3 Layer Architecture

Jiwon Jung·2025년 11월 3일

스프링(Spring)

목록 보기
7/20

이번 포스팅에서는 3 Layer Architecture에 대해 기록한다.


📖 3 Layer Architecture

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


📖 Controller Layer

  • 일반 사용자(클라이언트)가 애플리케이션과 상호작용 하는 사용자 인터페이스 및 커뮤니케이션 계층이다.
  • @RestController 혹은 @Controller 를 사용한다.
  • 해야 할 일
    • HTTP 요청 매핑
    • 요청 파라미터 검증
    • 응답 데이터 반환
    • 예외 처리 및 에러 응답
  • 🙅🏻 하지 말아야 할 일
    • 비즈니스 로직 처리
    • 데이터베이스 직접 접근
    • 복잡한 데이터 변환

📖 Service Layer

  • 비즈니스 로직을 처리하는 역할을 한다.
  • @Service 를 사용한다.
  • 해야 할 일
    • 비즈니스 규칙 구현
    • 데이터 유효성 검증
    • 여러 데이터 소스 조합
    • 트랜잭션 경계 설정
  • 🙅🏻 하지 말아야 할 일
    • HTTP 관련 처리
    • 데이터베이스 쿼리 작성
    • UI 관련 로직

📖 Repository Layer

  • 데이터베이스와의 상호작용을 담당한다.
  • 실제 데이터베이스에서 데이터를 저장하거나 가져오는 계층이다.
  • @Repository 를 사용하지만, 이미 해당 기능을 갖고 있는 @JpaRepository 를 extends하는 경우에는 추가로 @Repository 를 붙이지 않아도 된다.
  • 해야 할 일
    • CRUD 연산 구현
    • 쿼리 최적화
    • 데이터 매핑
  • 🙅🏻 하지 말아야 할 일
    • 비즈니스 로직 처리
    • 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"
}
  • DTO
@Getter
public class CreateMovieRequest {

    private String title;
}
  • Controller
@RestController
public class MovieController {

    @PostMapping("/movies")
    public void createMovie(@RequestBody CreateMovieRequest request) {
        // ...
    }
}
  • 클라이언트의 요청 본문을 Controller에서 받기 위해 @RequestBody와 CreateMovieRequest DTO를 활용하여 데이터를 받을 수 있다.
  • DTO는 단순 클라이언트와 서버 간에서만 사용되는 건 아니다.
    • 비즈니스 로직이 없는 순수한 데이터 객체이기 때문에 계층 간 필요 시 언제나 사용할 수 있다.
  • 클라이언트의 Request와 Response, 그리고 자바 코드 간의 변환은 스프링이 알아서 해준다.

0개의 댓글