Spring
[Spring] MVC1, MVC2, Spring MVC 정리
하부루
2024. 6. 13. 00:00
1. MVC의 개념
- Model, View, Controller로 역할별로 분리한 디자인 패턴
- MVC패턴을 통해 UI 영역과 비즈니스 로직 영역으로 구분되어 서로에게 영향을 주지않으면서 개발 및 유지보수가 가능
- Model: 사용자가 원하는 데이터나 정보를 제공
- View: 사용자에게 보여지는 화면을 출력
- Controller: 사용자의 요청 처리 및 전체적인 흐름 제어
2. MVC 1
- 모든 클라이언트의 요청과 응답을 JSP가 담당
- JSP가 Controller와 View의 기능을 모두 담당하는 구조
- 구현 난이도가 쉽지만 복잡해질수록 유지보수가 힘들다
장점 과 단점
- 장점
- 간단하고 쉽게 구현할 수 있다
- 빠르게 개발할 때 유용하다
- 단점
- 규모가 커지고 복잡해질수록 유지보수가 힘들다
- 유연성이 떨어지고 확장하기 어렵다
3. MVC 2
- MVC 2 패턴는 표준으로 사용되는 패턴이다
- 요청을 컨트롤러(서블릿)가 담당
- Controller와 View가 분리되어 있다
장점 과 단점
- 장점
- M, V, C 가 분리 되어있어 수정해야 할 부분이 있다면, 필요한 부분만 꺼내서 수정가능
- 각 컴포넌트를 독립적으로 테스트 할 수 있으므로 테스트 용이성이 높다
- 유지 보수성이 좋고 재사용성이 좋다
- 단점
- MVC 1 보다 구현이 복잡할 수 있다
- 작은 규모의 프로젝트에 적용하기엔 오버일 수 있다
4. MVC 1 과 MVC 2의 차이점 정리
- 요청을 누가 처리하냐에 차이
- MVC 1 에서는 Controller(JSP)가 요청을 처리
- MVC 2 에서는 Controller(Servelt)가 요청을 처리
- Controller와 View가 분리가 되었는가
- MVC 1 에서는 Controller + View를 JSP가 혼자 담당
- MVC 2 에서는 Controller 와 View를 분리
5. Spring MVC
우선 Front Controller의 개념을 알아보자
[Front Controller]
* 위의 사진은 Front Controller가 적용 되지 않았을 때 컨트롤러가 호출되는 방식이다.
* 컨트롤러가 클라이언트의 요청을 받을 때 중복되는 코드가 발생할 수 있다.
* FrontController가 클라이언트와 Controller 사이에서 공통된 요소를
FrontController가 담당하게 된다면 FrontController가 요청에 맞는
컨트롤러를 찾아서 호출하면 된다.
* 스프링 MVC의 DispatcherServlet이 FrontController 패턴으로 구현 되어있다.
6. Spring MVC의 요청 처리 흐름 설명
- DispatcherServlet: 클라이언트에게 요청을 받아 응답까지의 MVC 처리과정을 통제
- HandlerMapping: 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정
- HandlerAdapter: HandlerMapping에서 결정된 핸들러 정보로 해당 메소드를 직접 호출하는 역할
- ViewResolver: Controller의 처리 결과(데이터)를 생성할 view를 결정
1. 클라이언트는 URL을 통해 요청을 전송
2. 디스패처 서블릿은 핸들러 맵핑을 통해 해당 요청이 어떤 컨트롤러에 적용할지 결정
3. 디스패처 서블릿은 핸들러 어댑터에게 요청의 전달을 맡긴다
4. 핸들러 어댑터는 해당 컨트롤러에 요청을 전달한다
5. 컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환한다
6. 디스패처 서블릿은 뷰 리졸버를 통해 반환할 뷰를 찾는다
7. 디스패처 서블릿은 뷰에 전달할 데이터를 추가한다
8. 데이터가 추가된 뷰를 사용자에게 반환한다
7. HandlerMapping 과 HandlerAdapter
HandlerAdapter의 존재 이유?
- 스프링에서는 개발자에게 핸들러(컨트롤러)를 구성할 수 있는 여러가지 방식을 지원한다.
- @RequestMapping, HttpRequestHandler 상속, Controller 인터페이스 상속 등 다양한 방식이 있는데, 각각 방식을 수행하기 위해 그에 맞는 핸들러 어댑터를 미리 구현해 두고, 필요한 어댑터를 사용한다.MVC의 개념
HandlerMapping 란?
- 요청된 URL에 매핑된 핸들러(컨트롤러)를 조회
- @RequestMapping이 가장 일반적, @GetMapping, @PostMapping등은 구체적인 매핑 제공
- 더 구체적인 URL 패턴을 가진 핸들러 메서드가 일반적인 패턴의 메서드보다 우선이 된다
특정 핸들러 메서드 레벨의 매핑 순위
- /users/123와 같은 요청이 들어올 때 /users/{userId}가 더 구체적인 패턴이므로 첫 번째 메서드 getUser가 호출된다.
- /users/abc와 같은 요청은 두 번째 메서드 getAnyUser에 매핑되며, /anyOtherPath와 같은 요청은 세 번째 메서드 getAll에 매핑된다.
@Controller
public class UserController {
// 우선순위 1: 더 구체적인 URL 패턴
@GetMapping("/users/{userId}")
public String getUser(@PathVariable String userId) {
return "user";
}
// 우선순위 2: 덜 구체적인 URL 패턴
@GetMapping("/users/*")
public String getAnyUser() {
return "anyUser";
}
// 우선순위 3: 더 일반적인 패턴
@GetMapping("/**")
public String getAll() {
return "all";
}
}