1장 스프링 프레임워크 소개 #1 spring reference

나도 해보자 스프링 레퍼런스 읽고 번역하기!

참고 ) https://blog.outsider.ne.kr/729
https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#spring-introduction

한글 번역해주신분은 3.1버전이고 지금은 4.3.9버전이니까 두개 차이를 비교하면서 번역해보기로하자
약 700페이지라고 하니까 일년 근무일수 약 250일로 잡으면 하루에 3페이지씩 번역하면 1년안에 되지않을까 합니다. 
음.. 아니야.. 마음편하게 꼴리는대로하자. 


Part 1. Spring Framework 개요. 

스프링 프레임워크는 엔터프라이즈급 애플리케이션을 만들기 위한 경량 솔루션이며, one-stop-shop이다. 
하지만 스프링은 다른 나머지 부분 없이, 니가 필요한 부분만 이용할 수 있도록 모듈화 되어있다. 
너는 아무 웹 프레임워크 위에 IoC 컨테이너를 이용할 수 있다 또한 하이버네이트통합 코드JDBC추상화 계층만 이용할 수 도 있다. 
스프링 프레임워크는 RMI나 웹서비스로 로직에 원격접속하는 선언적 트랜젝션 관리와 데이터를 유지하는 다양한 옵션을 제공한다. 스프링은 너의 소프트웨어에 full-featured MVC를 제공하고 투명하게 aop를 합칠수있다.

스프링은 침투적이지 않게 디자인 되어있다 (도메인 로직 코드가 일반적으로 프레임워크에 의존적이지 않다) 
DAO와 같은 통합 레이어에서 데이터 접근 기술과 스프링 라이브러리에 대한 의존성이 존재하지만, 하지만 이런 의존성이 너의 다른 코드들과 독립적으로 만들기는 쉽다. 

