Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

[Spring 레퍼런스] 1장 스프링 프레임워크 소개 #1

오랫동안 자바와 스프링에 대해서 공부해야지 하면서도 사실 다른 기술들에 비해서 많은 시간은 투자하지 못했습니다. 어쨌든 작년부터는 스프링으로 업무를 하고 있기 때문에 올해는 맘먹고 스프링을 공부하기로 했습니다. 어떻게 스프링을 공부하는게 좋을까 고민을 많이 했습니다. 그래도 수많은 기술들을 만져봤지만 스프링 프레임워크자체가 꽤 크기 때문인지 전체적인 감을 잡기가 좀 어려웠습니다. 아무래도 시간을 많이 투자하지 못했기 때문이라고 생각합니다.

예전과는 다르게 이제는 토비의 스프링 3라는 좋은 책이 생겼기 때문에 공부하기는 훨씬 용이해 졌다고 생각합니다. 토비의 스프링 3를 한번 보기는 했지만 제대로 스프링을 써보기 전에 공부했기 때문에 제대로 이해못한 부분도 있었는데 그래도 6개월 이상 스프링을 사용하고 있기 때문에 올해 스프링을 공부하면 이해도가 좀 더 높아질 꺼라 생각하고 있습니다. 토비님이 토비의 스프링 3에서 계속 러닝테스트를 강조하셨기 때문에 코딩량도 부족한 저에게는 좋은 학습방법이 될꺼라고 생각했습니다. 하지만 러닝테스트는 공부를 하면서 설명에 나온 기능을 직접 테스트로 구현하면서 파악해 보는 것이기 때문에 러닝테스트 작성외에 기능의 설명이 나열된 어떤 교재가 필요했습니다. 처음에는 토비의 스프링 3을 생각했지만 책도 아는 만큼 보이기 때문에 좀 더 스프링을 이해하고 보면 더 이해도가 높을꺼라고 생각해서 한번 더 보기전에 좀 더 스프링에 대한 감을 잡고 싶었습니다.

그래서 스프링 프레임워크 레퍼런스 가이드를 선택했습니다.  레퍼런스 가이드는 모든 기술에서 기본이 된다고 생각하고 있었기 때문에 조급해하지 말고 기분부터 다져가자는 생각으로 레퍼런스 가이드를 보기로 했습니다. 사실 700 페이지나 되는 분량에 좀 압도되기는 했지만 끝까지 다 보지 못한다고 하더라도 일단 해보기로 했습니다. 저는 영어문서를 읽을 때 가능하면 번역을 하면서 보기 때문에 번역한 내용을 블로그에 올립니다. 이 내용은 스프링을 공부하려는 목적으로 하는 번역이기 때문에 번역의 품질은 그다지 좋지 못합니다. 왠만한 기술 용어는 영문 용어를 그대로 사용했고  문장은 내용을 이해할 수 있는 정도 수준이면 크게 다듬지 않았기 때문에 상당수 번역문체가 존재할 수 있습니다. 그리고 스프링에 대한 이해도가 높지 않기 때문에 오역이 있을 수도 있습니다.

이 문서는 Github 저장소에서 관리합니다. 현재 레퍼런스 가이드는 3.1버전이지만 3.1의 내용이 전부 적용되어 있지는 않은것 같습니다. 나중에 레퍼런스 가이드가 업데이트되었을 때 비교해서 적용도 해야하기 때문에(가능하다면) 저장소로 관리하기로 했습니다. 이왕 하는거 저장소로 관리하기 시작했지만 레퍼런스 가이드의 분량이 엄청나기 때문에 끝까지 할 수 있을지 어느정도까지 하다가 멈출지는 저도 알 수 없습니다. 하다가 지쳐서 그만 둘 수도 있고 스프링 학습이 목적이기 때문에 학습에 별로 도움이 안된다고 느껴지거나 더 좋은 학습방법을 깨닫게 되면 언제든지 멈출 수 있습니다. 저는 git-flow의 브랜칭 모델을 따르기로 했기 때문에 번역한 내용은 master브랜치가 아닌 develop브랜치에 존재합니다. master 브랜치를 사용합니다.




