주절주절,,🗣
회사 프로젝트가 기존에는 모두 계층형이었으나, 이번에 한 프로젝트를 전체 리팩토링 하면서 도메인형으로 변경하게 되었다.
이로써 이제 계층형과 도메인형도 혼합되어 존재하게 되었는데, 앞으로는 모두 도메인형으로 바꿀까?
요즘 도메인형이 더 선호되는 것 같기도 하지만, 개인적으로 무조건 도메인형이 좋다고 생각되진 않는다.
그래서 나름의 기준을 가지기 위해 간단히 정리해보았다.
패키지 구성은 크게 두 가지 유형이 있다.
1️⃣ 계층형
2️⃣ 도메인형
계층형
ex)
Application.java
└ /controller
└ /service
└ /repository
장점
- 해당 프로젝트에 이해가 상대적으로 낮아도 전체적인 구조를 빠르게 파악할 수 있음
단점
- 디렉토리에 클래스들이 너무 많이 모이게 됨
- 모듈 단위로 분리 시 어려움이 있음
도메인형
ex)
Application.java
/book
└ /controller
└ /service
└ /repository
/card
└ /controller
└ /service
└ /repository
장점
- 관련된 코드들이 응집해 있음
- 모듈 단위로 분리할 때 유리함
단점
- 프로젝트에 대한 이해도가 낮을 경우 전체적인 구조를 파악하기 어려움
- 개발자의 성향에 따라 도메인을 구분하는 기준이 다를 수 있고, 내 예상과 다른 패키지에 존재하는 경우 관련 코드를 찾기 어려움
- 패키지 간 순환 참조가 발생할 가능성이 있음
- 같은 패키지 내부에 있어도 되는 파일인데도 불구하고 모듈별로 구분되어 있기 때문에 다른 패키지에 존재하게 되고, 서로를 참조할 수 있음
결론
복잡도가 높고 제공하는 기능이 많아 하나의 계층에 속하는 클래스 수가 많고,
제공하는 기능을 명확한 기준으로 분리할 수 있고,
추후에 모듈별로 별도 서비스로 쪼개질 가능성이 있는 경우
➡️ 도메인형 구조
복잡도가 낮고 제공하는 기능이 적어 하나의 계층에 속하는 클래스 수가 적고,
제공하는 기능을 명확한 기준으로 분리하기가 애매하고,
추후에 모듈별로 분리하게 될 일이 없을 것 같은 작은 규모의 프로젝트 일 경우
➡️ 계층형 구조
로 방향을 잡을 것 같다.
<참고 블로그>
'Java' 카테고리의 다른 글
[Java] 오버로딩(overloading)과 오버라이딩(overriding) 차이점 (0) | 2020.05.03 |
---|---|
[Java] 접근 제어자 정리(private, default, protected, public) (0) | 2020.05.03 |
[Java] equals()과 == 차이점, String Constant Pool(상수 풀) (3) | 2020.04.29 |
댓글