[Spring] Layered Architecture

이연우·2025년 7월 24일

TIL

목록 보기
36/100

📚 Layered Architecture란?

  • 애플리케이션을 서로 다른 역할을 맡는 계층들(Layers)로 나누어 구조화한 아키텍처
  • 각 계층은 고유한 책임을 가지며, 서로 역할 분리가 되어 있어 유지 보수와 확장성이 좋아짐

❗기존 MVC 패턴의 문제점

  • Controller 하나가 너무 많은 일을 함
    → 요청 처리, 예외 처리, 뷰 응답, 비즈니스 로직, DB 연동까지 담당
  • 결과적으로
    - 유지 보수 어렵고
    - 테스트도 힘들고
    - 코드 재사용성도 낮음

🧭 Layered Architecture 구조

> Layered Architecture 적용

1. Presentation Layer (프레젠테이션 계층)

📍 Controller

  • 사용자의 요청을 받아 처리 흐름을 Service에 넘기고, 응답을 사용자에게 반환
  • 화면(View) 또는 JSON 데이터를 반환
  • 어노테이션: @Controller, @RestController

🗒️ 예시 코드

@RestController
public class UserController {
    private final UserService userService;

    @GetMapping("/users")
    public List<UserResponseDto> getUsers() {
        return userService.getAllUsers();
    }
}

2. Business Layer (비즈니스 계층)

📍 Service

  • 핵심 비즈니스 로직을 담당
  • 요청을 받아 의사 결정, DB 작업 필요 시 Repository 호출
  • 보통 하나의 로직 = 하나의 트랜잭션
  • 어노테이션: @Service

🗒️ 예시 코드

@Service
public class UserService {
    private final UserRepository userRepository;

    public List<UserResponseDto> getAllUsers() {
        return userRepository.findAll().stream()
               .map(UserResponseDto::fromEntity)
               .collect(Collectors.toList());
    }
}

3. Data Access Layer (데이터 접근 계층)

📍 Repository

  • DB와 직접 연결되어 CRUD 수행
  • JPA, MyBatis, JDBC 등으로 구현
  • 어노테이션: @Repository

🗒️ 예시 코드

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

4. DTO (Data Transfer Object)

📍 계층 간 데이터 전달용 객체

  • Controller ↔ Service ↔ Repository 간 데이터 교환에 사용
  • Entity와 분리되어 있어 외부 노출에 유리
  • 일반적으로:
    • RequestDto: 요청 데이터 담음
    • ResponseDto: 응답 데이터 담음

🗒️ 예시 코드

public class UserResponseDto {
    private String username;
    private int age;

    public static UserResponseDto fromEntity(User user) {
        return new UserResponseDto(user.getUsername(), user.getAge());
    }
}

🧩 용어 정리

용어설명
MVCModel-View-Controller 패턴. 초창기 웹 구조 방식
EntityDB 테이블과 매핑되는 클래스 (JPA에서 주로 사용)
DAOData Access Object. Repository와 같은 의미로 쓰이는 경우 많음
DTOData Transfer Object. 계층 간 데이터 전달용 객체

📌 Controller → Service → Repository → DTO 흐름

0개의 댓글