Spring Boot

Spring MVC 패턴

stophyeon 2024. 1. 5. 15:30
728x90

MVC가 필요하 이유

MVC란 MVC 패턴이라는 디자인 패턴입니다.

Application을 개발할 때 Model / View / Controller로 3가지로 분리해서 개발하는 것입니다.

먼저 MVC패턴이 필요한 이유를 설명하기 위해 Application의 동작과정을 살펴보겠습니다.

 

1. Client(User)의 요청(Request)

Client는 웹/앱을 사용해 서비스를 제공 받을 때 항상 요청을 하고 요청 사항에 따라 사용자가 원하는 데이터를 보여주고
추가하는 것이 웹 서비스의 전부입니다.
예를 들어 사용자가 로그인 버튼을 누른다면 로그인 요청을 처리하기 위해 서버의 DB에서 해당 아이디와 비밀번호가 일치하는지 확인하는 작업을 수행한 뒤 사용자에게 로그인을 한 상태의 페이지를 제공합니다. 

 

2. Client에게 응답(Response)

Client가 요청을 했다면 Application은 사용자의 요청에 따른 작업을 처리한 뒤 처리한 결과를 사용자에게 보여줘야 합니다. 결과를 보여주는 것을 응답이라고 합니다.

 

위 과정을 보면 개발자가 하는 일은 사용자의 요청을 받고 요청에 따른 작업을 처리하는 서비스를 만드는 것입니다.

그런데 만약 개발자가 서비스를 개발할 때 요청을 처리하는 모든 부분에 요청을 받는 부분이 필요합니다.

그렇다면 중복된 코드가 늘어나고 코드를 수정할 때도 모든 부분을 수정해야 합니다.

위 문제를 효과적으로 해결하는 것이 MVC 패턴입니다.

 

MVC 패턴이란

MVC패턴이란 역할을 나눠서 각 역할에 해당하는 부분만 만드는 것입니다.
사용자의 요청을 받는 부분을 개발할 때는 요청을 받는 기능만을 개발하고 요청을 처리하는 부분을 개발할 때는 요청을 처리하는 부분만 개발하고, 사용자에게 응답을 주는 부분은 응답을 전달하는 기능만을 개발하는 것입니다.
이렇게 되면 중복된 코드도 줄어들고 코드를 수정할 때도 수정을 해야할 부분만 수정하면 됩니다.

MVC 패턴은 Model/ View /Controller의 앞글자만 따서 명명한 것입니다.
Model은 사용자의 요청을 처리하는 부분,
View는 사용자의 요청에 응답을 하는 부분,
Controller는 사용자의 요청을 어디서 처리할지 구분해주는 부분입니다

하지만 SPA Application을 개발한다면 View에서 하는 작업을 front-end에서 하기 때문에
Back-end는 데이터를 전달해주기만 해도됩니다. 
즉, 백엔드 서버는 필요한 데이터를 JSON형태로 전달해주는 역할만 수행합니다.  

 

Spring MVC 구조

 

위 이미지가 MVC 패턴이 적용된 Spring Application에서 사용자의 요청을 처리하는 과정을 나타낸 것입니다.

구성 요소를 하나씩 살펴보겠습니다.

1. Front Controller(Dispatcher Servlet)

가장 먼저 사용자의 요청을 받는 부분입니다. 
사용자의 요청을 보고 어떤 Controller에서 처리하는 요청인지 판단한 뒤 해당 Controller에 요청을 전달합니다.
이 부분은 개발자가 직접 개발하는 것이 아닌 Spring 프레임워크에 정의되어 있습니다.
사용자의 요청을 구분하는 방법은 URI를 통해 구분합니다.

2. Controller

Front Controller에게 요청을 전달받았다면 요청을 처리하기 위한 비즈니스 로직을 호출하는 부분입니다.
비즈니스 로직은 쉽게말해 요청을 처리하는 부분을 말합니다. 여기서는 Service,Repository,DB가 해당합니다.
여러개의 Controller 객체안에 여러개의 Service 객체가 있는 것입니다. 해당요청을 어떤 Service에서 처리할지도 URI를 사용해서 구분합니다.

3. Service

이 부분부터 사용자의 요청을 처리합니다.
거의 대부분의 사용자의 요청은 DB에게 요청을 하는 것입니다. 하지만 사용자의 요청은 DB에게 바로 요청을 할 수 없습니다. 또한 DB에서 추출한 데이터를 가공해서 사용자에게 응답을 해야합니다. Service부분은 요청을 DB에게 전달하기 위해 요청을 가공하고,요청을 처리한 데이터를 가공하는 부분입니다.

4. Repository(DAO)

DB에 가장 가까이 있는 클래스입니다. 
DB에 직접 접근하는 객체로 서비스와 DB를 실질적으로 연결하는 부분입니다. 
즉, DB의 데이터에 CRUD(Create/Read/Upadate/Delete)기능을 합니다.

5. Entity(Domain)

DB의 Table을 정의하는 부분입니다.
Table의 연관관계, Attribute값을 정의합니다. 
DB를 Spring에서 직접 정의할 수 있는 부분이라고 생각하시면 됩니다.

6. DataBase

DB는 데이터들을 저장한 공간입니다
(자세한 설명은 RDBMS 카테고리에 있습니다)

7. DTO

DTO는 각각의 객체들이 요청을 전달할 때 캐리어 역할을 하는 클래스입니다.
사용자의 요청을 DTO에 담아서 각 클래스에게 전달할 대 DTO를 넘겨주는 것으로 요청을 넘겨주는 것과 같은 효과를 냅니다.

 

위 7개 클래스중 Front Controller를 제외한 6개의 클래스는 개발자가 서비스에 맞게 직접 개발합니다.

앞으로 위 6개 클래스를 개발하는 방법을 알아보겠습니다. 

'Spring Boot' 카테고리의 다른 글

RestController  (0) 2024.01.07
Controller  (0) 2024.01.07
Spring Boot - PSA  (0) 2023.07.28
Spring Boot - AOP  (0) 2023.07.24
Spring Boot 중요 개념-IoC,DI  (0) 2023.07.21