finerss's world!

2011/12/12 +2

Spring IOC

공부/Spring2011. 12. 12. 22:19

-Spring 에서의 IOC

Spring 프레임워크를 보면 Lightweight Container 라는 단어나 IoC라는 단어가 자주 나온다.

Spring 프레임워크를 이해하기 위해서 가장 먼저 이해해야 하는 것은 IOC 개념이다. 또한  이 IOC 개념이 Container 기능이 된다.

Spring 프레임워크에는 여러가지 모듈이 있는데 IoC모듈은 모든 Spring 모듈의 가장 기본적인 Core 기능을 제공함으로 그만큼 중요하다고 할수 있다.

-Container, Lightweight Container 란

컨테이너의 기본 틍징을보면
Lifecycle Management
Lookup
Configuration
Depenency Resolution
Thread Management
Object Pooling
Clustering Management
Remotion
Exposing remote services
Customization and extensibility

등의 기능을 포함 한다는 것이다.

컨테이너는 여러가지 면에서 반드시 필요한데 첫쨰로 컴포넌트/오브젝트의 자유로운 삽입(Pluggability)이 가능하도록 하기위한
calling code 의 독립성 떄문이다. 둘쨰는 서비스의 lookup이나 configuration이 일관성을 갖도록 하기 위한 것이다.
셋쨰는 단일화된 서비스의 접근방법을 제공하기 위한것이다. 예로 개발자 각자 자기만의 스타일로 싱글톤이나 팩토리를 만들어 쓸 필요가 없어야 한다는 것이다. 넷쨰는 비지니스 오브젝트에 부가적으로 필요로하는 각족 enterprise service를 제공하기 위해서이다.

그렇다면 lightweight Container 의 특징은 무엇일까? 일반 컨테이너처럼 애플리케이션 코드를 관리해 주지만 그 코드 내에 컨테이너에 대한 의존적인 부분들이 필요 없도록 해준다. 코드 내에 컨테이너에서 동작하기 위해서 특별히 필요로하는 부분이 없기떄문에 가볍다고 할수있는것이다.
컨테이너를 알지못하는 오브젝트 또는 알 필요도 없는 오브젝트를 가능하게 해준다는 것이다. 이는 컨테이너 내에 오브젝트를 배치(deploy) 하기 위한
복잡한 과정이 없다는 것을 의미한다. 컨테이너  그 자체로 가볍다는것을 의미한다.

'공부 > Spring' 카테고리의 다른 글

About Spring  (0) 2011.12.12
엔티티 빈  (0) 2011.07.26
RMI(원격 메소드 호출, Remote Method Invocation)  (3) 2011.07.04

About Spring

공부/Spring2011. 12. 12. 21:25

-Framework


1) Framework 란 무엇인가?

프레임워크란  프래그래머가 프로그램을 만드는데 있어 아주 기본이 되는 골격 코드를 말한다.

중요한 것은 이 골격이라는 것이 어떤 특별한 목적을 가지고 있다는 점이다. 건물을 만들기 위한 골격, 배를 만들기 위한 골격처럼말이다.

골격을 보면 앞으로 완성품이 무엇이 될지 예상할 수가 있따. 그래서 이 프레임워크를 반제품이라고 부르는 사람도 많다.

반제품, 즉 반쯤 완성된 제품이라는 의미이다. 반쯤 완성되었기 떄문에 프레임워크를 이용하는 사람은 나머지 반 부분만 채워 넣어주면 된다.

프레임워크 자체는 완전한 애플리케이션 소프트웨어가 아닌 어떤 문제영역을 해결하기 위한 잘 설계된 일반적인,

재사용 가능한 모듈(이미만들어진 '반') 이기 떄문에 완결된 애플리케이션으로 제공되지 못한다.

따라서 사용자가 프레임워크를 확장하여 비즈니스 요구사항을 만족시키는 완전한 애플리케이션 소프트웨어를  완성시키는 작업( 나머지 ' 반') 이 요구되

는 것이다.

<변경이되지않는 Core부분인 Cold Spot 위에 훅 포인트(Hook Point)를 통해 확장한다(Hot Spot).>
 


즉 프레임워크는 Open-Closed 원칙 (이하 OCP)을 그대로 따르고있다. 재사용되는 공통된 부분은 프레임워크로 구현되어

다른사람이 그 내부를 가공 없이 이용하도록 제공하고 있다(Closed). 확장이 필요한 부분은 사용자 요구사항에 맞게 정의하여 확장시키므로

문제영역에 최적화된 애플리케이션 설계가 완성된다(Open) *이를 확장에는 열려있고, 병경에는 닫혀있다라고 말한다.

프레임워크를 애플리케이션에 적용할 떄 변경되지 않고 반복적으로 재사용되는 부분을 프레임워크의 코어로 정의한다. 변경이 잘 일어나지 않는

프레임워크의 코어부분을 콜드 스팟(Cold spot)이라고 부르기도 한다.(OCP) 에서 Closed 모듈에 해당한다).

프레임워크 코어는 각 애플리케이션마다 확장 모듈을 연결하는 확장 점을 제공하는데, 이를 훅 포인트(Hook Point)라고 한다.

대개 훅 포인트는 추상 클래스나 인터페이스의 형태로 나타낸다. 애플리케이션마다 이 훅 포인트를 통해 확장 모듈을 바인딩한다.

이확장 모듈을 핫스팟(Hot Spot)이라고 부른다(OCP에서 Open 모듈에 해당한다).

일반적으로 훅 포인트는 사용자가 소스코드 상에서 함수 호출을 통해 확장 모듈을 등록(혹은 바인딩)하게 된다.

