2018년 8월 28일 화요일

스프링 메이븐 프로젝트 설정하기 3탄 servlet-context.xml 설정 하기(interceptor 포함)

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
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.xsd">
<annotation-driven />
<!-- 자동으로 등록할 컴포넌트가 있는 패키지를 지정한다. -->
<context:component-scan base-package="com.home.myspring" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>

<resources mapping="/resources/**" location="/resources/" />
<resources mapping="/css/**" location="/css/" /> 
<resources mapping="/images/**" location="/images/" /> 
<resources mapping="/js/**" location="/js/" /> 


<!-- 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="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<beans:property name="prefix" value="/WEB-INF/views" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>


<!-- MultipartResolver -->
    <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="maxUploadSize" value="100000000"/>
        <beans:property name="maxInMemorySize" value="100000000"/>
    </beans:bean>

<!-- 인터셉터 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/interceptor/**"/>
<beans:bean id="defaultInterceptor" class="com.home.myspring.interceptor.DefaultInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

<beans:bean id="exceptionMapping" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- <beans:property name="exceptionMappings">
<beans:props>
<beans:prop key="SQLException">error/db_error</beans:prop>
<beans:prop key="IOException">error/error</beans:prop>
</beans:props>
</beans:property> -->
<!-- value(경로)는 viewResolver prefix 하위폴더부터 설정 -->
<beans:property name="defaultErrorView" value="error/errorPage" />
</beans:bean>
</beans:beans>


servlet-context.xml 의 내용이다.

빨간부분

기본 으로 생성되는 servlet-context.xml 에는 <annotation-driven /> 한줄로만으로도

@Controller 에노테이션이 붙은 클래스가 스프링 컨테이너 내부적으로 관리되는

데이터맵 에 적제되고 컨트롤러 내부적으로 @Autowired 로 선언된 객체가

데이터맵 내에서 일치하는 타입을 조회하여 DI(Dependency injection) 를 구현해준다.

하지만 <annotation-driven /> 만으로 설정한다면 모든 에노테이션객체 로딩을 현제의

servlet-context.xml 에서 실시 한다는 말과 같으므로 root-context.xml 로 설정 파일을

나누는거 자체가 애매해 진다.

따라서


<context:include-filter type="annotation"                                                                    expression="org.springframework.stereotype.Controller" />


인클루드 필터를 이용해서 @Controller 객체만 적제 하므로 서버 빌드를 효율적으로 관리

하게 된다. 이쯤 되면 그럼 컨트롤러 객체 내에 DI 하다가 null 포인트 나는거 아니냐 하는

의문점을 갖을수 있지만. web.xml 을 보면 의문이 풀린다.



리스너로 스프링이 제공하는 ContextLoaderListener 가 설정되어있고

web.xml 의 내용

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

앱 컨텍스트 파라미터로 root-context.xml 을 먼저 로드하고 로드된

root-context.xml 에서 service,dao,등등 컴포넌트들을 아까 언급한 스프링이 관리하는

데이터맵 에 적제 되므로 spring DispatcherServlet 으로 서블릿 배치시 로드되는

servlet-context.xml @Controller 만 에노테이션 드리븐 하게되어도 DI 에 영향을 주지 않게

되고 각 xml 분리 성격에도 부합하게 된다.

노란부분

보통 apache, eginx 등 의 was 에서 정적리소스(image,css,...) 요청은 받아서 처리하는데

현제 개발  환경에서는 웹컨터에너 톰캣 뿐이므로 image,css 등 정적 리소스를 서블릿 요청

과 구분 하기위해서 설정 하는 부분이다.

파란부분

인터셉터 설정하는 부분으로 특정 요청 url에 대해서 사전작업이 필요할경우 설정한다.

예를 들면 로그인된 사용자에 한에서 페이지를 표시해야할경우 복수의 url에 하나의 로그인

검증 로직을 수행해야 할경우 사용할수 있다. 위 설정은 /interceptor 로 시작 하는 모든 url

에 대해서 DefaultInterceptor 클래스가 수행되게끔 테스트로 설정 해놨다. 따라서

해당 패키지에 DefaultInterceptor 클래스를 만들고 내용은 이렇다.

package com.home.myspring.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class DefaultInterceptor extends HandlerInterceptorAdapter{
// preHandle() : 컨트롤러보다 먼저 수행되는 메서드
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("preHandle!!!");
        // preHandle의 return은 컨트롤러 요청 uri로 가도 되냐 안되냐를 허가하는 의미임
        // 따라서 true로하면 컨트롤러 uri로 가게 됨.
        return true;
    }
    // 컨트롤러가 수행되고 화면이 보여지기 직전에 수행되는 메서드
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("postHandle!!!");
        // TODO Auto-generated method stub
        super.postHandle(request, response, handler, modelAndView);
    }
}


콘솔로 확인 가능 하다.


마지막으로 오류 페이지 관련 설정인데 이부분은 생략하고 다음 4탄으로 넘어가겟다.








댓글 없음:

댓글 쓰기

[lunux]리눅스 폴더별 용량 확인

리눅스 폴더별 용량 확인 조회 하고자 하는 디렉토리 리스트가있는 경로로 이동후 du -h --max-depth=1