이번 포스팅에서는 3 Layer Architecture에 대해 기록한다.
📖 3 Layer Architecture
- 소프트웨어 시스템을 3개의 논리적 계층으로 분리하는 아키텍처이다.
- 3개의 레이어로 분리
- Controller Layer (Presentation Layer)
- Service Layer (Business Layer, Application Layer)
- Repository Layer (Data Layer)
- 3 Layer Architecture의 목적
- 관심사의 분리
- 각 계층은 고유한 책임만 담당
- 변경 사항의 영향 범위 최소화
- 유지보수성 향상
- 코드의 가독성과 이해도 증가
- 독립적인 테스트 가능
- 재사용성 증대
- 확장성 개선
- 특정 계층만 변경하여 기능 확장
- 새로운 기술 도입 용이

📖 Controller Layer
- 일반 사용자(클라이언트)가 애플리케이션과 상호작용 하는 사용자 인터페이스 및 커뮤니케이션 계층이다.
@RestController 혹은 @Controller 를 사용한다.
- ✅ 해야 할 일
- HTTP 요청 매핑
- 요청 파라미터 검증
- 응답 데이터 반환
- 예외 처리 및 에러 응답
- 🙅🏻 하지 말아야 할 일
- 비즈니스 로직 처리
- 데이터베이스 직접 접근
- 복잡한 데이터 변환
📖 Service Layer
- 비즈니스 로직을 처리하는 역할을 한다.
@Service 를 사용한다.
- ✅ 해야 할 일
- 비즈니스 규칙 구현
- 데이터 유효성 검증
- 여러 데이터 소스 조합
- 트랜잭션 경계 설정
- 🙅🏻 하지 말아야 할 일
- HTTP 관련 처리
- 데이터베이스 쿼리 작성
- UI 관련 로직
📖 Repository Layer
- 데이터베이스와의 상호작용을 담당한다.
- 실제 데이터베이스에서 데이터를 저장하거나 가져오는 계층이다.
@Repository 를 사용하지만, 이미 해당 기능을 갖고 있는 @JpaRepository 를 extends하는 경우에는 추가로 @Repository 를 붙이지 않아도 된다.
- ✅ 해야 할 일
- 🙅🏻 하지 말아야 할 일
- 비즈니스 로직 처리
- HTTP 응답 생성
- 사용자 인터페이스 관련 작업
📖 레이어간 통신 규칙
- ✅ 허용되는 통신
- 상위 → 하위: 상위 계층이 하위 계층을 호출(ex. Controller가 Service 호출)
- 같은 계층: 동일 계층 내 컴포넌트 간 통신
- 🙅🏻 금지되는 통신
- 하위 → 상위: 하위 계층이 상위 계층 직접 호출(ex. Service가 Controller 호출)
- 계층 건너뛰기 (ex. Controller가 Repository 호출)
📖 DTO(Data Transfer Object)
- DTO란 데이터를 전달하기 위한 순수 데이터 객체이다.
- 스프링은 클라이언트의 요청을 받고, 이 요청을 자바 코드로 변환하여 처리한다.
- 이 때, 사용자의 Request 데이터를 자바 코드에 담아 Controller에 옮겨줄 객체가 필요한데, 이 객체가 바로 DTO이다.
- 클라이언트의 요청은 HTTP이고, Body에는 JSON 데이터가 있다.
- 💡 Entity와 혼동 주의
- Entity는 DB 테이블과 직접 연결되는 클래스이고, DTO는 DB랑 아무 관련이 없다.
- DTO는 Entity를 외부에 노출하지 않기 위해 데이터를 옮길 때만 쓰는 클래스이다.
- JSON 요청
{
"title": "범죄도시11"
}
@Getter
public class CreateMovieRequest {
private String title;
}
@RestController
public class MovieController {
@PostMapping("/movies")
public void createMovie(@RequestBody CreateMovieRequest request) {
}
}
- 클라이언트의 요청 본문을 Controller에서 받기 위해 @RequestBody와 CreateMovieRequest DTO를 활용하여 데이터를 받을 수 있다.
- DTO는 단순 클라이언트와 서버 간에서만 사용되는 건 아니다.
- 비즈니스 로직이 없는 순수한 데이터 객체이기 때문에 계층 간 필요 시 언제나 사용할 수 있다.
- 클라이언트의 Request와 Response, 그리고 자바 코드 간의 변환은 스프링이 알아서 해준다.