Inversion of Control

구름코딩·2020년 10월 13일
0

스프링은 컨테이너이며 동시에 IoC/DI를 기반으로 하고있다

컨테이너

컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록하는 것이라 할 수 있다

다시말해, 컨테이너란 당신이 작성한 코드의 처리과정을 위임받은 독립적인 존재라고 생각하면 된다. 컨테이너는 적절한 설정만 되어있다면 누구의 도움없이도 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해준다

스프링 컨테이너

스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치하며, 종속객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다
다시 말하면, 프로그래머가 작성한 코드는 컨테이너를 사용하게 됨으로서 프로그래머의 손을 떠나 컨테이너의 영역으로 떠나버리게 된다 (정확히 말하자면 컨테이너가 맘대로 객체를 생성하는 게 아니라 프로그램을 이용하는 이용자의 호출에 의해 컨테이너가 동작하게 되는 구조)

종류

  • BeanFactory, Application Context
    • 주로 Application Context를 사용하는 것이 좋다

주로 사용되는 애플리케이션 컨텍스트 기능

  • ClassPathXmlApplicationContext : 클래스패스에 위치한 xml 파일에서 컨텐스트 정의 내용을 읽어들인다
  • FileSystemxmlApplicationContext : 파일 경로로 지정된 xml 파일에서 컨텐스트 정의 내용을 읽어들인다
  • XmlWebApplicationContext : 웹 어플리케이션에 포함된 xml 파일에서 컨텐스트 정의 내용을 읽어들인다

IoC

IoC란?

  • 스프링이 제공하는 IoC 컨테이너이다
  • 제어의 역전 즉 외부에서 제어를 한다는 것
  • 객체의 생성에서부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미
  • Inversion of Control된 Container

일반적인 (의존성에 대한) 제어권 => 내가 사용할 의존성은 내가 만든다

class OwnerController {
   private OwnerRepository repository = new OwnerRepository();
}

IoC => 내가 사용할 의존성을 누군가 알아서 주겠지

class OwnerController {
   private OwnerRepository repo;

   public OwnerController(OwnerRepository repo) {
       this.repo = repo;
   } 

   // repo를 사용합니다.
}

class OwnerControllerTest {
   @Test
   public void create() {
         OwnerRepository repo = new OwnerRepository();
         OwnerController controller = new OwnerController(repo);
   }
}

IoC컨테이너의 역활

  • 빈(Bean)을 만들고 엮어서 제공
  • 스프링 IoC컨테이너 안에 들어있는 Bean객체들 끼리만 의존성을 주입해준다

빈 설정

  • 이름 또는 ID
  • 타입
  • 스코프

참고
심플하게 개발

profile
내꿈은 숲속의잠자는공주

0개의 댓글