스프링 프로젝트에서 설정을 좀 하면 Servlet 사용하기가 너무 쉬워서 Dynamic Web Project로 Servlet을 못 만드는 상황을 보게 되었습니다. 그래서 간단한 예제를 작성 해봤습니다.

 

 

 

1. Dynamic Web Project를 생성 해주세요. 상단 탭의 'File -> New -> Others' 

 

 

 

2. 프로젝트 이름 입력 및 런타임 서버를 설정 해주세요. 저는 Wildfly 를 사용 하겠습니다.

 

 

 

3 Servlet 클래스를 생성 합니다.상단 탭의 'File -> New -> Others' 

  그림3-2 처럼 정보를 입력한 후 그림3-3처럼 자동 생성될 메소드(doGet)를 선택 해주세요.

 선그림 3-1
그림 3-2
그림 3-3

 

 

4. 클래스를 생성하면 아래와 같이 자동으로 doGet 메소드가 생성됩니다.

package com.demo;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Hello
 */
@WebServlet("/Hello")
public class Hello extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Hello() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
}

 

 

 

 

5. Wildfly 서버를 실행 시키고 http://localhost:8080/{Project name}/{WebServlet Mapping name}접속 하시면

그림 5-2처럼 메세지가 보여집니다.

그림 5-1

 

그림 5-2

Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

 

초기 스프링 부트 프로젝트를 생성 하고 해당 에러가 발생 했습니다.

부트는 기본적으로 jsp를 지원 해주지 않기 때문에 jsp 관련 라이브러리를 추가 하면 정상적으로 실행 할 수 있습니다.

 

아래 코드를 pom.xml에 추가하시면 되고, 버전은 필요하신 버전에 맞춰 수정 하시면 됩니다 !

 

	
		
		    jstl
		    jstl
		    1.2
		
		
		    javax.servlet.jsp
		    javax.servlet.jsp-api
		    2.3.1
		    provided
		

처음 스프링 프로젝트가 생성되면 아래와 그림과 같은 구조를 확인 하실 수 있습니다.

간단하게 구성을 설명 하겠습니다.


src/main/java 는 프로젝트에서 개발되는 모든 Java코의 경로가 됩니다.

개발자나 프로젝트의 기호에 따라 sql mapper, tiles 등 xml 의 경로가 포함되기도 합니다.


src/main/recoursec 는 서버가 작동될때 사용되는 파일들의 경로입니다.

DB 연동을 위한 sql mapper의 xml 파일, titles의 template.xml 파일, 다국어 지원을 위한 properties.xml 등이 포함됩니다.


src/test/java 와 src/test/resources 는 말 그대로 테스트용 경로입니다. 위 두 경로와 목적만 다릅니다.


JRE System Library 세팅된 자바 버전을 나타냅니다.


Maven Dependencies 는 pom.xml 에 등록된 라이브러리들이 표시 되어 있습니다.


src->webapp->resources 는 이미지, 자바스크립트 등 페이지를 구성하는 resources들의 경로입니다.

src->webapp->WEN-INF->spring  스프링을 구성하는 설정 파일들의 경로입니다.

src->webapp->WEB-INF->views 실제 페이지를 구성하는 jsp, html 등의 파일들의 경로입니다.





 아래부터 home.jsp 의 작동 원리를 설명 하겠습니다.





기존 Dynamic Web 프로젝트는 jsp 등 웹 파일에서 서버를 실행 하면 바로 해당 페이지에 접근을 할 수 있었습니다.

하지만 스프링에서는 보안을 위해 웹 파일들을 WEB-INF 안에 저장 하고 있습니다.

이유는 WEB-INF 는 직접 접근을 할 수 없기 때문입니다. 이러한 이유로 home.jsp 를 바로 실행 시키면 

아래처럼 404 에러가 발생합니다. 그렇기 때문에 우리는 컨트롤러를 통해 페이지를 호출 해야 합니다.

그림(스프링 작동 순서) 에서 부터 순서대로 설명 하겠습니다.





