[Spring] 스프링 웹 프로젝트 생성하기
- Spring Boot를 사용해 프로젝트를 구축하는 요즘 시대에 Maven, Gradle 등을 이용하지 않고, 라이브러리 파일만을 이용하여 스프링 프로젝트를 만들어 본다.
- Controller, RestController 등 간단한 웹 개발에 필요한 라이브러리만 포함시켜 설정했다.
- 테스트 환경은 다음과 같다.
- Java : jdk11
- Eclipse : 2020-06(4.16.0)
- Tomcat : 9.0.82
- 사용하는 라이브러리 파일은 다음과 같다. 다음 파일들은 https://mvnrepository.com 에서 받을 수 있다.

1. Eclipse에서 Dynamic Web Project를 생성
- 프로젝트 생성 시 Dynamic Web Project를 선택하고

- 프로젝트 이름을 지정

- 생성 마지막 단계에서 [Generate web.xml deployment descriptor] 에 체크하고 [Finish] 버튼을 클릭하여 프로젝트 생성

- 프로젝트 생성 시 다음과 같이 나타날 것이다.

2. Spring 관련 라이브러리 추가
- mvnrepository에서 받은 파일들을 [Project]/WebContent/WEB-INF/lib 폴더 아래로 이동.

3. 스프링 애너테이션
- 스프링 3.0 이전에는 DI나 AOP 같은 기능은 XML 파일을 설정한 후 사용했다고 한다.
- 이는 애플리케이션의 기능이 복잡해지면 XML 설정 파일도 복잡해졌고 관리에 문제가 생긴다.
- 따라서 스프링 3.0부터DI 같은 설정은 코드에서 직접 설정할 수 있게 애너테이션 기능을 제공한다.
* 스프링 애너테이션 제공 클래스
클래스 | 기능 |
DefaultAnnotationHandlerMapping | 클래스 레벨에서 @RequestMapping을 처리한다. |
AnnotationMehtodHandlerAdapter | 메서드 레벨에서 @RequestMapping을 처리한다. |
* <context:component-scan> 태그 기능
- <context:component-scan> 태그를 사용해 패키지 이름을 지정하면 애플리케이션 실행 시 해당 패키지에서 애너테이션으로 지정된 클래스를 빈으로 만들어 준다.
<context:component-scan base-package="패키지 이름" /> |
애너테이션 | 기능 |
@Controller | 스프링 컨테이너가 component-scan에 의해 지정한 클래스를 컨트롤러 빈으로 자동 변환한다. |
@Service | 스프링 컨테이너가 component-scan에 의해 지정한 클래스를 서비스빈으로 자동 변환한다. |
@Repository | 스프링 컨테이너가 component-scan에 의해 지정한 클래스를 DAO 빈으로 자동 변환한다. |
@Component | 스프링 컨테이너가 component-scan에 의해 지정한 클래스를 빈으로 자동 변환한다. |
- 이러한 클래스들은 실행 시 자동으로 빈으로 생성된다.
4. 스프링 애너테이션 사용을 위한 설정
- 애너테이션을 사용하기 위해 관련 클래스를 XML 설정 파일에서 빈으로 설정해야 한다.
4.1 web.xml 파일 설정
- 프로젝트 디렉토리 내 WebContent/WEB-INF 아래에 있는 web.xml 파일을 다음과 같이 작성한다.
* WebContent/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup><!-- 값이 1 이상이면 톰캣 실행 시 DispatcherServlet을 미리 메모리에 로드한다. -->
</servlet>
<servlet-mapping>
<servlet-name>action</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>
4.2 action-servlet.xml 파일 생성
- 스프링에서 제공하는 DefaultAnnotationHandlerMapping과 AnnotationMethodHandlerAdapter 클래스의 빈을 설정한다.
- <contenxt:component-scan base-package="com.spring" /> 태그를 이용해 com.spring 하위 패키지에 애너테이션이 적용되도록 설정한다.
- View(JSP) 파일은 /WEB-INF/views 디렉터리 아래에 작성하면 읽을 수 있도록 설정한다.
* WebContent/WEB-INF/action-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 클래스 레벨에 @RequestMapping을 처리한다. -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 메서드 레벨에 @RequestMapping을 처리한다. -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
<!-- com.spring 패키지에 존재하는 클래스에 애너테이션이 적용되도록 설정한다. -->
<context:component-scan base-package="com.spring" />
</beans>
5. API 테스트
- 설정을 마쳤다. 이제 애너테이션을 이용한 테스트 코드를 작성해 본다.
5.1 View를 반환하는 ViewController
- jsp 파일을 반환하는 뷰 컨트롤러를 작성한다.
- 컨트롤러 자바 파일은 com.spring 패키지를 생성해 해당 패키지 아래에 작성하도록 한다.


* com/spring/ViewTestController.java
package com.spring;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ViewTestController {
@GetMapping("/view")
public String firstView() {
return "firstView";
}
}
5.2 View(JSP) 파일 작성
- 브라우저에 표시될 JSP 파일을 작성한다.
* WEB-INF/views/firstView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>First</title>
</head>
<body>
<h1>첫 번째 JSP입니다.</h1>
<p>/view 요청 시 반환됩니다.</p>
</body>
</html>
5.4 값을 반환하는 RestController
- 이번에는 뷰가 아닌 값(문자) 등을 반환하는 컨트롤러를 작성한다.
* com/spring/RestTestController.java
package com.spring;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RestTestController {
@GetMapping("/rest")
public String value1() {
return "rest";
}
}
- http://IP:port/DynamicWeb/rest 를 입력하여 확인한다.

6. 컨텍스트 이름을 입력하지 않고 요청하기
- 위 예를 보면 요청 시 컨텍스트(프로젝트 이름)를 포함한다. 이를 입력하는 것은 귀찮다.
- 톰캣의 server.xml 을 다음과 같이 수정하면 컨텍스트 이름을 제외하고 요청할 수 있다.
* server.xml
<Host>
<Context docBase="DynamicWeb" path="/" reloadable="true" source="org.eclipse.jst.jee.server:DynamicWeb"/>
</Host>
- <Context> 태그 안에 path의 값을 "/" 만 입력한다.
- 이제 다음과 같이 요청할 수 있다.

- 이것으로 간단하게 라이브러리 파일만을 이용해 스프링 프로젝트를 생성했다.
- DB 연동, 파일 업로드 등 다른 기능이 필요하면 라이브러리를 추가해 설정하고 개발하면 될 것 같다.