SpringBoot 프로젝트를 처음 시작하고 HelloController만 만들어 준 폴더 구조이다.
아무런 디렉토리 구조가 잡혀있지 않은 상황이다.
개발자가 다양하게 내부 레이아웃을 구성할 수 있다.
보편적으로는 이러한 애플리케이션 아키텍처(MVC)를 기반으로 설계한다.
Controller
- Client의 요청을 받았을 때, Service를 호출
- 업무 수행이 완료되면, 그 결과를 바탕으로 화면을 구성하도록 View에 전달
Service
- Controller의 요청을 받아, 해당 요청에 알맞은 정보로 가공 후 DB로 전달
- DB 정보가 필요할 때는 Repository에 요청
- Repository를 상속받아 .save() 등의 함수 사용 가능
Repository
- DB관리 (연결, 해제, 자원 관리)
- Entity에 의해 생성된 DB에 접근하는 메서드를 사용하기 위한 인터페이스
- DB에 CRUD의 명령을 실행하게 만듦
- JPA를 상속받음으로써, 기본적인 CRUD의 동작(함수 사용)이 가능해짐
- 예: JpaRepository<대상 엔티티, Entity에 접근할 객체의 Type>
- JPA에서 Repository 인터페이스를 생성 후, JpaRepository<Entity, 기본키 타입>을 상속받으면 기본적인 CRUD가 자동으로 생성됨
계층형 구조
예를들어 투두리스트 애플리케이션이라고 가정하고, 도메인이 'User', 'Check'가 있다고 하자.
ㄴsrc/main/java/com/springboot/checkit
ㄴ CheckitApplication.java
ㄴ controller
ㄴ UserController
ㄴ CheckController
ㄴ service
ㄴ UserService
ㄴ CheckService
ㄴ DAO
ㄴ UserDAO
ㄴ CheckDAO
ㄴ DTO
ㄴ UserDTO
ㄴ CheckDTO
계층형 구조는 각 애플리케이션 계층을 대표하는 디렉토리를 기준으로 코드가 구성된다.
대부분이 Layered 아키텍처를 사용하기 때문에
Layered 아키텍처의 컴포넌트들이 패키지가 되는 경우가 많다.
계층형 구조의 장단점
장점
- 프로젝트의 전반적인 이해도가 낮아도, 패키지 구조만 보고 전체적인 구조를 파악할 수 있다.
- 애플리케이션의 API를 보고 흐름을 파악하고 싶다면, Controller 패키지 하나만 보고 파악할 수 있다.
- 애플리케이션의 비즈니스 로직을 보고싶다면, Service 패키지 하나만 보고 파악할 수 있다.
단점
- 하나의 패키지 안에 여러 도메인이 있기 때문에 도메인별 응집도가 낮다.
- 때문에 도메인의 흐름을 파악하기 힘들다.
- Check 도메인에 대한 변경이 있을때, 여러 패키지에서 변경이 일어난다.
- 규모가 커지면 하나의 패키지 안에 여러 클래스들이 모여서 확장 가능성이 떨어진다.
- 유스케이스(사용자의 행위) 표현이 어렵다.
- 계층형에서는 계층으로 패키지가 묶이기 때문에 네이밍해서 분리하기 어렵다.
도메인형 구조
ㄴsrc/main/java/com/springboot/checkit
ㄴ CheckitApplication.java
ㄴ User
ㄴ Controller
ㄴ Service
ㄴ DAO
ㄴ DTO
ㄴ Check
ㄴ Controller
ㄴ Service
ㄴ DAO
ㄴ DTO
도메인형 구조는 도메인을 기준으로 패키지를 나눈 구조이다.
도메인형 구조 장단점
장점
- 도메인의 흐름을 파악하기 쉽다.
- Check 도메인의 흐름을 보고 싶을 때, Check 패키지 하나만 보면 된다.
- Check 도메인에 대한 변경점이 있을 때, Check 패키지만 변경이 일어난다.
- 도메인별로 패키지가 나뉘기 때문에 네이밍으로 분리하기 쉽다.
단점
- 애플리케이션의 전반적인 흐름을 한눈에 파악하기 어렵다.
- 개발자의 관점에 따라 어느 패키지에 둘지 애매한 클래스들이 존재한다.
- 자신이 예상하는 패키지와 다를 때, 해당 클래스를 찾기 어렵다.
이렇게 공부를 하고 장단점을 비교해가며, 이번 프로젝트는 계층형을 선택했다.
왜냐하면, 규모가 작으며 도메인이 작은 프로젝트다.
또한 애플리케이션 흐름과 가독성을 우선시 했기 때문이다.
그래서 완성한 폴더구조다!
다음 포스팅은 Repository와 DAO의 차이점을 기술해보겠다.
틀린 부분이 있으면 지적해주시면 감사하겠습니다.
Reference
[Springboot] directory 구조 : 계층형과 도메인형
'Server' 카테고리의 다른 글
[JPA] JPA란 / 영속성 컨텍스트 #1 (0) | 2024.08.02 |
---|---|
[JPA] GenerationType.IDENTITY 오류 / AUTO_INCREMENT (0) | 2024.08.02 |
DDD 개념 / DAO와 Repository 차이 (0) | 2024.07.31 |
[SpringBoot] DTO, DAO, VO 개념 알아보기 (0) | 2024.07.12 |
[SpringBoot] MVC 패턴 (2) | 2024.07.11 |