티스토리 뷰

Spring

[Spring] Dispatcher-Servlet 설정

망나니개발자 2017. 11. 4. 03:42

우리의 최종 목표는 화면 전환(페이지 이동)을 해보고 DB에서 값을 꺼내 출력을 해보는 것으로 잡겠습니다. 그렇게 하기 위해서 꼭 필요한 단계가 지금하는 내용인데, 이번에는 dispatcher-servlet을 web.xml에 등록하고, pom.xml, web.xml을 수정하는 작업을 해보도록 하겠습니다. 현재 일하는 곳에서 준 템플릿을 바탕으로 그것에 정의된 클래스를 사용하는 관계로 필수적이지만 초보자 수준에서는 불필요한 라이브러리 등이 들어갈 수 있습니다.(물론 저도 초보입니다ㅎㅎ)



1. dispatcher-servlet 설정하기



기본적으로 우리가 만드는 것은 웹페이지이기 때문에, 우리는 화면을 제어할 수 있어야 합니다.

그러기 위해서 화면의 제어를 앞장서서 담당하는 dispatcher-servlet에 대해서 알아보도록 하겠습니다.

(dispatcher-servlet이 뭔지 모르신다면 여기 혹은 servlet이 뭔지 모르신다면 여기를 참고해주세요.)

먼저 소스코드를 보여드리고 아래에서 설명드리도록  하겠습니다.



[ dispatcher-servlet.xml ]

 < ?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
                           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd ">
    
	<mvc:annotation-driven />

    <context:component-scan base-package="com.s4c.stg.*">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
    
    <bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" />
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    	<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    	<property name="prefix" value="/WEB-INF/views/"/>
    	<property name="suffix" value=".jsp"/>
    </bean>
    
</beans>



dispatcher-servlet은 webapp/WEB-INF/config 폴더에 생성하면 됩니다.

위에 적은  xmlns관련된 내용은 아래의 bean에서 사용하기 위한 클래스를 사용하기 위해 명시해주는 것이므로 빠짐없이 적어주어야 합니다! 여기에 추가된 <mvc:annotation-driven>은 우리가 Annotation을 활용할 때 기본적인 Default 방식을 설정해준다고 합니다. 그러므로 없어도 크게 상관 없다고 합니다.

그다음에 추가된 내용은 <context:component-scan>과 관련된 내용입니다. 일반적으로 스프링에서 클래스를 만들고 *의존성 주입은 @Autowired를 통해 (클래스 생성을) 처리합니다. 그런데 @Autowired를 하기 위해서는 application-context.xml에 해당클래스 모두를 bean으로 등록해두어야 되는데, 이러한 과정이 번거로우므로<context:component-scan>을 이용하여 처리하게 해주는 것입니다. base-pacakge = "com.s4c.stg.*"라고 나와있는데, 이것은 com.ndc.stg.으로 시작하는 패키지 모두를 등록하겠다는 것입니다.(모든 자바 클래스 패키지가 이것으로 시작하게 만들면 참 편하겠죠??) 그 다음의 objectMapper는 뷰 이름으로부터 사용할 View Object를 맵핑해줍니다. 여기서는 /WEB-INF/views/ 폴더의 .jsp로 끝나는 파일들을 찾아서 매핑해준다는 뜻입니다.



2. web.xml 수정하기



[web.xml]


우리가 dispatcher-servlet.xml을 만들긴 했지만 이것을 프로젝트에 묶어주지않았습니다. 그러므로 현재는 dispatcher-servelt을 사용할 수 없는데, 이것을 사용하기 위해서는 web.xml에 등록해주어야 합니다. 그래서 이것과 추가적으로 web.xml에 등록해야하는 내용을 한번에 처리하도록 하겠습니다!

<web-app version="3.0" 
		xmlns="http://java.sun.com/xml/ns/javaee" 
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <display-name>Archetype Created Web Application</display-name>

  <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>
  
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/dispatcher-servlet.xml</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/config/spring/context-*.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <session-config>
    <session-timeout>-1</session-timeout>
  </session-config>

</web-app>

