Spring

[Spring] 스프링 웹 프로젝트 생성하기

dev23 2024. 10. 15. 19:30
반응형

- 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를 선택하고

Dynamic Web Project 생성

 
- 프로젝트 이름을 지정
 

프로젝트 이름 설정

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

web.xml 파일 생성

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

생성 후 프로젝트 구조

 

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 연동, 파일 업로드 등 다른 기능이 필요하면 라이브러리를 추가해 설정하고 개발하면 될 것 같다.

반응형