프로젝트에서 전체 프로젝트 환경 구성을 맡게 되었다. 

프로젝트 구조를 어떻게 가져갈지 고민하고, 패키지 구조, 공통 제공 기능 등을 구상해야 했다. 

처음해보기도 했고, 아직 많~~~~이 부족하다는 걸 매순간 깨닫는 작업이었다..  

프로젝트 끝나기 전까지 내가 스스로 프로젝트를 좀 더 효율적으로 할 수 있는 부분을 캐치해내고, 적용해보는 부분이 생기도록 고민해봐야겠다!


우선, 오늘은 Spring 설정 부분을 정리해두려 한다. 

구성한 프로젝트 환경은 아래와 같다


 - JAVA: JDK 1.8

  - IDE: Eclipse Mars2 (4.5)

  - WAS: Tomcat 8.0.42 

  - DB: Oracle 11g

  - Build: Maven 3.3.9

  - Framework: Spring 4.3.6 , 사내프레임워크

 


기존 시스템 재구축 성격의 프로젝트라, 기본적인 tools 업그레이드와, 프레임워크 버전 현행화가 요새 주된 작업이다.

버전 업그레이드라 생각해서 처음부터 구축하는 것 보다 낫겠지 싶었는데, 더 어려운 것 같다.. 호환성이 안맞아 깨지는 부분이 생기고 ㅜ


AS-IS 시스템은 Spring 3.1 버전을 쓰고 있었다.


Spring 4.3.x 에 맞게 dispatcher-servlet.xml 파일을 수정했다. 처음엔 뜬구름 잡듯이 이해됬었는데, 차장님한테 질문하고나니

그래도 흐름이 쭉 잡힌 것 같다. 잘정리해놔야지!


_____________________________________________________________________________________________________________________________

# Spring 설정: dispatcher-servlet.xml


  dispatcher-servlet에서 기본적으로 설정 고려해야 하는 항목들은 아래와 같다고 생각한다.

  

  1.component 스캔

   2.MVC 설정 = interceptors, adpater, handler

   3.Resolver 설정


 '화면'단에 적용할 설정들을 모아놓는 곳이기 때문에 기본적으로 위의 설정들은 들어가야 한다. 


1) dispatcher-servlet.xml

  

    - 톰캣 서버를 기동시키면 기동로그에 dispatcher-servlet 파일이 로딩되는 부분이 보인다.

    - root Context 초기화가 이루어진 다음, 이제 WebApplication Context가 초기화될 차례다.

    -  WebApplication Context가 초기화되면서, dispatcher-servlet.xml 파일에 선언한 bean 들이 등록된다.


정보: Initializing Spring FrameworkServlet 'sample'

| [INFO ] 20:45:38.727 [o.s.w.servlet.DispatcherServlet] [localhost-startStop-1]   -FrameworkServlet 'sample': initialization started 

| [INFO ] 20:45:38.732 [o.s.w.c.s.XmlWebApplicationContext] [localhost-startStop-1]   -Refreshing WebApplicationContext for namespace 'sample-servlet': startup date [Sun Apr 16 20:45:38 KST 2017]; parent: Root WebApplicationContext 

| [INFO ] 20:45:38.732 [o.s.b.f.x.XmlBeanDefinitionReader] [localhost-startStop-1]   -Loading XML bean definitions from class path resource [META-INF/dispatcher-servlet.xml]  



  (1) component 스캔 작업


      - dispatcher-servlet.xml 파일 내 컴포넌트 스캔 셋팅은 아래와 같다. 


<?xml version="1.0" encoding="UTF-8"?>

<beans  xmlns:context="http://www.springframework.org/schema/context" 

            xsi:schemaLocation=" http://www.springframework.org/schema/context 

                                         http://www.springframework.org/schema/context/spring-context.xsd ">


<context:component-scan base-package="com.sampleframework, com.sampleCompany.sample" use-default-filters="false">

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

