Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

IoC(Inversion of Control)

OpenSource/Spring 2012.08.07 14:52
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

출처 : 토비의 스프링3

Spring에서 많이 알려진 용어 이다.

IoC(Inversion of Control) : 제어의 역전

이 개념을 알기 전에 먼저 Spring에서의 Factory에 대해서 알아보자.

팩토리 : 객체의 생성 방법을 결정하고 그렇게 만들어진 오프젝트를 돌려주는 것인데, 이런 일을 하는 오프젝트를 흔히 팩토리라고 부른다.(디자인 패턴의 팩토리와는 다른 것이다.) 

acet : 음..팩토리...오브젝트!!!! 오브젝트의 생성, 리턴등을 하는 오브젝트!!!!!라고 보여진다!

간단히 말하면..  
public class DaoFactory{
    pubilc UserDao userDao(){
        /////////// 팩토리의 메소드는 UserDao 타입의 오브젝트를 어떻게 만들고, 
// 어떻게 준비시킬지 결정 한다.   ConnectionMaker connectionMaker = new DConnectionMaker();    UserDao userDao = new UserDao(connectionMaker);
/////////////////////////////////////////////////////////////   return userDao;    } }


제어의 역전이라는 개념을 알아보자!

간단히
프로그램의 제어 흐름 구조가 뒤바뀌는 것이라고 할 수 있다.

일반적으로는 main() 처럼 프로그램이 시작되는 지점에서 오프젝트를 결정, 생성(new), method 호출, 호출 된 method 안에서 다음에 사용 할 것을 결정 하고 호출 하는 방식이 반복적으로 이루어지고 있다.

제어의 역전이란 이런 제어 흐름의 개념을 거꾸로 뒤집는 것이다.
오브젝트가 자신이 사용 할 오브젝트를 스스로 선택하지 않는다. 어떤 객체를 만들지 생각하지 않는 다는 말.
당연히 생성 하지도 않는다. 

모든 제어 권한이 자신이 아닌 다른 대상에게 위임하기 때문이다.

ex) A Class에서 getAcetInfo()같은 메소드가 구현 되어있다고 하자!! 이 메소드가 언제 어디서 사용 될지는        A Class 자신은 모른다!! 
     다른쪽  B의 method에서  이 구현 된 것을 제어 하는 것이 바로 제어의 역전!!!!!
     대충 이런 개념인 것이다. ^0^good~

이제 Spring에서의 Ioc에 대해서 알아보자!
우선 아래의 그림을 참고하도록 하자!


[IoC와 object Factory의 관계]

acet : factory라는 오브젝트에 대해서 위에서 알아보았다. 객체를 생성, 리턴을 하는 일을 하는 오브젝트!!
IoC는 제어의 역전이라고 해서 생성, 리턴 등을 하는 일을 자기자신이 아닌 다른쪽에서 제어를 하는 것이라고 이해했다. 즉, IoC의 개념에서 보면 생성,리턴을 하는건 factory!! 그런데 그것을 다른쪽에서 제어하는 것이라고 생각하면 좋을 것 같다!(더 헷깔리게 말했나;;)


Spring에서는 Spring이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 bean(빈)이라고 부른다.
bean : 자바빈 or EJB에서 말하는 빈과 비슷한 오프젝트 단위의 애플리케이션 컴포넌트를 말한다.

또한, Spring Bean은 컨테이너 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 말이다.

Spring에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 bean factory라고 부른다.

참고사항 :
애플리케이션 컨텍스트 - bean factory보다는 이를 좀 더 확장한 것, IoC 방식을 따라 만들어진 일종의 bean factory라 생각 하면 된다.
스프링 컨테이너라고 부르기도 한다.

애플리케이션 컨텍스트 동작 방식
애플리케이션 컨텍스트는 애플리케이션에서 IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관계설정을 담당한다. ApplicationContext 인터페이스를 구현.

Application Context에는 직접 오브젝트를 생성하고, 관계를 맺어주는 코드가 없고, 그런 생성정보와 연관관계 정보를 별도의 설정정보를 통해 얻는다. 
@Configuration이 붙어있으면 애플리케이션 컨텍스트가 활용하는 IoC 설정 정보다.

ex) 

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
...
@Configuration => 애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 표시
public class DaoFactory{
   @Bean         => 오브젝트 생성을 담당하는 IoC용 메소드라는 표시
   public UserDao(){
       return new UserDao(connectionMaker());
   }
   @Bean
   public   ConnectionMaker connectionMaker(){
       return new DConnectionMaker();
   }
}                                        



