MVC 패턴
: 애플리케이션의 구조를 Model - View - Controller 세가지 역할로 분리하는 디자인 패턴
Model
- 데이터와 비즈니스 로직을 처리
- 도메인 영역 (비즈니스 로직을 포함하는 객체, 엔티티)
(Controller-Service-Repository 패턴에서는 Model을 더 세분화하여 Service와 Repository로 분리)
즉, Service와 Repository가 Model의 역할을 분리해서 수행 (비즈니스로직처리와 DB데이터처리)
- DB와의 상호작용을 담당
- 애플리케이션의 핵심 기능을 구현
View
- 사용자에게 데이터를 표시
- Model에서 가져온 데이터를 UI에 출력
- HTML, JSP, Thymeleaf 등
Controller
- 사용자의 요청을 받아 Model과 View를 연결
- Model을 호출하여 필요한 데이터를 가져오고 View에 데이터를 전달
스프링에서의 MVC 패턴은 SpringWebMVC 모듈로 구현된다.
Spring WebMVC 모듈
- Spring Web의 하위 모듈로, Spring MVC 아키텍쳐를 구현하는데 필요한 모든 기능을 제공
- 구성 요소
- DispatcherServlet : 모든 HTTP 요청을 중앙에서 처리하는 서블릿
- Controllers : 사용자의 요청을 처리하고, Model을 호출하고, 적절한 뷰로 데이터를 전달
- Models : 컨트롤러와 뷰 간에 데이터를 전달하는 객체
- Views : 사용자에게 데이터를 표시하는 역할
- ViewResolvers : 논리적인 뷰 이름을 실제 뷰 리소스로 매핑
- Handler Mappings : 특정 URL 패턴을 처리할 컨트롤러 메서드와 매핑 (@RequestMapping, @GetMapping 등의 어노테이션)
@Controller 기반의 동작 방식

1. 클라이언트의 HTTP 요청이 내장 서블릿 컨테이너인 tomcat을 통해 DispatcherServlet에게 전달된다.
2. DispatcherServlet은 해당 요청을 분석하고, HandlerMapping을 통해 적절한 컨트롤러를 찾는다.
3. HandlerAdapter가 컨트롤러를 실행할 수 있도록 지원.
4. HandlerAdapter가 컨트롤러의 메서드를 호출하고, ModelAndView를 반환.
5. DispatcherServlet이 ViewResolver.resolveViewName()을 호출하여 View를 결정.
6. ViewResolver가 해당 View 객체를 반환.
7. DispatcherServlet이 View의 render(model)을 호출하여 렌더링.
8. 최종적으로 클라이언트에게 HTML 응답을 반환.
@RestController 기반의 REST API 동작 방식
- @RestController는 기본적으로 @Controller + @ResponseBody의 역할을 하며, ViewResolver 없이 JSON 데이터를 반환

- 스프링을 시작하면, 같은 패키지 내의 @Controller, @Service, @Repository 같은 Bean을 IoC 컨테이너에 등록.
-> 생성자 주입을 통해 의존 관계를 자동으로 설정.
- 클라이언트가 데이터를 담아 요청을 보냄 (ex: JSON).
- Tomcat이 요청을 받아 DispatcherServlet에 전달.
- DispatcherServlet이 HandlerMapping을 통해 적절한 컨트롤러를 찾음.
- HandlerAdapter가 컨트롤러의 메서드를 실행.
- 컨트롤러는 Service를 호출하여 로직을 처리한 후, JSON 데이터를 반환.
- Spring의 HttpMessageConverter가 객체를 JSON으로 변환.
- 최종적으로 클라이언트에게 JSON 응답을 반환.
API
- API는 너가 이런 경로에 대해 이런 요청을하면 이런 응답을 줄거야!의 약속 - Controller에 포함, swagger로 문서화할 수 있다.
- API 설계를 먼저 하고, Controller에 이를 표현하고, 그 기능을 만들기 위해 Service를 구현 -> 데이터에 접근하기 위해 Repository 구현하는게 가장 좋은 개발 순서이다.
참고 - https://minho-jang.github.io/development/20/