2023.10.05 - [Framework/Spring] - [Spring] 레이어드 아키텍처와 스프링의 레이어드 아키텍처
스프링의 레이어드 아키텍처를 정리한 적이 있는데 이번에는 각 영역에서 중요역할을 담당하는 Controller, Service, Repository에 대해 자세히 알아보자.
Controller
컨트롤러는 스프링 레이어드 아키택쳐 중 프레젠테이션 레이어의 포함되어 있다. 클라이언트 요청이 서버 측에 전달될 때 가장 먼저 접촉하는 영역이 컨트롤러라고 할 수 있다.
좀 더 자세히 설명하자면, 사용자의 요청을 받아 Service Layer에 비즈니스 처리를 위임하고 이에 대한 결과를 View를 통해 반환하는 역할을 한다.
- 클라이언트에게 온 응답(Response)은 모두 컨트롤러를 통해 진행된다.
- 컨트롤러로 들어온 요청을 어떻게 처리할지 결정하여 모델로 요청을 전달하는 역할을 수행한다.
Service
서비스는 스프링 레이어드 아키택쳐 중 비즈니스 계층을 담당한다(4 계층으로 분리 시 응용계층에 포함하기도 함). 주로 서비스의 비즈니스 로직을 정의하는 역할을 수행한다.
애플리케이션의 비즈니스 로직을 포함하여 사용자의 요청을 처리하므로 도메인 객체들의 협력하여 요청을 수행한다. 그렇기 때문에 사용자의 요청을 직접 받는 Controller와 도메인 객체를 다루는 Repository 사이에 위치한다.
Repository
리파지토리는 스프링 레이어드 아키택쳐 중 데이터 접근 계층을 담당한다(4 계층 시 인프라 계층). 주로 데이터베이스와 상호작용하는 역할을 수행한다.
특히 JPA를 활용하는 경우, DAO 대신 사용되며 JpaRepository를 extends 하면 기본적인 CRUD를 제공해 준다. 기본적으로 ORM 프레임워크와 연계되기 때문에 데이터베이스와의 상호작용을 단순화하고 추상화할 수 있는 장점이 있다.
정리하자면, 데이터의 영속성관리 담당하며 데이터베이스와의 상호작용을 추상화하여 데이터베이스 세부정보를 노출하지 않고도 숨기는 역할도 수행한다.
핵심 계층
계층구조 중 안 중요한 계층은 없으나 보편적으로 핵심 비즈니스 로직을 관리하는 서비스 계층을 가장 핵심이라 여겨진다. 그렇기 때문에 서비스 계층은 외부 요인(기술) 변경되어도 최대한 변경 없이 순수하게 관리되어야 한다.
여기서 순수하게 관리되어야 한다는 것은 특정 기술의 종속되지 않는 것을 의미한다. Controller(프레젠테이션 계층), Repository(데이터 접근 계층)은 기본적으로 특정 기술의 어느 정도 종속되어 있다. Controller는 HTTP 기반 REST API에서 GRPC 같은 기술로 변경하면 코드 수정이 필요하고, Repository도 DB 접근 기술이 변경되면 어노 정도 변경이 필요하다. (JDBC에서 JPA 변경하는 등..)
역설적으로 이런 기술 종속에 대한 변경은 다른 계층에서 담당하게 되니 서비스는 그만큼 순수하게 유지될 수 있다. 이것이 계층을 나눈 핵심 포인트가 될 수 있다.
정리
"각각의 역할에 맞게 관심사를 분리" 계층을 나누는 이유이다. 즉, 각각의 계층(객체)이 본인의 역할 명확해지고 본인 영역에 대한 책임만 가지면 되니 특정 계층에 영향을 미치지 않고 순수하게 관리될 수 있다.
이러한 관리로 인해 개발자들은 업무를 수월하게 분담할 수 있고, 강한 연관성에서 발생되는 위험에서 벗어날 수 있게 된다. 프로젝트 관점에서도 유지보수 및 확장에서도 용이해질 수 있게 된다.
Reference
김영한 님의 강의 - 스프링 DB 1 편 강좌 참고
https://youwjune.tistory.com/40
'Framework > Spring' 카테고리의 다른 글
[스진초5기/Spring] 스프링 3계층과 DI의 관계 (0) | 2023.11.05 |
---|---|
[스진초5기/Spring] 그래서 Controller가 뭐야? (1) | 2023.11.03 |
[스진초5기/Spring] IoC, DI 정리 (0) | 2023.10.30 |
[Spring] 로그를 남겨주는 라이브러리 - Logback (0) | 2023.10.13 |
[Spring] REST API를 명세하는 방법 - Swagger (1) | 2023.10.11 |