study/summary
Spring 기초 3주차
으녕오리
2024. 11. 20. 11:40
Chapter 1: MVC 패턴
- Template Engine
- 동적인 웹 페이지를 생성하기 위해 사용되는 도구
- UI(User Interface)를 만들며, SSR에 사용된다.
- HTML 문서에 동적으로 변경해야 하는 부분만 코드를 넣을 수 있게 하기 위해
- ex) Thymeleaf, JSP
- MVC 패턴 개요
- Servlet이나 JSP만으로 처리하기는 부담이어서 고안된 패턴이다.
- Web Application은 일반적으로 MVC 패턴을 사용한다.
- Servlet만 사용 -> 문제점 : Servlet은 View 영역과 비즈니스 로직이 섞여있다.
- JSP만 사용 -> 문제점 : JSP는 Servlet 코드에서 View만 분리되었다.
- MVC(Model, View, Controller) 패턴
- 하나의 Servlet이나 JSP로 처리하던 것들을 Model, View, Controller 영역으로 나눈 것
- 비즈니스 로직과 View를 완전히 분리시킴
- Controller
- Servlet에 해당하는 영역
- HTTP Request를 전달받아 파라미터를 검증한다.
- 비즈니스 로직을 실행(Layered Architecture)
- Service Layer - 비즈니스 로직
- Repository Layer - Database와 상호작용
- View에 전달할 결과를 조회하여 Model 객체에 임시로 저장한다.
- Model : View에 출력할 Data를 임시저장
- View
- JSP에 해당하는 영역
- Model 객체에 담겨져 있는 Data를 사용하여 화면을 Rendering
- MVC 패턴이 적용된 Servlet, JSP (실습)
- @ServletComponentScan : application이 실행될 때 Servlet을 Servlet Container에 등록해준다.
- MVC 패턴의 문제점
- Controller에 여전히 문제 있음
- View로 이동하는 forward가 항상 중복 호출된다.
- View의 path를 입력(중복 작업)한다.
- HttpServletResponse 객체를 사용하는 경우가 적다. (JSP에서 모두 해결하기 때문)
- ★ 공통 기능(모든 컨트롤러에서 공통으로 적용되는 기능)이 추가될수록 Controller에서 처리해야 하는 부분들이 많아진다.
-> 프론트 컨트롤러 패턴으로 해결!
- Controller에 여전히 문제 있음
- 프론트 컨트롤러 패턴
- Servlet(Controller)이 호출되기 전에 공통 기능을 하나의 Servlet에서 처리해주는 패턴이다.
- Controller Mapping(요청을 처리할 수 있는 Controller를 찾아서 호출) 역할을 한다.
- ★ 프론트 컨트롤러를 제외한 나머지 컨트롤러는 Servlet을 사용하지 않아도 된다.
- 모든 컨트롤러에서 같은 형태의 응답을 하는 것은 아니다
-> 어댑터 패턴으로 해결!
- 어댑터 패턴
- 다양한 컨트롤러(Handler)를 유연하게 만들기위해 어댑터 패턴을 도입하게 되었다.
- 서로 다른 인터페이스를 갖는 두 클래스를 연결해주는 패턴이다.
- 프론트 컨트롤러, 어댑터, 핸들러(컨트롤러) 모두 각자의 역할만 수행한다. (책임 분리)
- 공통 로직의 변경이 발생 x
- 정리
- Servlet : 비즈니스 로직 코드와 View 코드가 함께 존재
- JSP : View는 분리했지만 여전이 비즈니스 로직이 포함되어 있음
- MVC 패턴 : 공통 로직을 처리하는 것에 코드가 중복됨
- 프론트 컨트롤러 패턴 : 각각의 핸들러 호출 후에 다른 형태의 응답이 발생됨
- Spring MVC : 현재 사용됨, MVC패턴 + 프론트 컨트롤러 패턴 + 어댑터 패턴
Chapter 2: Spring MVC
- Spring MVC 구조
- DispatcherServlet : Spring의 프론트 컨트롤러
- View : 인터페이스로 구성되어 있다, 확장성을 가지고 있다.
- Handler -> 비즈니스 로직만 처리하면 된다.
- 실행순서

- ★ Dispatcher Servlet(Servlet의 한 종류이다.) : Spring MVC의 프론트 컨트롤러
- IntelliJ Class Diagram
- ***Spring Boot는 Dispatcher Servlet을 서블릿으로 자동으로 등록(내장 Tomcat WAS를 실행하면서 등록한다)하고
모든 URL 경로에 대해서 Mapping 한다. -> (urlPatterns="/")
- ***Spring Boot는 Dispatcher Servlet을 서블릿으로 자동으로 등록(내장 Tomcat WAS를 실행하면서 등록한다)하고
- DispatcherServlet의 service()
- Servlet이 호출되면 HttpServlet이 제공하는 service()가 호출된다.
- Spring MVC는 service()를 Override 해두었다.
- DispatcherServlet.doDispatch()가 호출된다.
- IntelliJ Class Diagram
- Spring MVC의 주요 Interface
- ***Spring MVC는 기능들이 대부분 Interface로 만들어져 있기 때문에,
DispatcherServlet 코드의 변경 없이 기능변경 및 확장이 가능하다. - 인터페이스를 implements하여 구현하면 내가 만든 클래스를 사용할 수 있다. (다형성)
- 아래의 것들은 모두 interface로 구성되어 있다.
- HandlerMapping
- HandlerAdapter
- ViewResolver
- View
- ***Spring MVC는 기능들이 대부분 Interface로 만들어져 있기 때문에,
- Controller Interface
- Controller Interface를 implements하여 구현하게 되면 원하는 Controller(Handler)를 사용할 수 있게 된다.
- @Component : Spring Bean(애플리케이션의 구성 요소를 정의하는 객체)에 등록하는 역할을 한다.
-> 마치 Servlet이 Servlet Container에 등록되는 것과 같다. - ExampleController의 호출 방법
- Handler Mapping과 Handler Adapter를 통해(Spring Boot가 구현해놓음)
- Handler Mapping
- ExampleController를 찾는다.
- Handler Adapter
- Handler Mapping을 통해 찾은 핸들러를(=Controller Interface를)
실행할 수 있는 Handler Adapter를 찾고 실행한다.
- Handler Mapping을 통해 찾은 핸들러를(=Controller Interface를)
- Handler Mapping
- Handler Mapping과 Handler Adapter를 통해(Spring Boot가 구현해놓음)
- Spring Boot의 Handler Mapping, Handler Adapter
- Handler Mapping
- RequestMappingHandlerMapping
- HandlerMapping에서 우선순위가 가장 높다.
- Annotation 기반 Controller의 @RequestMapping에서 사용
- RequestMappingHandlerMapping
- Handler Adapter
- RequestMappingHandlerAdapter
- Annotation 기반 Controller의 @RequestMapping에서 사용
- RequestMappingHandlerAdapter
- Handler Mapping
- HttpRequestHandler로 알아보는 Spring MVC 동작 순서
- View Resolver
- 반환된 ModelAndView 객체를 알맞은 View로 전달하기 위해 DispatcherServlet에서 ViewResolver를 호출하여 View 정보를 설정
- View의 논리 이름을 물리 이름으로 전환하는 역할을 수행하고,
Rendering 역할을 담당하는 View 객체를 반환
- Spring Boot의 ViewResolver
- BeanNameViewResolver
- InternalResourceViewResolver : application.properties 설정 파일에 등록한 prefix, suffix 설정 정보를 사용하여 ViewResolver 등록
- InternalResourceViewResolver로 알아보는 Spring MVC 동작 순서