DongDD's IT

[Spring] Spring MVC - MVC, IntelliJ 설정, 프로젝트 생성 본문

프로그래밍/Spring

[Spring] Spring MVC - MVC, IntelliJ 설정, 프로젝트 생성

DongDD 2019. 3. 28. 22:49

[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 설정

WEB-INF


3. 실행결과

result


Source


1. Source tree

1) web.xml 사용 방식

web.xml


2) Config 사용 방식

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. 구조

front controller

- 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에서 모듈 선택 후 생성

war-1

3. 생성한 Exploded로 Archive 생성

war -2


4. Edit Configurations에서 war exploded로 변경

war-3



Comments