Spring에서 프로젝트를 시작하면, 항상 Controller, Service, Repository를 너무 당연하듯 분리하곤 한다.
하지만, 이에 대해 왜 이렇게 분리하는지 생각해 본 적 있는가?
이번 포스트를 통해 Controller, Service, Repository에 차이에 대해 명확히 알아가는 시간을 가져 보려고 한다.
MVC 패턴이란?
MVC 패턴이란, 사용자 인터페이스로부터 비즈니스 로직을 분리하여, View - Controller - Model의 3가지로 분류하는 패턴이다. 그렇다면, MVC 패턴은 왜 등장했을까?
MVC 패턴이 등장하기 이전에, Spring 에서는 JSP를 사용하곤 했었다.
이는 Controller 영역에 View 영역을 같이 구현하는 방식이며, 사용자의 요청을 JSP가 전부 처리하는 방식이었다.
이렇다 보니, Controller 로직에 View 로직이 함께 존재하니까 JSP 파일에 대한 비중이 너무나도 커졌고, 유지보수와 확장이 어려워졌다.
이러한 문제점을 해결하고자 MVC 패턴이 등장했다.
MVC 패턴의 가장 큰 의의는 화면에 보여주는 View의 영역과 실제로 사용자의 역할을 처리하는 Business 로직을 분리함으로써 각 파일의 책임을 분산시켜 더욱 변경과 확장에 용이한 코드 설계가 가능하게 했다는 점이다.
1. Controller
Controller란, Spring의 4계층 구조에서 Presentation Layer(tier)를 담당하며, 주로 사용자의 요청을 받아 Service Layer에 처리를 위임하고 이에 대한 처리 결과를 View를 통해 반환하는 역할을 한다.
- 사용자에게 UI나 클라이언트에게 Response를 보내는 역할을 하는 모든 클래스를 포함한다.
- Client로부터 request를 받고 response를 하는 모든 API를 담는다.
컨트롤러는 모델이나 뷰에 대해서 알고 있다. 모델이나 뷰는 서로의 존재를 모르지만, 변경 사항이 있을 경우 외부로 알리고 수신한다. 이는 컨트롤러가 이를 중재하기 때문이다. 따라서 컨트롤러는 모델이나 뷰에 대한 사항에 대해 알고 있어야 한다.
다시 언급하지만, MVC 패턴에서 가장 중요한 점은 Model과 View는 서로의 존재를 몰라야 한다는 점이다. 결국 Controller를 통해 비즈니스 로직과 View 모델 사이의 징검다리 역할을 잘 수행하도록 하는 것이 MVC 패턴을 구현하는데 있어 핵심이라고 할 수 있겠다.
2. Service
Service란, Spring의 4계층 구조에서 Application Layer(응용 계층)를 담당하며, 주로 서비스의 비즈니스 로직을 정의하는 Layer의 역할을 담당한다.
- 애플리케이션의 Business Logic을 포함하며 사용자의 요청을 이행하기 위해 도메인 객체들이 협력하여 요청을 수행하도록 조정할 책임이 있다.
- Service는 Controller와 도메인 레이어 사이에 추상화 계층을 제공한다.
- Controller가 요청된 작업을 수행하기 위해 호출할 수 있는 메소드 집합을 제공한다.
- 사용자로부터 전달받은 데이터를 가공하여 처리해 줍니다. JpaRepository를 상속하는 객체를 가져와 어떤 처리를 할지 비즈니스 로직을 처리합니다.
3. Repository
Repository란, Spring 4계층 구조에서 Infrastructure Layer(인프라 계층)을 담당하며, 주로 외부와의 통신(DB, 메세징 시스템)을 담당한다.
- 해당 계층에서 얻어온 정보를 Application Layer이나 Domain Layer에 전달하는 역할을 한다.
특히 JPA를 활용하는 경우, JpaRepository를 extends 하는 Repository 클래스를 만들면, 기본적인 CRUD를 제공해 준다.
어제 작성했던 DDD의 Layered Architecture에 고민했던 내용을 보니, 비로소 Controller, Service, Repository의 차이점이 너무나도 당연하고 명확해지는 것을 느꼈다. 더욱 자세한 내용은
https://youwjune.tistory.com/38 해당 포스팅을 통해, Spring의 Layered Architecture에 대해서 공부하다 보면,
왜 Layered Architecure를 사용하는지, 왜 MVC 패턴이 등장하게 되었는지에 대한 이해를 저절로 얻어가게 될 것이다.
그 이유를 이해한다면, Controller, Service, Repository에 대한 이해가 자연스럽게 될 것 같다!
출처
'CS > Spring' 카테고리의 다른 글
[Spring] DI의 세 가지 방법(필드 주입, 생성자 주입, setter 주입) (0) | 2023.04.21 |
---|---|
[Spring] 스프링에서 빈 객체를 등록하는 방법(@Bean, @Component) (0) | 2023.04.14 |
[Spring] 비즈니스 로직이란? (0) | 2023.04.08 |
[Spring] Entity, DTO, VO 무슨 차이야? (0) | 2023.04.07 |
[Spring] DI와 IOC에 대해서 (0) | 2023.04.05 |