Spring Framework Reference Documentation

이 문서는 개인적인 목적이나 배포하기 위해서 복사할 수 있다. 출력물이든 디지털 문서든 각 복사본에 어떤 비용도 청구할 수 없고 모든 복사본에는 이 카피라이트 문구가 있어야 한다.



Part I. Spring Framework 개요

스프링 프레임워크는 엔터프라이즈급 애플리케이션을 만들기 위한 경량솔루션이며 많은 기능을 제공하고 있다. 하지만 스프링은 필요한 부분만 가져다 사용할 수 있도록 모듈화되어 있다. Struts를 IoC 컨테이너와 함께 사용할 수 있고 하이버네이트 통합 코드나 JDBC 추상화 계층만 사용할 수도 있다. 스프링 프레임워크는 RMI나 웹서비스로 로직에 원격접근하는 선언적 트랜잭션 관리와 데이터를 유지하는 다양한 옵션을 지원한다. 모든 기능을 갖춘 MVC 프레임워크를 제공하고 소프트웨어에 투명하게 AOP를 합할 수 있다.

스프링은 비침투적이다. 이 말은 도메인 로직 코드가 일반적으로 프레임워크에 의존적이지 않다는 의미이다. (데이터 접근 계층 같은)로 통합 계층에서 데이터 접근 기술과 스프링 라이브러리에 대한 의존성이 존재한다. 하지만 당신의 다른 코드들로부터 이러한 의존성을 쉽게 제거할 수 있을 것이다.

이 문서는 스프링 프레임워크에 대한 레퍼런스 가이드이다. 이 문서에 대한 어떤 요청이나 의견, 질문이 있다면 사용자 메일링 리스트나 http://forum.springsource.org/의 지원 포럼에 글을 올리면 된다.



1. 스프링 프레임워크 소개

스프링 프레임워크는 자바 애플리케이션 개발을 위한 포괄적인 인프라스트럭쳐를 제공하는 자바 플랫폼이다. 스프링은 당신이 애플리케이션에 집중할 수 있도록 인프라스트럭쳐를 다룬다.

스프링을 사용하면 "plain old Java objects"(POJOs)로 어플리케이션을 만들고 엔터프라이즈 서비스를 비침투적으로 POJO에 적용할 수 있다. 이 능력은 Java SE 프로그래밍에 적용되고 전제 혹은 부분적으로 Java EE에 적용된다.

어플리케이션 개발자인 당신이 어떻게 스프링 플랫폿의 이점을 사용할 수 있는가에 대한 예제가 있다.

  • 트랜잭션 API를 사용하지 않고도 데이터베이스 트랜잭션에서 자바메서드를 실행하도록 만든다.
  • 원격 API를 사용하지 않고도 로컬 자바메서드를 원격 프로시저로 만든다.
  • JMX API를 사용하지 않고도 로컬 자바메서드를 관리작업으로 만든다.
  • JMS API를 사용하지 않고도 로컬 자바메서드를 메시지 핸들러로 만든다.


1.1 의존성 주입(Dependency Injection)과 제어의 역전(Inversion of Control)

자바 어플리케이션은 -- 제한적인 에플릿부터 n티어 서버사이드 엔터프라이즈 어플리케이션까지 포함하는 의미다 -- 보통 어플리케이션에 적합한 형식으로 협력하는 객체로 이루어져 있다. 그래서 어플리케이션의 객체는 서로 의존성이 있다.

자바 플랫폼이 어플리케이션 개발에 관련된 풍부한 기능을 제공하더라도 기본적으로 구축된 블락들을 서로 밀착된 하나의 큰 구조로 만드는 기능은 부족하다. 아키텍처와 개발자가 이 작업을 해야 한다. 사실, 애플리케이션을 만드는 여러 가지 클래스와 오브젝트 인스턴스를 구성하가 위해 팩토리, 추상 팩토리, 빌더, 데코레이터, 서비스 로케이터같은 디자인 패턴을 사용할 수 있다. 하지만 이러한 디자인 패턴은 단순히 베스트 프티스에 이름을 주어 패턴이 무슨 일을 하고 어디에 적용할 수 있고 어떤 문제에 대한 것인지 등을 설명한 것뿐이다. 패턴은 어플리케이션에서 스스로 구현해야 하는 베스트 프렉티스를 형식화한 것이다.