제일 먼저보면 <filter>라는 속성으로encodingFilter라는 것을 추가해주었습니다. 대충 내용을 보면 대충 감이 오시겠지만 인코딩을 UTF-8로 설정하여 필터링하겠다는 설정입니다. 그리고 아래의 filter-mapping은 어떠한 클래스들에 대하여 utf-8로 인코딩을 할 것인지 명시해주었는데 /의 형식으로 시작하는 url에 대하여 UTF-8로 인코딩을 할 것이라고 명시를 했습니다. 그리고 이제 <servlet>으로 시작하는 내용이 보이는데, web.xml에 dispatcher라는 서블릿을 추가해주겠다는 것이고, dispatcher servlet의 서블릿에서만 사용할 수 있는 초기화 파라미터로 (<init-param>) contextConfigurationLocation을 주고 있습니다. contextConfigurationLocation이라는 것은 contextLoader가 <param-value>의 위치에 있는 설정 파일을 읽어들이겠다는 것이고 그 파일이 dispatcher라는 서블릿으로 만들겠다는 것입니다. 그리고 아래에는 <context-param> 가 다시 나오고 있는데 설정파일이 dispatcher-servlet 말고도 datasource나 transcation 등도 있을 수 있으므로 그것들을 읽기 위해서 적어주었고, WEB-INF/config/spring 폴더의 context-로 시작해서 .xml로 끝나는 파일을 읽어들이겠다고 명시하였습니다. 즉, context-spring.xml 이나 context-root.xml과 같은 형식의 파일들을 읽겠다는 것입니다. <listener>  내용은 Spring에서 어떤 이벤트를 받기 위해서 대기하는 객체라고 이해하면 될 것 같습니다.

이전에 했던 내용을 그대로 따라오고 계시다면 아래와 같이 네모된 영역을 수정하면 됩니다.(파일들의 경로를 설정해주는 것은 꼭 제가 설정했던 위치가 아니여도 다른 파일들과 잘 맞춰주기만 한다면 어느 위치에 있든지 상관이 없습니다.)




3. pom.xml 수정하기



[pom.xml]

위에서 정의한 라이브러리들의 class들이 여럿 필요한데 그 내용들을 모두 추가한 제 pom.xml을 올리도록 하겠습니다. (일일이 치는 것도 좋지만 에러를 피하기 위해서 복사하여 붙여넣는 것도 좋은 방법입니다!)

아래에는 <dependencies> 부터  </dependencies> 까지 추가해두었습니다.


  <dependencies>
  
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.0</version>
        </dependency>  
  
  
  		<!-- thumbnail -->
		<dependency>
		    <groupId>com.jhlabs</groupId>
		    <artifactId>filters</artifactId>
		    <version>2.0.235-1</version>
		</dependency>
          <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
      <!-- JSR 330 -->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>privided</scope>
    </dependency>
		<!-- Inject Annotation dependency -->
	
	   <dependency>
	        <groupId>javax.inject</groupId>
	        <artifactId>javax.inject</artifactId>
	        <version>1</version>
	    </dependency>
	    
		<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		    <version>5.1.6</version>
		</dependency>

  		<!-- Mybatis Dependencies -->
  		<dependency>
		    <groupId>org.lazyluke</groupId>
		    <artifactId>log4jdbc-remix</artifactId>
		    <version>0.2.7</version>
		</dependency>
		  
  		<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.bgee.log4jdbc-log4j2</groupId>
            <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
            <version>1.16</version>
        </dependency>
  
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>

		<dependency>
	      <groupId>org.mybatis</groupId>
	      <artifactId>mybatis</artifactId>
	      <version>${mybatis.version}</version>
	  	</dependency>
  
		<!-- Spring dependencies -->    
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
  
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>


이제 겨우 기본이 되는 설정들을 마무리하였고, 다음 장에서는 MyBatis(마이바티스)와 Datasource(데이터 소스)에 대해서 설정을 해보도록 하겠습니다. 필수적인 내용이므로 천천히 완벽이해하면서 따라오세요~






관련 포스팅

  1. Maven 기반의 Spring 프로젝트 만들기 (1/5)

  2. Spring 개발환경 설정하기 (2/5)

  3. Dispatcher Servlet 설정하기 (3/5)

  4. MyBatis, Datasource 설정 (4/5)

  5. DB에서 데이터 조회하기 (5/5)


