본문으로 바로가기

[Spring] 스프링 웹 MVC - 1

category Spring 2021. 7. 27. 16:28

https://www.inflearn.com/course/%EC%9B%B9-mvc

 

스프링 웹 MVC - 인프런 | 강의

이 강좌는 자바 서블릿(Servlet) 기반의 MVC 프레임워크인 스프링 웹 MVC(이하 스프링 MVC)에 대해 학습합니다., 스프링 웹 MVC 이 강좌는 자바 서블릿(Servlet) 기반의 MVC 프레임워크인 스프링 웹 MVC(이하

www.inflearn.com

ㅁ 스프링 MVC 동작 원리

ㅇ 스프링 MVC 소개

- 스프링 4.3 부터 @GetMapping 이 @RequestMapping(method = {RequestMethod.GET}) 포함함

- lombok을 통해 getter,setter 뿐만 아니라 생성자도 설정 가능

@Getter @Setter
@Builder @NoArgsConstructor @AllArgsConstructor
public class Event {

- 뷰에서 <td th:text="${event.name}">안 나올때 나오는 값</td> 로 thymeleaf 로 모델 값 호출

 

ㅇ 서블릿 소개

- 서블릿은 요청에 대해 쓰레드를 생성해서 처리하기 때문 빠름

- init, doGet, destory

 > 서블릿 컨테이너에 서블릿 객체가 생성되면 init 실행

 > 이후 객체가 계속 존재하면 doGet 메소드로 요청 처리

 > 객체 사라질때 destroy 진행

 

- <scope>provided</scope> 는 war 패키징에는 포함되지 않음,

  왜냐면 컨테이너에서 제공이 됨

servlet-api dependency 를 provided 로 scope 를 설정하면 소스코드 작성시에는 관련 dependency 들을 사용할 수 있지만,
war 패키징시에는 관련 dependecy 는 빠진채로 패키징이 된다.
그렇지만 해당 war 파일을 서버사이드의 톰캣 위에서 돌리게 될테니 톰캣에서 servlet-api dependecy 들을 제공해준다.

 

ㅇ 서블릿 리스너와 서블릿 필터

- 서블릿 리스너 : 웹 애플리케이션에서 발생하는 주요 이벤트를 감지하고 각 이벤트에 특별한 작업이 필요할때 사용

 > 총 4가지 이벤트가 있음 ( 컨텍스준 수준  / 세션 수준 : - 라이프사이클, 애트리뷰트 ) 

 > 서블릿 컨테이너 상위에서 처리함 (서블릿이 실행되기 전에 처리)

 

- 서블릿 필터 : 들어온 요청을 특정 서블릿으로 보내고, 특정 url 패턴에 특정한 작업을 할 수 있음, 체인 구조임

 > 서블릿 혹은 url에 적용 가능

 > 여러 서블릿으로 전달하려면 url 패턴으로 진행

 

ㅇ 스프링 IoC 컨테이너 연동

- ContextLoaderListener : 서블릿 컨텍스트에 라이프사이클에 맞춰서 application Context를 binding 함

 > 스프링 설정파일이 있어야 applicationcontext를 생성할 수 있음

- DispatcherServlet은 ROOT WebApplicationContext를 상속 받는 Servlet Application Context를 만듬

 > Root WebApplicationContext는 공용으로 쓸 수 있는데, 상속 받은 Application Context는 DispatcherServlet에서만 사용 가능

 > Root WebApplicationContext에는 Web과 관련된 bean 은 등록되지 않음

   >> Repository, Service 정도만

 > Servlet WebApplicationContext에는 Controller , ViewResolver, handlerMapping 등이 있음

 

ㅇ 스프링 MVC 연동

- 위에는 서블릿 애플리케이션에 스프링 IOC 컨테이너를 연동하여, applicationContext에 등록된 bean을 사용함

- 계층 구조를 통해 context를 두개 만들고 , Root와 sevlet으로 나누어 등록하여 진행

- 최근에는 DispatcherServlet 에서 하나의 context를 생성하여, 여기에 모든 bean을 등록하여 진행함

- 서블릿 컨테이너가 먼저 뜨고, 스프링을 web에 연동함

 > 서블릿 컨텍스트안에 스프링이 등록됨

 ( 톰캣 안에 스프링이 있음 )

- 부트의 경우, spring boot application이 먼저 기동 되고, 그 안에 톰캣이 내장서버로 뜸

 > 서블릿을 코드로 톰캣에 등록함

 > 스프링이라는 자바 어플리케이션 안에 , 톰캣이 들어감

 

ㅇ DispatcherServlet 

- handlermapping 은 기본적으로 beanNameUrlHandlerMapping과 RequestMappingHandlerMapping이 있음

- @RestController = @Controller + @ResponseBody

- DispatcherServlet의 initStrategies 메소드에 ViewResolver , HandlerMapping등을 전부 실행한다.

 >  로직에 Strategy pattern 전략 패턴이 들어가있음

- InternalResourceViewResolver 에 suffix, prefix 추가

 

ㅇ 스프링 MVC 구성 요소 (DispatcherServlet 이 사용하는 인터페이스 요소)

- DispatcherServlet의 initStrategies 메소드 에서 init 하는 것들

- MultipartResolver : HttpServletRequest 를 MultipartHttpServletRequest 로 변환

 > MultipartResolver에 대한 bean을 DispatcherServlet이 따로 등록해주지 않음 (Spring Boot에서는 Standard~ 로 등록해줌 )

- HandlerAdapter : HandlerMapping으로 요청된 것을 처리하는 인터페이스

  > 함수형으로도 만들 수 있음

 > 스프링 MVC 확장의 핵심

- 뷰 이름이 없는 경우, 요청을 기반으로 판단함

 > 요청이 /sample 이면 뷰도 sample 로 인식

 > RequestToViewNameTranslator 가 처리함

- ViewResolver : internalResourceViewResolver 가 한개 등록되어있음

-  FlashMapManger : redirect 할때 사용

 > redirect시  화면에서 refresh할때 , 중복 form post 요청을 방지하기 위해 사용

 > 데이터를 가지고 있고 get 요청으로 변환한다. (필요 변수를 url에 붙여주거나 전달함)

 >> 스프링 3.1 부터 지원 , 세션 기반

 

- WebApplicationInitializer 를 통해 web.xml 대신 서블릿 설정 만들 수 있음

- 스프링 부트는 dispathcerServlet의 전략 bean들을 미리 등록되어 있어서, default 값을 사용하지 않음

- 부트가 아닌 경우, dispathcerServlet를 위한 세부 구성 요소 bean 설정하기에 따라 설정이 달라짐

 

'Spring' 카테고리의 다른 글

[Spring] 스프링 웹 MVC - 3  (0) 2021.08.02
[Spring] 스프링 웹 MVC - 2  (0) 2021.07.28
[Spring] 스프링 데이터 JPA - 4  (0) 2021.07.26
[Spring] 스프링 데이터 JPA - 3  (0) 2021.07.25
[Spring] 스프링 데이터 JPA - 2  (0) 2021.07.23