5 minute read

개요

: 스프링 프로젝트의 기본 생성 방법보다 아주 원초적으로 스프링 프로젝트가 필요한 최소요구조건이 무엇인지 알아야 한다. 이를 학습하기 위해 작성한다.

  • 프로젝트: Dynamic Web Project
  • 템플릿: Dynamic Web Project

상세

[https://developer-syubrofo.tistory.com/m/14]https://developer-syubrofo.tistory.com/m/14

요약

: 위 참고블로그에서 직접 테스트도 해본 요약이다.

(1) Dynamic Web Project 생성

: 프로젝트를 생성한다.

  • Project name
    프로젝트 이름
  • Target Runtime (서버설정)
    이미 설정을 보유한 서버를 선택 (일단은 None!)
  • Dynamic web module version
    JSP 2.3 이면 서블릿 3.1, JSP 2.2 이면 서블릿 3.0
  • Configuration
    기본값(Default Configuration) 선택

(2) 스프링 라이브러리 준비

: 스프링을 구동하기 위한 라이브러리를 준비한다.

/WEB-INF/lib/(jar몽땅넣기)

- aspectjrt-1.6.10.jar
- javax.imject-1.jar
- jcl-over-slf4j-1.6.6.jar
- jsp-api-2.1.jar
- jstl-1.2.jar
- junit-4.7.jar
- log4j-1.2.15.jar
- servlet-api-2.5.jar
- slf4j-api-1.6.6.jar
- slf4j-log4j12-1.6.6.jar
- spring-aop-4.3.9.RELEASE.jar
- spring-beans-4.3.9.RELEASE.jar
- spring-context-4.3.9.RELEASE.jar
- spring-core-4.3.9.RELEASE.jar
- spring-expression-4.3.9.RELEASE.jar
- spring-web-4.3.9.RELEASE.jar
- spring-webmvc-4.3.9.RELEASE.jar

  1. 스프링 관련된 라이브러리 모두 넣기
  2. 프로젝트 우클릭 - Build Path - Configure Build Path..
  3. Libraries 탭 - Add JARs..
    • 아까 넣은 라이브러리리들을 모두 상대경로로 추가(Add JARs) 한다.
    • 폐쇠망등을 고려하여 어디서든 패키징하여 사용할 수 있도록 프로젝트 내 폴더에 넣고 상대경로로 추가하는것이 나을듯하다.

(3) Spring Bean Configuration File 생성

/WebContent/WEB-INF/name-servlet.xml

<?web version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context" 
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="prefix" value="/WEB-INF/views/" />
       <property name="suffix" value=".jsp" />
   </bean>

   <context:annotation-config/>
    
   <bean class="spring.home.controller.HomeController"/>

</benas>

위 내용을 작성하기전에 아래 내용을 필독한다.
스프링 프로젝트로 만들면 기본적으로 servlet-context, root-context 가 미리 구성되어진다. 하지만 나는 Dynamic 프로젝트 로 만들었다. 이는 Dispacher 서블릿을 수행시키는 Spring Bean Configuration File(예시: servlet-context)이 기본구성에 없다는 말이된다. 그래서 나의 Dynamic 프로젝트 안에 Spring Bean Configuration File 을 생성하고 인식시켜주어야 한다.

  1. WEB-INF 우클릭 - New - Other - Spring Bean Configuration File
  2. 파일명을 xxxx-servlet.xml 으로 작성
    • 반드시 뒷부분은 servlet.xml 으로 작성해야한다. 스프링프로젝트가 아닌 나의 프로젝트 상태에서는 이것을 보고 컨피그를 인식한다.
  3. 파일내용 작성
  4. 파일내용 작성 후 namespace 탭에서 bean, context 딱 2가지를 필수적으로 체크한다.

참고)
빈(bean) 태그를 보면 컨트롤러가 명시되어있다.
컨트롤러가 추가될때마다 Spring Bean Configuration File 내용에서 태그에 컨트롤러를 명시해야할까? 그렇다. old 하고 원초적인 상태라면 하나씩 생성해야할것이다. :) 패키지 전체를 주입하는 `context:component-scan` 태그를 사용하면 특정 패키지에 있는 컨트롤러가 모두 주입될것이다.