하지만 바인딩 코드들이 사용자 코드 곳곳에 분포되어 산만하고 반복 작업을 하게 되는데 이런 불편 떄문에 현재 프레임워크는 메타 데이터를

이용하여 훅 포인트로의 연결, 정책 설정들을 정의하고 있는 추세이다.

이렇게 프레임워크에 기반해 애플리케이션을 개발하게 되면 생산성이 향상될 뿐 아니라 여러 애플리케이션이 비슷한 구조를 가지게 되므로
 
관리하기도 쉬워진다.

2) 자바 프레임워크에는 어떤 것이 있는가?

대표적인 자바 프레임 워크로는 (이것이 전부는아니다)

웹 어플리케이션 프레임워크: Spring MVC, Struts, WebWork 등
데이터베이스 관련 프레임워크: iBatis, Hibernate, Spring DAO
비지니스 관련 프레임워크 : Spring
*Spring의 경우 객체를 생성하고 객체간의 의존관계를 정의하고 라이프 사이클을 제어하는 틀을 제공해주며,
거기에다 다른 프레임워크들을 서로 연결해 주는 역활도 한다.

-Spring 소개

1)EJB

Spring을 이야기 하기 전에 앞어 EJB를 살펴보면, EJB는 Enterprise JavaBeans 의 약자로 엔터프라이즈 급의 서비스를 제공하는 것을

목적으로 한다. EJB에 대한 문서를 읽어보면 'EJB는 엔터프라이즈 애플리케이션 개발을 단순화 한다'  라고 소개하고 있다.

하지만 이는 그 이전의 엔터프라이즈 애플리케이션과 비교하였을 때 맞는 이야기이고 실상은 그 개발이 단순화하지 못하고 있는것이

사실이다.

EJB의 선언적 프로그래밍 모델이 트랜잭션이나 보안과 같은 개발의 기반구조에 해당하는 여러 측면들을 단순화 시킨것은 사실이지만,

배치 설명자(deployment descriptor), 홈/리모트 인터페이스 등과 같은 과도한 코드를 강제함으로써 다른 방식으로 복잡해졌다고

말할 수 있다. EJB는 분산 객체나 원격 트랜잭션 등의 복잡한 문제를 해결하기 위하여 만들어 졌기 떄문에 복잡하지만,

아이러니하게도 현실적으로 봤을 때 상당수의 엔터프라이즈 애플리케이션은 그정도로 복잡하지 않다는 것이다.

이러한 고민 안에서 스프링은 탄산하게 되었다.

2)Spring

Spring은 로드 존슨이 만든 오픈소스 프레임워크 이며, 복잡한 엔터프라이즈 애플리케이션을 겨냥해 만들어졌다.

스프링은 평범한 자바빈즈(이하 POJO - Plain Old Java Object)를 사용하는데도 EJB에서만 가능했던 일들이 모두 이뤄지게 한다.

그러나 스프링의 유용성은 서버 축 개발에만 국한 한 것이아니라, 모든 자바 애플리케이션에서 단순성, 테스트 용이성, 느슨한 결함성의 측면에서

스프링의 이점을 얻을 수 있다.

Spring 의 특징을 보면

경량 - 스프링은 그 크기와 부하의 측면에서 경량(liteweight)이다. 전체 스프링 프레임워크는 기껏해야 몇 메가 안되는 하나의 JAR 파일로 배포된다.
또한 스프링 자체의 부하는 무시해도 되는 수준이다.

제어 역행- 스프링은 제어 역행(IoC - Inversion of Control) 이라는 기술을 통해 애플리케이션의 느슨한 결합을 도모한다.
IoC가 적용되면 객체는 의존하는 다른 객체를 생성하거나 찾는 대신, 수동적으로 의존성을 받는다. 이런의미로 IoC를 의존성 주입이라고 말하기도한다.

관점지향 - 스프링은 관점지향 프로그래밍(AOP : Aspect Oriented Programming)을 위한 풍부한 지원을 한다.
관점지향 프로그래밍은 애플리케이션 비지니스 로직을 시스템 서비스로부터 분리함으로써 응집된 개발을 가능하게 한다. 애플리케이션 객체는 원래 해야할 일인 비지니스 로직을 수행하는 것 이외에는 아무것도 하지않는다. 애플리케이션 객체는 로깅이나 트랜잭션 지원과 같은 시스템적인 관심사에는 책임이 없으며 신경조차 쓰지 않는다.

컨테이너 - 애플리케이션 객체의 생명주기와 설정을 포함하고 관리한다는 점에서 스프링은 일종의 컨테이너라고 말할 수 있따. 빈의 인스턴스를 하나만
생성시키거나 또한 필요할 떄마다 설정 가능한 프로토 타입을 기반으로 새로운 인스턴스를 생성시키는 등 빈이 어떻게 생성되야 하는지를 직접
설정할 수 있다. 또한 빈이 서로 어떻게 연관돼야 하는지도 설정할 수 있다. 이 부분이야 말로 스프링의 가장 핵심적인 기능이라고 말할 수 있다.

프레임워크 - 스프링을 사용하면 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있다. 스프링에서 애플리케이션 객체는 대게 XML파일
내에 선언적으로 구성한다. 또한 스프링은 애플리케이션 로직 개발은 개발자에게 맡기고, 다양한 기반구조 기능을 제공한다.







'공부 > Spring' 카테고리의 다른 글

Spring IOC  (0) 2011.12.12
엔티티 빈  (0) 2011.07.26
RMI(원격 메소드 호출, Remote Method Invocation)  (3) 2011.07.04