스프링 프레임워크 제어의 역전 (IoC) 컴포넌트는 이러한 관심사에 접근한다. 즉, 서로 다른 컴포넌트들을 사용할 준비가 된 완전히 동작하는 애플리케이션을 구성하는 형식적인 의미를 제공한다.스프링 프레임워크는 자신의 어플리케이션으로 통합할 수 있는 퍼스트 클래스 객체를 형식화된 디자인 패턴으로 만들었다.수많은 조직과 협회는 신뢰할 수 있고 유지보수 가능한 어플리케이션을 만들려고 이 방법으로 스프링 프레임워크를 사용한다.

배경

“제어의 어떤 관점이 역전되었는가?” 마틴 파울러(Martin Fowler)는 2004년 자신의 사이트에서 제어의 역전(IoC)에 대한 의견을 말했다. 파울러는 원리가 더 명확하게 드러나도록 이름을 의존성 주입(Dependency Injection)으로 바꾸어야 한다고 제한했다.

IoC와 DI를 더 알고 싶다면 http://martinfowler.com/articles/injection.html에 올라온 파울러의 글을 참고해라.



1.2 모듈

스프링 프레임워크는 약 20개의 모듈로 구조화된 특징으로 이루어져 있다. 이러한 모듈들은 다음 다이어그램에 보이듯 코어 컨테이너, 데이터 접근/통합, 웹, AOP(관점지향 프로그래밍), 인스트루멘테이션(Instrumentation), 테스트로 그룹을 나눌 수 있다.

스프링 프로그램의 개요

스프링 프로그램의 개요



1.2.1 코어 컨테이너

코어 컨테이너 는 코어(Core), 빈즈(Beans), 컨텍스트(Context), 표현언어 (Expression Language) 모듈로 이루어졌다.

코어와 빈즈 모듈은 IoC와 의존성 주입을 포함하는 프레임워크의 기본이 되는 부분을 제공한다. BeanFactory는 팩토리 패턴을 세련되게 구현했다. BeanFactory을 사용하면 프로그래밍 적으로 싱글톤을 구현할 필요가 없고 실제 프로그램 로직에서 의존성에 대한 설정과 명세를 분리할 수 있다.

컨텍스트 모듈은 코어와 빈즈 모듈에서 제공하는 단단한 기반위에 구성되었다. 이는 JNDI 등록과 유사한 프레임워크 스타일로 객체에 접근한다는 의미다. 컨텐스트 모듈은 빈즈 모듈의 특징을 상속받고 국제화, 이벤트 전파, 리소스-로딩, 서블릿 컨테이너 컨텍스트의 투명한 생성에 대한 지원을 추가한다. 또한 컨텍스트 모듈은 EJB, JMX, 기본적인 원격 같은 Java EE의 기능을 지원한다. ApplicationContext 인터페이스는 컨텍스트 모듈에서 중요하다.

표현언어 모듈은 런타임에서 객체 그래프를 조회하고 조작하는 강령한 표현언어이다. 표현언어 모듈은 JSP 2.1 명세에 명시된 것처럼 통합된 표현언어(unified EL)의 확장이다. 언어는 속성값을 설정하고 가져오는 기능과 속성 할당, 메서드 호출, 배열과 컬렉션과 인덱서의 컨텍스트 접근, 논리적/산술적 오퍼레이터, 이름있는 변수, 스프링의 IoC 컨테이너에서 이름으로 객체를 획득하는 기능을 지원한다. 일반적인 리스트 집합뿐 아니라 리스트의 투영과 선택도 지원한다.


1.2.2 데이터 접근/통합

