본문 바로가기

Room 102. Back-end/Spring

[실전 개발자를 위한 Spring Framework ] 강의 - IoC

04강 IoC에 대해

  • 목차
    • 내용
      • IoC 개념
      • IoC 관련 용어 이해
    • 학습 목표
      • IoC 개념에 대한 이해
      • DL과 DI에 대해 이해하고 IoC 관련 용어들을 이해
  • IoC(Inversion of Control)의 개념
    • IoC(제어권의 역전)이란, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었음을 의미!
      컨테이너가 객체의 라이프 사이클을 관리해준다는 의미입니다.
    • 객체의 생성부터 삭제까지, 메모리에 객체를 올리고 관리하는 작업은 굉장히 비용이 많이 드는 작업입니다.
      그래서 자주 사용하는 객체를 미리 메모리에 올려 두고 클라이언트에서 객체의 사용 요청이 왔을 때, 소멸시키지 않고 메모리에 올려둔 객체를 재활용하는 것이 IoC의 개념입니다.
    • 이러한 IoC의 개념을 구현하는 것이 바로 스프링 컨테이너입니다.
    • 컴포넌트 의존관계 결정, 설정 및 생명주기를 해결하기 위한 디자인 패턴이라고도 볼 수 있습니다.
    • IoC를 이미지로 표현하면 아래와 같이 제어의 역전라는 형태를 이룬다고 볼 수 있습니다.

  • IoC 컨테이너
    • POJO객체들을 관리하는 것을 포괄적으로 스프링/IoC 컨테이너 라고 함.
    • 스프링 프레임워크는 객체에 대한 생성 및 생명주기를 관리할 수 있는 기능을 제공하고 있음. 
      즉, IoC 컨테이너 기능을 제공합니다.
      • IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리함.
        ( new Student() 등 을 반복할 필요가 없음 )
      • POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가짐.
      • 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡김.
      • POJO(Plain Old Java Object) 란?
        • 직역하면 명백히 오래된 자바 객체.
        • = Java Beans.
          순수하게 setter/getter 메소드로 이루어진 Value Object성의 Bean.
        • POJO에 대한 참고 포스트 >> https://m.blog.naver.com/weekamp/186678831
  • IoC 분류
    - 스프링 컨테이너에 객체를 로딩하고 사용을 하려면 두 가지 기능이 필요함.
      이를 위해 IoC가 제공하는 두 가지 기능!
    • Dependency Lookup (의존성 검색)
      - 객체 ID나 타입을 통해서 객체를 찾는 기능을 제공하고 있음.
      - 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용해서 Bean을 Lookup 하는 것.
    • Dependency Injection
      - 각 클래스간의 의존관계를 빈 설정(Bean Definition)정보를 바탕으로 컨테이너가 자동으로 연결해주는 것.
      - 객체들은 객체들끼리 서로 사용할 수도 있기 때문에, 의존성 관리가 필요함.
        A라는 객체가 B라는 객체를 사용할 경우, B라는 객체를 A 라는 객체에 참조시켜줘야 되는데
        이 참조를 자동으로 해줌.
        의존성이 있는 객체를 클라이언트에게 주입시켜주는 3 가지 방식을 스프링이 모두 제공함!
      • Setter Injection : Setter로 !
      • Constructor Injection : 생성자로 !
      • Method Injection : 메드로!

  • Spring IoC 관련 용어
    • Managed Bean(그냥Bean이라고도함.)
      • 스프링 컨테이너에 의해서 관리되는 객체.
      • 스프링 빈 이라고도 함.
      • 스프링 설정 파일에 등록되어 사용 ... 자동 등록 기능을 사용 가능합니다.
        (Bean이라는 XML 태그로 명시되어 있음)
        (Annotation 기능을 사용하여 자동등록 가능)
    • Spring Container
      • 관리되어지는(Managed) 빈이 모여 있는 곳
      • IoC 컨테이너로써 Application Context 클래스로 구현 됨.
  • 기타 컨테이너
    • PicoContainer
      • PicoContainer는 DI자체에 집중한 상당히 작은 컨테이너 프레임워크입니다.
      • 외부구성파일(Confituration xml 파일)도 없고 애노테이션도 필요없습니다.
      • 단지 컴포넌트를 컨테이너와 함께 등록하기만 하면 됩니다.
      • 따라서 굉장히 단순한 구성으로 DI를 구성할 수 있지만, 이 때문에 복잡한 대형 프로젝트에는 적합하지 않는 DI 컨테이너로 알려져 있기도 합니다.
    • Guice (by Google)
      • Guice는 구글이 발표한 DI 프레임워크입니다.
      • Guice는 Java5이상을 위한 가벼운 DI Container이며 애노테이션을 사용하며 자바 객체를 구성하도록 DI를 구현합니다.
      • 구현 클래스가 인터페이스와 묶이도록 한 후, @Inject 애노테이션을 사용하여 생성자나 메소드, 필드에 Dependency를 주입합니다.
      • 동일한 인터페이스에 하나 이상의 구현이 필요한 경우, 사용자는 구현을 식별하는 커스텀 애노테이션을 만들수 있습니다. 그리고 주입 시 그 애노테이션을 사용합니다.
      • Guice는 이처럼 자바 애노테이션을 사용한 최초의 일반적인 DI Framework입니다.
      • Guice의 장점으로는 사용 편의성이나 에러 메시지의 확실성과 더불어 빠른 속도를 꼽을 수 있습니다.
  • Spring 실습 내 순서
    • TestDAO 클래스 생성
    • TestDAO 빈 컨테이너에 등록
    • TestDAO DL 로 사용

 

  • 코드 예제