Java애플리케이션은 애플리케이션을 형성하는 다른것과 협력하는 많은 수의 객체로 구성된다. 애플리케이션내 객체는 스스로간에 의존성을 가진다고 말할수 있다.
Java언어와 플랫폼은 풍부한 기능의 애플리케이션 서버와 웹 프레임워크를 위해 원시타입과 클래스를 기본적으로 빌드하는 것으로 부터 방법을 분류하여 아키텍트를 위한 풍부한 기능을 제공하고 애플리케이션을 빌드한다. 부재로 인해 결정적으로 눈에 띄는 영역은 기본적인 빌딩 블럭과 그것을 조합한 것을 일관성있는 전체로 가지는 수단이다. 이 영역은 애플리케이션을 빌드하여 아키텍트와 개발자가 제공하는 것을 남는다. 여기에는 다양한 클래스와 객체 인스턴스를 조합한 비지니스를 돌리는 많은 수의 디자인 패턴이 있다. Factory, Abstract Factory, Builder, Decorator, 그리고 Service Locator 와 같은 디자인 패턴은 소프트웨어 개발 산업에서 널리 보급된 인식과 수용을 가진다. 이것들 모두는 매우 좋지만, 이러한 패턴은 패턴이 하는 것에 대한 상세설명과 함께 이 패턴이 가장 잘 적용되는 그리고 이 패턴이 할당된 애플리케이션의 문제에 대해 주어진 이름이 가장 좋은 구현형태를 나타낸다. 마지막 구문이 “패턴이 하는 것의 상세설명 ”을 사용한다. 패턴책과 위키는 당신이 제거하고 곰곰히 생각하고 애플리케이션에 스스로 구현할수있는 형상화된 가장 좋은 상황의 목록이다.
Spring 프레임워크의 IoC컨포넌트는 다양한 개별 컨포넌트를 조합하는 형상화된 방법을 완전히 작동하는 애플리케이션에 제공하여 클래스, 객체 그리고 애플리케이션을 조합하는 서비스를 가져오는 기업적인 개념을 할당한다. Spring 프레임워크는 수많은 애플리케이션에 수년간 증명되고 디자인 패턴처럼 형상화된 가장 좋은 형태를 가진다. 그리고 당신이 아키텍트와 개발자처럼 제거하고 자체적인 애플리케이션에 통합할수 있는 첫번째 클래스객체처럼 이러한 패턴을 체계화한다. 이것은 견고하고 유지보수가 가능한 애플리케이션을 처리하기 위해 Spring프레임워크를 사용한 수많은 조직과 기구에 의해 입증된것처럼 정말로 매우 좋은 것이다.
Spring은 밑의 다이어그램에서 보여지는 7개의 모듈로 잘 조직된 많은 기능을 포함한다. 이 장은 순서대로 각 모듈을 언급한다.
Spring 프레임워크의 개요
Core 패키지는 프레임워크의 가장 기본적인 부분이고 IoC와 의존성 삽입(Dependency Injection-DI)기능을 제공한다. 여기의 기본적인 개념은 프로그램에 따른 싱글톤의 필요성을 제거하는 factory패턴의 정교한 구현물을 제공하고 당신의 실질적인 프로그램 로직으로부터 설정과 의존성 명시를 분리시키는 것을 당신에게 허용하는 BeanFactory이다.
Core 패키지의 가장 위에는 프레임워크 스타일의 방식으로 bean에 접근하기 위한 방법을 제공하는 다소 JNDI-등록기와 유사한 Context 패키지가 위치한다. context패키지는 bean패키지로부터 이 기능을 상속하고, 국제화(I18N)(예를 들어 resource bundle을 사용하여), 텍스트 메시지, 이벤트 위임, 자원-로딩 그리고 예를 들어 서블릿 컨테이너와 같은 것에 의해 투명한 컨텍스트 생성을 위한 지원을 추가한다.
DAO 패키지는 끔찍한 JDBC코딩과 데이터베이스 업체 특정 에러코드의 파싱을 할 필요를 제거하는 JDBC추상화 레이어를 제공한다. 또한 JDBC패키지는 특정 인터페이스를 구현하는 클래스를 위해서 뿐 아니라 당신의 모든 POJOs를 위해서도 선언적인 트랜잭션 관리만큼 프로그램에 따른 방식으로 할수 있는 방법을 제공한다.
ORM 패키지는 JDO, Hibernate, 그리고 iBatis를 포함하는 인기있는 객체-관계 맵핑 API를 위한 통합 레이어를 제공한다. ORM패키지는 사용하여 당신은 앞에서 언급된 간단한 선언적인 트랜잭션 관리와 같은 Spring이 제공하는 다른 모든 기능을 사용해서 혼합하여 모든 O/R매퍼를 사용할수 있다.
Spring의 AOP 패키지는 당신이 정의하는것을 허용하는 AOP 제휴 호환 aspect-지향 프로그래밍 구현물을 제공한다. 예를 들어 코드를 명백하게 분리하기 위한 메소드-인터셉터와 pointcut은 논리적으로 구별되어야 할 기능을 구현한다. 소스레벨 메터데이타 기능을 사용하여 당신은 .NET속성과 다소 비슷한 모든 종류의 행위적 정보를 당신의코드로 결합한다.
Spring의 Web 패키지는 멀티파트 파일업로드기능, 서블릿 리스너를 사용한 IoC컨테이너의 초기화 그리고 웹-기반 애플리케이션 컨텍스트와같은 기본적인 웹-기반 통합 기능들을 제공한다. WebWork나 Struts와 함께 Spring을 사용할때 이것은 그것들과 통합할 패키지이다.
Spring의 MVC 패키지는 웹 애플리케이션을 위한 Model-View-Controller(MVC)구현물을 제공한다. Spring의 MVC구현물은 어떤 오래된 구현물이 아니다. 이것은 도메인 모델 코드와 웹폼(Web forms)사이의 분명한 구분을 제공하고 유효성체크와 같은 Spring프레임워크의 다른 모든 기능을 사용하도록 당신에게 허용한다.
위에서 언급된 빌드단위로 당신은 애플릿에서부터 Spring의 트랜잭션 관리 기능과 웹 프레임워크를 사용하는 완전한 기업용 애플리케이션까지 모든 종류의 시나리오로 Spring을 사용할수 있다.
전형적으로 완전한 Spring웹 애플리케이션
Spring의 선언적인 트랜잭션 관리 기능을 사용하여, 웹 애플리케이션은 EJB에 의해 제공되는것과 같은 컨테이너 관리 트랜잭션을 사용할때 되는것처럼 완벽하게 트랜잭션적이다. 당신의 모든 사용자 정의 비지니스 로직은 Spring의 의존성 삽입 컨테이너에 의해 관리되는 간단한 POJO를 사용해서 구현될수 있다. 메일을 보내거나 유효성체크를 위한 지원을 포함하는 서비스, 웹 레이어의 비의존성은 당신에게 유효성체크 규칙을 수행하기 위한 위치를 선택하도록 허용한다. Spring의 ORM지원은 JPA, Hibernate, JDO 그리고 iBATIS와 통합된다. 예를 들어 Hibernate를 사요할때 당신은 존재하는 Hibernate맵핑을 지속적으로 사용하고 표준 Hibernate SessionFactory설정을 사용할수 있다. 폼 컨트롤러는 ActionForms이나 HTTP파라미터를 당신의 도메인 모델을 위한 값에 이동시키는 다른 클래스의 필요성을 제거하는 도메인모델을 가진 웹레이어와 유사하게 통합한다.
3자(third-party)의 웹 프레임워크를 사용한 Spring 미들티어
때때로 현재의 환경은 당신에게 다른 프레임워크로의 완벽한 교체를 허용하지 않는다. Spring은 이것내 모든것을 사용하도록 당신에게 강요하지 않는다. 이것은 모든것 또는 아무것도 아닌것(all-or-nothing)인 솔루션이 아니다. WebWork, Struts, Tapestry 또는 다른 UI프레임워크를 사용한 존재하는 앞부분은 당신에게 Spring이 제공하는 트랜잭션 기능을 사용하도록 허용하는 Spring기반의 미들티어와 완벽하게 통합될수 있다. 당신이 해야할 필요가 있는 오직 한가지는 ApplicationContext를 사용하여 당신의 비지니스 로직을 묶고 WebApplicationContext를 사용하여 당신의 웹 UI레이어를 통합하는 것이다.
원격 사용 시나리오
당신이 웹서비스를 통해 존재하는 코드에 접근할 필요가 있을 때, 당신은 Spring의 Hessian-, Burlap-, Rmi- 나 JaxRpcProxyFactory클래스를 사용할수 있다. 존재하는 애플리케이션에 원격 접근을 가능하게 하는 것은 최근에는 어려운 일이 아니다.
EJB - 존재하는 POJO를 포장하기
Spring은 POJO를 재사용하는것을 당신에게 허용하고 그것들을 비상태유지(stateless) 세션빈으로 포장하고 선언적인 보안이 필요한 측정가능한 실패에 안전한(failsafe) 웹 애플리케이션내 사용하기 위한 EJB를 위해 존재하는 접근- 그리고 추상- 레이어를 제공한다.