본문 바로가기
boostcource/boostcourse_web programming

Spring MVC 웹 어플리케이션 실습 -2

by sgyeong 2024. 7. 14.

DispatcherServlet을 Front Controller로 설정하기

 

- web.xml 파일에 설정

- javax.servlet.ServletContainerInitializer 사용

  서블릿 3.0 스펙 이상에서 web.xml 파일을 대신해서 사용할 수 있다.

- org.springframework.web.WebApplicationInitializer 인터페이스를 구현해서 사용

 

 

web.xml 파일에서 DispatcherServlet 설정하기 1/2

 

- xml spring 설정 읽어들이도록 DispatcherServlet 설정

 

- Java config spring 설정 읽어들이도록 DispatcherServlet 설정

 

 

 

WebApplicationInitializer를 구현해서 설정하기 1/2

 

- Spring MVC는 ServletContainerInitializer를 구현하고 있는 SpringServletContainerInitializer를 제공한다. 

- SpringServletContainerInitializer는 WebApplicationInitializer 구현체를 찾아 인스턴스를 만들고 해당 인스턴스의 onStartup 메소드를 호출하여 초기화한다.

 

 

 

Spring MVC 설정

 

- kr.or.connect.webmvc.config.WebMvcContextConfiguration

 

 

 

@Configuration

- org.springframework.context.annotation의 Configuration 어노테이션과 Bean 어노테이션 코드를 이용하여 스프링 컨테이너에 새로운 빈 객체를 제공할 수 있다.

 

@EnableWebMvc

- DispatcherServlet의 RequestMappingHandlerMapping, RequestMappingHandlerAdapter, ExceptionHandlerExceptionResolver, MessageConverter 등 Web에 필요한 빈들을 대부분 자동으로 설정해준다.

- xml로 설정의 <mvc:annotation-driven/>과 동일하다.

- 기본 설정 이외의 설정이 필요하다면 WebMvcConfigurerAdapter 를 상속받도록 Java config class를 작성한 후, 필요한 메소드를 오버라이딩 하도록 한다.

 

 

WebMVCConfigurationSupport

- https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java

 

spring-framework/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java a

Spring Framework. Contribute to spring-projects/spring-framework development by creating an account on GitHub.

github.com

 

 

@ConponentScan

- ComponentScan 어노테이션을 이용하면 Controller, Service, Repository, Component 어노테이션이 붙은 클래스를 찾아 스프링 컨테이너가 관리하게 된다.

- DefaultAnnotationHandlerMapping과 RequestMappingHandlerMapping 구현체는 다른 핸들러 매핑보다 훨씬 더 정교한 작업을 수행한다. 이 두 개의 구현체는 어노테이션을 사용해 매핑 관계를 찾는 매우 강력한 기능을 가지고 있다. 이들 구현체는 스프링 컨테이너 즉 어플리케이션 컨텍스트에 있는 요청 처리 빈에서 RequestMapping 어노테이션을 클래스나 메소드에서 찾아 HandlerMapping 객체를 생성하게 된다.

* HandlerMapping은 서버로 들어온 요청을 어느 핸들러로 전달할지 결정하는 역할을 수행한다.

- DefaultAnnotationHandlerMapping은 DispatcherServlet이 기본으로 등록하는 기본 핸들러 매핑 객체이고, RequestMappingHandlerMapping은 더 강력하고 유연하지만 사용하려면 명시적으로 설정해야 한다.

 

 

WebMvcConfigurerAdapter

- org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter

- @EnableWebMvc를 이용하면 기본적인 설정이 모두 자동으로 되지만, 기본 설정 이외의 설정이 필요할 경우 해당 클래스를 상속받은 후, 메소드를 오버라이딩 하여 구현한다.

 

Controller (Handler) 클래스 작성하기

- @Controller 어노테이션을 클래스 위에 붙인다.

- 매핑을 위해 @RequestMapping 어노테이션을 클래스나 메소드에서 사용한다.

 

@RequestMapping

Http 요청과 이를 다루기 위한 Controller의 메소드를 연결하는 어노테이션

Http Method와 연결하는 방법

     - @RequestMapping("/users", method=RequestMethod.POST)
     - From Spring 4.3 version

             @GetMapping
             @PostMapping
             @PutMapping
             @DeleteMapping
             @PatchMapping

Http 특정 헤더와 연결하는 방법

     - @RequestMapping(method = RequestMethod.GET, headers = "content-type=application/json")

Http Parameter와 연결하는 방법
     - @RequestMapping(method = RequestMethod.GET, params = "type=raw")
Content-Type Header와 연결하는 방법

     - @RequestMapping(method = RequestMethod.GET, consumes = "application/json")

Accept Header와 연결하는 방법

     - @RequestMapping(method = RequestMethod.GET, produces = "application/json")

 

 

 

실습

 

