본문 바로가기
WEB/SPRING

[Spring] Inversion of Control

by snow_white 2022. 6. 3.

제어의 역전

 

의존성에 대한 control이 뒤바뀌었다!

그럼 원래는 어떠했길래 뒤바뀐 것인가?

처음엔 잘 모를 수 있다.

 

의존성에 대한 제어권은 자기 자신이 들고 있는 것이다.

예를 들어 OwnerController는 OwnerRespository를 사용한다.

즉, OwnerRespository를 repository라는 레퍼런스 변수를 통해 사용한다.

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

 

아래 코드를 보면 OwnerController는 OwnerRespository를 사용하지만 새로운 객체를 생성하지는 않는다.

생성자를 통해 누군가에 의해 받아온다!

의존성을 만드는 일은 더이상 OwnerController가 하는 일이 아니다. (의존성을 만드는 일은 누군가 외부에서 해주는 것 같아!)

따라서 제어권이 역전되었다고 할 수 있다.

이렇게 의존성을 주입해주는 일을 Dependency Injection이라고 한다. DI 역시 일종의 IoC라고 할 수 있다.

왜? 의존성을 관리하는 일 자체, 그 제어권이 역전되었으니까!

class OwnerController {
   private OwnerRepository repo;

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

   // repo를 사용합니다.
}

 


아래 코드에서 doSomething() 메서드를 호출하면 sampleRepository가 설정이 되어 있지 않는 이상 NullPointerException이 발생할 것이다.

하지만 아래의 코드에서는 NullPointerException이 발생할 수가 없다.

그 이유는 SampleController라는 인스턴스를 생성하려면 sampleRepository를 매개변수로 받는 하나뿐인 생성자를 거쳐야 하기 때문에 SampleController 인스턴스를 만들려면 반드시 SampleRepository를 만들어 넣어줄 수밖에 없다.

package org.springframework.samples.petclinic.sample;

public class SampleController {
	SampleRepository sampleRepository;

	public SampleController(SampleRepository sampleRepository) {
		this.sampleRepository = sampleRepository;
	}
	
	public void doSomething() {
		sampleRepository.save();
	}
}

즉, SampleRepository 없이는 SampleController를 만들 수 없는 구조이다.

따라서 SampleController에서 사용하는 SampleRepository 인스턴스들은 안전하게 사용 가능하다.

package org.springframework.samples.petclinic.sample;

import org.junit.jupiter.api.Test;

public class SampleControllerTest {
	@Test
	public void testDoSomething() {
		SampleRepository sampleRepository = new SampleRepository();
		SampleController sampleController = new SampleController(sampleRepository);
		sampleController.doSomething();
	}
}

 

그럼 SampleRepository의 의존성 주입, 누가 넣어줄까?

(@Bean : 스프링이 관리하는 객체들)

스프링에 있는 IoC 컨테이너에서 Bean들의 의존성을 관리하고, 객체를 만들어서 Bean으로 등록해준다.

서로 필요한 의존성을 주입해준다. 특정 애노테이션으로 등록해줄 수 있다.

댓글