[{TableOfContents }]

!!!! 개요

!!! 9.1. 자바 엔터프라이즈 플랫폼과 스프링 애플리케이션

!! 9.1.1. 클라이언트와 백엔드 시스템

* 스프링은 웹브라우저를 클라이언트로 하고 DB에 데이터를 저장, 조회하는데 집중되어 있다. 
* 클라이언트가 반드시 웹브라우저일 필요는 없고 RIA나 HTTP프로토콜을 사용하는 다른 시스템일수도 있다. 
* 백엔드 시스템은 DB뿐 아니라 메시징 서버, 메일서버, 메인프레임등 다양하게 사용이 가능하다. 

* 스프링 엔터프라이즈 애플리케이션의 서비스와 협력구조
%%information 그림 1-1 %%

!! 애플리케이션 서버

* 스프링 애플리케이션을 배포하려면 JavaEE서버가 필요하다. 
* JavaEE서버는 크게 두가지로 분류할 수 있다. 

! 경량급 WAS/서블릿 컨테이너

* 톰캣과 제티와 같은 가벼운 서블릿 컨테이너
* EJB나 리소스 커넥터, WAS가 제공하는 분산 서비스등이 굳이 필요하지 않다면 서블릿 컨테이너로도 충분하다. 

! WAS

* 스프링은 3.0기준으로 J2EE 1.4와 JavaEE 5.0에 완벽히 호환된다. 일부 JavaEE 6.0의 기능을 지원하기도 한다. 

! 스프링 소스 tcServer

* 스프링을 개발하는 스프링소스에는 아파치 프로젝트인 HTTPD와 톰캣의 핵심 개발자가 많다. 
* 톰캣 기반으로 엔터프라이즈 스프링 애플리케이션에 최적화된 경량급 애플리케이션 서버인 tcServer를 개발했다. 
** 톰캣에 비교해서 고급서버관리, 배포기능과 진단기능을 추가로 포함하고 있다. 

!! 9.1.3. 스프링 애플리케이션의 배포단위

https://docs.oracle.com/cd/E19830-01/819-4712/ablgz/index.html

! 독립 웹 모듈

* 스프링은 보통 war로 패키징된 독립 웹 모듈로 배포된다. 

! 엔터프라이즈 애플리케이션

* 확장자가 ear인 엔터프라이즈 애플리케이션으로 패키징해서 배포할수도 있다. 

! 백그라운드 서비스 모듈

* J2EE 1.4에서 등장한 rar패키징 방법도 있다. 
* rar는 리소스 커넥터를 만들어 배포하는 방식인데 스프링으로 만든 애플리케이션이 UI는 필요없고 서버내에서 백그라운드 서비스처럼 동작할 필요가 있다면 rar모듈로 만들어서 배포할수 있다. 

!!! 9.2. 개발도구와 환경

http://en.wikipedia.org/wiki/Java_EE_version_history#Java_EE_5_.28May_11.2C_2006.29

!! 9.2.1. JavaSE와 JavaEE

! JavaSE/JDK

* 스프링 3.0은 JavaSE 5 버전에서 추가된 언어와 문법의 특징을 최대한 활용해서 개발했기 때문에 JDK 5.0 이상의 버전이 필요하다. 
* JDBC 4.0과 같은 일부 기능은 JDK 6.0 이상에 추가된 기능이라 JDK 6.0 이상을 사용해야 한다. 

! JavaEE/J2EE

* 스프링 3.0은 J2EE 1.4나 JavaEE 5.0 이 필요하다. 
* 스프링 3.0 자체는 JDK 6.0과 Java 5.0 을 기준으로 개발됐지만 주요 기능은 JDK 5.0 에서 동작하도록 J2EE 1.4버전과 호환된다. 
* 다만 J2EE 1.4 버전 서버를 사용할때는 JDK 5.0에서 동작하는지 반드시 확인이 필요하다. 

! 카페에서는

* 톰캣 6.0을 사용함
** http://tomcat.apache.org/tomcat-6.0-doc/index.html
** Servlet 2.5 과 JavaServer Pages 2.1 를 지원하기 때문에 JavaEE 5.0을 사용함

!! 9.2.2. IDE

* 이클립스
* 넷빈즈
* 인텔리제이

!! 9.2.3. SpringSource Tool Suite

* 스프링 개발에 필요한 플러그인이 포함되어 있다. 
* 스프링 플러그인외에도 개발에 필요한 각종 플러그인이 포함되어 있고 스프링소스에서 필요한 검증을 마치고 릴리즈한다. 

! SpringIDE 플러그인 

%%error 책에는 스샷이 많음.. 보강하자. %%

* 빈 클래스 이름 자동완성
* 빈 설정 오류검증 기능
* 프로젝트 생성, 설정파일 생성, 빈 등록 마법사
* 빈 의존관계 그래프
* AOP 적용대상 표시
* 기타 지원기능

! STS 플러그인

* 스프링 개발과 설정파일 편집을 지원하는 SpringIDE에 더해서 스프링 애플리케이션의 서버 배치와 같은 추가기능을 제공해준다. 

! 기타 플러그인

* M2Eclipse : 메이븐 플러그인
* AJDT : AspectJ Development Tool의 약자로 이클립스에서 AspectJ AOP를 이용한 개발을 지원하는 툴이다. 
* VMCI
* 이클립스 표준 플러그인 : WTP(Web Tool Platform) 등등

!! 9.2.4. 라이브러리 관리와 빌드 툴

! 라이브러리 관리의 어려움

* 자바는 모듈이라는 개념이 없다. 
** 같은 패키지와 클래스명을 가진 a.jar, b.jar 가 모두 같은 클래스패스에 있을때 둘중 어떤 것을 사용할지 선택할수 없다. 
** 즉 자바에서 jar파일은 압축 패키징 방법일뿐 구분가능한 독립된 모듈이 아니다. 
* 이런 문제를 해결하기 위해서 가장 간단한 방법은 재패키징이다. 
** C 1.0과 C 2.0 모두 org.library.LibClass 라는 클래스명이라면 그 중 하나를 org.library.repack.LibClass 로 명명한다. 
** 이 클래스를 사용하는 라이브러리도 변경된 패키지의 클래스를 사용하도록 수정해야 한다. 
* 스프링은 의존관계의 문제가 많은 라이브러리의 경우 이런 재패키징 방식을 사용한다. 
** ASM은 버전별로 호환이 안되기로 유명한 라이브러리다. 
** org.springframework.asm 이라는 스프링 패키지 하위로 재패키징했다. 

! 라이브러리 선정

* 스프링 모듈
** 스프링 모듈은 총 20개의 모듈이 있다. 
** 어떤 경우에 어떤 모듈이 필요한지에 대해서는 부록 A.2절의 "스프링 모듈의 의존관계" 를 참고
* 라이브러리

! 빌드툴과 라이브러리 관리

*