[Spring] Spring MVC - MVC, IntelliJ 설정, 프로젝트 생성
[Spring] Spring MVC
Spring MVC
- 자바 기반 web application 개발할 때 사용하는 프레임워크
- 아키텍쳐 : MVC 패턴
MVC
1. Model, View, Controller 세가지 역할의 컴포넌트로 구성
1) Model
- 데이터, 비즈니스 로직을 제공하는 컴포넌트
2) View
- model의 데이터를 참조하고 반환할 응답 데이터를 생성하는 컴포넌트
3) Controller
- 요청과 응답 처리를 제어하고 model과 view의 호출을 제어
특징
1. POJO 구현
- 모델, 컨트롤러 등의 클래스는 POJO로 구현
2. Annotation 방식을 정보 설정
3. 유연한 method signature 정의
- 처리에 필요한 인자들만 받아 처리 가능
4. Servlet API 추상화
- Servlet API가 추상화되어 Servlet API를 직접 사용하는 코드가 없어짐
5. View 구현 기술 추상화
- 컨트롤러는 view 이름을 반환, 스프링 mvc는 view 이름을 이용해 view 표시
6. Spirng의 DI Container와 연계
- Spring DI Container가 제공하는 구조를 활용할 수 있음
Spring MVC Project 생성
- New Project의 Maven으로 생성
기본 설정
1. pom.xml 디펜던시 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <properties> <spring.version>5.1.5.RELEASE</spring.version> <jdk.version>11</jdk.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.6.Final</version> </dependency> </dependencies> | cs |
- spring-mvc, core, web, hibernate 추가
2. AppConfig 생성
1 2 3 | @Configuration public class AppConfig { } | cs |
3. web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/AppConfig.java</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app> | cs |
- contextConfigLocation에 AppConfig 등록ㅍ
- listener-class에 ContextLoaderListener 정의
DispatcherServlet 설정
- DispatcherServlet : 앞단에서 Client의 요청을 받아 처리해주는 프론트 컨트롤러
1. WebMvcConfig 생성
1 2 3 4 5 | @Configuration @EnableWebMvc public class WebMvcConfig implements WebMvcConfigurer { } | cs |
2. web.xml에 dispatcherservlet 등록
- Front controller를 사용하기 위해 dispatcherServlet을 web.xml 등록
1 2 3 4 5 6 7 8 9 10 11 12 | <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/AppConfig.java</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> | cs |
- <web-app></web-app> 안에 DispatcherServlet 내용 추가
CharacterEncoding 설정
- 한국어 사용 시, 한국어가 깨지지 않도록 UTF-8로 설정
- web.xml에 작성
1 2 3 4 5 6 7 8 9 10 11 12 | <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/</url-pattern> </filter-mapping> | cs |
- <web-app></web-app> 안에 CharacterEncodingFilter 추가
VIewResolver
- web page의 view를 띄어주기 위한 컴포넌트
- jsp를 띄어주게 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Configuration @EnableWebMvc @ComponentScan(basePackages = "com.mvc") public class WebMvcConfig implements WebMvcConfigurer { @Bean public ViewResolver internalResourceViewResolver() { InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver(); internalResourceViewResolver.setPrefix("/WEB-INF/views/"); internalResourceViewResolver.setSuffix(".jsp"); return internalResourceViewResolver; } } | cs |
Controller
1. index.jsp를 띄어주는 controller 구현
1 2 3 4 5 6 7 8 9 | @Controller public class TestController { @RequestMapping("/") public String main() { return "index"; } } | cs |
2. /WEB-INF/views에 있는 index.jsp
- tomcat 설정
- deploy에 /WEB-INF/views 설정
3. 실행결과
Source
1. Source tree
1) web.xml 사용 방식
2) Config 사용 방식
2. pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId> <artifactId>mvc</artifactId> <version>1.0-SNAPSHOT</version> <properties> <spring.version>5.1.5.RELEASE</spring.version> <jdk.version>11</jdk.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.6.Final</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>LATEST</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>LATEST</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.6.Final</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> </dependencies> </project> | cs |
3. web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/AppConfig.java</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/AppConfig.java</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/</url-pattern> </filter-mapping> </web-app> | cs |
4. web.xml 대신 java기반 config 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class DispatcherConfig extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[0]; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[]{WebMvcConfig.class}; } @Override protected String[] getServletMappings() { return new String[] {"/"}; } @Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return new Filter[] {characterEncodingFilter}; } } | cs |
Spring MVC 아키텍쳐
Front Controller Pattern
- Spring MVC는 Front Controller Pattern을 사용하고 있음
- 클라이언트 요청을 front controller 컴포넌트 받아 요청 내용에 따라 핸들러를 선택하는 아키텍쳐
Front Controller Architecture
- Spring MVC에서는 DispatcherServlet이 Front controller의 역할을 수행
1. 역할
- 클라이언트 요청 수집
- 요청 데이터를 자바 데이터로 변환
- 입력값 검증
- 핸들러 호출
- 뷰 선택
- 응답
- 예외 처리
2. 구조
- Client의 요청을 DispatcherServlet이 받음
- DispathcerServlet은 해당하는 요청을 처리할 Handler(Controller)를 선택
- ViewResolver를 통해 Controller에서 반한된 view 객체를 가져옴
- View 클래스를 렌더링할 데이터를 생성
- Client에게 응답
1) DispatcherServlet
- Front Controller의 제일 앞단에 위치하여 클라이언트의 요청을 받음
- 프레임워크 내부 동작에 필요한 여러 인터페이스를 가지고 있음
2) Handler(Controller)
- 요청에 따라 필요한 처리를 수행
-> Annotation 구현 방법
1 2 3 4 5 6 7 8 | @Controller public class TestController { @RequestMapping("/") public String main() { return "index"; } } | cs |
-> Controller Interface 구현체로 구현 방법
1 2 3 4 5 6 7 8 9 | @Component("/") public class TestController extends AbstractController { protected ModelAndView handleRequestInternal(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { ModelAndView modelAndView = new ModelAndView("home"); return modelAndView; } } | cs |
3) Handler Mapping
- 요청을 처리할 핸들러를 선택하는 역할
- @RequestMapping("")을 사용하여 handler를 mapping함
4) Handler Adapter
- handler method를 호출하는 역할
- handler method에 인자를 전달하고 method의 처리 결과를 반환
5) View Resolver
- handler(controller)에서 반환한 view 이름을 보고 view 인터페이스의 구현 클래스를 선택하는 역할
6) View
- 클라이언트에 반환하는 응답 데이터를 생성하는 역할
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Configuration @EnableWebMvc @ComponentScan(basePackages = "com.mvc") public class WebMvcConfig implements WebMvcConfigurer { @Bean public ViewResolver internalResourceViewResolver() { InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver(); internalResourceViewResolver.setPrefix("/WEB-INF/views/"); internalResourceViewResolver.setSuffix(".jsp"); return internalResourceViewResolver; } } | cs |
war로 실행
1. File-Project Structure- Artifacts에서 artifact생성
2. Web Application: Exploded에서 모듈 선택 후 생성
3. 생성한 Exploded로 Archive 생성
4. Edit Configurations에서 war exploded로 변경