Inversion of Control ( IOC ) 란 무엇인가?
직역한다면 "제어의 역전" 입니다.
public class Hello() {
private HelloResponseDto dto = new HelloResponseDto();
...
}
위 코드는 자바에서 쉽게 볼 수 있는 코드입니다. Hello 클래스에서 HelloResponseDto 객체를 사용하기 위해
Hello 클래스 내부에서 new 키워드로 "직접" 객체를 생성하고 있습니다.
아래 코드를 한번 볼까요?
public class Hello() {
private HelloResponseDto;
hello(helloResponseDto dto) {
self.HelloResponseDto = dto;
}
...
}
Hello 클래스 생성자를 통해 "외부" 에서 객체를 할당 받고 있습니다. 이런 경우에 Hello 클래스 만으로는
의존성을 충족시킬 수 없습니다. 외부에서 생성자를 통해 의존성을 주입해주어야 합니다.
따라서 "제어가 역전" ( IOC ) 되었다고 볼 수 있습니다.
만약 그대로 실행한다면 self.HelloResponseDto 가 가르키는 것은 아무것도 없으므로
NullPointException(NPE) 오류가 발생할 것입니다. 여기서 왜 스프링에서 IOC 를 사용하는 이유를 알 수 있습니다.
스프링 컨터이너에게 생성자 호출, 객체 생명 주기의 관리를 맡기면서
개발자는 비지니스 로직에 신경쓸 수 있도록 하는데 큰 이유가 있습니다.
@Controller
public class Hello {
private HelloResponseDto dto;
@Autowired
public Hello(HelloResponseDto dto) {
this.dto = dto;
}
...
}
위 코드 처럼 스프링에서는 new 키워드를 통한 객체 생성이 아닌
@AutoWired 어노테이션을 통해 의존성 주입을 받습니다.
어떻게 스프링 프레임워크에게 객체를 생성을 위임하고, 설정하는지는
Bean 과 DI ( Dependency Injection ) 에 대한 공부가 필요합니다.
참고 : https://youtu.be/NZ_lPFvu9oU