![](https://velog.velcdn.com/images/hugh0223/post/1a63811b-edda-435e-8763-73032e79b593/image.png)
🖋️ Backend 효과적인 패키지 구조를 만들기
Domain, Service, Controller, Repository, DAO, DTO, VO 핵심 구성요소 이해
Spring Boot 애플리케이션을 구성하는 효과적인 방법은 기능과 계층별로 구성하는 것
더 쉽게 탐색하고 관리
com.example.myapp
├── config
├── controller
├── service
├── repository
├── domain
├── dto
├── exception
└── security
핵심 개념 및 디자인
Domain
- 도메인 모델
- DB 모델과 그 관계를 반영하는 비즈니스 로직의 기본 Entity
- 설계 TIPS
- 도메인 모델을 간결하게 유지
- 도메인 클래스에서 비즈니스 로직 지양
- 객체를 DB 에 매핑하는데 사용
- (JPA 의 '@Entity' 같은 애노테이션 사용)
DTO
- 데이터 전송 객체
- 클라이언트에 필요할 수 있는 필수 데이터만 전송
- 특별히 설계된 프로세스 간 데이터를 전송하는데 사용
- 설계 TIPS
- 데이터 캡슐화
- 원격 메서드에 대한 다중 호출 방지
VO
- 값 객체
- 객체가 라이프사이클 전반에 걸쳐 항상 유효한 상태인지 확인
- 불변이며 ID 없음
- 설계 TIPS
- 단일 단위로 취급하는 복합 값을 표현할 때 사용
DAO
- 데이터 액세스 객체
- 데이터 소스에 대한 모든 액세스를 추상화하고 캡슐화
- 데이터 소스와의 연결을 관리
- 데이터를 획득하고 저장
- 설계 TIPS
- Spring Boot에서 DAO 기능은 일반적으로 리포지토리에서 처리
Repostiory
- 저장소
- 데이터베이스의 데이터에 액세스하기 위해 정의하는 인터페이스
- Spring Data JPA를 사용하면 JpaRepository를 확장하여 DAO 코드를 작성하지 않고도 CRUD 작업을 활용
- 설계 TIPS
- 저장소를 사용하여 데이터베이스 쿼리를 비즈니스 로직과 격리된 상태로 유지
Service
- 서비스 계층은 애플리케이션의 비즈니스 로직을 처리
- 컨트롤러와 저장소 계층 사이에서 작동
- 설계 TIPS
- 서비스를 인터페이스로 구현하고 별도의 구현 클래스 설계
Controller
- 컨트롤러는 들어오는 HTTP 요청을 처리하고 응답을 반환
- 그들은 서비스 계층과 View 사이의 다리 역할
- 설계 TIPS
- 컨트롤러를 가볍게 유지
- 비즈니스 로직을 포함하지 않고 서비스에 위임
Exception
- 사용자 정의 예외 및 오류 처리 메커니즘이 여기에 정의
- 설계 TIPS
- 전역적으로 예외를 처리하려면 @ControllerAdvice 또는 @RestControllerAdvice를 사용
Config
- Swagger 구성, 모델 매퍼 또는 애플리케이션에 대해 구성된 기타 Bean과 같은 구성 클래스가 포함
- 설계 TIPS
- 이러한 클래스를 표시하려면 @Configuration을 사용하고 메서드 수준 주석에는 @Bean을 사용
설계 최적화 팁!
관심사항 분리
- MVC 패턴을 사용하여 책임을 명확하게 분리
- 이는 종속성을 더 잘 관리하는 데 도움
데이터베이스 상호 작용 효율성
- 지연 로딩, 적절한 열망 가져오기, 쿼리 최적화와 같은 JPA 성능 사례를 사용
보안
- 일반적인 취약점으로부터 보호
- Spring Security를 사용하여 애플리케이션을 보호
테스트
- 서비스 계층에 대한 단위 테스트
- 데이터베이스 및 Spring 컨텍스트를 포함하는 통합 테스트를 작성