제어의 역전
의존성에 대한 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으로 등록해준다.
서로 필요한 의존성을 주입해준다. 특정 애노테이션으로 등록해줄 수 있다.
'WEB > SPRING' 카테고리의 다른 글
[Spring] 컴포넌트 스캔 (0) | 2022.06.03 |
---|---|
[Spring] @Configuration 설정 클래스의 @Bean 설정과 싱글톤 (0) | 2022.06.03 |
[Spring] Dependency Injection (0) | 2022.06.02 |
[Spring] STS설정 및 스프링 한글깨짐 방지 설정 (0) | 2022.06.02 |
[Spring] 스프링 vs 스프링 부트 (0) | 2022.06.02 |
댓글