Categories
Algorithm🧩
백준 📝
BookReview📕
CleanCode✨
Network 📨
Database 🗄
DevOps☁️
에러 일기📕
Etc💬
Fishy Fish 🎣
Spring🌱
스프링 MVC
Spring MVC
특징
- 프론트 컨트롤러 패턴에 기초한 MVC 프레임워크
- 모델, 뷰, 컨트롤러의 인터페이스가 정의되어 있어 구현에 의존적이지 않다.
- 약한 결합도로 구성되어 유연하고 확장하기 쉬움
- 다양한 서드 파티 라이브러리 연계를 지원
- Jackson, Google Gson 등
- 애노테이션 도입으로 스프링 MVC 보급이 확대
- @Controller, @RequestMapping 등의 선언으로 간단하게 활용 가능
자바 웹 어플리케이션 설계 방식
1. Model1 방식
JSP만 사용하여 개발하거나 Java bean을 포함하여 개발하는 방식
- JSP에 뷰와 비즈니스 로직이 혼재되어 복잡도가 높고 유지보수하기 어렵다.
2. Model2 방식
Model-View-Controller로 분리
- 뷰와 비즈니스 로직의 분리로 유지보수하기 쉽고 확장에 용의하다.
- Controller: 데이터의 처리와 화면의 분기를 담당
- View: 화면상의 처리
- Model - 뷰에 필요한 비즈니스 데이터
3. 프론트 컨트롤러 패턴
클라이언트의 요청을 별도의 프론트 컨트롤러에 집중시키는 방식
- 모든 요청의 공통 부분을 별도의 프론트 컨트롤러로 처리한다.
- 이 프론트 컨트롤러를
DispatcherServlet이라고 함 - 실행 프로세스
- DispatcherServlet이 HTTP 요청을 받는다.
- DispatcherServlet은 서브 컨트롤러에 요청을 위임한다.
- 서브 컨트롤러에서 클라이언트 요청 처리를 위해 DAO를 호출
- DAO 객체는 리소스를 엑세스해 Model 객체를 생성하고 요청 결과를 리턴한다.
- DispatcherServlet은 처리 결과에 적합한 뷰에 화면 처리를 요청한다.
- 선택된 뷰는 화면에 모델 객체를 가져와 화면을 처리한다.
- HTTP 응답
- 구성요소
- DispatcherServlet: 프론트 컨트롤러로 클라이언트의 요청을 받아 서브 컨트롤러에게 요청을 전달하고 리턴 결과를 뷰에 전달해 응답을 생성한다.
- HandlerMapping: URL과 요청 정보를 기준으로 어떤 컨트롤러를 실행할지 결정하는 객체
- 애노테이션 방식으로 이용할 경우 mvn:annotation-driven 태그 설정 필요
- DispatcherServlet은 하나 이상의 핸들러 매핑을 가질 수 있다.
- Controller: 클라이언트의 요청을 처리하고 그 결과를 DispatcherServlet에 전달한다.
- Model: 컨트롤러가 뷰에게 넘겨줄 데이터를 저장하기 위한 객체
- ViewResolver: Controller가 리턴한 뷰 이름을 기반으로 Controller 처리 결과를 생성할 뷰를 결정한다.
- View: Controller의 처리 결과 화면을 생성한다.
스프링 스테레오타입 애노테이션
- @Component, @Service, @Controller, @Repository는
스프링이 관리하는 컴포넌트를 나타내는 일반적인 스테레오 타입 - ervice, Presentation, Persistence 계층의 컴포넌트는 @Service, @Controller, @Repository 스테레오 타입을 사용하여 구체화
- @Service, @Controller, @Repository는 @Component의 전문화된 타입
애노테이션 종류
- @Component: 일반적인 컴포넌트
- @Repository: Persistence계층 컴포넌트
- @Service: Business계층 컴포넌트
- @Controller: Presentation 계층 컴포넌트
- @RestController: @Controller + @ResponseBody
MVC 환경 설정
기본 설정
- spring-webmvc를 설정하면 스프링 웹과 기타 스프링 프레임워크의 의존 모듈에 대한 의존 관계도 함께 처리 된다.
- 스프링 MVC에서는 Bean Validation 구조체(hibernate-validator)를 이용해 자바 빈 값의 유효성을 애노테이션을 통해 검증한다.
웹 애플리케이션 컨텍스트 등록 설정
웹 애플리케이션에 사용할 2가지 애플리케이션 컨텍스트를 등록한다.
- ContextLoadListner: 서비스 계층 이하의 빈(@Service, @Repository 등)을 등록하기 위한 클래스
- DispatcherServlet: 컨트롤러 빈을 등록하기 위한 클래스
- 서블릿 컨테이너에 프론트 컨트롤러인 DispatcherServlet 클래스 등록
-
web.xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/root-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listenerclass> </listener> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
컨트롤러 구조
모든 컨트롤러에는 @Controller애노테이션을 설정
- 메스드 별로는
@RequestMapping애노테이션을 통해 URL을 매핑한다. @RequestParam은 Http 요청 파라미터를 메소드의 파라미터로 전달받을 때 사용- 설정 방식
- DispatcherServlet 클래스의 설정 파일인 servlet-context.xml에서 컨트롤러를 등록한다.
- <annotation-driven />: 패키지 내부에서 찾은 빈과 URI를 매핑한다.
- <context:component-scan base-package=”org.tukorea.web.controller” />
- base-package 내부의 클래스에서 @Controller 지정된 컨트롤러를 검색하여 빈으로 등록
-
DispatcherServlet 설정 코드
<annotation-driven /> <resources mapping="/resources/**" location="/resources/" /> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean> <context:component-scan base-package="org.tukorea.web.controller" /> -
ContextLoadListner 설정: @Service로 지정된 클래스를 빈으로 등록한다.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> </bean> <context:component-scan base-package="org.tukorea.web.service" /> </beans>
@RequestMapping
URL과 컨트롤러 메서드의 매핑을 설정하는 애노테이션
- 속성값을 통해 URL을 설정한다.
- 속성
- value: url 표시
- path: value의 별명
- method: HTTP 메서드
- params: 요청 파라미터 유무나 파라미터 값
매핑 설정 방식
- @PathVariable 적용 변수로 전달
@RequestMapping(value="/try/{msg}", method = RequestMethod.GET)
- @RequestParam 적용 변수로 전달
@RequestMapping(value="/tryA", method = RequestMethod.GET)
public String getUserTest1( @RequestParam("msg") String msg)
- @ModelAttribute 변수로 전달
@RequestMapping(value="/tryB", method = RequestMethod.GET)
public String getUserTest2( @ModelAttribute("msg") String msg)
- @RequestMapping(value={“/tryC”, “/tryD”})
- 배열의 형태로 지정 가능