- 그림(스프링 작동 순서)




1. web.xml 은 프로젝트의 환경 설정을 해주는 파일입니다. 프로젝트가 실행되면 이 파일이 가장 먼저 실행 되고, 

DispatcherServlet이 해당 프로젝트로 들어오는 요청들을 낚아채고 핸들링을 해줍니다.

이 부분은 낚아챈 요청들을 servlet-context.xml 로 보내주는 부분입니다.





	
	
		contextConfigLocation
		/WEB-INF/spring/root-context.xml
	
	
	
	
		org.springframework.web.context.ContextLoaderListener
	

	
	
		appServlet
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			/WEB-INF/spring/appServlet/servlet-context.xml
		
		1
	
		
	
		appServlet
		/
	







2. servlet-context 는 낚아챈 요청을 받아 <annotation-drive/> 란 태그를 사용하여 컨트롤러에서 어노테이션을 사용할 수 있게 해줍니다.

<context:component-scan base="com.프로젝트.패키지명"/> 태그는 어노테이션을 사용할 영역(패키지)를 설정 할 수 있게 해줍니다.

낚아챈 요청은 com.포르젝트.패키지명에  요청된 url에 맞게 맵핑이 됩니다.

  




	
	
	
	

	
	

	
	
		
		
	
	
	
	
	
	


  



3. @RequestMapping(value = "/", method=RequestMethod.GET) 에 있는 value 값을 참조하여 요청된 url과 맵핑을 합니다.

return 되는 값은 "home" 이지만, 과정 4에서 페이지 경로를 prefix(/WEB-INF/views/) , suffix(.jsp) 가 자동으로 완성해주기 때문에,

최종적으로 /WEB-INF/view/return값.jsp 가 호출이 됩니다.








localhost:8080 을 실행 해보시면 아래와 같은 결과가 나오게 됩니다.

@RequestMapping 에서 value값을 "Index" 라고 설정을 하게 되면, localhost:8080/Index 라는 url로 접근 하면 됩니다.





처음 스프링을 공부 했을때, 왜 home.jsp가 실행되지 않는지 이해를 못 했습니다.

근데 사실 아주 간단하지 않은 간단한 구조를 갖고 있었습니다.


home.jsp 에서 바로 실행을 하게 되면 아래와 같이 404 에러가 발생 합니다.

왜냐하면, WEB-INF는 보안의 이유때문에 직접 접근이 불가능 합니다.

해당 폴더에는 프로젝트의 환경 설정을 해주는 중요한 파일들이 존재하게 됩니다.


예를들어, DB 를 사용한다면 WEB-INF폴더에  저장된 DB의 ID, PW가

적나라게 드러나기 때문입니다.






그렇다면 어떻게 접근 해야 할까요?

스프링 프로젝트의 기본 home.jsp 작동 원리를 이해 하시려면,

밑의 프로젝트 구조를 알아야 합니다.







webapp 의 WEB-INF 폴더 안에는 web.xml 이란 파일이 존재합니다.

*web.xml 은 프로젝트의 환경 설정을 해주는 파일

프로젝트가 실행되면 web.xml 이 가장 먼저 실행되고, 그 다음 

DispatcherServlet이 해당 프로젝트로 들어오는 요청들을 낚아채고 핸들링 해줍니다.

그 낚아챈 요청들은 servlet-context.xml로 보내주게 됩니다.






그렇게 요청을 받은 servlet-context.xml 은

① : <annotation-driven /> 란 태그를 사용하여 @(어노태이션)을 사용할 수 있고,

그 어노태이션의 사용 위치는(패키지명:Home_Test)

② : <context:component-scan base-package="aaa.bbb.(패키지명)" />

해당 패키지명 내부의 클래스들입니다.(클래스명:HomeController.java)









@RequestMapping의 value가 "/" 인데 이것의 의미는 프로젝트명 이후에

아무런 주소없이 실행을 시키면 해당 메소드를 실행 시키라는 뜻입니다.

