[코드로 배우는 스프링 웹 프로젝트 개정판] 2장 정리
스프링 MVC 프로젝트는 root-context.xml과 servlet-context.xml을 연동하여 구동하며, 웹 프로젝트는 절대 경로를 사용하는 것이 바람직하다. 스프링 MVC의 기본 구조는 DispatcherServlet, HandlerMapping, HandlerAdapter, Controller, ViewResolver, View로 구성되어 있다. 스프링 MVC를 이용하는 컨트롤러는 HttpServletRequest, HttpServletResponse를 거의 사용하지 않아도 되며, 다양한 타입의 파라미터 처리와 리턴 타입 사용이 가능하다. @Controller 어노테이션을 사용하여 컨트롤러를 선언하고, @RequestMapping을 통해 URL 경로를 설정한다. 파라미터는 @RequestParam을 통해 수집하며, Model 객체는 JSP에 데이터를 전달하는 역할을 한다. 컨트롤러의 리턴 타입은 String, void, VO, DTO 타입, ResponseEntity 타입, Model, ModelAndView, HttpHeaders 등이 있다. @ControllerAdvice와 @ExceptionHandler를 사용하여 예외를 처리한다.
Mar 13, 2024
🌼스프링 MVC의 기본 구조
💡핵심 키워드
스프링 MVC 프로젝트의 내부 구조
- 스프링 MVC 프로젝트를 구성해서 사용한다는 의미는 내부적으로 root-context.xml로 사용하는 일반 Java 영역과 servlet-context.xml로 설정하는 Web 영역을 같이 연동해서 구동하게 된다.
- 바깥쪽에 있는 WebApplicationContext는 기존의 구조에 MVC 설정을 포함하는 구조로 만들어진다.
- 스프링은 원래 목적 자체가 웹 애플리케이션을 목적으로 나온 프레임워크가 아니기 때문에 달라지는 영역에 대해서는 완전히 분리하고 연동하는 방식으로 구현되어 있다.
- 웹 프로젝트는 가능하면 절대 경로를 이용하는 구조를 사용하는 것이 바람직하다.
예제 프로젝트의 로딩 구조
- 프로젝트 구동 시 관여하는 XML은 web.xml, root-xontext.xml, servlet-context.xml이다.
- web.xml은 Tomcat 구동과 관련된 설정이다. 나머지 두 파일은 스프링과 관련된 설정이다.
- 프로젝트의 구동은 web.xml에서 시작한다. web.xml의 상단에는 가장 먼저 구동되는 Context Listener가 등록되어 있다.
- <context-param>에는 root-context.xml의 경로가 설정되어 있고, <listener>에는 스프링 MVC의 ContextLoaderListener가 등록되어 있다.
- root-context.xml이 처리되면 파일에 있는 빈 설정들이 동작한다.
- root-context.xml에 정의된 객체들은 스프링의 영역 안에 생성되고, 객체들 간의 의존성이 처리된다. root-context.xml이 처리된 후엣는 DispatcherServlet이 동작한다.
- org.springframework.web.servlet.DispatcherServlet 클래스는 내부적으로 웹 관련 처리의 준비 작업을 진행하는데, 이때 사용하는 파일이 servlet-context.xml이다.
- DispatcherServlet에서 XmlWebApplicationContext를 이용해서 servlet-context.xml을 로딩하고 해석한다. 이 과정에서 등록된 객체들은 기존에 만들어진 객체들과 같이 연동된다.
모델2와 스프링 MVC
- 스프링 MVC의 기본 구조는 다음과 같다.
- 사용자의 Request는 Front-Controller인 DispatcherServlet을 통해서 처리한다.
- HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾는다.
- 적절한 컨트롤러가 찾아졌다면 HandlerAdapter를 이용해서 해당 컨트롤러를 동작시킨다.
- Controller는 개발자가 작성하는 클래스로 실제 Request를 처리하는 로직을 작성한다.
- ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해서 처리하는 것이 좋을지 해석한다.
- View는 실제로 응답 보내야 하는 데이터를 Jsp 등을 이용해서 생성하는 역할을 한다.
🌼스프링 MVC의 Controller
💡핵심 키워드
- 스프링 MVC를 이용하는 경우 작성되는 Controller는 다음과 같은 특징이 있다.
- HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현
- 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능
- GET 방식, POST 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리 가능
- 상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능
@Controller, @RequestParam
- @Controller 어노테이션을 사용하면 컨트롤러를 선언할 수 있다.
- 컨트롤러로 선언되면 자동으로 스트링의 객체로 등록된다.
- servlet-context.xml은 <context:component-scan>이라는 태그를 이용해서 지정된 패키지에 선언된 클래스들을 조사하면서 스프링에서 객체 설정에 사용되는 어노테이션들을 가진 클래스들을 파악하고 이를 객체로 생성해서 관리한다.
- 클래스 선언부에는 @Controller와 함께 @RequestMapping을 많이 사용한다.
- @RequestMapping은 현재 클래스의 모든 메서드들의 기본적인 URL 경로가 된다.
@RequestMapping의 변화
- @RequestMapping은 몇 가지의 속성을 추가할 수 있다.
- @GetMapping, @PostMapping 어노테이션을 통해 Method 속성을 구분해서 추가할 수 있다.
@Controller의 파라미터 수집
- Controller는 파라미터를 자동으로 수집할 수 있다.
- @RequestParam을 통해 기본 자료형이나 문자열, 리스트, 배열, 객체 리스트 등을 처리할 수 있다.
- 파라미터를 변환해서 처리해야 하는 경우 @InitBinder를 통해 처리할 수 있다.
- @DateTimeFormat을 사용해서 날짜를 변환할 수도 있다.
Model이라는 데이터 전달자
- Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 하는 존재다.
- @ModelAttribute 어노테이션을 통해 강제로 전달받은 파라미터를 Model에 담아서 전달할 수 있다.
- RedirectAttributes 타입도 스프링 MVC가 자동으로 전달해주는 타입이지만 일회성으로 데이터를 전달하는 용도로 사용한다.
Controller의 리턴 타입
- Controller의 메서드가 사용할 수 있는 리턴 타입은 주로 다음과 같다.
- String: jsp를 이용하는 경우 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용한다.
- void: 호출하는 URL과 동일한 이름의 jsp를 의미한다.
- VO, DTO 타입: 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용한다.
- ResponseEntity 타입: response 할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용한다.
- Model, ModelAndView: Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용한다.
- HttpHeaders: 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용한다.
- commons-fileupload를 이용해서 업로드되는 파일을 처리할 수 있다.
Controller의 리턴 타입
- @ControllerAdvice는 해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 용도로 사용한다.
- @ExceptionHandler는 해당 메서드가 () 들어가는 예외 타입을 처리한다는 것을 의미한다.
- 404 에러 메시지의 경우 스프일 MVC의 모든 요청은 DispatcherServlet을 이용해서 처리되므로 web.xml을 수정해야 한다.
🏁결론
해당 내용을 정리하면서 스프링 MVC 프로젝트의 생성과 동작 과정, 스프링 MVC 구조의 이해, 스프링 MVC를 이용하는 파일 업로드 처리, 예외 처리를 이해할 수 있었다.
Share article