<!-- 여러 클래스가 생성된 경우 한번에 bean 주입하는법 -->

<!-- ASIS -->
<!-- <bean class="spring.home.controller.HomeController"/> -->

<!-- TOBE -->
<context:component-scan base-package="spring.home.controller" />

(4) web.xml 생성

/WebContent/WEB-INF/web.xml

<?web version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns:web=http://xmlns.jcp.org/xml/ns/javaee">
    <!--  서블릿1  -->
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <!--  가장먼저 보여질 첫페이지를 설정해준다. 여기서는 WEB-INF 안에 접근가능하다. -->
    <welcome-file-list>
        <welcome-file>homd.do</welcome-file>
    </welcome-file-list>
</web-app>

  1. WEB-INF 우클릭 - New - Other - xml
  2. web.xml 파일명으로 생성
  3. DispatcherServlet 서블릿 매핑정보 입력
    • 아까 만든 Spring Bean Configuration File 의 파일명 앞부분을 으로 작성한다.

중요) DispatcherServlet 매핑
명시된 url-pattern 을 만족해야 서블릿이 발동되는듯 하다.

  • <url-pattern>*.do</url-pattern>
    *.do 를 패턴으로 설정한뒤 www.test.com/main.do 접속한다. .do 문자열이 존재하니까 서블릿이 발동되고 main 이라는 URL 매핑을 찾을것이다.
  • <url-pattern>/</url-pattern>
    / 를 패턴으로 설정한뒤 www.test.com/main 으로 접속한다. / 문자열이 존재하니까 서블릿이 발동되고 main 이라는 URL 매핑을 찾을것이다.

물론 여기까지는 단순히 서블릿 실행을 위해 web.xml 파일안에 서블릿매핑 관점에서 본것이다. 실제 서버에서 올바른 경로에 요청하기위해서는 서버(톰캣, Pivotal 등)의 Context 설정 관점도 동시에 고려해야 한다.

중요) Context docBase, Path 설정
server.xml 에서 서버에 요청하는 경로의 기준을 정한다.

  • <Context docBase="/dymmm" path="/dymmm"...>
    www.test.com/dymmm 이 요청의 기준이 되어 작동한다.
  • <Context docBase="/dymmm" path="/"...>
    www.test.com/ 이 요청의 기준이 되어 작동한다.

이렇게 기준점을 정하고 위에서 설명한것처럼 파일에 접근할때 Dispatcher Servlet 매핑을 거칠 수 있도록 한번 더 고려하면 된다. 통상 / 으로 해주는 것 같다.

컨트롤러에서 위 내용을 고려하고 적절한 매핑URL을 부여하면 끝이다.
@RequestMapping(value=”/home”)

(5) 컨트롤러 작성

