프로젝트에서 전체 프로젝트 환경 구성을 맡게 되었다.
프로젝트 구조를 어떻게 가져갈지 고민하고, 패키지 구조, 공통 제공 기능 등을 구상해야 했다.
처음해보기도 했고, 아직 많~~~~이 부족하다는 걸 매순간 깨닫는 작업이었다..
프로젝트 끝나기 전까지 내가 스스로 프로젝트를 좀 더 효율적으로 할 수 있는 부분을 캐치해내고, 적용해보는 부분이 생기도록 고민해봐야겠다!
우선, 오늘은 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 |