Layered Architecture의 주요 계층
Presentation Layer
- 역할: 요청을 받고, 응답을 반환합니다.
- 주요 책임: UI 처리, API 엔트포인트 제공, 사용자 입력 검증, 요청을 서비스 계층에 전달
- Spring Annotation:
@Controller, @RestController
Business Layer
- 역할: 비즈니스 로직 수행 및 트랜잭션 관리
- 주요 책임: 도메인 규칙을 처리, 데이터 검증, 여러 데이터 소스 및 서비스 조합, 트랜잭션 관리
- Spring Annotation:
@Service
Data Access Layer
- 역할: 데이터베이스와의 연동 및 CRUD 작업
- 주요 책임: DB 연결 및 해제, 쿼리 실행, 데이터 변환, 외부 시스템 연동
- Spring Annotation:
@Repository
Layered Architecture의 핵심 원칙
Seperation of Concerns
각 계층은 자기만의 책임에 집중하고 다른 계층의 내부 동작을 알지 못해도 됩니다.
Modularity and Encapsulation
각 계층은 인터페이스를 통해서만 다른 계층과 통신합니다. 내부 구현을 숨기며 각 계층들이 독립적으로 개발, 테스트, 교체가 가능합니다.
Hierarchical Communication
일반적으로 상위 계층이 하위 계층에만 의존하고, 반대 방향의 의존은 허용하지 않습니다.
Layered Architecture의 장점
- 유지보수성: 각 계층의 책임이 분리되어 있기 때문에 한 계층을 변경하여도 다른 계층에 미치는 영향이 적습니다.
- 재사용성: 계층별 코드 재사용이 쉽고, 동일 계층을 여러 프로젝트에서 활용할 수 있습니다.
- 테스트 용이성: 각 계층을 독립적으로 테스트할 수 있습니다.
- 확장성: 새로운 기능 또는 계층 추가가 용이합니다.
- 팀 협업: 역할 분담이 명확하여 여러 팀이 동시에 개발하기가 쉽습니다.
Layered Architecture의 단점
- 복잡성 증가: 작은 프로젝트에는 불필요하게 복잡할 수 있습니다.
- 계층 간 중복 및 비효율: 단순한 작업도 여러 계층을 거쳐야 할 수 있습니다.
- 성능 저하: 계층을 거치는 과정에서 오버헤드가 발생할 수 있습니다.
Spring에서의 Layered Architecture
Controller -> Service -> Repository -> Database
Contoller는 사용자의 요청을 받아 Service로 전달합니다.
Service는 비즈니스 로직을 처리하고, 필요한 경우 Repository를 호출합니다.
Repository는 DB와 직접 통신하여 CRUD 작업을 합니다.
각 계층은 DTO, Entity, DAO 등의 객체를 통해 데이터를 주고 받습니다.
DTO(Data Transfer Object), DAO(Data Access Object)란?
DTO는 계층 간 데이터 전달을 하는 용도의 객체입니다. 어떠한 로직없이 getter/setter만 가지고 있습니다.
DAO는 데이터베이스 접근을 추상화한 객체입니다. Spring에서는 Repository가 해당 역할을 수행합니다.
자료 및 코드 출처: 스파르타 코딩클럽