이것저것

IOC 와 DI 란? 본문

카테고리 없음

IOC 와 DI 란?

nays111 2021. 5. 20. 20:04

스프링 핵심 중 하나인 IOC(Inversion Of Control) 와 DI (Dependency Injection) 에 대해 포스팅해보려 한다.

 

IOC (Inversion Of Control)란?

IOC 란 Inversion Of Control의 약자로 "제어의 역전"을 뜻하고, 스프링의 핵심 기능 중 하나이다.

 

IOC 에 대해 살펴보기 위해 간단하게 자바에서 객체를 생성하는 두 가지 방법에 대해 알아보자.

객체지향 프로그래밍에서 객체를 생성하는 두 가지 방법

 

1번 그림에서는 A가 직접 B, C를 만들어서 사용한다.

2번 그림에서는 외부에 있는 B, C 객체를 받아와서 사용한다. (이를 제어의 역전이라 한다.)

 

 

이를 코드로 표현해보면 다음과 같다.

"내가 쓸 놈은 내가 만들어 쓸게"
class UserInfoController{
	private UserInfoRepository repo = new UserInfoRepository();
 }
"내가 쓸 놈은 이 놈인데 누군가 알아서 주겠지,,," (IOC)
class UserInfoController{
	private UserInfoRepository repo;
    
    //생성자를 통해 의존성 주입
    public UserInfoController(UserInfoRepository repo){
    	this.repo = repo;
    }
    
}
class UserInfoControllerTest{
	@Test
    public void create(){
    	UserInfoRepository repo = new UserInfoRepository();
        //의존성 주입
        UserInfoController controller = new UserInfoController(repo);
}

Spring Framework 에서는 IOC 컨테이너를 제공해준다.

ApplicationContext(BeanFactory) 라는 인터페이스가 IOC 컨테이너라고 불린다.

IOC 컨테이너를 직접 쓸일을 거의 없다. IOC 컨테이너 는 위 코드를 동작하게 만들어준다.

IOC 컨테이너는 빈(bean) 을 만들고 엮어주며 제공해준다.


빈(Bean) 이란?

빈(Bean)이란 스프링 IOC 컨테이너가 관리하는 객체이다. 

 

어떻게 빈(Bean)을 등록할 수 있을까? 2가지 방법이 있다.

1. Component Scanning 

- 스프링부트의 경우, main 에 있는 @SpringBootApplication 을 따라가보면 @ComponentScan을 찾을 수 있다.

- @ComponentScan은 모든 클래스들의 모든 패키지 전체를 탐색하여 @Component 어노테이션이 붙은 클래스를 찾아서 빈으로 등록해준다.

 

@Component

     @Controller

     @Service

     @Repository

(셋 다, @Component 이다.)

 

2. 직접 일일히 XML 이나 자바 설정 파일에 등록하는 방법

 

 

등록한 빈(Bean)을 어떻게 꺼내쓸 수 있을까?

- @Autowired 또는 @inject 어노테이션을 통해 의존성을 주입한 이후 꺼내쓴다.

- ApplicationContext 에서 getBeans() f으로 직접 꺼내쓸 수도 있다.


DI (Dependency Injection) 란?

 

(객체 지향 프로그래밍 : 다른 객체를 사용하는 것 = 다른 객체에 의존한다.)

처음 확인했던 객체를 생성하는 두 가지 방법에 대해 다시 한번 봐보자.

두번째 방법에서는 A객체에서 B, C를 직접 생성하지 않고, 외부에서 생성된 객체를 setter() 혹은 생성자를 이용해서 사용한다. 이를 "주입"이라고 하며 스프링에서 사용하는 DI 방식이다.

즉, 스프링은 다른 객체들이 사용하고, 다른 서비스를 위해 사용할 수 있는 클래스를 컨테이너 형태로 이 기능을 제공해준다. (컨테이너 : 의존 주입을 관리해주는 누군가)

 

"A 라는 객체에서 B,C 객체를 사용(의존) 할 때, A 객체에서 직접 생성을 하는 것이 아니라 외부 (IOC 컨테이너) 에서 생성된 B,C 객체를 주입시켜 setter 혹은 생성자를 통해 사용할 수 있는 것이 스프링의 핵심 기능"

 

 

생성자, 필드, Setter에 @Autowired를 붙힘으로써 의존성을 주입할 수 있다.

 

 

Comments