스프링

패키지 구조는 어떻게 가져가는 것이 좋을까?

 

패키지 구조와 관련해 끊이지 않는 논쟁 거리가 있는데 오늘은 그 이야기를 함 해보자. 이 또한 상황에 따라 다르다고 할 수도 있겠지만 나름의 이유는 있어야 된다고 생각한다.

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안의 장,단점에서 잘못 생각하고 있는 부분이 있을까?

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

세계에는 올바른 일만 하는 사람은 있을 수 없다. 반드시 나쁜 일도 하고 있다. -탈무드

댓글 ( 4)

댓글 남기기

작성