3-Layered 아키텍처 패턴 상세 구성

민준·2025년 3월 15일
post-thumbnail

1. 3-Layered 아키텍처란?

3계층 아키텍처(3-Layered Architecture)는 관심사의 분리(Separation of Concern) 원칙을 적용하여 유지보수성과 테스트 용이성을 높이는 설계 방식
웹 애플리케이션을 3개의 주요 계층으로 나누어 역할을 분리


2. 3-Layered(3계층 구조)의 역할

계층역할주요 애너테이션
Presentation Layer클라이언트 요청 처리, 응답 반환 (Spring MVC 컨트롤러)@Controller
Business Layer비즈니스 로직 수행, Model에 데이터 생성@Service
Data Access Layer데이터베이스와 직접 연결, CRUD 처리@Repository

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

  • 사용자 요청을 받아 적절한 서비스(Service) 계층을 호출
  • 서비스에서 받은 데이터를 화면(View)으로 반환

Spring MVC에서 @Controller를 사용

@Controller
@RequestMapping("/users")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/{id}")
    public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.getUserById(id));
    }
}
  • @Controller → 이 클래스가 클라이언트 요청을 처리함
  • @GetMapping("/{id}") → URL 요청을 받아 Service 계층 호출

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

  • 비즈니스 로직을 담당하는 계층
  • Controller에서 받은 요청을 처리하고 Repository 계층과 연결

Spring에서 @Service를 사용

@Service
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public UserDTO getUserById(Long id) {
        User user = userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
        return new UserDTO(user.getId(), user.getName());
    }
}
  • @Service → 비즈니스 로직을 수행하는 클래스
  • userRepository.findById(id) → DB에서 데이터를 가져옴

2-3. Data Access Layer (데이터 액세스 계층)

  • 데이터베이스와 직접 연결하여 CRUD를 수행하는 계층

Spring에서 @Repository를 사용

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findById(Long id);
}
  • @Repository → DB와의 직접적인 상호작용을 담당
  • JpaRepository 상속 → 기본적인 CRUD 기능 제공

DAO vs Repository

DAO (Data Access Object)

  • 전통적으로 데이터베이스와 직접 연결된 CRUD 함수를 제공
  • MyBatis, JDBC를 사용할 때 자주 사용됨
public interface UserDao {
    void create(User user);
    User read(Long id);
    void update(User user);
    void delete(Long id);
}

Repository (Spring JPA)

  • DAO를 더 추상화한 개념으로, 필요한 기능만 선택적으로 구현 가능
  • Spring JPA를 사용하면 JpaRepository를 상속받아 기본 CRUD 기능을 제공받음
public interface UserRepository {
    User get(Long id); // 원하는 기능만 구현
}

차이점 요약

DAORepository
개념DB에 직접 연결하여 CRUD 수행DAO를 감싸는 추상화 계층
특징SQL을 직접 다룸JPA, Hibernate 등을 활용
사용 방식JDBC, MyBatis 기반Spring Data JPA 기반

@Repository와 DAO 이 두 개념은 다르나, Spring에서 혼용해서 쓰기도 한다.


3. DTO vs VO

DTO (Data Transfer Object)

  • 데이터를 전달하기 위한 객체
  • 가변 객체이며 getter, setter 포함
public class UserDTO {
    private Long id;
    private String name;
    
    // 생성자, Getter, Setter
}

VO (Value Object)

  • 불변 객체(Immutable Object)
  • DTO와 비슷하지만, setter가 없으며 한 번 생성된 값은 변경 불가능
public class UserVO {
    private final Long id;
    private final String name;

    public UserVO(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    // Getter만 제공 (Setter 없음)
}

차이점 요약

DTOVO
변경 가능 여부가변 (Mutable)불변 (Immutable)
역할데이터 전송값 객체 (불변성 보장)

4.Monolithic vs MSA

Monolithic (모놀리식) 아키텍처

  • 과거에는 하나의 대형 어플리케이션(=단일 서버)이 모든 기능(서비스)을 수행

단점

  • 배포가 어려움 → 작은 수정도 전체 시스템 재배포 필요
  • 유지보수 비용 증가 → 하나의 서비스 변경이 다른 기능에 영향을 줌
  • 트래픽 증가 시 확장 어려움 → 특정기능만 확장하는 것이 불가능

    회원 관리, 상품 관리, 결제 서비스가 하나의 서버에서 실행됨.
    회원 관리 기능을 수정하려면 전체 애플리케이션을 다시 빌드하고 배포해야 함.


MSA (Microservice Architecture)

  • 서비스를 여러 개의 독립적인 마이크로서비스로 나눔
  • 각 서비스는 독립적인 배포 및 운영 가능
  • 장점: 특정 서비스가 다운되어도 전체 시스템이 영향을 받지 않음
  • 단점: 관리할 서비스가 많아지며 API 관리가 필요

클라이언트 → API Gateway → 여러 개의 Microservices → 각각의 DB

MSA에서 API Gateway의 역할

  • 각 마이크로서비스의 API를 중앙에서 관리
  • Swagger 등을 사용하여 API 문서화

5. Spring의 등장과 함께 경량화 + MSA로 전환 가능

Spring은 기존 모놀리식 아키텍처의 단점을 해결하고 유지보수성과 확장성을 높이는 환경을 제공

Spring의 장점

  • 설정이 간편해지고, 개발이 쉬워짐
  • 비지니스 로직을 모듈화하여 분리 가능
  • Spring Boot를 통해 독립적인 실행이 가능 → 즉, 여러 개의 독립적인 마이크로서비스 배포 가능

Spring Boot와 MSA의 궁합이 좋은 이유

Spring Boot내장 웹 서버(Tomcat)를 포함하여 마이크로서비스를 손쉽게 실행 가능
Spring Cloud는 MSA에서 필요한 API Gateway, 서비스 등록/탐색, 분산 트랜잭션 관리 등을 지원

Spring을 사용하면 자연스럽게 MSA 도입이 쉬워짐

Spring을 사용하면 각 기능을 독립적인 서비스로 분리하고 확장하기 쉬움

Spring과 MSA의 연결점

Spring 기능MSA에서의 역할
Spring Boot독립적인 마이크로서비스 실행 가능
Spring CloudMSA 환경에서 서비스 간 통신 및 로드 밸런싱 제공
Spring Security개별 마이크로서비스 보안 관리
Spring Data JPA각 마이크로서비스의 독립적인 DB 접근 용이

0개의 댓글