2012. 11. 28. 16:12

일반적인 클래스 호출

클래스내에 선언과 구현이 한 몸이기 때문에 다양한 형태로 변화가 불가

class Test1{            class Test2{          class Test3{
 void method             void method           void method
 { }                          { }                        { }
}                            }                           }

class Test{
 Test1 test1= new Test1();
 Test2 test2= new Test2();
 Test3 test3= new Test3();

 void Test(){
  test1.method();  // 
  test2.method();  // method 호출
  test3.method();  //
 }
}

 

인터페이스를 이용한 클래스 호출

클래스를 인터페이스와 구현클래스로 분리하였고,

구현클래스 교체가 용이하여 다양한 형태로 변화가 가능하지만 구현클래스 교체시 호출 클래스의 소스를 수정해야 함

 

 팩토리패턴을 이용한 클래스 호출 방식

class Factory{
 static Super createB(){           static Super createC(){           static Super createD(){   
  return new B();                      return new C();                      return new D();
 }                                          }                                          }

}

public class A{
 Super b1 = Factory.createB();                           // B클래스를 생성하고 있다는 문장이 안보이면서 B객체가 생성       
 Super c1 = Factory.createC();
 Super d1 = Factory.createD();

 void a(){
  b1.method();
  c1.method();
  d1.method();
 }
}

팩토리 방식은 팩토리가 구현클래스를 생성하므로 클래스는 팩토리를 호출하는 코드로 충분

구현클래스 변경시 호출클래스에는 영향을 미치지 않고, 팩토리로 수정

하지만 클래스에 팩토리를 호출하는 소스가 들어가야 하기 때문에 팩토리에 의존함을 의미

 

IoC를 이용한 클래스 호출 방식

팩토리패턴의 장점을 더하여 어떠한 것에도 의존하지 않는 형태로 구성이 가능

실행 시점에 클래스간의 관계가 형성이 됨

즉, 의존성이 삽입된다는 의미로 IoC를 DI(Dependency Injection) 라는 표현으로 사용

 

IoC 란?

먼저, Spring framework에서 IoC의 궁극적인 최종 목표는 결합도를 낮추는 것

결합도란 한 개의 객체가 다른 객체와 얼마나 연결고리가 강한가...

IoC란 간단하게 말하여 프로그램 제어 흐름 구조가 바뀌는 것

일반적으로, main() 같은 프로그램이 시작되는 지점에서 다음에 사용할 Object를 결정, 생성하고, 만들어진 Object 내의

메소드를 호출하는 반복; 각 Object는 프로그램 흐름을 결정하거나 사용할 Object를 구성하는 작업에 능동적으로 참여

하지만, IoC는 제어 흐름의 개념을 거꾸로 뒤집는다. Object는 자신이 사용할 Object를 스스로 생성하거나 선택하지 않는다.

자신이 어떻게 만들어지고 어디서 사용되는 알 수 없기때문에 모든 제어 권한을 자신이 아닌 다른 대상에게 위임

프로그램 시작을 담당하는 main()같은 엔트리 포인트를 제외하면 모든 Object는 이런 방식으로 위임받은 제어 권한을 갖는

특별한 Object에 의해 결정되어 만들어짐

IoC 용어 정리

spring framework - IoC container, application context를 포함해서 spring이 제공하는 모든 기능을 통칭

bean - 스프링에서 제어권을 가지고 직접 만들고 관계를 부여하는 Object,

자바빈, EJB 빈과 비슷한 Object 단위의 Application Component;

bean factory - 스프링의 IoC를 담당하는 핵심 컨테이너

빈의 등록/생성/조회/반환/관리, 보통은 bean factory를 바로 사용하지 않고 이를 확장한 application context를 이용

BeanFactory는 bean factory가 구현하는 Interface (getBean() 등의 메소드가 정의되어 있음)

application context - bean factory를 확장한 IoC 컨테이너

빈의 등록/생성/조회/반환/관리의 기능은 bean factory와 같지만, 여기에 spring 각종 부가 서비스를 추가로 제공

ApplicationContext는 application context가 구현해야 하는 interface이며, BeanFacotry를 상속

 

IoC 구현 방법

- DI(Dependency Injection) : 의존성 주입

각 계층 사이, 각 클래스 사이에 필요로 하는 의존 관계를 컨테이너가 자동으로 연결해주는 것

각 클래스 사이의 의존 관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해 주는 것

 

의존성 주입(DI) 간단한 예제

<bean id = "exampleBean" class ="examples.ExampleBean">

<property name = "beanOne"><ref bean="anotherExample"/></property>

<!-- setter injection using the neater 'ref' attribute -->

<property name = "beanTwo" ref = "yetAnotherBean"/>

<property name = "integerProperty" value="1"/>

</bean>

 

<bean id = "anotherExampleBean" class="examples.AnotherBean"/>

<bean id = "yetAnotherBean" class = "examples.YetAnotherBean"/>

 

public class ExampleBean {

private AnotehrBean beanOne;

private YetAnotherBean beanTwo;

private int i;

 

public void setBeanOne(AnoterBean beanOne)

this.beanOne = beanOne;

public void setBeanTwo(YetAnother beanTwo)

this.beanTwo = beanTwo;

public void setIntegerProperty(int i)

this.i = i;

}

'Study' 카테고리의 다른 글

[LINUX] OS bit 수 확인 방법, ulimit  (0) 2014.07.09
File I/O java  (0) 2014.05.15
Luke - 3  (0) 2012.10.05
Lucene - 2  (0) 2012.10.05
Lucene - 1  (0) 2012.10.04
Posted by 아도니우스