</context:component-scan>  



      ▶ Spring이 @Component 또는 @Component를 메타 어노테이션으로 갖고 있는 어노테이션(@Controller, @Repository, @Service)이 

          붙은 클래스들을 빈으로 등록한다.

      ▶ 스캔 범위: 보통 공통빈(persistence, service) 설정 정보는 Application context에, web layer 단의 빈(controller)들WebApplicationContext에 

                        저장한다.

      ▶ stereotype annotation: 클래스에 붙어 해당 클래스가 컴포넌트 스캔 대상이고, 스프링에 의해 관리될 것임을 명시한다. 

      ▶ base-package: 설정한 패키지 내에서 컴포넌트 스캔을 수행한다. 스캔 범위 지정

      ▶ use-default-filters: 아무 설정을 안할 경우 default로는 모든 stereo type 스캔한다. 개별적으로 특정 빈만 스캔하려는 경우 

                                   해당 설정을 false로 해주고, 특정 빈을 include filter 설정해주어야 한다.



      ▶ sts 의 spring explorer를 통해 bean 로딩 확인 (프로젝트 패키지명은 모자이크 처리함)



[ 이미지1 - component-scan의 use-default-filters 설정을 주지 않은 경우, base-package내 컴포넌트들을 모두 스캔하고 있다]



                   [ 이미지2 - component-scan의 use-default-filters 설정을 false로 주고, Controllerㄹ 컴포넌트만 include 설정 한 경우, base-package내 

                                  @Controller 컴포넌트들만 스캔하고 있다]




(2) spring MVC 설정


    - spring MVC를 활성화하기 위해 아래와 같은 설정을 해준다.


    - 보통 설정들을 copy해서 쓰기 때문에 실제로 이 설정이 정확히 어떤 역할을 하는지 몰라 그냥 그대로 쓰는 경우가 많다.

      그러다 보면 사용하지 않는 설정들도 다 포함되어 설정파일만 비대해지게 된다. 


      STS를 별도로 설치하여 spring explorer 뷰를 활용하여 실제 설정을 적용했을 때 어떤 변화가 일어나는 지 확인해 보았다. (강추!)

      (eclipse Mars2 4.5 버전에서는 sts 플러그인 설치 시, 기존 내장되어 있는 maven 의 m2e와 충돌이 나는지.. 설치 후 

       maven 도 안되고, sts 기능도 사용이 불가했다...버그인것 같은데 레퍼런스가 거의 없다 ㅜㅜ. sts 중 maven 과 겹치는 부분은 제외한 채

       설치해도 같은 결과가 반복됬다.....eclipse를 밀기를 몇번 ^^;; 그냥 sts 를 별도로 설치해서 확인했다)


<mvc:annotation-driven />  


    ▶@Controller 와 @RequestMapping 사용 활성화

    ▶@Controller들에게 요청을 전파하기 위한 HandlerMapping(default: RequestMappingHandlerMapping)과          

       HandlerAdapter(default: RequestMappingHandlerAdapter)를 등록


         - RequestMappingHandlerMapping 역할: 요청들을 해당 annotation이 걸린 컨트롤러 method로 매핑

          

    ▶ HandlerExceptionResolver 등록

  


[이미지3 - mvc:annotation-driven 설정을 해준 경우, 위와 같이 handlerAdapter가 자동으로 등록되었다. 더 깊게 확인은 못해봤지만,       

              AnnotationDrivenBeanDefinitionParser라는 애가 파싱을 담당하나 보다.]





(3) MVC - interceptor 설정 


(4) MVC - adapter 설정


(5) MVC - resolver 설정






__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.



 

      


'Spring' 카테고리의 다른 글

[에러] no matching editors or conversion strategy found  (0) 2017.04.20
spring - profile  (0) 2017.03.19
[Spring] Transaction 관리  (0) 2017.03.12
Spring - BeanNameViewResolver  (0) 2017.01.29

+ Recent posts