어떻게 구조를 나눌까 고민하다 작은 프로젝트는 굳이 패키지를 디테일하게 나눌 필요가 없을 것 같은데?라는 생각이 들어 어떤 식으로 나누면 좋을지 찾아보았다.
처음 찾아본 글은 인프런에서의 질문에 대한 김영한 님의 답변이였다.
정답은 없다고 하셨다.
프로젝트를 진행할 때마다 어떤 식으로 나누고 시작하면 좋을지 해당 프로젝트에는 어떤식으로 나누는 게 좋을지 고민하신다고 한다. 현재 프로젝트의 상황과 규모에 따라서, 거기에 맞는 유지보수하고 확장하기 쉬운 구조가 있기 때문이다.
그러면 어떤 방식으로 나누는 방법이 있는지 알아보자.
패키지 구성은 크게 레이어 계층형, 도메인형 이렇게 2가지 유형이 있다.
계층형
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── DemoApplication.java
│ │ ├── config
│ │ ├── controller
│ │ ├── dao
│ │ ├── domain
│ │ ├── exception
│ │ └── service
│ └── resources
│ └── application.properties
장점
- 해당 프로젝트에 이해가 상대적으로 낮아도 전체적인 구조를 빠르게 파악할 수 있다.
- 중복된 코드가 발생할 가능성이 적다.
단점
- 디렉토리에 클래스들이 너무 많이 모이게 된다.
- 모듈 단위로 분리 시 어려움이 있다.
도메인형
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── DemoApplication.java
│ │ ├── coupon
│ │ │ ├── controller
│ │ │ ├── domain
│ │ │ ├── exception
│ │ │ ├── repository
│ │ │ └── service
│ │ ├── member
│ │ │ ├── controller
│ │ │ ├── domain
│ │ │ ├── exception
│ │ │ ├── repository
│ │ │ └── service
│ │ └── order
│ │ ├── controller
│ │ ├── domain
│ │ ├── exception
│ │ ├── repository
│ │ └── service
│ └── resources
│ └── application.properties
장점
- 관련된 코드들이 응집해 있다.
- 모듈 단위로 분리할 때 유리하다.
단점
- 프로젝트에 대한 이해도가 낮을 경우 전체적인 구조 파악하기 어렵다.
- 개발자의 성향에 따라 도메인을 구분하는 기준이 다를 수 있고, 내 예상과 다른 패키지에 존재하는 경우 관련 코드를 찾기 어렵다.
- 패키지 간 순환 참조가 발생할 가능성이 있다.
팀프로젝트할 때 도메인형 방식으로 했었는데 도메인을 구분하는 기준이 달라서 내가 예상하는 곳에 예상했던 코드가 없었던 적이 있어 한참 찾은 적이 있었다.
따라서,
계층형 구조는 추후에 업데이트할 기능이 많이 없거나 작은 규모의 프로젝트 일 경우에 편리할 것 같다 생각이 들고,
도메인형 구조는 규모가 크고, 도메인이 많은 경우에는 분리하고 보기 편할 것 같고, 유지보수성 및 확장성에 유용할 것 같다고 느껴졌다.
'Spring' 카테고리의 다른 글
단위 테스트, 통합 테스트 (0) | 2023.09.14 |
---|---|
DDD(Domain Driven Desgin) (0) | 2023.07.25 |
[Spring] 왜 Service 와 ServiceImpl로 나누는걸까 (0) | 2023.06.28 |
OAuth (0) | 2023.05.06 |
Redis (0) | 2023.05.05 |