IOC( Inversion of Control)

                                                 제어권의 역전

IOC란?

  • 제어권이 역전된 것을 Ioc라고 함

일반적으로 본인이 사용할 의존성은 아래와 같이 본인이 생성함  

class OwnerController {
  private final OwnerRepository owners; = new OwnerRepository ();


그러나 여기서 본인인 OwnerController 가 직접관리하는게 아니라 아래와 같이

생성자를 통해 외부에서 객체를 만들어 주입하는것

의존성을 만드는 것은 더이상 OwnerController 가 아니라 외부에서 가능하게 하는것을

제어권이 역전이라고 함


class OwnerController {
  private final OwnerRepository owners;


  //IOC
  public OwnerController(OwnerRepository clinicService) {  //의존성 주입(DI)
      this.owners = clinicService;
  }




IOC 컨테이너란?

ApplicatioContext(BeanFactory) 둘중 하나를 사용 하는데 ApplicationContext는       BeanFactory 를 상속하기 때문에 더 다양한 일을 할 수 있음

  • 빈(bean)을 만들고 의존성을 엮어주고 제공해주는게 IOC컨테이너

모든 객체가 빈으로 등록되는 것은 아님

등록 조건

  1. 특정 어노테이션을 쓰거나 인터페이스를 상속

@Controller @Service 등등

   2. 직접 @Bean어노테이션을 이용하여 등록

@Bean
public JCacheManagerCustomizer petclinicCacheConfigurationCustomizer() {
return cm -> {
cm.createCache("vets", cacheConfiguration());
};

위방법으로 등록된 빈들은 서로간의 의존성 주입을 ioc컨테이너가 해줌

  //IOC
  public OwnerController(OwnerRepository clinicService) {  //의존성 주입(DI)
      this.owners = clinicService;
  }

의존성 주입은 ioc컨테이너 안에 있는 빈들끼리만 서로 해주는것을 원칙으로 함


  • ApplicationContext를 이용하여 저장된 bean 확인

@Autowired
ApplicationContext applicationContext;

@Test
public void getBean(){
  OwnerController bean = applicationContext.getBean(OwnerController.class);
  assertThat(bean).isNotNull();

}


  • 실제 의존성 주입받은 객체 owners와 ApplicationContext를 이용해 호출한 객체가 동일한 객체인지 확인


@Controller
class OwnerController {

  private final OwnerRepository owners;
  private final ApplicationContext applicationContext;


  public OwnerController(OwnerRepository clinicService

                       , ApplicationContext applicationContext) {
      this.owners = clinicService;
      this.applicationContext=applicationContext;
  }

  @GetMapping("/bean")
  @ResponseBody
  public String bean(){
      return "bean :" + applicationContext.getBean(OwnerRepository.class) + "\n"
           + "owner 객체 : " + this.owners;
  }


결과

org.springframework.data.jpa.repository.support.SimpleJpaRepository@3e6a72 org.springframework.data.jpa.repository.support.SimpleJpaRepository@3e6a72



백기선님의 강좌를 보고 정리했슴돠 백기선님 짱


+ Recent posts