이 문서는 스프링 프레임워크의 feature들의 레퍼런스 가이드이다. 이 문서에 대한 질문이나 코멘트가 있으면 메일링 리스트로 보내라. 프레임워크 자체에 질문이 있으면 스택오버플로우로 물어봐라.(see https://spring.io/questions).


1. 스프링으로 시작하기.

이 레퍼런스 가이드는 스프링 프레임워크에 대한 자세한 정보를 제공한다. 이것은 모든 features들의 포괄적인 문서를 제공할 뿐만 아니라 스프링이 가지고 있는 개념을 이해하는데 배경지식을 제공한다. 

당신이 만약 지금 스프링을 시작한다면, 너는 스프링 부트기반 애플리케이션을 만들어서 스프링 프레임워크를 이용 할 수 있다. 스프링 부트는 스프링 기반의 애플리케이션을 만드는 빠른 방법이다. 부트는 스프링 프레임워크를 기반으로 convention을 따라 가능한 빠르게 작동시킬 수있도록 디자인 되어있습니다. 

시작하기 가이드, RESTful webservice 시작하기 가이드를 따라하거나 기본 프로젝트를 만드는데 start.spring.io 페이지를 이용할 수 있습니다. 이런 가이드들은 만들기 쉽고, task에 집중되어있으며 대부분이 스프링 부트를 기반으로 하고있습니다. 
또한 가이드는 당신이 특정한 문제를 풀려고 할 때 스프링 포트폴리오의 다른프로젝트들로 커버할수있다.

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

스프링은 자바 애플리케이션을 개발하는데 포괄적인 기반을 제공하는 자바 플랫폼이다. 당신이 당신의 애플리케이션에 집중할 수 있도록 스플이은 기반을 다룬다. 

스프링은 가능하게 한다 너가 어플리케이션을 만들 수 있게 포조로부터 그리고 적용한따 전체 서비스가 포조와 칩투되어있지않은 
스프링은 plan old Java object(POJOs)로 애플리 케이션을 만들 수 있고, 또 엔터프라이즈 서비스로 비 침투적으로 POJOs에 적용할 수 있다. 이 능력은 자바 SE 프로그래밍 모델에 적용되고 java ee에 전체 혹은 부분적으로 적용된다. 

애플리케이션 개발자로서 당신이 어떻게 스프링 플랫폼의 이익을 볼 수 있는지 예제이다.
  - 트랜젝션API를 이용하지 않고도 데이터베이스 트랜젝션에서 자바 메소드를 실행하도록 만든다.
  - Servlet API를 이용하지 않고 로컬자바 메소드를 HTTP 엔드포인트를 만들 수 있다. 
  - JMS API를 이용하지 않고 로컬자바 메소드를 메세지 핸들러를 만들수 있다.
  - JMX API를 이용하지 않고 로컬 자바 메소드를 관리 작업으로 만든다. 


2.1 의존성 주입(Dependency Injection) 과 

제어의 역전( Inversion of Control  )

 자바 애플리케이션은 -- 제한적은 애플릿으로 부터 n티어 서버사이드 엔터프라이즈 애플리케이션까지 포함하는 의미이다 -- 보통 애플리캐이션에 적합한 객체로 이루어저 있다. 그래서 애플리케이션의 객체는 서로간의 의존성을 가진다. 

비록 자바 플랫폼이 애플리케이션 개발에 풍부한 기능을 제공하지만, 전체를 논리적으로 기초를 구상하는 방법이 부족하여 이런 남은 작업들은 개발자와 아키텍쳐가 해야한다. 사실 당신은 다양한 클래스와 객체를 조합하여 애플리 케이션을 만드는데, Factory, Abstract Factory, Builder, Decorator and Service Locator와 같은 디자인 패턴을 사용할 수 있다. 하지만, 이런 패턴들은 베스트 프랙티스에 이름을 주어 어떤 패턴이 어떤일을 하고 어디에 적용해야하는지 어떤 문제에 대한 것인지 설명한 것 뿐이다. 패턴들은 당신이 애플리케이션에서 구현해야 하는 베스트 프랙티스를 형식화 한 것이다. 

스프링의 제어의 역전(IoC) 컴포넌트는 서로다른 컴포넌트를 완전히 작동될 준비가 된 애플리케이션으로 조립시키는 형식화된 방법을 제공하여이런 문제를 해결합니다. 
스프링 프레임워크는 자신의 애플리케이션으로 통합할 수 있는 퍼스트 클래스 객체를 형식화된 디자인 패턴으로 만들었다.
수많은 조직과 협회는 신뢰할 수 있고 유지보수 가능한 어플리케이션을 만들려고 이 방법으로 스프링 프레임워크를 사용한다.


배경

“제어의 어떤 관점이 역전되었는가?” 마틴 파울러(Martin Fowler)는 2004년 자신의 사이트에서 제어의 역전(IoC)에 대한 의견을 말했다. 파울러는 원리가 더 명확하게 드러나도록 이름을 의존성 주입(Dependency Injection)으로 바꾸어야 한다고 제한했다.
IoC와 DI를 더 알고 싶다면 http://martinfowler.com/articles/injection.html에 올라온 파울러의 글을 참고해라.


1.2 모듈

스프링 프레임워크는 약 20개의 모듈로 이루어져 있다. 이런 모듈들은  아래 그림과 같이  Core Container, Data Access/Integration, Web, AOP (Aspect Oriented Programming), Instrumentation, Messaging, and Test으로 이루어져 있다.



다음 섹션은 각 기능의 사용가능한 모듈과 해당 이슈 이름 및 해당 항목에 대해 설명합니다.
이슈 이름은 의존성 관리 툴로서 사용되는 이슈의  ID와 관련있습니다. 


2.2.1 Core Container

코어 컨테이너는 spring-core, spring-beans, spring-context, spring-context-support, spring-expression모듈로 이루어져 있습니다.

스프링 코어와 스프링 빈 모듈은  IoC와 DI와 같은 프레임워크의 기반을 제공한다. BeanFactory는 팩토리 패턴을 높은 수준으로 구현했다.  프로그래밍 방식의 싱글톤을 구현할 필요가 없고, 구성을 분리할 수 있게하고, 프로그램의 로직으로 부터 의존성에 대한 설정과 명세를 분리할 수 있다. 

Context 모듈은 코어와 빈 모듈에서 제공하는 단단한 기반 위에 구성된다. 그말은 JNDI레지스트리와 유사하게 프레임워크 스타일 방식으로 오브젝트에 접근한다. 컨텍스트 모듈은 빈즈 모듈의 특징을 상속받는다 그리고 국제화 이벤트 전파, 리소스 로딩, 서블린 컨테이너 컨텍스트의 투명한 생성에 대한 지원을 추가한다. EJB, JMX, basic remoting과 같은 Java EE의 특징을 지원한다. 
Application Context  인터페이스는 컨텍스트 모듈에서 중요하다. spring-context-support 가 
(캐싱, 메일링, 스케줄링, 템플릿 엔진)을 이용하기 위한 스프링 애플리케이션 컨텍스트에 common third-party libray에 통합하기 위한 지원을 제공한다.
 caching (EhCache, Guava, JCache), mailing (JavaMail), scheduling (CommonJ, Quartz) and template engines (FreeMarker, JasperReports, Velocity).


spring expression 모듈은 쿼리와 런타임시 객체 그래프를 조회하고 조작하는 강력한 표현 언어를 제공한다. 
JSP 2.1스펙에 정의된 Undefined Expression Language의 확장이다. 
property value를 설정하고 가지고 오는 기능과  속성 할당, 메서드 호출, 배열과 컬렉션과 인덱서의 컨텍스트 접근, 논리적/산술적 오퍼레이터, 이름있는 변수, 스프링의 IoC 컨테이너에서 이름으로 객체를 획득하는 기능을 지원한다.
일반적인 리스트 집합뿐만 아니라 리스트의 투영과 선택도 지원한다. 



2.2.2 AOP 와 Instrumemtation

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

spring-aspects 모듈은 AspcetJ와의 통합을 제공합니다. 

spring instrument모듈은 인스트루멘테이션을 지원하는 클리새와 특정 애플리케이션 서버에서 사용되는 클래스로더  구현체를 제공한다. 
spring instrument tomcat모듈은 스프링 톰캣 instrumetation agent 에 들어있다. 

2.2.3 Messaging

스프링 4 버전엔 메세지 기반 애플리케이션의 기초인 Message, MessageChannel, MessageHandler같은  스프링 Integration project로부터 key를 추상화하는 spring message모듈이 있다. 
메세지 모듈은 프로그래밍 모듈을 기반으로한 스프링MVC어노테이션 처럼 메세지를 메소드에 매핑시킨는 어노테이션의 세트를 포함한다.

2.2.4 Data Access/Integration

Data Access/Integration 계층은 JDBC,ORM,OXM,JSM, 트랜젝션 모듈로 구성된다. 
Spring jdbc모듈은 jdbc추상화 계층을 제공한하여 지루한 jdbc코딩과 파싱 database-vendor에서 정의한 에러코드들을 제거한다. 
spring tx모듈은 특별한 인터페이스와 모든 너의 POJO를 관리하는 클래스를 이용프로그래밍적, 선언트랜젝션 관리를 제공한다.
spring -orm 모듈은 JPA, JDO, Hibernate와 같은 유명한 객체 - 관계형 매핑 API를 위한 통합 레이어를 제공한다. 
spring-orm 모듈을 이용하여 당신은 앞에서 말했던 간단한 선언적 트랜젝션 관리 기능과 같은 스프링이 제공하는 이런 모든 객체/관계형 매핑 프레임워크를 이용할 수 있다. 
spring-oxm 모듈은 JAXB, Castor, XMLBeans, JiBX,  XStream과 같은 객체/xml매핑하는 추상 레이어를 제공한다.
spring -jms모듈은 메세지를 만들고 소비하는 기능을 가진다.  스프링 4.1 부터 spring-messaging 모듈로 제공된다. 

2.2.5. Web

웹 레이어는 spring-web, spring-webmvc, spring-websocket, spring-webmvc-portlet 모듈로 구성된다. 
spring-web모듈은 다중 파일 업로드, 서블릿 리스너와 web-oriented application context를 이용한 Ioc Container의 초기화 기본적인 웹 기반 통합 기능을 제공한다.
spring-webmvc모듈은 (web-servlet모듈) 웹 앱을 위한 rest와 mvc를 포함한다.
spring mvc framework에는 도메인모델 코드와 웹 폼 그리고  스프링 프레임워크의 모든 다른 기능들이 깔끔하게 분리되어있다. 

spring web-mvc-portlet모듈은 포틀릿 환경에서 사용되는 mvc구현과 웹  서블릿 모듈 기능의 미러 기능을 제공한다. 

2.2.6 TEST

spring test 모듈은 JUnit 이나 TESTNG 등의 스프링 컴포넌트로 단위 테스트와 통합 테스트를 지원한다. Spring Application Context와 이런 컨텍스츠의 캐싱의 안정된 로딩을 제공한다. 목 오브젝트를 제공하여 독립적으로 테스트가 가능하게 해준다. 


덧글

댓글 입력 영역