스프링은 굉장히 크고 방대한 프레임웍입니다. 

여기서 다루는 내용은 스프링을 처음 시작할 때 참고할 만한 내용들로 구성한 '스프링 겉핥기' 수준입니다. 

스프링에 대해 본격적으로 배우기 위해서는 각각의 주제들에 대해 좀더 상세히 다루고 있는 서적이나 웹 문서 등을 활용하시기 바랍니다.

학습이나 업무 중에 궁금하신 내용들이 있으시면, KSUG 그룹스 메일링이나 페이스북 그룹 등을 활용하시면 도움이 될 것입니다.

스프링의 세계에 오신 것을 환영합니다~! 건승을 빕니다~!

(아래서 참조한 스프링 레퍼런스 원문에 대한 번역 본들은  http://blog.outsider.ne.kr/tag/spring_reference_documentation 에서도 찾아볼 수 있습니다.)


1. 스프링이란 무엇인가?

개요/소개

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/spring-introduction.html

The Spring Framework is a lightweight solution and a potential one-stop-shop for building your enterprise-ready applications.

스프링 프레임웍은 엔터프라이즈급 애플리케이션을 만들기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션이다.

- Note : 엔터프라이즈급 애플리케이션

  단일 데스크탑에서 실행되는 J2SE(Standard Edition)기반의 애플리케이션과는 대조적으로, 네트워크를 기반으로 여러 컴퓨터와 관계해서 실행되는 규모가 큰 J2EE(Java2 Enterprise Edition) 기반의 애플리케이션. 대표적으로 웹 서비스.

- Note : 모든 기능을 종합적으로 제공하는

  엔터프라이즈 애플리케이션을 개발할 때 반복적으로 등장하는 웹 요청 처리, JDBC/트랜잭션, 리모팅/인티그레이션 등에 대한 솔루션을 스프링 프레임웍을 통해 대부분 제공할 수 있게 함. 

- Note : 경량화된 솔루션

  상대적으로 무거운 EJB에 대한 대안으로 고안된 POJO 기반의 경량 빈 팩토리/컨테이너. 


http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/overview.html

Spring Framework is a Java platform that provides comprehensive infrastructure support for developing Java applications. Spring handles the infrastructure so you can focus on your application.

스프링 프레임웍은 자바 애플리케이션을 개발하기 위해 필요한 인프라스트럭처를 종합적으로 제공해, 개발자로 하여금 애플리케이션 개발에 집중할 수 있게 도와준다.

- Note : 인프라스트럭처

  (유사: boilerplate code, 배관(?) 코드) 

  애플리케이션에서 문제해결을 위한 주요 관심 코드가 아닌, 주변적이면서도 반드시 있어야 하는 공공재(?) 적인 코드들. 반드시 필요하지만 번거롭게 반복적으로 등장하기 때문에, 코드 재사용을 위한 첫번째 해결 목표가 된다.

Spring enables you to build applications from “plain old Java objects” (POJOs) and to apply enterprise services non-invasively to POJOs. This capability applies to the Java SE programming model and to full and partial Java EE.

스프링은 POJOs(plain old java objects)를 기반으로 애플리케이션을 개발할 수 있게 하여, 엔터프라이즈 서비스를 비간섭적(non-invasively)으로 POJO에 적용시킬 수 있게 해준다. 이러한 기술은 자바SE 프로그래밍 모델뿐만 아니라 전체 또는 일부의 자바EE에 까지 적용할 수 있게 된다. 

- Note : POJO(Plain Old Java Object)

  보통의 자바 (빈) 객체

- Note : 비간섭적(non-invasively)

  간섭적(invasively)인 코드와 대조적인 개념으로, 상속이나 의존관계에 의해 코드 작성에 제약사항을 가하게 되는 코드를 배제한다는 개념.

IoC

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/overview.html#overview-dependency-injection


IoC(Inversion of Control)는 스프링 프레임웍의 핵심이 되는 개념이자 기술입니다. 관련된 문서나 서적(스프링의 핵심 개념들을 제대로 배우고 싶으시면 토비의 스프링3를 추천합니다. ^^;) 을 통해 반드시 이해할 필요가 있습니다. 처음부터 이해하기 어려운 경우에는, 구현 예제를 통해 스프링을 우선 사용해본 뒤 나중에라도 반드시 이해할 수 있도록 합니다.

- Spring IoC 개념 및 활용방안

http://www.javajigi.net/pages/viewpage.action?pageId=5614

- 토비의 스프링, 2부 선택 - 10장 IoC 컨테이너와 DI

http://code.google.com/p/developerhaus/wiki/TobySpring_10

스프링, 먹는건가?

그러니까,, 스프링 프레임웍(이하, 스프링)이라는 것은 자바+웹 개발자라고 하면 반드시 직면하게 되는 개발문제들에 대해, 아주 훌륭하고 유연한 설계를 통해 개발 Best Practice(모범사례)들을 제공해주고, 비슷한 처지의 개발자들이 매번 똑같은 코드를 재생산하게 되는 것을 방지해주는 아주 유익한(!) 솔루션이다... 라고 말할 수 있겠습니다.

(어디까지나 작성자의 사견이며 공식적인 정의는 아니므로,, 참고만 하세요.. 태클은 사양하겠습니다. __;;)

2. 스프링은 어떻게 구성되어 있는가?

모듈 구성

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/overview.html#overview-modules


1. Core Container

Core Container는 Core, Beans, Context, EL(Expression Language) 모듈들로 구성되어 있다.

Core 모듈과 Beans 모듈은 프레임웍의 기반이 되는 부분들로, IoC와 DI(Dependency Injection, 의존성주입) 기능을 제공한다. BeanFactory는 팩토리 패턴을 철학적으로 구현해놓은 것으로, 프로그램에서 직접 싱글톤을 생성하지 않을 수 있게 해주며, 객체간의 의존관계를 실제 프로그램 로직에서부터 설정파일로 분리해낼 수 있게 해준다.

Context 모듈은 Core 모듈과 Beans 모듈의 실체화된 부분을 제공하며, 객체에 대한 접근 방법을 JNDI 레지스트리와 유사하게 프레임웍 형식으로 제공한다. Context 모듈은 Beans 모듈의 기능을 상속받고, 이에 추가적으로 국제화(리소스 번들의 사용과 같은), 이벤트 전이(event-propagation), 리소스 로딩, 서블릿 컨테이너와 같은 컨텍스트의 생성 기능들을 함께 제공한다. 

Expression Language 모듈은 객체 그래프를 런타임시에 조회하고 조작할 수 있는 강력한 표현 언어 기능을 제공하며, JSP 2.1 스펙에서 사용하는 통합표현언어(unified EL)를 확장하고 있다. 


2. Data Access/Integration

Data Access/Integration 레이어는 JDBC, ORM, OXM, JMS, 트랜잭션 모듈들로 구성되어 있다.

JDBC 모듈은 JDBC-추상 레이어를 제공하여 데이터베이스의 종류에 따른 JDBC 구현코드와 에러 코드를 대신 다루어준다.

ORM 모듈은 JPA, JDO, 하이버네이트(Hibernate), iBatis와 같이 잘 알려진 객체-관계매핑(object-relational mapping, ORM) API들에 대한 인티그레이션 레이어를 제공한다. 

OXM 모듈은 JAXB, Castor, XMLBeans, JiBX, XStream과 같은 객체/XML 매핑(Object/XML mapping) 구현체에 대한 추상 레이어를 제공한다.

JMS(Java Messaging Service) 모듈은 메시지의 생성과 소비 기능을 제공하며, Transaction 모듈은 프로그램적(programmatic) 또는 선언적(declarative) 트랜잭션 관리 기능을 제공한다. 


3. Web

웹 레이어는 Web, Web-Servlet, Web-Struts, Web-Portlet 모듈들로 구성되어 있다.

스프링의 Web 모듈은 multipart 파일업로드, 서블릿 리스너를 사용한 IoC 컨테이너와 웹-애플리케이션 컨텍스트를 초기화 등의 기본적인 웹 관련 인티그레이션 기능들을 제공한다.

Web-Servlet 모듈은 웹 애플리케이션에 필요한 스프링의 MVC(model-view-controller) 구현체를 제공한다. 


4. AOP and Instrumentation

스프링의 AOP 모듈은 AOP Alliance의 규약에 호환되는 관점-지향 프로그래밍(aspect-oriented programming) 구현체를 제공하며, 메서드 인터셉터와 포인트컷을 사용해 코드를 기능별로 깔끔하게 분리될 수 있게 도와준다. 

Aspects 모듈은 AspectJ와의 인티그레이션을 제공하며, Instrumentation 모듈은 특정 애플리케이션 서버에서 사용되는 클래스로더(classloader) 구현체와 인스트루먼테이션(instrumentation) 기능을 제공한다.


5. Test

Test 모듈은 JUnit 또는 TestNG를 사용해 테스트를 지원하는 스프링 컴포넌트를 제공한다. 


사용 시나리오

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/overview.html#overview-usagescenarios 

스프링의 모듈들을 활용해 여러 가지 형태의 시나리오에 따라 블럭을 구성할 수 있으며, 몇 가지 예를 들면 다음과 같다.


1. 일반적인 사용 시나리오 (웹 애플리케이션)

핵심 도메인들은 Core Container 기능들을 활용해 커스텀 도메인 로직으로 구성하고,

하위에서는 AOP를 활용해 POJO에 대해 선언적 트랜잭션으로 구성하고, ORM 매핑 구현체를 적용해 커스텀 DAO/레파지토리를 구성할 수 있다.

상위에서는 폼 컨트롤러를 두어 일반적인 웹 요청을 처리하고, 파일업로드 등에 대한 Multipart 리졸버와 요청 파라미터에 대한 동적 바인딩을 활용할 수 있다. 결과 뷰에 대해서도 JSP, Velocity, PDF, 엑셀 등 여러 가지 인티그레이션을 활용할 수 있다.

그리고, 외부 시스템과의 연동을 위해 여러 가지 리모팅/인티그레이션 기술들을 활용할 수 있다.


2. 외부 프론트 웹 프레임웍을 사용하는 시나리오

미들단 하위로는 스프링의 모듈들을 사용하며, 웹 요청/처리단 만을 스프링 MVC 대신 Struts 등의 외부 프론트 웹 프레임웍을 인티그레이션하는 형태


3. 리모팅 웹 서비스 API 구현 시나리오

리모팅 웹 서비스 API 구현을 위해 웹 요청/처리 단을 스프링의 Hessian, Burlap, Rmi 등의 구현체를 사용한 형태 


3. 스프링을 사용하는 방법

Java HelloWorld


Web HelloWorld


4. 스프링에 대해 더 배우기

공식문서

학습도서

(yes24 선정 기준 1~5위)

- 토비의 스프링3

http://www.yes24.com/24/goods/4020006

- 스프링 인 액션

http://www.yes24.com/24/goods/6229706

- 스프링3 레시피

http://www.yes24.com/24/goods/4744444

- 웹 개발자를 위한 스프링 3.0 프레임워크

http://www.yes24.com/24/goods/3945627

- 스프링 프레임워크 3.0

http://www.yes24.com/24/goods/6230929


(용감하신 분은 원서도 추천...!)

블로그/링크




출처 - http://www.ksug.org/search/aop










Posted by linuxism
,