※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
2023.01.29 - [나에 대한 기록] - [독서 기록] 스프링5 프로그래밍 입문 - 최범균 저
[독서 기록] 스프링5 프로그래밍 입문 - 최범균 저
https://search.shopping.naver.com/book/catalog/32458958626 스프링5 프로그래밍 입문 : 네이버 도서 네이버 도서 상세정보를 제공합니다. search.shopping.naver.com 지난 한 주 동안 최범균님의 스프링 5 프로그래밍
krchoish.tistory.com
중급 Spring 책으로 넘어가기 전에, 해당 책에서 배운 기초적인 내용으로 가벼운 게시판을 만들어보려 한다.
해당 프로젝트의 기본 설정은 다음과 같다.
- JDK 11
- Tomcat 9.0
- MySQL
- Gradle 7.6
- Spring 5
[ 1 ] Gradle 설정
Gradle은 Maven과 같은 빌드관리도구로서 프로젝트를 진행하면서 사용하는 수많은 라이브러리들을 관리해 주는 도구이다. 지금까지 Maven을 활용해 왔지만, Maven보다 뛰어난 성능, xml보다 간결한 Groovy 스크립트 언어 기반이라는 장점을 가진 Gradle을 사용해 보고자 한다.
pom.xml을 통해 라이브러리 의존 설정을 하는 Maven과 달리, Gradle은 build.gradle로 기본적인 설정을 진행한다.
apply plugin: 'java'
apply plugin: 'war'
sourceCompatibility = 11
targetCompatibility = 11
compileJava.options.encoding = "UTF-8"
repositories {
mavenCentral()
}
dependencies {
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
providedCompile 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.3'
implementation ('javax.servlet:jstl:1.2')
implementation ('org.springframework:spring-webmvc:5.2.22.RELEASE')
implementation ('org.springframework:spring-jdbc:5.2.22.RELEASE')
implementation ('org.apache.tomcat:tomcat-jdbc:10.1.5')
implementation ('com.mysql:mysql-connector-j:8.0.32')
}
wrapper {
gradleVersion = '7.6'
}
2행의 'war' 플러그인은 자바 웹 어플리케이션을 위한 플러그인이다. Servlet, JSP, JSTL에 대한 의존과 spring-webmvc 모듈에 대한 의존을 추가했다.
※ Could not find method Compile() for arguments [javax.servlet.jsp.jstl:jstl:1.2] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
'Compile'로 의존 설정 시 다음과 같은 에러가 발생할 수 있는데, Gradle version 7 부터는 Compile, testCompile이 deprecated 되었으므로 implementation, testImplementation을 사용해야 한다. Compile을 implementation으로 변경하면 해결될 것이다.
[ 2 ] Spring MVC를 위한 최소 설정
Spring 2.5, 3 버전에서는 Spring MVC를 사용하기 위해 상황에 맞는 설정을 일일이 구성해야 했다.
이러한 번거로움을 수반하지 않기 위해 내부적으로 다양한 빈 설정을 해 주는 @EnableWebMvc 애노테이션을 사용한다.
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 {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
}
@EnableWebMvc 애노테이션이 Spring MVC를 사용하는데 필요한 기본적인 구성을 자동으로 설정해 준다면, WebMvcConfigurer인터페이스는 Spring MVC의 개별 설정을 조정할 때 사용한다.
- configureDefaultServletHandling 메서드는 DispatcherServlet의 매핑 경로를 '/'로 주었을 때, JSP, HTML, CSS를 올바르게 처리하기 위한 설정을 추가한다.
- configureViewResolvers 메서드는 JSP를 이용해서 Controller의 실행 결과를 보여주기 위한 설정을 추가한다. 필자는 /WEB-INF/view/ 에 있는 ~.jsp로 실행 결과인 View를 리턴할 계획이다.
[ 3 ] DispatcherServlet 설정
Spring MVC가 웹 요청을 처리하려면 DispatcherServlet을 통해 웹 요청을 받고, 요청에 맞는 Controller를 검색하여 요청을 처리할 수 있도록 해야 한다. 이를 위해 web.xml 파일에 DispatcherServlet을 등록한다. (web.xml은 src/main/webapp/WEB-INF에 위치한다)
<?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" metadata-complete="true">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
config.MemberConfig
config.MvcConfig
config.ControllerConfig
</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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
- 10~13행: DispatcherServlet을 dispatcher라는 이름으로 등록
- 14~19행: contextClass 초기화 파라미터 설정. 자바 설정을 이용하는 웹 어플리케이션인 경우 AnnotationConfigWebApplicationContext 클래스 사용
- 20~26행: contextConfiguration 초기화 파라미터의 값을 지정. 이 파라미터에는 Spring Configuration 클래스 목록을 지정하며 각 Configuration 파일의 경로는 줄바꿈이나 콤마로 구분. 해당 프로젝트에서는 config 패키지에서 세 개의 Configuration 파일을 사용할 계획
- <load-on-startup>: tomcat과 같은 컨테이너가 해당 웹 어플리케이션 구동할 때 이 Servlet을 함께 실행하도록 설정
- 30~33행: 모든 요청을 DispatcherServlet이 처리하도록 Servlet mapping
- 35~48행: HTTP 요청 파라미터의 인코딩 처리를 위한 Servlet filter. UTF-8로 인코딩할 수 있도록 한다.
[ DispatcherServlet의 웹 요청 처리 과정 ]
(1) DispatcherServlet이 모든 웹 요청을 받는다.
(2) DispatcherServlet은 웹 요청이 들어오면 요청에 맞는 Controller를 직접 검색하지 않고 HandlerMapping이라는 Bean 객체에게 Controller 검색을 요청한다.
(3) HandlerMapping은 브라우저의 요청 경로를 바탕으로 적절한 Controller Bean 객체를 DispatcherServlet에 전달한다.
(4) DispatcherServlet은 전달받은 Controller Bean 객체의 적절한 메서드 수행을 HandlerAdapter Bean에게 위임한다.
(5) HandlerAdapter는 Controller의 적절한 메서드를 호출하여 요청을 처리하고 그 결과를 ModelAndView라는 객체로 변환하여 DispatcherServlet에 리턴한다.
(6) DispatcherServlet은 ViewResolver 객체를 사용하여 적절한 View 객체를 찾거나 생성하여 리턴한다.
처리 과정을 살펴보면 DispatcherServlet은 모든 연결을 담당하는 역할을 맡고 있음을 알 수 있다. 하지만, 우리는 DispatcherServlet이 사용해야 할 HandlerMapping, HandlerAdapter 클래스를 Bean으로 등록한 적이 없다.
위에서 @EnableWebMvc 애노테이션은 Spring MVC를 사용하는데 필요한 기본적인 구성을 자동으로 설정함을 언급했다. 그 설정에는 HandlerMapping, HandlerAdapter 클래스도 포함되어 있다. 따라서 @EnableWebMvc 애노테이션을 활용하면 우리는 DispatcherServlet이 사용해야 할 HandlerMapping, HandlerAdapter 클래스를 Bean으로 등록할 필요가 없다.
[ 4 ] 서버 연결 확인
Spring MVC가 잘 구동하는지 테스트하기 위해 기본적인 Controller와 View를 작성한다.
"/hello" GET 요청 시 쿼리스트링으로 넘겨받은 이름을 View로 출력해 보자. 이를 위해 아래의 Controller를 작성한다.
package controller;
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 {
@GetMapping("/hello")
public String hello(Model model, @RequestParam(value="name", required = false) String name) {
model.addAttribute("greeting", "hello, " + name);
return "hello";
}
}
Controller를 구현했다면 Controller를 Spring Bean으로 등록해야 한다. DispatcherServlet 설정에서 contextConfiguration 초기화 파라미터의 값으로 config.ControllerConfig를 줬으므로
package config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import controller.HelloController;
@Configuration
public class ControllerConfig {
@Bean
public HelloController helloController() {
return new HelloController();
}
}
config.ControllerConfig에 HelloController를 Bean으로 등록한다.
결과를 출력할 View인 JSP는 다음과 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
test: ${greeting}
</body>
</html>
Gradle 프로젝트를 tomcat으로 구동하고 "/hello?name=TaBo"를 요청해 보자.
Spring MVC가 잘 구동됨을 확인할 수 있다.
[ 계획 ]
- 회원가입 구현
- 로그인 및 Session으로 정보 유지
- 게시판에 글 올리기
- admin 계정으로 게시판 관리하기
- 파일 업로드
'Project > [Spring] 게시판' 카테고리의 다른 글
[Spring] 게시판 만들기 - 로그인 및 로그아웃 구현 (2) | 2023.02.13 |
---|---|
[Spring] 게시판 만들기 - 커맨드 객체 검증 및 에러 코드 지정 (1) | 2023.02.11 |
[Spring] 게시판 만들기 - 회원가입 구현 (1) | 2023.02.10 |