mvcexam 프로젝트에 kr.or.connect.mvcexam.config 패키지를 만들어준다.

 

 

 

kr.or.connect.mvcexam.config 패키지 안에 WebMvcContextConfiguration 클래스를 만들어준다.

 

 

필요한 어노테이션들을 추가해준다.

 

ComponentScan할때 basePackages는 반드시 지정해줘야 한다. 그렇지 않으면 어느 패키지먼저 찾아야 할지 몰라서 제대로 수행이 되지 않을 수 있다. 

 

이 클래스는 distpatcherServlet이 실행될 때 읽어들이는 설정파일이다. 필요한 내용을 넣어준다.

 

addResourceHandlers가 필요한 이유는 웹 어플리케이션이 받는 요청중에는 controller에 url이 핑되어있는 요청뿐만 아니라 css, image, javascript 등 정적 리소스도 요청을 받는다. 초창기에는 이러한 요청이 ".do" 와 같은 형식으로 들어왔지만 현재는 대부분 "/"을 통해 요청된다. 이러한 요청이  들어왔을때 서블릿이 모든 요청을 처리하게 되므로 정적 리소스 요청도 컨트롤러에서 처리하려고 시도한다. 이로 인해 오류가 발생할 수 있다. 이 설정은 각각의 디렉토리를 만들어놓고 알맞게 요청이 들어오는 위치를 찾게 해주는 설정이다.  예를들어 "/ XX / **"와 같은 형식으로 url 요청이 들어오면 어플리케이션의 루트 디렉토리 아래에서 적절한 리소스를 찾아 반환하도록 설정할 수 있다. 이 설정이 없다면, 컨트롤러의 요청 매핑에서만 리소스를 찾으려고 하여 오류가 발생할 수 있다.

 

configureDefaultServletHandling은 파라미터로 전달받은 DefaultServletHandlerConfigurer 객체에 enable이라는 메서드를 호출함으로써 DefaultServletHandler를 사용하도록 해준다. 이를 통해 매핑 정보가 없는 url 요청은 스프링의 DefaultServletHttpRequestHandler가 처리하도록 해준다. 스프링의 DefaultServletHttpRequestHandler는 WAS의 DefaultServlet에게 일을 넘기게 된다. WAS는 DefaultServlet이 static한 자원을 읽어서 보여주도록 해준다. 

 

addViewController 메서드는 특정 url에 대한 처리를 Controller를 작성하지 않고 핑할 수 있게 해준다. 요청이 / 로 들어오면 main이라는 이름의 view로 보여주도록 한다. main이라는 이름만으로 view 정보를 찾아낼 수는 없기 때문에,  getInternalResourceViewResolver라는 메서드에서  InternalResourceViewResolver를 생성하고, resolver에 prefix, suffix를 지정한다. 이를 통해 설정된 경로에 view정보를 찾게 해준다. 

 

DispatcherServlet을 동작하게 하기 위해서 DispatcherServlet을 Front Controller 로 설정해야 한다. web.xml에서 설정해준다.

 

 

WEB-INF에 views 폴더를 만들어준다.

 

 

views 폴더 안에 main.jsp를 만들어준다.

 

 

실제로 페이지가 잘 뜨는지 확인해준다. 

 

 

실행을 하면 Hello World!가 보여진다. 프로젝트가 만들어질때 기본적으로 생성되는 index.jsp 파일이다. 

웹 어플리케이션 기본 설정에는 주소가 없을때 index 파일을 먼저 찾는 설정을 갖고 있다. 파일이 이름이 index가 아니거나 파일 위치가 다른 곳에 있다면 index.jsp를 찾지 않는다. 현재 이 파일은 필요 없기 때문에 삭제해준다. 그리고 나서 다시 실행해준다.

 

 

 

 

 

 

 

 

 

참고    :  https://www.boostcourse.org/web316/lecture/254349?isDesc=false

 

웹 프로그래밍(풀스택)

부스트코스 무료 강의

www.boostcourse.org

https://docs.spring.io/spring-framework/reference/

 

Spring Framework Documentation :: Spring Framework

Rod Johnson, Juergen Hoeller, Keith Donald, Colin Sampaleanu, Rob Harrop, Thomas Risberg, Alef Arendsen, Darren Davison, Dmitriy Kopylenko, Mark Pollack, Thierry Templier, Erwin Vervaet, Portia Tung, Ben Hale, Adrian Colyer, John Lewis, Costin Leau, Mark F

docs.spring.io

 

'boostcource > boostcourse_web programming' 카테고리의 다른 글

Spring MVC 웹 어플리케이션 실습  (0) 2024.07.07
Spring MVC 구성 요소 2  (0) 2024.07.07
Spring MVC 구성요소  (0) 2024.07.07
Spring MVC  (0) 2024.07.07
Select, Delete  (0) 2024.07.06