본문 바로가기
BackEnd FrontEnd/Spring

IOC

by forkballpitch 2017. 9. 27.
728x90
728x90

IoC Inversion of Control 줄임말

 

객체간의 의존관계를 자신이 아닌 외부조립기가 수행해준다는 개념

클래스안에 특정객체를 가지고 있고 객체에 따른 클래스안에는 다른 객체를 가지고 있다.

이런 경우에는 인스턴스들이 서로 의존하는 모습을 보여주고 있다는 것이다.

이런 상황의 경우에는 의존관계의 제어권은 개발자가 가지고 있다는 말이다.

Instance 대한 lifecycle 개발자가 직접 관리하게 된다. 제어권을 container에게 넘겨주는 행위을 제어권의 역전(IOC)이라고 한다.

여기서 말하는 container Spring Framework ApplicationContext 라고 봐도된다.

 

IoC 종류로 분리가 된다. 개발자가 container에게 제어권을 위임하게 되면 new container 대신한다.

첫 번째의 경우 DI(Denpendency Injection)은 Container가 직접 주입해주는 경우 이다. 개발자는 Object 선언만 하고 Container가 Instance를 주입하게 되는데, 첫번째 방법에서 많이 이용한다. 하지만 멀티 쓰레드 환경에서 Instance 이용할 경우는 서로의 간섭이 없어야 하기 때문에,  두 번째 방법 DL(Denpendency Lookup) 이용한다. Contaciner Instance 가지고 있고, 개발자는 Instance 직접 참조하여 이용 하는 방법 이다.  

 

 

-----도움이되는글

 Spring의 Ioc에 대하여 설명 한다.

 본 글에 들어가기에 앞서 http://www.springsource.org/download/community 에서 Spring 3.x.x 이상을 다운 받고 라이브러리에 추가 하도록 한다.

 Java라는 언어를 이용하면서 new 라는 키워드를 자주 이용 한다. 이와 같은 행위는 Instance 를 생성 하는 것 이다.

 

public class Wcontroller{

 Wservice service = new Wservice();

 ....

}

public class Wservice {

 Wdao dao = new Wdao();

  ....

}

public class Wdao {

  ....

}

 

 위 Sample을 보도록 하자. Wcontroller Class는 Wservice Instance를 가지고 있고, Wservice Class는 Wdao Instance를 가지고 있다. 이런 경우는 서로 강하게 의존을 하고 있는 Code라고 볼 수 있다.

 Instance는 서로 의존(Dependency) 하는 모습을 보여주고 있다. 이런 상황의 경우에는 "의존 관계의 제어권은 개발자가 가지고 있다." 라고 말할 수 있다. Instance에 대한 LifeCycle을 개발자가 직접 관리하게 된다. 제어권을 Container에게 넘겨주는 행위를 제어권의 역전 Ioc(Inversion Of Control) 이라고 한다. 여기서 말하는 Container는 SpringFramework의 ApplicationContext 라고 봐도 된다.

 

 

 위 그림을 보도록 하자. Ioc(Inversion Of Control) 은 두 종류로 분리가 된다. 개발자가 Container 에게 제어권을 위임하게 되면 new 를 Container가 대신 한다. 첫 번째의 경우 DI(Denpendency Injection)은 Container가 직접 주입해주는 경우 이다. 개발자는 Object 선언만 하고 Container가 Instance를 주입하게 되는데, 첫번째 방법에서 많이 이용한다. 하지만 멀티 쓰레드 환경에서 Instance를 이용할 경우는 서로의 간섭이 없어야 하기 때문에,  두 번째 방법 DL(Denpendency Lookup)을 이용한다. Contaciner가 Instance를 가지고 있고, 개발자는 Instance를 직접 참조하여 이용 하는 방법 이다.  

 

@Controller

public class Wcontroller {

 

 @Autowired

 Wservice service;

 

 public void showMsg() {

  System.out.println("Wcontroller.showMsg....");

  service.showMsg();

 }

 

}

@Service

public class Wservice {

 

 @Autowired

 Wdao dao = new Wdao();

 

 public void showMsg() {

  System.out.println("Wservice.showMsg....");

  dao.showMsg();

 }

 

}

@Repository

public class Wdao {

  

 public void showMsg() {

  System.out.println("Wdao.showMsg....");

 }

 

}

 

