디렉토리 구성 정하기
클래스 다이어그램을 작성하던 중 패키지 구조를 먼저 선정하고, 클래스들을 만들어 두어야 된다고 생각하여 패키지 구조를 어떤식으로 구성해야 할지 궁금해서 알아보았습니다.
먼저 개발 디렉토리는 크게 계층형 구조와 도메인형 구조로 나뉩니다. 이를 설명하기 전에 알아야할 부분들을 먼저 나열하겠습니다.
스프링부트 Web layer
스프링 부트 web layer와 개발 디렉토리 구조간의 연관관계로 주로 MVC 아키텍처를 기반으로 합니다. 스프링 부트는 기본적으로 MVC 아키텍처를 따릅니다.
- Web Layer: 사용자의 입력을 처리하고, 사용자에게 올바른 응답을 반환하는 역할입니다. 웹 계층은 다른 계층에서 발생한 예외도 처리해야 합니다. 이는 애플리케이션의 진입점으로 인증을 관리하고, 승인되지 않은 사용자에 대한 방어선 역할을 해야합니다.
- Service Layer: 서비스 로직 입니다.
- Repository Layer: DB 저장소에 접근하는 영역으로 DAO입니다.
- DTO: 데이터 전송 객체 입니다.
- Domain Model: @Entity가 사용되는 영역 입니다. 즉 작업을 제공하는 상태인 비저장 클래스입니다.(table 필드와 매핑되는 영역)
MVC 패턴
MVC 패턴은 각 구성요소가 독립적으로 변경 가능하도록 설계되어 유지보수가 용이하고, 코드의 재사용성을 높이는데 도움이 됩니다. 서로간의 의존성을 최소화하여 유지보수와 확장이 쉽도록 합니다.
또한, MVC 패턴은 하나의 서블릿이나, jsp로 처리하던 것을 컨트롤러와 뷰라는 영역으로 나눈것입니다.
- Model: 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비지니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링하는 일에 집중할 수 있습니다.
- View: 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중합니다. 여기서 HTML을 생성하는 부분을 말합니다.
- Controller: HTTP 요청을 받아서 파라미터를 검증하고, 비지니스 로직을 수행합니다. 그리고 뷰에 전달할 결과 데이터를 조회하여 모델에 담습니다.
Controller는 Model과 View의 중간의 역할로서 사용자가 데이터를 클릭하고 수정하는 등 이벤트들을 처리한다. 컨트롤러의 규칙으로 모델이나 뷰에대해서 알고 있어야 하며, 변경을 모니터링해야 한다.
Dao, Dto, Vo
- DAO(Data Access Object): 데이터 베이스에 접근 객체로 MVC패턴의 Model에서의 역할을 수행합니다.
(로직&비지니스 로직을 분리)
- DTO(Data Transfer Object): 데이터 전송 객체로 계층간 데이터 교환을 위한 Java Bean 로직을 가지지 않는 객체이고 getter, setter만을 가집니다.
- VO(Value Object): 값 객체로 단순 불변 클래스를 만들어 사용한다. getter 기능만 존재합니다.
계층형 구조(Layer) vs 도메인형 구조(Domain)
개발 디렉토리 구조에서 크게 2가지로 나뉘는데 계층형 구조와 도메인형 구조로 나뉩니다.
- 계층형 구조
Controller
⎿ MemberController
⎿ OrderController
Service
⎿ MemberService
⎿ OrderService
Domain
⎿ MemberDto
⎿ OrderDto
- 도메인형 구조
Member
⎿ MemberController
⎿ MemberService
⎿ MemberDto
Order
⎿ OrderController
⎿ OrderService
⎿ OrderDto
어떤 디렉토리 구조를 사용하든 정답은 없습니다. 위와 같은 구조가 아니더라도 진행하는 프로젝트에 가장 적합하게 만드는 것이 중요합니다. 위의 두 종류의 장단점을 비교해보겠습니다.
- 계층형 구조
- 장점: 패키지 구조만 보고 전체적인 구조를 파악하기 수월하고, 계층별 응집도가 높습니다.
- 단점: 디렉토리 안에 클래스들이 너무 많이 모인다. 그렇기에 상대적으로 작은 규모의 프로젝트에 적합하다.
- 도메인형 구조:
- 장점: 도메인의 흐름을 파악하기 쉽고, 도메인별 응집도가 높습니다.
- 단점: 전반적인 흐름을 한눈에 파악하기 어렵습니다. 개발자 관점에 따라 어느 패키지에 넣어야 할지 애매한 클래스들이 존재합니다.
프로젝트 디렉토리 구성
프로젝트 디렉토리는 전반적인 구조 파악이 수월한 계층형 구조로 구성하기로 결정했습니다.
- config: 로그인 인증 처리
- controller: @Controller 컨트롤러를 서비스로 전달, view로부터 오는 요청에 대해서 Get, Post 등을 매칭하여 service로 전달
- regpository: @Repository 실제 db에 연결되는 영역(DAO)
- domain: @Entity 선언, table 필드와 매핑되는 영역(DTO)
- service: 비지니스 로직 처리
- exception: 예외 처리
사진 출처
https://www.petrikainulainen.net/software-development/design/understanding-spring-web-application-architecture-the-classic-way/