댓글
댓글쓰기 폼
  • 코쟁이놈 dispatcher-servlet에서 스캔하여 등록한 빈들이 담긴 컨테이너랑 context-param에 명시한 context로 시작하는 xml파일에서 스캔하여 등록한 빈들이 담긴 컨테이너랑 별개인가요? 2020.06.05 18:22
  • 망나니개발자 모두 Spring IOC Container에 의해 관리되는 것으로 알고 있는데, 확실하지는 않습니다ㅜㅜ 2020.06.06 14:33 신고
  • 햇병아리 개발자 공부하면서 정리한 내용으로 몇자 정보를 남겨드립니다.

    기본적으로 IOC 컨테이너는 스프링 애플리케이션에서
    '오브젝트 생성', '관계설정', '오브젝트 사용 및 제거' 등 의 역할을 수행하는 컨테이너를 의미하며,

    스프링에서는 '빈 팩토리', '애플리케이션 컨텍스트' 라고도 불리며,
    아주 간단한 표현으로 ApplicationContext 인터페이스를 구현 한 클래스 오브젝트 라고도 불립니다.
    (다양하게 불리는 IOC 컨테이너에 대해서는 인터넷이나 서적들을 참고하시길 바랍니다.)


    앞으로 제가 설명할 때는 편의상 IOC 컨테이너를 '애플리케이션 컨텍스트'라고 지칭하겠습니다.

    스프링 애플리케이션을 개발할 때 애플리케이션 컨텍스트를 계층구조로 만드는 경우가 많다고 합니다.(저도 아직 학생 신분이라
    현장을 보진 않았지만요...)


    애플리케이션 컨텍스트 계층구조는 부모역할을 하는 '루트 애플리케이션 컨텍스트' 와 '서블릿 애플리케이션 컨텍스트로
    구성 하며, 계층 구조 안에 모든 컨텍스트는 각자 독립적인 설정정보를 이용해 빈 오브젝트를 만들고 관리합니다.
    (자세한 내용을 찾으시고 싶으시면, 'IOC 컨텍이너 계층구조' 또는 '애플리케이션 컨텍스트 계층구조' 에 대해
    조사해 보시길 바랍니다.)

    스프링 애플리케이션에서 애플리케이션 컨텍스트 계층구조를 구현 할 때 사용하는 방법은 아래와 같습니다.
    (이 부분도 간단히 말해드리는 부분이니, 추가적으로 찾아보시기 바랍니다.)


    루트 애플리케이션 컨텍스트)
    => ContextLoaderListener 등록
    => 디폴트 설정 파일 위치가 아닌 변경시 <context-param> 으로 변경

    서블릿 애플리케이션 컨텍스트)
    => DispatcherServlet 등록
    => 디폴트 설정 파일 위치가 아닌 변경시 <init-param> 으로 변경


    너무 자질구레한 설명이 많았습니다.(제가 설명을 '블로그 주인장님'처럼 잘하는게 아니라서 이해 부탁드립니다.)

    정리하자면, <context-param> xml 파일에 의해 등록되는 빈은 '루트 애플리케이션 컨텍스트' 에서 등록 관리 되는 빈이고,
    dispatcher-servlet.xml 을 통해서 등록되는 빈은 '서블릿 애플리케이션 컨텍스트' 에서 등록 관리되는 빈으로

    두개의 IOC 컨텍이너는 계층구조로 만들어진 별개의 IOC 컨텍이너이다.

    추가)
    굳이 왜 이렇게 IOC 컨텍이너를 나누어서 사용하는가.? 이러한 의문이 생기실수 있는데 이 부분도
    인터넷이나 서적을 통해 직접 확인 해보시면 머리에도 오래 남고 도움이 되시리라 생각합니다.

    이상입니다.^^

    즐거운 스프링 공부 되세요.~~
    2020.06.30 17:39
  • 망나니개발자 저도 스프링 책 다시 읽어보려고 구매했는데, 다시 한번 읽어봐야겠네요ㅎㅎ 너무 잘 설명해주셔서 감사합니다:) 2020.07.01 11:55 신고
공지사항
Total
1,039,925
Today
2,430
Yesterday
3,788
TAG
more
«   2021/05   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함