위 Sample를 보도록 하자. Annotation으로 작성 되었고, Spring Web 환경에서 사용한다. 제일 위에 있던 Sample 과 달리 new 라는 키워드가 사라진 점을 발견할 수 있다. 개발자가 직접 Instance를 관리하지 않는다. @Autowired는 DI(Denpendency Injection)을 해주는 기준이라고 보면 된다. 여기서 끝이 아니다. 위와 같이 작성만 했다고 해서 동작하지는 않는다. Container에 대한 작업을 해야 한다.

 

public class WapplicationContext {

 

 public static void main(String[] args) {

  

  AnnotationConfigApplicationContext annotationConfigApplicationContext 

  = new AnnotationConfigApplicationContext();

  

  annotationConfigApplicationContext.register(Wdao.class);

  annotationConfigApplicationContext.register(Wservice.class);

  annotationConfigApplicationContext.register(Wcontroller.class);

  

  annotationConfigApplicationContext.refresh();

  

  Wcontroller wcontroller = annotationConfigApplicationContext.getBean(Wcontroller.class);

  

  wcontroller.showMsg();

  

 }

 

 

 위 Sample를 보도록 하자. 쉽게 이해를 돕기 위하여 코드 기준으로 작성 하였다. Container는 Wdao, Wservice, Wcontroller Class를 등록함 으로써, 각각 Instance 들을 가지고 있다. getBean(Wcontroller.class)는 DL(Denpendency Lookup)을 해주는 기준이라고 보면 된다.

 

Wcontroller.showMsg....

Wservice.showMsg....

Wdao.showMsg....

 

 실행 할 경우 위와 같은 메시지가 출력 된다. 정상적으로 DI(Denpendency Injection), DL(Denpendency Lookup)이 된 것을 확인 할 수 있다.

 실제로 사용할 경우에는 SpringFramework의 AppcationContext Instance가 위의 역활을 대신해 줄 것이다. XML로 설정을 하게 된다.

 Spring을 사용하여 개발을 할 경우, Ioc에 대해서는 꼭 기억 하고 있도록 하자. DI(Denpendency Injection)에 대한 자세한 내용은 다음 글을 참고 하도록 한다.

 

출처: http://blog.whitelife.co.kr/entry/Spring-Ioc [White Life Story]

 

출처: <http://blog.whitelife.co.kr/entry/Spring-Ioc>

 

 

 

--도움이되는글

 

 

 

기본적인 완제품 제작 순서와는 다르게 작은 부품부터 큰 부품으로, 제품을 만드는 순서가 역순 (Inversion of Control).

그래서 IoC라는 이름이 붙었으며, 이러한 일련의 작업을 스프링은 컨테이너라는 곳에 담아서 처리하여 스프링을 IoC컨테이너라 함.

스프링은 완성품을 만드는 것보다 부품을 모아서 조립하는 것을 도와줌. 즉, 이러한 DI 구조를 개발자가 좀 더 쉽고, 간편하게 사용할 수 있도록 지원해 주는 프레임워크 중의 하나가 스프링.

 

 * IoC 컨테이너

 어떠한 객체의 명세서를 작성하고, 스프링 라이브러리는 해당 명세대로 객체를 생성. 생성된 객체(그리고 디펜던시)들을 보관하는 공간을 의미.

IoC컨테이너는 다른 용어로 빈 팩토리(Bean Factory), 애플리케이션 컨텍스트(Application Context) 라고도 불림.

스프링의 IoC 컨테이너는 일반적으로 애플르케이션 컨텍스트를 말함.

 

> 빈 팩토리(Bean Factory) : 

 빈(오브젝트) 생성과 관계 설정 제어를 담당하는 IoC오브젝트. 

 좀 확장한 애플리케이션 컨텍스트(application context) 주로 사용.

 

> 애플리케이션 컨텍스트: (IoC 컨테이너 or  스프링 컨테이너)

 DI 위한 팩토리에 엔터프라이즈 애플리케이션을 개발하는 필요한 여러 가지 컨테이너 기능을 추가한 .

 

참고) JNDI (Java Naming and Directory Interface)

* 엔터프라이즈 애플리케이션을 위한 네이밍과 디렉토리 서비스 표준 인터페이스

* Java 소프트웨어 클라이언트가 이름(Name)을 이용하여 데이터 및 객체를 찾을 수 있도록 도와주는 디렉토리 서비스에 대한 Java API.

 

728x90
728x90

'BackEnd FrontEnd > Spring' 카테고리의 다른 글

java.sql.SQLException: Unknown system variable 'query_cache_size' 오류가 날때  (0) 2019.12.10
OAuth2 구현하기 & postman test  (0) 2019.12.01
AOP  (0) 2017.09.27
Spring 특징  (0) 2017.09.27