예전과는 다르게 이제는 토비의 스프링 3라는 좋은 책이 생겼기 때문에 공부하기는 훨씬 용이해 졌다고 생각합니다. 토비의 스프링 3를 한번 보기는 했지만 제대로 스프링을 써보기 전에 공부했기 때문에 제대로 이해못한 부분도 있었는데 그래도 6개월 이상 스프링을 사용하고 있기 때문에 올해 스프링을 공부하면 이해도가 좀 더 높아질 꺼라 생각하고 있습니다. 토비님이 토비의 스프링 3에서 계속 러닝테스트를 강조하셨기 때문에 코딩량도 부족한 저에게는 좋은 학습방법이 될꺼라고 생각했습니다. 하지만 러닝테스트는 공부를 하면서 설명에 나온 기능을 직접 테스트로 구현하면서 파악해 보는 것이기 때문에 러닝테스트 작성외에 기능의 설명이 나열된 어떤 교재가 필요했습니다. 처음에는 토비의 스프링 3을 생각했지만 책도 아는 만큼 보이기 때문에 좀 더 스프링을 이해하고 보면 더 이해도가 높을꺼라고 생각해서 한번 더 보기전에 좀 더 스프링에 대한 감을 잡고 싶었습니다.
그래서 스프링 프레임워크 레퍼런스 가이드를 선택했습니다. 레퍼런스 가이드는 모든 기술에서 기본이 된다고 생각하고 있었기 때문에 조급해하지 말고 기분부터 다져가자는 생각으로 레퍼런스 가이드를 보기로 했습니다. 사실 700 페이지나 되는 분량에 좀 압도되기는 했지만 끝까지 다 보지 못한다고 하더라도 일단 해보기로 했습니다. 저는 영어문서를 읽을 때 가능하면 번역을 하면서 보기 때문에 번역한 내용을 블로그에 올립니다. 이 내용은 스프링을 공부하려는 목적으로 하는 번역이기 때문에 번역의 품질은 그다지 좋지 못합니다. 왠만한 기술 용어는 영문 용어를 그대로 사용했고 문장은 내용을 이해할 수 있는 정도 수준이면 크게 다듬지 않았기 때문에 상당수 번역문체가 존재할 수 있습니다. 그리고 스프링에 대한 이해도가 높지 않기 때문에 오역이 있을 수도 있습니다.
이 문서는 Github 저장소에서 관리합니다. 현재 레퍼런스 가이드는 3.1버전이지만 3.1의 내용이 전부 적용되어 있지는 않은것 같습니다. 나중에 레퍼런스 가이드가 업데이트되었을 때 비교해서 적용도 해야하기 때문에(가능하다면) 저장소로 관리하기로 했습니다. 이왕 하는거 저장소로 관리하기 시작했지만 레퍼런스 가이드의 분량이 엄청나기 때문에 끝까지 할 수 있을지 어느정도까지 하다가 멈출지는 저도 알 수 없습니다. 하다가 지쳐서 그만 둘 수도 있고 스프링 학습이 목적이기 때문에 학습에 별로 도움이 안된다고 느껴지거나 더 좋은 학습방법을 깨닫게 되면 언제든지 멈출 수 있습니다.
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를 사용하지 않고도 로컬 자바메서드를 메시지 핸들러로 만든다.
자바 어플리케이션은 -- 제한적인 에플릿부터 n티어 서버사이드 엔터프라이즈 어플리케이션까지 포함하는 의미다 -- 보통 어플리케이션에 적합한 형식으로 협력하는 객체로 이루어져 있다. 그래서 어플리케이션의 객체는 서로 의존성이 있다.
자바 플랫폼이 어플리케이션 개발에 관련된 풍부한 기능을 제공하더라도 기본적으로 구축된 블락들을 서로 밀착된 하나의 큰 구조로 만드는 기능은 부족하다. 아키텍처와 개발자가 이 작업을 해야 한다. 사실, 애플리케이션을 만드는 여러 가지 클래스와 오브젝트 인스턴스를 구성하가 위해 팩토리, 추상 팩토리, 빌더, 데코레이터, 서비스 로케이터같은 디자인 패턴을 사용할 수 있다. 하지만 이러한 디자인 패턴은 단순히 베스트 프티스에 이름을 주어 패턴이 무슨 일을 하고 어디에 적용할 수 있고 어떤 문제에 대한 것인지 등을 설명한 것뿐이다. 패턴은 어플리케이션에서 스스로 구현해야 하는 베스트 프렉티스를 형식화한 것이다.
스프링 프레임워크 제어의 역전 (IoC) 컴포넌트는 이러한 관심사에 접근한다. 즉, 서로 다른 컴포넌트들을 사용할 준비가 된 완전히 동작하는 애플리케이션을 구성하는 형식적인 의미를 제공한다.스프링 프레임워크는 자신의 어플리케이션으로 통합할 수 있는 퍼스트 클래스 객체를 형식화된 디자인 패턴으로 만들었다.수많은 조직과 협회는 신뢰할 수 있고 유지보수 가능한 어플리케이션을 만들려고 이 방법으로 스프링 프레임워크를 사용한다.
배경
“제어의 어떤 관점이 역전되었는가?” 마틴 파울러(Martin Fowler)는 2004년 자신의 사이트에서 제어의 역전(IoC)에 대한 의견을 말했다. 파울러는 원리가 더 명확하게 드러나도록 이름을 의존성 주입(Dependency Injection)으로 바꾸어야 한다고 제한했다.
IoC와 DI를 더 알고 싶다면 http://martinfowler.com/articles/injection.html에 올라온 파울러의 글을 참고해라.
“제어의 어떤 관점이 역전되었는가?” 마틴 파울러(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로 스프링 컴포넌트의 테스트를 지원한다. 테스트 모듈은 스프링 어플리케이션 컨텍스트의 안정된 로딩과 이러한 컨텍스트의 캐싱을 제공한다. 또한, 코드를 격리된 상태로 테스트하기 위해 사용할 수 있는 모의 객체를 제공한다.
잘 정리되어있네요
감사합니다 :)
스프링소스에서 직정작성한 문서라 정리는 잘 되어 있지요.. ㅎㅎㅎ
변역 품질은 뭐 발변역이라서요. ^^
좋은 글 감사합니다..
예 감사합니다. ㅎ
좋은 자료네요...
이번 프로젝트가 스프링이라..좀 알아봐야 되겠다 싶어.이리 조리 요래 저래 찾아 보다가 딱. 저에게 맞는 메뉴얼을 발견했네요..
좋은 글 감사하구요, 울 나라 IT 발전에 한 몫하신 겁니다.^.^
공부겸해서 시작했다가 내용이 좋아서 계속 달리고 있네요 ㅎㅎㅎ
thank you very much~! ^_^
^^;;;
정말 감사합니다..
스프링 레퍼런스 영문판만 보다가 번역본을 찾아보니 1.2버전밖에 없어서 포기했었는데
이렇 좋은 자료 번역해주셔서 감사합니다.
열심히 보겠습니다 ^^..
혼자하다보니 다 하지는 못할것 같구요. 아직 진행중입니다. ㅎㅎ
내용파악 위주로 빠르게만 하다보니 번역품질은 좋지 못해서 원문하고 좀 비교하면서 보셔야 할겁니다.
오웃 이런 좋은 자료가..
영어 때문에 힘들어하는 저 같은 이들에겐 참 축복 같은 블러그네요. ^^
앞으로 잘 읽도록 하겠습니다.
오역이 있을수 있으니 유의해 주세요. ^^;;
Table 을 탁자로만 번역하지 않으셨으면 만족합니다.
과거 어느 출판사의 기계 번역 덕에 DB 안에 있는 탁자가 무엇일까를 고민하던 시절이 있었죠. ㅡㅡ;
ㅎㅎㅎㅎㅎ 번역기를 돌리진 않았습니다. ㅋ
https://github.com/outsideris/learning-spring <<- github 테스트를 해보았습니다.
좋은 자료 감사합니다.
이상있으면 말씀해 주세요.
좋은 글 감사합니다. 덕분에 스프링을 더 빨리 이해할 수 있었습니다.
네... 최근에 나머지 부분에 다시 박차를 가하고 있으니 완료되길 기대하고 있습니다. ㅎ
저도 영어 땜시 무척이나 고생하는데...
이렇게 좋은 블로그가 있어서 참 다행입니다...^_^
많은 도움 되고 있습니다.
네 사실 내용검증도 하고 문장도 다듬어야 하는데 양이 많다보니 거기엔 엄두도 못내고 있네요. ^^
영어로 읽어야 하나 고민하고 있었는데 이런 엄청난 일을 하셨다니 감사합니다.
버그 리포트 할 곳을 찾다가 못찾아서 댓글로 합니다.
0. Eclipse Juno SR2 에서 컴파일을 시도 했습니다.
1. src/dynamic-languages.xml 파일의 첫 라인의 첫 두 컬럼이 스페이스 입니다. 이것 때문에 에러가 발생합니다. 제가 별도로 앤트를 설치해서 쓰는게 아닌 관계로 이클립스 유노의 앤트 문제인지는 알수 없습니다.
누구나 해결 방법을 쉽게 찾을 수 있을 씨잘데기 없는 버그 이긴 하지만, 그래도 뭔가 찾아 드렸다는게 기쁘네요 ㅎㅎㅎ
노고에 다시한번 감사드립니다.
시작한지 2년이 넘었지만 아직도 안끝났네요 ^^;;
말씀하신 부분은 작업하다가 공백이 들어갔네요. 실수로 들어간거라 수정해 놓겠습니다만 터미널에서 컴파일할때는 오류가 발생하지 않아서 모르고 있었네요. 이클릭스의 앤트 플러그인이 검사를 더 엄격히 하는것 같네요. 오류 보고 감사드립니다.
혹시 또 찾으시는 문제가 있으면 https://github.com/outsideris/learning-spring 에 이슈로 남겨주시면 됩니다.
현재 스프링 프레임워크 4.x 버전을 번역하고 있습니다.
Outsider님께서 번역해놓으신 3.x 레퍼런스를 참고하려고 하는데 양해를 구하고자 댓글을 답니다.
안녕하세요. 양이 많아서 보통 작업이 아닌데 큰 일을 시작하셨네요.
아직 3.x도 다 끝나지 않았지만 참고해서 사용하셔도 되고요. 저도 이 작업이 꽤 오랫동안 하다보니 앞부분이랑 뒷부분이랑 단어사용이나 내용이 잘 맞는지도 자신이 없긴 합니다.
지금처럼 참고 링크만 연결해 주시면 되고요 지금 보니 저보다 더 잘 공개해 놓으셨던데 작업하시면서 작업관련해서 궁금하신 부분 있으시면 저도 도와드리겠습니다. ^^
유익한 정보 감사합니다. ^^ 배워보려 하는데 굉장히 복잡한 프레임웤이네요..
자주 들려서 배워야겠습니다.ㅠㅠ
블로그에 링크 걸어갑니다~
네 방문해 주셔서 감사합니다.
감사합니다
공부중인데 너무 좋은 내용이네요!
내용은 공식 레퍼런스 문서라서요.. ㅎㅎ 이제 버전이 오래됐지만요.
안녕하세요 우연히 IoC에 대한 문서를 보고 들어오게 되었는데 공식 레퍼런스라니 ㅠ.ㅠ 감동입니다 자주 들려 보겠습니다! 좋은 문서 감사합니다!!
지금에 비하면 버전이 꽤 옛날 버전의 레퍼런스라서 참고해서 보셔야 할 겁니다. 기본 내용은 갖지만요.