데이터 접근/통합 계층은 JDBC, ORM, OXM, JMC, 트랜잭션 모듈로 이루어졌다.

JDBC모듈은 JDBC 추상화계층을 제공한다. 그래서 지루한 JDBC 코딩과 데이터베이스 벤더에 따라 다른 오류코드를 파싱할 필요가 없다.

ORM 모듈은 JPA, JDO , Hibernate, iBatis를 포함하는 인기 있는 객체-관계 매핑 API에 대한 통합계층을 제공한다. ORM 패키지를 사용하면 이러한 O/R매핑 프레임워크들을 앞에서 언급했던 선언적 트랜젝션 관리 같은 스프링의 다른 기능들과 함께 사용할 수 있다.

OXM 모듈은 JAXB, Castor, XMLBeans, JiBX, XStream에 대한 객체/XML매핑 구현을 지원하는 계층이다.

자바 메시징 서비스 (JMS) 모듈은 메시지를 생산하고 소비하는 기능을 포함한다.

트랜잭션 모듈은 특별한 인터페이스와 모든 POJO (plain old Java objects)의 클래스에 대한 트랜잭션 관리를 지원한다. 트랜잭션 관리는 프로그래밍 적으로 하거나 선언적으로 할 수 있다.


1.2.3 웹

웹 계층은 웹, 웹-서블릿, 웹-스트러츠, 웹-포틀릿 모듈로 이루어졌다.

스프링의 웹 모듈은 기본적인 웹-지향적인 통합기능을 제공한다. 웹-지향적인 통합기능은 멀티파트 파일 업로드 기능, 서블릿 리스너와 웹 지향적인 애플리케이션 컨텍스트를 사용한 IoC 컨테이너의 초기화를 말한다. 또한, 스프링의 원격기능에서 웹과 관련된 부분을 포함한다.

웹-서블릿 모듈은 웹 어플리케이션을 위한 스프링의 모델-뷰-컨트롤러 (MVC ) 구현을 포함한다. 스프링의 MVC 프레임워크는 도메인 모델코드와 웹 폼을 깔끔하게 분리할 수 있도록 하고 스프링 프레임워크의 다른 모든 기능과 통합할 수 있게 한다.

웹-스트러츠(Web-Struts) 모듈은 스프링 어플리케이션에서 전통적인 스트러츠 웹티어를 통합을 지원하는 클래스를 포함한다. 이 지원은 스프링 3.0에서는 폐기되었다. 어플리케이션을 스트러츠 2.0이나 스트링 통합으로 마이그레이션 하던가 스프링 MVC를 사용하는 것을 고려해라.

웹-포틀릿(Web-Portlet) 모듈은 포틀릿 환경에서 사용되는 MVC 구현과 웹-서블릿 모듈 기능의 미러 기능을 제공한다.


1.2.4 AOP와 인스트루멘테이션(Instrumentation)

스프링의 AOP 모듈은 AOP Alliance를 따르는 관점지향 프로그래밍의 구현체다. 예를 들어 기능적으로 분리되어야 하는 코드를 깔끔하게 분리하는 메서드-인터셉터와 포인트컷을 정의할 수 있다. 소스레벨의 메타데이터 기능을 사용하면 .NET 어트리뷰트와 유사한 방법으로 행동에 관한 정보를 코드로 구현할 수 있다.

분리된 관점(Aspects) 모듈은 AspectJ와의 통합을 제공한다.

인스트루멘테이션(Instrumentation) 모듈은 인스트루멘테이션을 지원하는 클래스와 특정 어플리케이션 서버에서 사용되는 클래스로더 구현체를 제공한다.


1.2.5 테스트

테스트 모듈은 JUnit이나 TestNG로 스프링 컴포넌트의 테스트를 지원한다. 테스트 모듈은 스프링 어플리케이션 컨텍스트의 안정된 로딩과 이러한 컨텍스트의 캐싱을 제공한다. 또한, 코드를 격리된 상태로 테스트하기 위해 사용할 수 있는 모의 객체를 제공한다.
2012/01/15 02:56 2012/01/15 02:56