웹사이트 검색

스프링 MVC 예제


Spring MVC 예제에 오신 것을 환영합니다. 예전 Spring MVC Tutorial에서 Spring Tool Suite를 사용하여 Spring MVC 애플리케이션을 만드는 방법을 설명했습니다. 하지만 오늘은 maven과 Eclipse를 사용하여 기본적인 Hello World Spring MVC 애플리케이션을 만들 것입니다.

스프링 MVC 예제

Spring MVC 예제 Hello World Eclipse 프로젝트

Spring MVC 예제 Eclipse 프로젝트 설정

Dynamic Web 프로젝트를 Maven 프로젝트로 변환

pom.xml에 대한 Spring MVC 종속성

pom.xml에 spring-web 및 spring-webmvc 종속성을 추가하고 servlet-api, jsp-api 및 jstl 종속성도 추가해야 합니다. 최종 pom.xml 파일은 아래와 같습니다.

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.journaldev.spring.mvc</groupId>
	<artifactId>spring-mvc-example</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>Spring MVC Example</name>
	<description>Spring MVC Hello World Example</description>

	<!-- Add Spring Web and MVC dependencies -->
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.6.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.0.0</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
				</configuration>
			</plugin>
		</plugins>
		<finalName>${project.artifactId}</finalName> <!-- added to remove Version from WAR file -->
	</build>
</project>

빌드에서 finalName 구성을 확인하여 WAR 파일 이름에 버전 세부 정보가 없도록 합니다. 프로젝트가 Eclipse에 의해 빌드되면 maven 종속성 섹션에 표시되는 모든 jar를 확인할 수 있습니다.

프론트 컨트롤러로서의 Spring MVC DispatcherServlet

웹 애플리케이션에 Spring MVC 프레임워크를 추가해야 합니다. 이를 위해 아래와 같이 web.xml에 DispatcherServlet을 구성해야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>spring-mvc-example</display-name>

	<!-- Add Spring MVC DispatcherServlet as front controller -->
	<servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
       		<param-name>contextConfigLocation</param-name>
       		<param-value>/WEB-INF/spring-servlet.xml</param-value>
    		</init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern> 
    </servlet-mapping>
    
 </web-app>

contextConfigLocation init-param은 Spring Bean 구성 파일의 위치를 제공하는 데 사용됩니다.

Spring MVC 예제 Bean 구성 파일

다음 단계는 아래와 같이 Spring Bean 구성 파일 spring-servlet.xml을 생성하는 것입니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="https://www.springframework.org/schema/mvc"
	xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:beans="https://www.springframework.org/schema/beans"
	xmlns:context="https://www.springframework.org/schema/context"
	xsi:schemaLocation="https://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing 
		infrastructure -->

	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />
	<context:component-scan base-package="com.journaldev.spring" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
		in the /WEB-INF/views directory -->
	<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>

</beans:beans>

세 가지 중요한 구성이 있습니다.

  1. annotation-driven은 DispatcherServlet에게 @Controller 주석을 사용하여 Controller 클래스를 찾도록 지시합니다.
  2. context:component-scan은 DispatcherServlet에게 컨트롤러 클래스를 찾을 위치를 알려줍니다.
  3. InternalResourceViewResolver 보기 페이지의 위치와 사용된 접미사를 지정하는 빈 구성. 컨트롤러 클래스 메서드는 보기 페이지의 이름을 반환한 다음 응답을 렌더링하는 데 사용할 보기 페이지를 파악하기 위해 접미사가 추가됩니다.

Spring MVC 컨트롤러 클래스

두 개의 URI(홈 페이지의 경우 "/” 및 사용자 페이지의 경우 "/user”)에 응답하는 단일 컨트롤러 클래스가 있습니다.

package com.journaldev.spring.controller;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.journaldev.spring.model.User;

@Controller
public class HomeController {

	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		System.out.println("Home Page Requested, locale = " + locale);
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

		String formattedDate = dateFormat.format(date);

		model.addAttribute("serverTime", formattedDate);

		return "home";
	}

	@RequestMapping(value = "/user", method = RequestMethod.POST)
	public String user(@Validated User user, Model model) {
		System.out.println("User Page Requested");
		model.addAttribute("userName", user.getUserName());
		return "user";
	}
}

간단하게 하기 위해 log4j와 같은 로깅 프레임워크를 사용하지 않았습니다.

Spring MVC 모델 클래스

단일 변수와 getter-setter 메서드가 있는 간단한 모델 클래스가 있습니다. 간단한 POJO 클래스입니다.

package com.journaldev.spring.model;

public class User {
	private String userName;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}
}

Spring MVC 뷰 페이지

아래에 정의된 두 개의 보기 페이지가 있습니다. home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
	<h1>Hello world!</h1>

	<P>The time on the server is ${serverTime}.</p>

	<form action="user" method="post">
		<input type="text" name="userName"><br> <input
			type="submit" value="Login">
	</form>
</body>
</html>

사용자.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Home Page</title>
</head>
<body>
<h3>Hi ${userName}</h3>
</body>
</html>

Spring MVC는 폼 변수를 모델 클래스 변수에 매핑하는 것을 처리하므로 두 위치에서 동일한 변수 이름을 사용합니다. 이것으로 spring mvc 예제 프로젝트를 배포하고 테스트할 준비가 되었습니다.

Spring MVC Eclipse 프로젝트 배포

스프링 MVC 예제 테스트

Spring MVC 예제 프로젝트 다운로드

참조: 공식 페이지