1.소개

오픈소스 비즈니스 컨설팅
둘러보기로 가기 검색하러 가기

자바 어플리케이션(초기 제약이 많은 애플릿에서부터 성숙한 n-tier 서버 기업형 어플리케이션에 이르는 느슨한 용어)은 통상 어플리케이션을 적당하게 형성시키기 위해서 또 다른 객체들과 협업하는 수많은 객체들로 이루어진다. 어플리케이션에 있는 객체들은 따라서 이들간의 의존성(dependency)를 가진다고 말할 수 있다.

배경 2004년 초반에 마틴 파울러는 자기 사이트의 독자들에게 다음과 같은 질문은 던졌다. 
제어의 역행(Inversion of Control)에 대해서 이야기할 때 "문제는 어떠한 측면의 제어가 역행되는가?" 이다. 
그 다음에 파울러는 이러한 원칙을 재명명하기를 제안헀으며(혹은 최소한 이름 자체가 이해가 더 
잘 되는 형태를 부여) 의존성 역행 (Dependency Injection) 이라는 용어를 사용하기 시작했다.
그 이후 그의 논문에서 제어의 역행 (IoC)와 의존성 역행 (DI) 원리를 지원하는 사상을 설명하기를 계속했다.
만일 IoC와 DI에 대해 괜찮은 이해가 필요하다면 http://martinfowler.com/articles/injection.html 를 참조하라.

자바 언어와 플랫폼은 원시적인 형태와 클래스의 매우 기본적인 요소 (와 새로운 클래스 정의를 통한 방법) 에서부터 많은 기능을 수행하는 어플리케이션 서버와 웹 프레임워크까지 전 범위에 걸쳐 어플리케이션을 아키텍처링하고 구축하는데 풍부한 기능을 제공한다. 이에 대한 결핍으로 인해 명백하게 눈의 띄는 부분은 기본적인 구성 요소를 취해서 이를 전체적인 형태로 구성하는 것이다. 즉, 이러한 영역은 어플리케이션 (혹은 어플리케이션들)을 구축하는 아키텍트와 개발자의 몫으로 일반적으로 남겨졌었다. 이제는 공평하게도 모두 것을 수행하는 어플리케이션을 완성하는 다양한 클래스와 객체 인스턴스를 구성하는 비즈니스에 부합하는 수많은 설계 패턴들이 있다. Factory, Abstract Factory, Builder, Decorator, Service Locator와 같은 설계 패턴들은 소프트웨어 개발 업계 내에서 널리 알려지고 수용되고 있다. (아마도 이것이 이러한 패턴들이 처음에 패턴으로 형태를 잡았던 이유일 것이다.) 이것은 모두 매우 좋지만, 이러한 패턴들은 단지 그뿐이다. 즉, 주어진 이름의 최상의 기법들, 패턴이 무엇을 하는지, 전형적으로 어디에 적용되는지에 대한 설명, 패턴의 적용이 강조하는 문제 등. "패턴이 무엇을 하는지에 대한 설명..." 문구에서 사용된 마지막 문장을 유의하라. 패턴 책들과 위키들은 여러분이 분명 받아들이고, 고민하고, 그 다음에 어플리케이션에 여러분 자신이 구현할 수 있는 형식화된 최상의 기법에 대한 전형적인 목록이다.

스프링 프레임워크의 IoC 컴포넌트는 이와 같이 다양한 분리된 컴포넌트를 사용을 위해 준비된 온전히 동작하는 어플리케이션으로 구성하는 형식화된 수단을 제공함으로써 어플리케이션을 구형하려는 클래스들과, 객체, 서비스들을 아우르는 전사 관점을 강조한다. 스프링 프레임워크는 수많은 어플리케이션에 여러해 동안 증명되고 설계 패턴으로 형식화된 최상의 기법을 취해서 실질적으로 이러한 패턴들을 아키텍트로써 그리고 개발자로써 수용하고 어플리케이션으로 통합할 수 있게 하는 첫번째 클래스 객체들로 코딩화시켰다. 이는 엔지니어에 강력하고, 유지가능한 어플레케이션에 스프링 프레임워크를 사용했던 수많은 조직과 단쳬에 의해 검증된 실제로 매우 훌륭한 산물이다.


1.1 개요

스프링 프레임워크는 많은 기능을 포함하고 있으며, 아래의 다이어그램에 보여지는 6개의 모듈에 잘 구조화되어 있다. 이 장은 차례로 각 모듈에 대해서 설명할 것이다.

Spring-overview.png

스프링 프레임워크 개요

Core 패키지는 프레임워크의 가장 기초가 되는 부분이며 IoC와 의존성 역행 기능을 제공한다. 여기서의 기본적인 개념은 BeanFactory로, 프로그램적인 singleton에 대한 필요성을 없애고 실질적인 프로그램 로직으로부터 의존성에 대한 설정과 명세를 떼어놓는 factory 패턴의 복잡한 구현체를 제공한다. Context 패키지는 Core 패키지가 제공하는 탄탄하 기반 위에 구축된다. 다소 JNDI 레지스트리의 형태로 프레임워크 유형의 방식으로 객체를 접근하는 방식을 제공한다. Context 패키지는 beans 패키지로부터 기능을 상속받고 국제화 (internationalization, I18N) (예를 들어 리소스 번들을 사용한), 이벤트-발생, 리소스-로딩, 서블릿 컨테이너와 같은 컨텍스트의 투명항 생성에 대한 지원을 추가한다. DAO 패키지는 지루한 JDBC 코딩과 DB 업체에 특수한 에러 코드를 파싱하는 작업에 대한 필요성을 없애주는 JDBC 추상 레이어를 제공한다. 또한, 특수한 인터페이스를 구현한 클래스에 대해서 뿐만 아니라 모든 POJO(plain old Java object) 대해서, JDBC 패키지는 프로그램적 뿐만 아니라 선언적인 트랜잭션 관리를 수행하는 방식을 제공한다. ORM 패키지는 JPA, JDO, Hibernate, iBatis를 포함하여 유명한 객체-관계형 매핑 API에 대한 통합 계층을 제공한다. ORM 패키지를 사용하면 이미 언급했던 단순한 선언적인 트랜잭션 관리와 같이 스프링이 제공하는 모든 다른 기능과 같이 모든 이러한 OR 맵퍼를 사용할 수 있다.