[Spring] IOC / DI

Posted by 신희준 on February 7, 2023


2023 - 02 - 07 (화)


IOC(Inversion Of Control)

  • 제어의 역전으로 해석된다.

      
    #예시 1  
    public class UserController(){
      LoginService loginService = new LoginService()
    }
      
    
  • 위 소스코드는 UserController 클래스에서 LoginService 객체를 생성한다. IOC는 위와 달리 UserController 클래스에서 LoginService 객체를 생성하여 제어하는 것이 아닌 특정 매개체에 의해 제어되는 것을 의미한다.

  • 스프링 IOC 컨테이너가 이 매개체의 역할을 한다. IOC 컨테이너는 빈(Bean) 이라고 불리는 집합체이며, 스프링에서 Bean은 생성된 인스턴스 형태이다.

  • IOC 컨테이너에 Bean을 등록하기 위해 설정파일으로 직접 등록하거나 Component Scan 으로 빈등록을 위한 컴포넌트 인터페이스 어노테이션이 설정되어있는 클래스를 읽어 등록한다.

  • 스프링부트의 경우 @SpringBootApplication 이 ComponentScan 을 포함하여 @Controller @Service @Repository @Configuration @Component 설정되어있는 클래스를 IOC 컨테이너에 등록한다.

      
    # 예시 2
    # 해당 어노테이션으로 등록된 Bean 들을 구성하는 IOC 컨테이너를 통해 제어한다. #예시1 에서는 직접 UserService 인스턴스를 개발자가 직접 만들어 제어  
    @Service
    public class LoginService(){
        
    }
    
    


DI(의존성 주입)

  • 의존성 주입이라고 하며 IOC 컨테이너에 생성된 인스턴스를 주입한다?(대입한다)

  • 보통 스프링 프레임워크에서 @Autowired 라는 어노테이션으로 의존성 주입이 이루어진다.

  • 예시 2 와 같은 형태로 IOC 컨테이너에 Bean이 등록되면 예시 3처럼 @Autowired 어노테이션을 통해 loginService 객체에 의존성을 주입한다.

  • 예시 4 의 경우 @RequiredArgsConstructor 어노테이션을 통해 기본생성자를 생성하여 주입한다.

      
    #예시 3
    @Controller
    public class UserController(){
      @Autowired
      private LoginService loginService;
    }
        
    
      
    #예시 4
    @RequiredArgsConstructor
    @Controller
    public class UserController(){
      private final LoginService loginService;
    }