Spring MVC를 이해한다.

Goal

  • Spring MVC Architecture를 이해한다.
  • 기본 Project Structure을 이해한다.
  • Spring MVC에서 Model, View, Controller의 사용법을 이해한다.
    • Model
    • View
    • Controller
  • Spring MVC를 위한 필수적인 기본 설정 방법과 개념을 이해한다.
    • Maven Configuration (pom.xml)
    • Web Deployment Descriptor (web.xml)
    • Spring MVC Configuration

Spring MVC Architecture란

Model, View, Controller를 분리한 디자인 패턴 (개발자가 직접 구현해야 하는 것)

Spring Framework가 제공하는 Class


기본 Project Structure

Web Application Structure(웹 서비스 기본 설정 구조)


Spring MVC에서 Model, View, Controller

Model

Key(name) Value
key1 value
key2 value2

Model Inplementations

  1. java.util.map의 구현
    @RequestMapping("/greeting")
    public String getGreeting(Map<String, Object> model) { 
     String greeting = service.getRandomGreeting();
     model.put("greeting", greeting);
    
     return "home";
    }
    
    1. service 객체의 메서드를 호출하여 결과를 가져온다.
    2. model에 첫 번째 인자 “name”과 결과에 대한 값인 두 번째 인자 value를 넣는다.
      • view에서 해당 이름(“name”)으로 value에 접근한다.
    3. 해당하는 value를 보여줄 View name을 반환한다.
  2. Spring에서 제공하는 Model 인터페이스 구현
    @RequestMapping("/special-deals")
    public String getSpecialDeals(Model model) { 
    
     List<SpecialDial> specialDeals = service.getSpecialDeals();
     model.addAttribute(specialDeals); // value만 넣으면 name은 자동 생성
    
     return "home";
    }
    
    • Map을 사용하는 것의 단점은 “name”을 반드시 지정해야하는 것이다.
    • Model 인터페이스는 addAttribute()와 같은 편리한 메소드를 제공한다.
      • addAttribute()는 Map 속성의 이름(“name”)을 자동으로 생성한다는 점을 제외하면 Map의 put()과 동일하다.
      • 자동으로 생성하고 싶지 않은 모델의 속성 이름을 결정하는 것은 여전히 가능하다.
      • 가장 자주 사용하는 Model 형식
  3. Spring에서 제공하는 ModelMap 객체
    @RequestMapping("/fullname")
    public String getFullname(ModelMap model) { 
    
     // chained calls are handy!
     model.addAttribute("name", "Jon")
          .addAttribute("surname", "Snow");
    
     return "home";
    }
    
    • 추가적인 기능을 제공한다.
      • chain으로 사용 가능

Controller

@Controller
public class HomeController {
    private static final Logget Logger = LoggerFactory.getLogger(HomeController.class);

    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        Logger.info("Welcome {}.", locale);

        // Business Logic
        Date date = new Date();
        DateFormat = dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
        String formattedDate = dateFormat.format(date);

        // BL의 결과를 Model에 저장 
        model.addAttribute("serverTime", formattedDate);

        // Return logical view name
        return "home";
    }

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String doLogin(@RequestParam String username, @RequestParam String password) {
        ...
	    return success;
    }
}

View


Spring MVC를 위한 필수 설정

1. Maven Configuration (pom.xml)

<?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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.hee</groupId>
    <artifactId>projectName</artifactId>
	<name>projectName</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
    <!-- properties에 명시한 version이 알아서 placeholder에 주입된다. -->
	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>4.2.5.RELEASE</org.springframework-version>
		<spring-security-version>4.0.4.RELEASE</spring-security-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
    <dependencies>
    <!-- Spring -->
		<dependency>
            <!-- Spring core dependency -->
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
            <!-- Spring MVC dependency -->
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
    </dependencies>
</project>

참고 Maven 장점

2. Web Deployment Descriptor (web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee; http://java.sun.com/xml/ns/javaee/web-app_2.5.xsd">

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring/service-context.xml
			/WEB-INF/spring/dao-context.xml
			/WEB-INF/spring/security-context.xml
			/WEB-INF/spring/applicationContext.xml
		</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>/WEB-INF/spring/dispatcher-servlet.xml
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>/</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>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

3. Spring MVC Configuration Files

# dispatcher-servlet.xml

# applicationContext.xml

# service-context.xml

# dao-context.xml

# security-context.xml:

관련된 Post

References