개발/Java & Kotlin

[Spring] Spring 프로젝트에서 레이어드 아키텍처 제대로 이해하기

devhooney 2025. 6. 23. 07:50
728x90

레이어드 아키텍처(Layered Architecture)는 소프트웨어를 관심사에 따라 계층(Layer)으로 나누는 아키텍처 스타일이다. 각 계층은 특정한 역할을 맡고, 상위 계층은 하위 계층에만 의존한다. 이 방식은 유지보수성, 테스트 용이성, 재사용성을 높이는 데 목적이 있다.

 

 

 


 

 

 

 

 

728x90

 

 

 

 

 

 


🧱 대표적인 4계층 구조

 


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

- 사용자와 상호작용하는 계층 (웹 화면, API, 모바일 UI 등)
- 요청을 받아 컨트롤러가 처리
- 사용자 입력을 처리하고 결과를 표시

✅ 예: Controller, HTML/Thymeleaf, REST API

 

 

 


 

 


2. Application Layer (애플리케이션/서비스 계층)

- 비즈니스 로직을 조합하여 기능을 구현하는 계층
- 트랜잭션 관리, 흐름 제어 담당
- 도메인 로직은 호출만 하고 직접 구현하지 않음

✅ 예: Service, UseCase 클래스

 

 

 


 

 


3. Domain Layer (도메인/비즈니스 계층)

- 핵심 비즈니스 규칙과 도메인 모델을 포함
- 순수한 자바 객체 (POJO)로 구성됨
- 외부 기술에 의존하지 않음

✅ 예: Order, Member, Payment, DomainService, Entity, ValueObject

 

 

 


 


4. Infrastructure Layer (인프라/데이터 계층)

- 외부 시스템과의 연동 담당 (DB, 파일 시스템, 메시지큐, 이메일 등)
- Repository 구현, 외부 API 호출
- 도메인/애플리케이션 계층에 기술적 세부사항을 숨김

 

✅ 예: JPA Repository, RestTemplate, KafkaConsumer, EmailSender

 

🔄 계층 간 의존 관계
- 위 → 아래 방향으로만 의존해야 합니다.
- 예를 들어, Presentation → Application → Domain → Infrastructure 순입니다.
- 의존 역전 원칙(DIP)을 적용하면 더 유연하게 구현할 수 있음

 

 

 




✅ 장점

- 관심사 분리 (SoC)
- 유지보수와 테스트가 용이함
- 재사용 가능성이 높음

 


⚠️ 단점

- 계층이 깊어질수록 호출이 복잡해짐
- 단순한 애플리케이션에 오버엔지니어링이 될 수 있음
- 성능상 병목이 될 수도 있음

 

 

 

 


 

📌 Spring Boot에서의 예시

 

@Controller                // Presentation Layer
public class OrderController { }

@Service                  // Application Layer
public class OrderService { }

@Entity                   // Domain Layer
public class Order { }

@Repository              // Infrastructure Layer
public interface OrderRepository extends JpaRepository<Order, Long> { }

 

 

 

 

728x90