★ 스프링 IoC 용어정리
  1) Bean 
   빈 또는 빈 오브젝트는 스프링이 IoC방식으로 관리하는 오브젝트라는 뜻이다.
   ※ 주의할점은 스프링을 사용하는 애플리케이션에서 만들어지는 모든 오브젝트가 다 빈은 아니라는 사실!!
   그중에서 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만을 빈이라고 부른다.

 2) Bean Factory 
 스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다.
 빈을 등록.생성, 조회하고 돌려주고, 그 외에 부가적인 빈을 관리하는 기능을 담당한다.
 보통은 이 bean factory를 바로 사용하지 않고, 이를 확장한 애플리케이션 컨텍스트를 이용한다.
 BeanFactory라고 붙여쓰면 빈 팩토리가 구현하고 있는 가장 기본적인 인터페이스의 이름이 된다.
이 인터페이스에 getBean()과 같은 메소드가 정의 되어있다.

3) Application Context
Bean Factory를 확장한 IoC컨테이너이다. 빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일!
여기에 스프링이 제공하는 각종 부가서비스를 추가로 제공한다.

빈 팩토리라고 부를 때는 주로 빈의 생성과 제어의 관점에서 이야기하는 것이고,
애플리케이션 컨텍스트라고 할 때는 스프링이 제공하는 애플리케이션 지원 가능을 모두 포함해서 이야기 하는 것이라고 보면 된다.

스프링에서는 빈 팩토리보다 어플리케이션 컨텍스트라는 용어를 많이 사용한다.
ApplicationContext라고 적으면 애플리케이션 컨텍스트가 구현해야하는 기본 인터페이스를 가리키는 것이기도 하다.
ApplicationContext는 BeanFactory를 상속한다. <--이런 부분은 직접 코딩을 접해봐야 할 것 같다!

4) 설정정보/설정 메타정보    
 스프링의 설정정보란 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다. 영어로 Configuration 이라고 하며, 이는 구성정보 내지는 형상정보라는 의미이다.
실제로 스프링의 설정정보는 컨테이너에 어떤 기능을 셋팅하거나 조정하는 경우에도 사용하지만 그보다도 IoC컨테이너에 의해 관리 되는 애플리케이션 오브젝트를 생성하고 구성 할 때 사용 된다.

5) 컨테이너 or IoC 컨테이너
 IoC방식으로 빈을 관리하는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC컨테이너라고도 한다.
후자는 주로 빈 팩토리 관점에서 이야기 하는 것이고(IoC컨테이너), 그냥 컨테이너 또는 스프링 컨테이너라고 할 때는 애플리케이션 컨텍스트를 가리키는 것이라고 보면 된다.

acet : 음..대충은 이해가 갔으나..어느정도의 암기가 필요 할 것 같다^0^ good~~
IoC 아시겠죠잉?? ㅋ

마지막으로..스프링으로 개발을 하다가 생각했었던 것이 있었다..처음 자바를 시작했을 때 C언어처럼
객체를 파라미터로 전달하거나 new 연산자를 통해서 객체를 생성하였다.
또한 Spring으로 개발을 하면서 생각했던 것은..new을 다 없애버렸다고 생각하였다.
지금  공부해보니..그 기술이 바로..IoC 인 것이다!!!!!+ㅁ+good~~

- 끝 -




acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

  • zkimera 2013.02.14 11:48 신고 답글 | 수정/삭제 | ADDR

    좋은 정보 잘 얻어갑니다..ㅎㅎ

    덧글 달았어요..ㅋㅋㅋ

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2013.02.18 20:13 신고 수정/삭제

      ㅎㅎㅎㅎㅎ 감사합니다~~
      종종 놀러오세요^-^ 누구신지는 잘모르겠지만여^^;

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바