tmkimm
Eddy
tmkimm
전체 방문자
오늘
어제
  • 분류 전체보기 (34)
    • DataBase (3)
    • Javascript (0)
    • Node.js (7)
    • Java (2)
    • Spring (3)
    • 기타 (13)
    • 사이드프로젝트 (2)
    • 생각 정리 (2)
    • 좋은글 공유 (1)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 논쟁
    • 에러트래킹
    • docker
    • Node.js
    • mybatis
    • 생각정리
    • 삽질기록
    • 설계
    • spring
    • Sentry
    • swagger
    • Java
    • 부하테스트
    • SSL
    • 사이드프로젝트
    • github
    • API 문서 자동화
    • 모니터링
    • Git

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    tmkimm

    Eddy

    [Spring] 스프링 설정 - web.xml, root-context.xml, servlet-context.xml 역할(Servlet, DispatcherServlet이란)
    Spring

    [Spring] 스프링 설정 - web.xml, root-context.xml, servlet-context.xml 역할(Servlet, DispatcherServlet이란)

    2020. 6. 21. 02:05

    스프링을 세팅하는 도중 궁금한 내용들이 생겨 따로 정리한다.

     

    예제를 그대로 따라하기만 하면 되겠지만 왜 쓰는건지는 알고 넘어가자.

     

    간단하게 정리하려고 했는데 생각보다 관련해서 알아야 하는 내용이 많다.

     

    어려운 내용들이 많아 이해해하는데 시간이 조금 걸릴 것 같다.

     

    web.xml

    web.xml은 설정을 위한 설정 파일이다.

    WAS가 처음 구동될 때 web.xml을 읽어 웹 애플리케이션 설정을 구성한다.

    DispatcherServlet을 등록해주면서 스프링 설정 파일을 지정한다.

    DispatcherServlet은 초기화 과정에서 지정된 설정 파일을 이용해 스프링 컨테이너를 초기화시킨다.

     

    	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>/WEB-INF/spring/root-context.xml</param-value>
    	</context-param>
        
    	<!-- Processes application requests -->
    	<servlet>
    		<servlet-name>appServlet</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    		</init-param>
    		<load-on-startup>1</load-on-startup>
    	</servlet>

     

    문자 인코딩 관련된 내용은 생략하고,

    아래 부분은 모든 요청을 DispatcherServlet이 처리하도록 서블릿 매핑을 설정한다.

    	<servlet-mapping>
    		<servlet-name>appServlet</servlet-name>
    		<url-pattern>/</url-pattern>
    	</servlet-mapping>

    url-pattern은 *.do, /*, / 이런식으로 많이 사용하는 것 같은데 그 차이가 궁금했다.

    *.do는 무의미한 확장자로 옛날에 사용하던 방식인 것 같고

    /*는 톰캣(conf)에 있는 기본 web.xml의 .jsp를 처리하는 설정 파일을 무시해버리게 되기 때문에

    /를 사용하는게 맞다고 한다.

     

    하지만 여기서 한가지 문제가 발생하게 되는데 setvlet-mapping을 /로 사용하게 되면서

    /*를 사용하는 것과 마찬가지로 톰캣에 있는 / 설정을 무시해버리게 되는 것이다.

    여기서 한가지 알아둬야할 부분은 .jsp든 .css든 .js든 파일에 직접 접근하는 경우는 없다.

    요청은 톰캣이 받게되고 서블릿에 패턴을 요청해서 처리하게 되는데 이 설정을 뭉개버린 것이다.

    servlet-context.xml에 다음과 같은 코드를 통해 이 문제를 해결할 수 있다.

     

    <mvc:default-servlet-handler />

    설정을 추가하면 default-servlet-handler가 빈(Bean)으로 추가된다.

    매핑되는 핸들러가 없다면 default-servlet-handler가 요청을 처리하게 된다.

     

    또는 이 방법으로도 해결할 수 있다.

    <mvc:resources mapping="/resources/**" location="/resources/"/>

     


    servlet-context, root-context에 대해 알아보기 전 알아야 할 부분이 있다.

     

    root-context : 이 context에 등록되는 Bean들은 모든 context에서 사용되어 진다.(공유가 가능하다)

    servlet-context : 이 context에 등록되는 Bean들은 servlet-container에만 사용되어진다.

     

    @Controller는 servlet-context에 등록하고

    @Service와 @Repository 등 root-context에 등록하라고 하는 이유가 이것때문인 것 같다.

    모두 root-context에 등록할 수 있겠지만 용도에 따라 나눈 것 같은데 다른 이유가 있는지 궁금하다.

     

     

    servlet-context.xml

     

    web.xml에서 DispatcherServlet 등록 시 설정한 파일이다.

    앞서 설명한 것 처럼 설정 파일을 이용해서 스프링 컨테이너를 초기화시킨다.

    코드를 하나 하나 짚어나가보자.

     

    아래 코드는 Annotation을 활용할 때 기본적인 Default 방식을 설정해준다고 한다.

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

     

    의존성을 주입하기 위해서는 xml이나 @Configuration을 이용해서 빈을 등록 해줘야 하는데

    이런 번거로움을 해결해준다.

    해당 패키지를 스캔해서 애노테이션을 명시한 클래스를 빈으로 등록해준다.

    <context:component-scan base-package="com.board.controller" />

     

    컨트롤러에서 return "home"; 을 했을때

     /WEB-INF/views/home.jsp가 나올 수 있는게 이 설정 덕분이다.

    viewResolver는 사용자의 요청에 대한 응답 view를 렌더링 하는 역활이다.

    prefix는 렌더링 시 handelr에서 반환하는 문자열의 앞에 붙여줄 문자열을 의미하고

    suffix는 뒷쪽에 붙는 문자열이다.

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <beans:property name="prefix" value="/WEB-INF/views/" />
      <beans:property name="suffix" value=".jsp" />
    </beans:bean>

     

    root-context.xml

    스프링 프로젝트 생성 시 root-context.xml에는 특별한 설정이 없다.

    공통적으로 사용하려는 Bean을 그때그때 사용하면 되는 것 같다. 

     

    참조 사이트 :
    web.xml 분석 - https://m.blog.naver.com/blogpyh/221128330192
    Servlet이란? - https://mangkyu.tistory.com/14
    WAS, Servlet Container, Servlet개념 - https://sharryhong.github.io/2017/06/03/java-servlet/
    servlet-mapping - https://multifrontgarden.tistory.com/145
    context에 관하여 - https://m.blog.naver.com/writer0713/220701612165

    'Spring' 카테고리의 다른 글

    [Spring] 스프링 부트(Spring Boot)란? - 특징, 사용 이유, 시작하기  (0) 2023.03.06
    [Spring] Servlet, DispatcherServlet 이란  (0) 2020.06.22
      'Spring' 카테고리의 다른 글
      • [Spring] 스프링 부트(Spring Boot)란? - 특징, 사용 이유, 시작하기
      • [Spring] Servlet, DispatcherServlet 이란
      tmkimm
      tmkimm
      ⭐️

      티스토리툴바