스프링부트에서 spring-boot-starter-web 모듈을 사용하면 기본적으로 톰캣(Tomcat)을 사용하는 스프링 MVC 구조를 기반으로 동작한다. MVC 패턴은 개발자 면접에서도 자주 묻는 개념이기도 하니 확실히 이해하고 넘어가자!
MVC는 Model-View-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나이다. 이 패턴은 애플리케이션을 세 가지 구성 요소로 나누어 개발하는 방법을 제시한다.
☝ MVC 패턴을 설명할 때 가장 많이 인용되는 사진이다.
사진에서도 알 수 있듯, MVC 패턴은 Model(모델), View(뷰), Controller(컨트롤러)라는 개념으로 역할을 나누어 일련의 작업을 처리하는 방법이다. 세 가지 개념에 대해 더 자세히 알아보자.
예를 들어, Controller에서 받은 데이터를 가공해 담는 역할이라고 볼 수 있다. 즉, 값과 기능을 가지는 객체라고 보면 된다. 일반적으로 자바 안에서 Model이란 엔티티나 DTO, VO와 같은 데이터 객체를 말하며, 이 객체들은 주로 비즈니스 로직을 처리하거나 애플리케이션의 상태를 나타낸다.
View의 역할은 간단히 말해 두 가지다. 첫 번째는 사용자에게 정보를 표시하는 것, 두 번째는 사용자의 입력을 받아 Controller에게 전달하는 것이다. 주로 웹 애플리케이션에서는 HTML, CSS, JavaScript 등을 통해 데이타를 기반으로 사용자들이 볼 수 있는 화면을 구성한다.
컨트롤러는 사용자로부터 들어오는 요청에 따라 적절한 비즈니스 로직을 통해 결과를 Model에 저장하고, 이를 View에 전달해줘야 하는 임무를 맡고 있다. Model과 View가 각각의 역할만 수행한다면, 컨트롤러는 이 둘 사이를 중재하고 결합해주기 때문에 MVC 패턴에서 가장 중요한 역할이라고 할 수 있다.
MVC 패턴의 작동 방식은 사용자 요청 처리와 사용자 입력 처리, 두 가지로 나눌 수 있다.
- 사용자가 애플리케이션에 요청을 보내면, Controller가 이 요청을 받는다.
- Controller는 받은 요청에 따라 필요한 데이터 처리나 비즈니스 로직 실행을 위해 Service를 호출한다.
- Service는 필요한 작업을 수행하고, 이를 위해 필요한 데이터를 Repository를 통해 데이터베이스에서 가져온다.
- Service가 처리한 데이터는 Model에 담겨서 다시 Controller로 반환되고, Controller는 이를 View에 전달한다.
Flow: User Request -> Controller -> Service -> Repository -> Model -> Controller -> View
- 사용자가 View에 데이터를 입력하면, View는 사용자의 입력을 Controller에 전달한다.
- Controller는 받은 입력을 처리하기 위해 Service를 호출하고, 필요한 데이터를 Repository를 통해 데이터베이스에서 가져온다.
- Service는 데이터를 가공하거나 비즈니스 로직을 실행한 후, 결과를 Model에 담아 다시 Controller로 반환한다.
- Controller는 반환된 Model을 View에 전달하여 사용자에게 업데이트된 정보를 보여준다.
- View는 Model로부터 받은 데이터를 사용자에게 표시한다.
Flow: User Input -> View -> Controller -> Service -> Repository -> Model -> Controller -> View
이렇게 사용자의 요청을 처리하고, 사용자의 입력을 받아 처리하는 과정에서 Controller는 Service와 Repository를 중계하여 데이터를 처리하고 Model에 전달한다. 그 후 Model은 View를 통해 사용자에게 결과를 보여주는 역할을 한다.
지금까지 MVC 패턴의 이론에 대해 알아보았다. 그러나 실전에서 MVC 구조로 개발을 한다면 이 규칙들을 잘 따라야 한다. 지금부터 MVC 실전 규칙에 대해 알아보자.
- Model은 Controller와 View에 의존하지 않아야 한다.
○ Model 내부에 Controller와 View에 관련된 코드가 있으면 안 된다.- View는 Model에만 의존해야 하고, Controller에는 의존하면 안 된다.
○ View 내부에 Model 코드가 있을 수 있고, Controller 코드가 있어서는 안 된다.- View가 Model로부터 데이터를 받을 때는, 사용자마다 다르게 보여주는 데이터에 한해서 받아야 한다.
- Controller는 Model과 View에 의존해도 된다.
○ Controller 내부에는 Model과 View의 코드가 있을 수 있다.- View가 Model로부터 데이터를 받을 때는 반드시 Controller에서 받아야 한다.
그동안 MVC 패턴에 대해 모호한 부분이 많았는데 전반적인 흐름과 각 요소의 특징에 대해 잘 알게되어 기쁘다. 앞으로는 MVC 패턴에 관한 질문이 들어왔을 때 잘 대답할 수 있을 것 같다!