/src/spring.home.controller/HomeController.java

 @Controller
   public class HomeController {
     
   @RequestMapping(value="/home.do")
   public ModelAndView home() {
       Systme.out.pirnt("ModelAndView start >>>> ");
       return new ModelAndView("home")
     
   }
        
  1. WEB-INF 우클릭 - New - Package
  2. spring.home.controller 패키지 생성
    • 아까 Spring Bean Configuration File 안에서 태그에 컨트롤러를 명시한 경로이다.
  3. 생성한 패키지 우클릭 - class
  4. HomeController.java 컨트롤러 생성
  5. 코드작성

(6) jsp 작성

/WebContext/WEB-INF/spring/home.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
  pageEncdoing="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert Title Here</title>
</head>
<body>
  hello world...!
</body>
</head>

(7) 서버새로만들기

: 만든 프로젝트를 실행시키기 위한 담당 런타임 서버를 새로만든다.

  1. Window - Preferences
  2. Server - Runtime Environment - Add
  3. 원하는 서버API 선택 (Pivotal, 톰캣 등등)
  4. 다음 - 다음 - Create new instance
  5. base 체크 (Pivotal은 nio 선택)
  6. 생성완료

(8) 서버설정확인하기

: 만든 담당 런타임 서버를 확인해본다.

  1. Window - Show View - Servers
  2. 만든서버 더블클릭

Server Locations

  • Use workspace metadata (does not modify tc Server installation)
    기본 옵션이 Use workspace metadata ( does not modify Tomcat installation) 인데 이 항목으로 설정한 후 웹 프로젝트를 구동시키면 workspace.metadata-plugins\org.eclipse.w st.server.core 경로에 jsp파일이 컴파일되어 생성 되어 있는것을 확인할 수 있다.
  • Use tc Server installation (takes control of tc Server installation)
    runtime environment 에 설정되어 있는 디렉토리에 파일을 컴파일 시키고 싶을 경우에는 이 두번쨰 항목을 선택. 간단하게 말하면 Deploy Path가 wtpwebapps 으로 지정된다 이때 주의할점이 있다. 여러 프로젝트에서 사용하는 경우 Deploy Path 를 다르게 지정하는것이 좋다. 예를들어 webPrj1 프로젝트는 wtpwebapps / webPrj2 프로젝트는 wtpwebapps_2 / webPrj3 프로젝트는 wtpwebapps_3 이와 같이 하는게 좋다. 그렇지 않으면 프로젝트를 바꿔가면서 톰캣을 기동할때 문제가 생길 수 있다고 한다. 셋팅하는사람에 따라 아예 톰캣서버를 다르게 1개더 구축해서 쓰는 사람도 있다.
  • Use custom location (does not modify tc Server installation)
    특정 폴더에 컴파일 시키고 싶을 경우에는이 세번째 항목을 선택한 후 원하는 폴더를 선택해 주면 된다. 해당 항목값을 변경시키고 싶을경우에는 서버를 C ean 한 이후 modul에 추가되어 있는 프로젝트를 먼저 제거해주어야 변경시킬수가 있다.

Server Options

  • Server module without publishing
    정적리소스를 바로 반영시킬 수 있다. html, js등 정적리소스를 수정한뒤에 바로 반영시킬 수 있다.
  • Publish module contexts to separate XML files
    이클립스에서 환경설정이나 xml 파일 작업을하면 그것을 실제 톰켓이 있는 서버와 동기화 시킨다는 것이다. (필요시 포트번호 수정)
  • Modules auto reload by default
    자바수정시 바로 서버재기동 해주는 기능이다. 체크한뒤 Modules 탭에서 Edit버튼을 눌러서 Auto reloading enabled 항목도 동시에 체크하면된다. (해제는 반대로) 이 결과는 결국 server.xml 에서 reloadabled 인가 옵션을 fals true로 바꾸는게 전부이다.

이어서 모듈탭으로 들어가서 Context Path 를 설정한다. (server.xml 에서 해도된다.) 보통 path를 / 로 지정해서 사용을 많이 한다.
이렇게 셋팅하면 http://localhost:8080/Context Path 가 된다.

중요) 이클립스에서 수정한 서버(Pivotal)가 실제서버폴더에 반영되지 않았다..
한참을 삽질했다… 내용은 다음과 같다.
Pivotal 기준으로 스프링프로젝트를 돌리고있었는데 서버측 Context Path 가 문제인지 url매핑이 문제인지.. 뭔가 어긋난다고 생각이 들었다. (결론은 server.xml의 Context Path 문제였다.) 서버뷰 Open launch configuration 에서 Arguments 탭에 가보면 Dcatalina.base 옵션내용에 이 스프링프로젝트를 구동시키는 서버가 있다. 이 경로에서 /conf/server.xml 를 열어보면 이클립스(STS)의 트리맵에서 수정한 sever.xml 내용 동기화가 하나도 안되어있었다. 즉, 난 툴에서 낚서만 한 꼴이다.. 아무것도 없으니 / 루트가 Context Path 였다.. ㅎㅎ

위에 Publish module contexts to separate XML files
항목의 체크를 해제하니까 곧바로 동기화가 된다.! 그런데 Context Path 가 잡힐때 절대경로로 동기화가 된다. Pivotal 로 하면 로컬테스트 용도로만 써야겠다. 톰캣은 어떻게 동기화되는지 시간날때 테스트해봐야겠다.

Context docBase, Path 설정

: 위에서 일련의 과정으로 설명한 내용으로 대체한다 :)

서버실행

: 정상인지 테스트 해본다.

Leave a comment