Spring MVC를 이용한 웹 페이지 작성 실습 - accidentlywoo/legacyVue GitHub Wiki

Spring MVC를 이용한 웹 페이지 작성 실습


학습 목표

  • Spring MVC를 이용해 프로젝트를 구성할 수 있고, 개발자가 작성해야 할 파일이 무엇인지 이해한다.
  • Spring MVC를 이용해 웹 어플리케이션을 작성할 수 있다.

핵심 개념

  • DispatcherServlet
  • WebApplicationInitializer
  • @RequestMapping = @GetMapping = @PostMapping

DispatcherServlet을 FrontController로 설정하기

  • web.xml 파일에 실행
  • javax.servlet.ServletContainerInitializer 사용 : 서블릿 3.0 스팩 이상에서 web.xml파일을 대신해서 사용할 수 있다.
  • org.springframework.web.WebApplicationInitializer 인터페이스를 구현해서 사용

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

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

Spring MVC 설정

@Configuration

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

@EnableWebMvc

  • DispatcherServlet의 RequestMappingHandlerMapping, RequestMappingHandlerAdapter, ExceptionHandlerExceptionResolver, MessageConverter 등 Web에 필요한 빈들을 대부분 자동으로 설정해준다.
  • xml로 설정의 mvc:annotation-driven/와 동일하다.
  • 기본 설정 이외의 설정이 필요하다면 WebMvcConfigurerAdapter 를 상속받도록 Java config class를 작성한 후, 필요한 메소드를 오버라이딩 하도록 한다.

WebMvcConfigurationSupport

@ComponentScan

  • ComponentScan 애노테이션을 이요아면 Controller, Service, Repository, Component 애노테이션이 붙은 클래스를 찾아 스프링 컨테이너가 관리하게 된다.
  • DefaultAnnotationHandlerMapping과 RequestMappingHandlerMapping 구현체는 다른 핸들러 매핑보다 훨씬 더 정교한 작업을 수행한다. 이 두 개의 구현체는 애노테이션을 사용해 매핑 관계를 찾는 매우 강력한 기능을 가지고 있다. 이들 구현체는 스프링 컨테이너 즉 애플리케이션 컨텍스트에 있는 요청 처리 빈에서 RequestMapping애노테이션을 클래스나 메소드에서 찾아 HandlerMapping 객체를 생성하게 된다.
  • HandlerMapping은 서버로 들어온 요청을 어느 핸들러로 전달할지 결정하는 역할을 수행한다.
  • DefaultAnnotationHandlerMapping은 DispatcherServlet이 기본으로 등록하는 기본 핸들러 매핑 객체이고, Request MappingHandlerMapping은 더 강력하고 유연하지만 사용하려면 명시적으로 설정해야 한다.

WebMvcConfigurerAdapter

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

Controller(Handler) 클래스 작성하기

  • @Controller 애노테이션을 클래스 위에 붙인다.
  • 매핑을 위해 @RequestMapping 애노테이션을 클래스나 메소드에서 사용한다.

@RequestMapping

  • Http 요청과 이를 다루기 위한 Controller 의 메소드를 연결하는 어노테이션
  • Http Method 와 연결하는 방법 : @RequestMapping(value="/users", method=RequestMethod.POST) : From Spring 4.3 version (@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, PatchMapping)
  • Http 특정 해더와 연결하는 방법 : @RequestMapping(methid = RequestMethod.GET, headers = "content-type=application/json")
  • Http Parameter 와 연결하는 방법 : @RequestMapping(method = RequestMethod.GET, headers = "content-type=application/json")
  • Content-Type Header와 연결하는 방법 : @RequestMapping(method = RequestMethod.GET, consumes = "application/json")
  • Accept Header 와 연결하는 방법 : @RequestMapping(method = RequestMethod.GET, produces = "application/json")

Spring MVC가 지원하는 Controller 메소드 인수 타입

  • javax.servlet.ServletRequest
  • javax.servlet.http.HttpServletRequest :\
  • org.springframework.web.multipart.MultipartRequest
  • org.springframework.web.multipart.MultipartHttpServletRequest
  • javax.servlet.ServletResponse
  • javax.servlet.http.HttpServletResponse :\
  • javax.servlet.http.HttpSession :\
  • org.springframework.web.context.request.WebRequest
  • org.springframework.web.context.request.NativeWebRequest
  • java.util.Locale
  • java.io.InputStream
  • java.io.Reader
  • java.io.OutputStream
  • java.io.Writer
  • javax.security.Principal
  • java.util.Map
  • org.springframework.ui.Model
  • org.springframework.ui.ModelMap
  • org.springframework.web.multipart.MultipartFile :\
  • javax.servlet.http.Part
  • org.springframework.web.servlet.mvc.support.RedirectAttributes
  • org.springframework.validation.Errors
  • org.springframework.validation.BindingResult
  • org.springframework.web.bind.support.SessionStatus
  • org.springframework.web.util.UriComponentsBuilder
  • org.springframework.http.HttpEntity<?>
  • Command 또는 Form 객체

Spring MVC가 지원하는 메소드 인수 애노테이션

  • @RequestParam
  • @RequestHeader
  • @RequestBody
  • @RequestPart
  • @ModelAttribute
  • @PathVariable
  • @CookieValue

@RequestParam

  • Mapping 된 메소드의 Argument에 붙일 수 있는 어노테이션
  • @RequestParam의 name에는 http parameter의 name과 맵필
  • @RequestParam의 required는 필수인지 아닌지 판단.

@Pathvariable

  • @RequestMapping의 path에 변수명을 입력받기 위한 place holder가 필요함
  • place holder의 이름과 PathVariable의 name 값과 같으면 mapping됨
  • required 속성은 default true임

@RequestHeader

  • 요청 정보의 헤더 정보를 읽어들 일 때 사용
  • @RequestHeader(name="헤더명") String 변수명

Spring MVC가 지원하는 메소드 리턴 값

  • org.springframework.web.servlet.ModelAndView
  • org.springframework.ui.Model
  • java.util.Map
  • org.springframework.ui.ModelMap
  • org.springframework.web.servlet.View
  • java.lang.String
  • java.lang.Void
  • org.springframework.http.HttpEntity<?>
  • org.springframework.http.ResponseEntity<?>
  • 기타 리턴 타입