패키지 구조는 어떻게 가져가는 것이 좋을까?
패키지 구조와 관련해 끊이지 않는 논쟁 거리가 있는데 오늘은 그 이야기를 함 해보자. 이 또한 상황에 따라 다르다고 할 수도 있겠지만 나름의 이유는 있어야 된다고 생각한다.
layered architecture 기반으로 개발한다고 가정하고 이야기를 전개해 보자. 각 layer별 패키지명은 다음과 같이 진행하기로 결정했다. 도메인 클래스는 domain, 비지니스 레이어는 service, 퍼시스턴스 레이어는 dao, 프리젠테이션 레이어는 web과 같이 명명하기로 약속했다. 이 명명 규칙은 각 프로젝트마다 다르게 정할 수 있다. 하지만 이슈는 이것이 아니라 그 다음이다. 패키지 구조에서 각 layer와 모듈의 관계를 어떻게 가져갈 것인가가 그 이슈이다.
1안 - layer 우선
- net.slipp.domain.modulename
- net.slipp.service.modulename
- net.slipp.dao.modulename
- net.slipp.web.modulename
2안 - 모듈 우선
- net.slipp.modulename.domain
- net.slipp.modulename.service
- net.slipp.modulename.dao
- net.slipp.modulename.web
위 두 가지 안 중 어느 방법이 더 좋을까? 내가 생각하는 각각의 장단점을 살펴보면 다음과 같다.
1안
- 특징
- 도메인 모델 위주 개발에 적합하다.
- 장점
- 각 패키지간의 cyclic dependency가 발생할 가능성이 적어진다.
- 중복된 부분을 제거하기 용이하다.
- 단점
- 추후 모듈 단위로 분리할 때 어려움이 있다.
2안
- 특징
- 개발자별로 기능 단위 개발을 하는 경우 주로 발생한다.
- 장점
- 모듈 단위로 분리할 때 유리하다.
- 단점
- 각 패키지간에 cyclic dependency가 발생할 가능성이 높다.
- 각 모듈에 중복된 코드가 발생할 가능성이 높다.
- 도메인 간의 관계보다 각 모듈별로 각자 구현할 가능성이 높다.
나는 위 같은 특성 때문에 패키지 구조를 결정할 때 1안을 사용한다. 최초 패키지 구조 잡을 때 2안에 대한 강한 애정을 가지는 개발자들이 많아서 이들을 설득하는데 애를 먹는 경우가 종종 있다. 2안도 좋지만 그 단점을 고려했을 때 1안이 더 나은 선택이지 않을까 생각해본다.
각자 패키지를 잡는 방법은 어떻게 되는지 궁금하다. 또한 내가 위에서 제시한 1안과 2안의 장,단점에서 잘못 생각하고 있는 부분이 있을까?
댓글 ( 4)
댓글 남기기