SpringMVC 19

[Spring] 스프링 MVC(19) - 서블릿 3 기반 설정

서블릿 3 기반 설정 서블릿 3 버전부터 web.xml 파일을 사용하는 대신 자바 코드를 이용해서 서블릿 / 필터를 등록할 수 있게 되었다. 방법은 WebApplicationInitializer 인터페이스를 상속받아 알맞게 구현해주면 된다. 다음은 그 예이다. public class SpringServletConfig implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { XmlWebApplicationContext servletAppContext = new XmlWebApplicationContext(); servletAppCont..

Spring 2022.04.16

[Spring] 스프링 MVC(18) - @RequestBody, @ResponseBody, HttpMessageConverter

@RequestBody, @ResponseBody 브라우저와 웹 서버 간에 데이터를 주고받을 때 사용되는 HTTP 프로토콜은 다음 그림과 같이 헤더와 몸체로 구성되어 있다. 요청 몸체에는 브라우저가 전송한 데이터가 담기는데, 이 데이터의 형식은 Content-Type 헤더 값으로 지정한다. 위 그림의 경우 요청 몸체의 형식이 'multipart/form-data'라고 지정되어 있다. 응답도 동일하게 헤더와 몸체로 구성되며, Content-Type 헤더를 이용해서 몸체의 데이터 형식을 지정한다. @RequestBody 어노테이션은 요청 몸체를 자바 객체로 변환할 때 사용된다. 예를 들어 요청 파라미터 문자열을 String 자바 객체로 변환하거나, JSON 형식의 요청 몸체를 자바 객체로 변환할 때 @Req..

Spring 2022.04.15

[Spring] 스프링 MVC(17) - 핸들러, HandlerMapping, HandlerAdapter

핸들러, HandlerMapping, HandlerAdapter DispatcherServlet은 웹 요청을 실제로 처리하는 객체의 타입을 @Controller 어노테이션을 구현한 클래스로 제한하지 않는다. 실제로 거의 모든 종류의 객체로 웹 요청을 처리할 수 있다. 그래서 웹 요청을 처리하는 객체를 좀 더 범용적인 의미로 '핸들러(Handler)'라고 부른다. DispatcherServlet은 웹 요청 처리 결과로 ModelAndView만 리턴하면 올바르게 동작한다. 그런데 지금까지 작성한 컨트롤러는 ModelAndView 뿐만 아니라 String을 리턴한 경우도 있었다. 따라서 누군가는 중간에서 String 타입을 ModelAndView로 변경해주어야 하는데, 이때 사용되는 것이 바로 HandlerA..

Spring 2022.04.07

[Spring] 스프링 MVC(16) - DelegatingFilterProxy

DelegatingFilterProxy를 이용한 서블릿 필터 등록 DelegatingFilterProxy 클래스는 서블릿 필터를 스프링 빈으로 등록할 때 사용된다. DelegatingFilterProxy 클래스는 스프링 컨테이너에 빈으로 등록된 서블릿 필터에 필터 처리를 위임한다. DelegatingFilterProxy를 사용하기 위해서는 다음과 같이 web.xml 파일에 DelegatingFilterProxy를 서블릿 필터로 등록해주면 된다. profileFilter org.springframework.web.filter.DelegatingFilter targetBeanName webProfileBean contextAttribute org.springframework.web.servlet.Framew..

Spring 2022.04.06

[Spring] 스프링 MVC(15) - WebApplicationContext

WebApplicationContext 계층 DispatcherServlet은 그 자체가 서블릿이기 때문에 한 개 이상의 DispatcherServlet을 설정하는 것이 가능하다. 예를 들어 다음과 같이 웹 페이지를 위한 DispatcherServlet과 REST 기반의 웹 서비스 연동을 위한 DispatcherServlet을 나누어 설정했다고 하자. front org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/front.xml rest org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/rest.xml 위 설정에서 두..

Spring 2022.04.05

[Spring] 스프링 MVC(14) - HandlerInterceptor

HandlerInterceptor를 이용한 인터셉터 구현 요청 경로마다 접근 제어를 다르게 해야 한다거나 사용자가 특정 URL을 요청할 때마다 접근 내역을 기록하고 싶다면 HandlerInterceptor를 사용하면 된다. HandlerInterceptor 인터페이스를 사용하면 다음의 세 가지 공통 기능을 넣을 수 있다. preHandle - 컨트롤러(핸들러) 실행 전 postHandle - 컨트롤러(핸들러) 실행 후, 뷰 실행 전 afterCompletion - 뷰 실행 후 preHandle() 메서드는 접근 권한이 없는 경우 컨트롤러를 실행하지 않거나, 컨트롤러를 실행하기 전에 컨트롤러에서 필요로 하는 정보를 생성하는 등의 작업을 수행한다. preHandle() 메서드가 false를 리턴하면 컨트롤러..

Spring 2022.04.05

[Spring] 스프링 MVC(13) - 추가 설정

WebMvcConfigurer를 이용한 커스텀 설정 WebMvcConfigurer 인터페이스는 MVC 네임스페이스를 이용한 설정과 동일한 설정을 하는데 필요한 메서드를 정의하고 있다. 예를 들어 태그는 뷰 컨트롤러를 설정할 때 사용되는데, 이와 동일한 설정을 위해 WebMvcConfigurer 인터페이스의 addViewContollers() 메서드를 이용한다. WebMvcConfigurer 인터페이스나 WebMvcConfigurerAdapter 클래스를 상속받아 구현한 클래스는 @Configuration 어노테이션을 적용해서, 설정 정보로 사용해야 한다. @Configuration @EnableWebMvc public class MvcConfiguration extends WebMvcConfigurerA..

Spring 2022.03.17

[Spring] 스프링 MVC(12) - 컨트롤러의 파라미터와 리턴 타입

@RequestMapping 어노테이션이 적용된 메서드에서 사용할 수 있는 파라미터 타입은 다음과 같다. HttpServletRequest, HttpServletResponse : 요청 / 응답 처리를 위한 서블릿 API HttpSession : HTTP 세션을 위한 서블릿 API Model, ModelMap, Map : 뷰에 데이터를 전달하기 위한 모델 @RequestParam : HTTP 요청 파라미터 값 @RequestHeader, @CookieValue : 요청 헤더와 쿠키값 @PathVariable : 경로 변수 커맨드 객체 : 요청 데이터를 저장할 객체 Errors, BindingResult : 검증 결과를 보관할 객체, 커맨드 객체 바로 뒤에 위치한다. @RequestBody(파라미터에 적용..

Spring 2022.03.16

[Spring] 스프링 MVC(11) - @ExceptionHandler, @ControllerAdvice, @ResponseStatus 어노테이션

@ExceptionHandler 어노테이션을 이용한 예외 처리 컨트롤러의 @RequestMapping 메서드를 실행하는 과정에서 예외가 발생할 때 직접 예외 처리를 하고 싶다면, @ExceptionHandler 어노테이션을 사용하면 된다. 다음 코드를 보자. @Controller public class CalculationController { @RequestMapping("/cal/divide") public String divide(Model model, @RequestParam("op1") int op1, @RequestParam("op2") int op2) { model.addAttribute("result", op1 / op2); return "cal/result"; } @ExceptionHan..

Spring 2022.03.16

[Spring] 스프링 MVC(10) - HttpSession과 @SessionAttributes 어노테이션

HttpSession 직접 사용하기 트래픽이 작거나 단일 서버에서 동작하는 웹 어플리케이션의 경우 서블릿의 HttpSession을 이용해서 사용자 로그인 상태를 유지하는 경우가 많다. HttpSession을 사용하는 가장 손쉬운 방법은 HttpSession을 컨트롤러 메서드의 파라미터로 지정하는 것이다. 다음 코드를 보자. @Controller @RequestMapping("/auth/login") public class LoginController { @RequestMapping(method = RequestMethod.POST) public String login(@Valid LoginCommand loginCommand, Errors errors, HttpSession session) { if (e..

Spring 2022.03.16