addAttribute는 model객체에 "serverTime"이란 이름으로 현재 시간을 담은것이고,

return "home"은 위의 servlet-context.xml에서 설정한

preffix와 suffix를 앞 뒤에 붙여준다는 뜻입니다.



즉!!! http://localhost:8080/Home_Test/ 이렇게 주소창에 실행을 시키면


1. web.xml 실행 후 servelt-context 가 요청 낚아챔


2. servlet-context에서 어노태이션의 사용 여부 및 위치를 확인 후 값 전달

* /Home_Test/ 라서 "/"요놈만 넘어가는 중입니다,

  ex) Home_Test/home.jsp 라면 home.jsp 가 넘어갑니다.


3. Homecontroller의 @Controller가 확인되며, mapping 값인 "/"인 home 메소드가 실행

* return 값 "home"은 다시 servlet-context.xml 로 넘어갑니다.


4. servlet-context.xml 이 return 값 'home'에 preffix와 suffix를 붙여 줌

* preffix(/WEB-INF/views) + home + suffix(.jsp) = /WEB-INF/views/home.jsp


5. home.jsp 가 실행됨

* 실제론 (http://localhost:8080/Home_Test/WEB-INF/views/home.jsp) 가 실행 됩니다.





Can not find the tag library descriptor for "http://  java.sun.com/jsp/jstl/core"


이런 에러가 발생한다면, 우선 pom.xml 로 가서 'javax.servlet' 부분을 확인 하세요


<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>


하지만 해당 부분이 별 문제가 없다면, Project를 clean 해보세요

* 상단 메뉴 -> Project -> Clean -> All projects or 해당 프로젝트 선택 후 'OK'


그래도 안 되신다면, 

Maven 저장 경로에서 pom.xml에 등록된 jstl의 jar파일이 있는지 확인 해주세요.

만약 없으면 Maven 업데이트를 해주면 자동으로 다시 설치 됩니다.

* 프로젝트 폴더 -> 우클릭 -> Maven -> Update Project


보통 pom.xml을 잘 못 만지거나, 아무런 이유 없이 발생 하더군요...

아무런 이유가 없다면 첫 번째 방법을 써보시고,

아니라면 두 번째 방법을 써보세요 :-)






첫 번째 파일 : web.xml (WEB-INF폴더)

--  WEB-INF 폴더에 'config'란 폴더 생성 후 'presentation-layerbiz.xml' 파일 생성

--  서버 시작될 때, 해당 위치에 있는 context파일을 모조리 읽어들이는 것을 뜻합니다.

     이 경로 안에 파일이 오류나면 서버 실행시 404 에러가 발생합니다.

--  중간의 characterEncoding 은 한글 인코딩을 위해 사용합니다.

--  servlet-name. class, url-pattern 에 오타 없는지 꼭 확인 해야 합니다.

     이 부분은 컨트롤러를 위해 사용 됩니다.




	
 	
		ex(main.do or index.jsp)
		



	
		contextConfigLocation
		/WEB-INF/spring/root-context.xml
	
	
	
		org.springframework.web.context.ContextLoaderListener
	

	
	
		characterEncoding
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
	
	
		characterEncoding
		*.do
	


	
	
		action
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			
			/WEB-INF/config/presentation-layerbiz.xml
		
	
		
	
		action
		*.do
	






두 번째 파일 : root-context.xml(WEB-INF -> spring 폴더)

--  DB를 연동 할 때 사용함. 중간중간 DB 및 서버 정보는 사용자에 맞게 입력해야합니다.

--  3 번째 단락의 component-scan은 Service 와 Implement 가 저장된 패키지명으로 해야됩니다.




	
   
   
      
      
      
      
      
   

   
   
      
      
      
   

   
   

      
   

   

   





세 번째 파일 : presentation-layerbix.xml

--  component-scan 의 base-package 부분은 controller 를 저장한 패키지 이름으로 해야합니다.



xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan r />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
		"http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
  
    
   
   
      
         
   




+ Recent posts