본문 바로가기
Backend FrameWork/Spring

[Spring Framework] Spring MVC 개념

by IsBerry 2018. 12. 24.
반응형

Spring MVC 개념

 

 



MVC 패턴은?

 : Model, View, Controller의 약자로, 어플리케이션을 세가지 역할로 구분한 개발 방법론

  비즈니스 로직과 인터페이스를 분리시켜 서로 영향없이 개발하기 수월한 장점이 있다

 

  - Model : 어플리케이션이 "무엇"을 할 것인지 정의. 내부 비즈니스 로직을 처리

  - Controller : Model이 "어떻게"처리할 지를 알려주는 역할

  - View : 처리한 것을 화면에 보여주는 역할

   

   * 단점 : View와 Model이 서로 의존성을 띄어서 복잡하게 연결되면, 새 기능을 추가할 때 테스트가 어려워진다고 함.



Spring MVC 웹 요청 처리과정

 


Spring MVC 구성 요소

구성 요소

설 명

DispatcherServlet 

  클라이언트의 요청을 전달 받아 Controller에게 전달하고 반환값을 View에게 전달해준다.

  (MVC프레임워크의 중심이 되는 서블릿 클래스  - 중앙에서 관리하는 역할 )

 HandlerMapping

  클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정.

 HandlerAdapter

  처리요청을 변환해서 Controller에게 전달하고 응답결과를 요구하는 형식으로 변환함.

 Controller

  요청을 처리한 뒤, 결과를 리턴함. View에서 보여줄 데이터를 모델에 담아 전달함.

 ModelAndView

  Controller가 처리한 결과 정보 및 View선택에 필요한 정보를 담음 

 ViewResolver

  Controller 처리 결과를 보여줄 View를 지정함. 

 View

  Controller의 처리 결과 화면을 생성함.



Spring MVC 기본 설정
1. web.xml 설정 - DispatcherServlet, 인코딩 필터 설정
2. Spring MVC설정 - HandlerMapping, HandlerAdapter, ViewResolver 설정


<web.xml> - 1. DispatcherServlet, 인코딩 필터 설정

 

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
<?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"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="spring" version="3.0">
    <display-name>spring</display-name>
 
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/mvc-start.xml
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
 
    <filter>
        <filter-name>encodingFilter</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>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
cs


//Line09 - 19 : DispatcherServlet등록

              DispatcherServlet은 내부적으로 스프링 컨테이너를 생성함.

              contextConfigLocation초기화 파라미터를 이용해서 컨테이너를 생성할 때 사용할 설정 파일 지정

           *  contextConfigLocation을 설정 안할 경우, /WEB-INF/[서블릿이름]-servlet.xml 파일을 default로 설정됨

  

//Line21 - 24 : DispatcherServlet에 대한 매핑을 *.do로 지정.

              - 웹 브라우저 요청 중에서 확장자가 do로 끝나는 모든 요청을 DispatcherServlet이 처리하게됨.

  

//Line26 - 38 : 요청 파라미터를 UTF-8로 처리하기 위한 인코딩 필터 설정. 




<mvc-start.xml> - 2. HandlerMapping, HandlerAdapter, ViewResolver 설정

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">
 
    <mvc:annotation-driven />
 
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>
 
    <bean class="com.isberry.spring.HelloController" />
</beans>
cs

 //Line11 : <mvc:annotation-driven/>태그는 HandlerMapping, HandlerAdapter클래스를 Bean으로 등록,
             JSON, XML 등 요청/응답 처리를 위해 필요한 변환 모듈, 데이터 바인딩 처리를 위한 Bean으로 등록해줌
             * <mvc:annotation-driven/>태그를 사용하기 위해서 Line4, 8, 9를 선언해줘야 한다.

//Line13 - 17 : ViewResolver 설정 : View이름을 실제 어떤 View와 연결할지 결정 
                                               prefix + View이름 + suffix  
                                               EX) /WEB-INF/view/View/이름.jsp <<를 연결
                    * id가 viewResolver로 설정되야함              
 
//Line19 : 커멘드 객체를 Bean으로 등록. 
              HandlerMapping으로 검색을 할때 해당 요청을 처리해줄 Controller를 찾음.



Controller 구현과정
 1. @Controller을 클래스에 적용
 2. @RequestMapping으로 처리할 요청 경로 지정  
 3. 요청을 처리할 메소드 구현, View이름으로 리턴 


<spring/HelloController.java> 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.spirngframework.web.bind.annotation.RequestMapping;
 
@Controller
public class HelloController
{
    @RequestMapping(“/hello.do”)
    public String hello(Model model)
    {
        model.addAttribute(“greeting”,“안녕하세요”);
        return “hello”;
    }
}
cs

//Line05 : 1. @Controller을 클래스에 적용
              *@Controller annotation을 사용하려면 import org.springframework.stereotype.Controller;을 선언해야함.

//Line08 : 2. @RequestMapping으로 처리할 요청 경로 지정 
                   @RequestMapping annotation

                      : 메소드가 처리할 요청 경로를 지정함.

                        @RequestMapping이 적용된 메소드는 클라이언트의 요청 결과를 보여줄 View이름을 리턴함.

                        * @RequestMapping annotation을사용하려면,  
import org.spirngframework.web.bind.annotation.RequestMapping;을 선언해야함.

//Line09 - 13 : 3. 요청을 처리할 메소드 구현, 
                       Model : 데이터를 View에 전달하기 위해 사용하는 것 
                                  Model을 메소드 파라미터에 추가하여 사용함.
                       *Model을 사용하려면import org.springframework.ui.Model;을 선언해야함.
                       - Model에 데이터를 추가하는 메소드
                     Model.addAttribute(String name, Object value) // value 객체를 name이름으로 추가한다
                              Model addAllAttributes(Map<String, ?> attributes) // 맵의 <키,값> 쌍들을 모델 속성 이름과 값으로 추가한다
                              boolean containsAttribute(String attrName) // 이름이 attrName인 모델 속성을 포함할 경우 true로 리턴
                        위 코드에서는, Model에 "안녕하세요"를 greeting이름으로 담아서 View에 전달한다는 의미.

//Line 12 : View이름으로 리턴 ("hello") -> hello라는 view이름을 찾은 뒤, 해당 view를 생성함.




View

: Controller에서 처리하고 리턴한 응답 결과를 생성해주는 기능 제공.


</WEB-INF/views/Hello.jsp> 

1
2
3
4
5
6
7
8
9
10
<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
</head>
<body>
인사말: ${greeting}
</body>
</html>
cs



//Line08 : ${greeting}은 Controller에서 Model에 넣은 model.addAttribute(“greeting”,“안녕하세요”);
greeting이라는 이름에 "안녕하세요"가 출력이 된다.



* 위 예제는 Spring MVC에서 Hello를 찍어보는 간단한 예제라 Model에 대한 정확한 이해가 안될 수도 있다.
위 예에서의 Model은 Controller안에 있는 hello메소드이고 Model은 더 공부하다보면 이해할 수 있을 것이다. 
여기서 Model은 내부 비즈니스로직을 처리하는 것 정도로 이해하고 넘어가면 된다.

     







반응형