본문 바로가기
Spring

IOC 컨테이너

by 스르나 2020. 5. 11.

IOC: Inversion of Control IOC의 단어 뜻을 보면 제어 역전이다. 그럼 무엇을 제어하는 것을 역전하는 것인가?? 바로 객체 생성이다. 우리는 자바에서 자신이 만든 클래스를 다른 곳에서 사용하기 위해 객체를 생성(인스턴스)를 한다. 바로 한번 예시 코드를 보자

 

// Student 클래스
public class Student{
    private String name;
}

//School 클래스
public class School{
    private Student student;

    public void init(){
        this.student = new Student();
    }
}

 

일단 위의 코드를 보면 Student클래스를 School클래스가 사용하기 위해 init메소드 안에서 new Student()로 객체를 생성 했다.
이런 경우는 제어권이 나한테 있는 것이다. 즉, 객체를 직접 만들어서 생성하는(new 해서 생성)것이다.


하지만 IOC는 이런 제어권을 IOC컨테이너라는 곳에서 가지고 있다. 그럼 생성은 어떻게 하는 것인가하면 IOC컨테이너에 객체를 등록하면 IOC 컨테이너가 미리 생성해 두고 필요한 곳에 주는 곳이다.


그림으로 한번 보자

 

위와같이 IOC 컨테이너가 다른 클래스에게 필요한 객체를 생성하여 나눠준다. 물론 여기서 인스턴스를 제공한다고 했는데 Spring에서는 제공되는 객체의 범위(싱글톤, 프로토타입)을 지정할 수 있다. Default가 싱글톤 범위여서 요청이 있을 때마다 생성해서 주는 것이 아니라 한 개를 주는 것이다.

즉, IOC 컨테이너는 Spring Bean을 등록하고 관리하는 곳이다.

이렇게 IOC 컨테이너를 사용하면 얻는 장점을 간략하게 보면 아래와 같다.

 

  1. 의존성 분리(DI)  -> 재사용성 증가, 변경에 대한 대처가 좋다
  2. Test Code 작성에 용의

 

의존성 분리란 위에서 본 객체 생성을 직접하는 경우는 의존성이 강하다고 하고 다른 객체에서 생성한(IOC 컨테이너에서 생성한)객체를 받아서 사용하는 경우는 의존성이 약하다고 한다.


의존성 분리의 장점은 만약 의존하고 있는 객체의 변화가 있을때 기존 코드의 변경을 많이 줄일 수 있다.

 

반대로 IOC 컨테이너에 등록하는 Bean들도 Bean으로 등록됨 으로서의 장점이 있다.

 

  1. 의존성 관리
    • 위에서 말한 의존성 분리와 비슷한 이유다
  2. 스코프
    • 따로 객체의 범위를 지정하지 않아도 어노테이션으로 범위를 지정해서 관리 할 수 있다.
  3. 라이프사이클 인터페이스
    • 객체의 생성부터 소멸까지의 과정을 좀 더 구체적으로 관리 할 수 있다.

 

요약 하자면 IOC 컨테이너의 역할은 아래 3가지이다

 

  1. 빈 인스턴스 제공
  2. 의존 관계 설정
  3. 빈 제공

'Spring' 카테고리의 다른 글

스프링 HttpMessageConverters  (0) 2021.01.27
Autowired  (0) 2020.05.11
Environment  (0) 2020.05.11
Scope  (0) 2020.05.11
Component  (0) 2020.05.11