프로젝트 폴더 및 그 하위 폴더 구성
Maven 프로젝트를 생성했다면 프로젝트 폴더의 하위 디렉토리로 다음의 디렉토리들을 추가해준다. (IntelliJ 사용자 기준)
src/main/webappsrc/main/webapp/WEB-INFsrc/main/webapp/WEB-INF/view
만약 디렉토리를 제대로 추가했다면 아래와 같은 디렉토리 구조가 될 것이다.
이 중 src/main/webapp 디렉토리에는 html, css, js, jsp 등 웹 어플리케이션을 구현하는데 필요한 코드가 저장된다. 그리고 그 하위 디렉토리인 WEB-INF에는 web.xml 파일이 저장된다.
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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>chapter9</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- war: servlet/jsp를 이용하여 개발한 웹 어플리케이션을 배포할 때 사용 -->
<packaging>war</packaging>
<!-- tomcat 10 버전부터는 javax.servlet 패키지 대신 jakarta.servlet 패키지 사용 -->
<dependencies>
<!-- servlet : 동적 웹페이지 생성용 자바 기반 웹 애플리케이션 프로그래밍 기술 -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>
<!-- spring-webmvc : servlet api를 기반으로 클라이언트의 요청을 처리하는 모듈 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.5</version>
</dependency>
<!-- tomcat-embed-jasper : jsp 파일을 servlet으로 변환하는 컴파일러 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>10.1.19</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
추가 설명
servlet: 동적 웹페이지 생성에 사용되는 java 기반 웹 애플리케이션 프로그래밍 기술spring-webmvc: servlet api를 기반으로 클라이언트의 요청을 처리하는 모듈tomcat-embed-jasper: jsp 파일을 servlet으로 변환하는 컴파일러
현재 사용하고 있는 IDE가 Intellij Community 버전이었기 때문에 Ultimate 버전과는 달리 tomcat 연동을 직접 지원해주지 않았다. 그래서 아래 링크들을 참고해가며 tomcat을 IntelliJ에 연동했다.
@EnableWebMvc
이 어노테이션은 Spring MVC를 사용할 때 필요한 다양한 기본 설정을 내부적으로 추가한다.
이를 통해 Spring MVC 기반 웹 애플리케이션 개발에 필요한 최소 설정을 간편하게 수행할 수 있다.WebMvcConfigurer인터페이스
DefaultServlet과ViewResolver에 관한 설정을 조정하는 기능을 제공한다.
MvcConfig 클래스
package config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
/* DispatcherServlet의 매핑 경로를 "/"로 설정했을 때
jsp/html/css 등을 올바르게 처리하기 위한 설정 추가 */
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/* jsp로 Controller의 실행 결과를 보여주기 위한 설정 추가 */
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
}
주요 설정 내용 정리
- DispatcherServlet 등록
- contextClass 초기화 파라미터 값 지정 : 웹 어플리케이션용 Spring 컨테이너 클래스
- contextConfiguration 초기화 파라미터 값 지정 : Spring 설정 클래스 목록
- tomcat 등으로 웹 어플리케이션 구동 시 이 servlet도 실행하도록 설정
- 지정한 DispaterServlet이 클라이언트의 모든 요청을 처리
- HTTP 요청 파라미터의 인코딩 처리용 servlet 필터 등록
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<!-- 1. DispatcherServlet 등록 -->
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 2. contextClass 초기화 파라미터 값 : 웹 어플리케이션용 Spring 컨테이너 클래스 -->
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<!-- 3. contextConfiguration 초기화 파라미터 값 : Spring 설정 클래스 목록 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
config.MvcConfig
config.ControllerConfig
</param-value>
</init-param>
<!-- 4. tomcat 등으로 웹 어플리케이션 구동 시 이 servlet도 실행하도록 설정 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 5. 지정한 DispaterServlet이 클라이언트의 모든 요청을 처리 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 6. HTTP 요청 파라미터의 인코딩 처리용 servlet 필터 등록 -->
<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>
Spring MVC 프레임워크의 컨트롤러(Controller)는 웹에서의 요청을 처리하고 그 결과를 View로 전달하는 Spring Bean 객체이다. Spring Controller로 사용되는 클래스는 다음의 어노테이션들을 사용한다.
Spring Controller에서 사용되는 주요 어노테이션
@Controller
이 어노테이션이 적용된 클래스를 Spring MVC의 Controller로 지정한다.@GetMapping("요청 경로")
이 어노테이션의 값에 해당되는 웹 어플리케이션 경로로 들어온 HTTP GET 요청을 이 어노테이션이 사용된 메서드로 매핑하고, 해당 메서드를 이용하여 요청을 처리한다.@PostMapping
이 어노테이션이 적용된 메서드의 기능은@GetMapping과 유사하지만 HTTP POST 요청에 대해 그러한 기능을 수행한다는 점에서@GetMapping과 차이가 있다.@RequestParam(value="HTTP 요청 파라미터명", [required=true/false])
HTTP 요청 파라미터의 값을 해당 어노테이션이 사용된 메서드의 파라미터로 전달한다.
이 중 value 속성은 HTTP 요청 파라미터명을 지정하고, required 속성은 HTTP 요청 파라미터의 필수 여부를 지정한다.
HelloController 클래스
package chap09;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloController {
/* Model : Controller의 처리 결과를 View로 전달할 때 사용 */
@GetMapping("/hello")
public String hello(Model model, @RequestParam(value="name", required = false) String name) {
/* addAttribute() : 지정된 이름과 값을 갖는 Model 속성 추가 */
model.addAttribute("greeting", "안녕하세요, " + name);
/* Controller의 처리 결과를 보여줄 View의 이름 반환*/
return "hello";
}
}
ControllerConfig 클래스
package config;
import chap09.HelloController;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ControllerConfig {
@Bean
public HelloController helloController() {
return new HelloController();
}
}
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
</head>
<!-- ${속성명} : Controller에서 추가한 Model 속성명으로 저장된 값을 불러온다. -->
<body>
인사말: ${greeting}
</body>
</html>
Spring MVC 프레임워크는 Controller에서 추가했던 Model 속성을 View의 jsp 코드에서 접근하는 것을 가능하게 한다. 이는 Spring MVC 프레임워크가 Model.addAttribute()를 통해 Model에 추가한 속성을 HttpServletRequest에 옮겨주는 작업을 수행한다는 점에서 기인한다.
따라서 jsp로 View 코드를 구현할 경우 Controller에서 추가한 속성의 이름을 통해 그 속성값을 응답 결과로 출력하게 된다.
실행 결과
- Spring MVC 설정
- 웹 브라우저의 요청을 처리하기 위한 Controller 구현
- Controller의 처리 결과를 보여주기 위한 View 구현
- Controller에서 Service, DAO를 사용하여 클라이언트의 요청을 처리하는 기능
- Controller에서 HTTP 요청 파라미터로 받은 값을 하나의 객체로 받아 검증하는 기능
- Spring이 제공하는 jsp 커스텀 태그를 이용한 폼 처리
- Controller에서 세션 또는 쿠키 사용
- 인터셉터로 Controller에 대한 접근 처리
- JSON 응답 처리