Spring IOC

이연중·2021년 3월 26일
0

Spring

목록 보기
2/2

일반적인 제어권: "내가 사용할 의존성은 내가 만든다"

class OwnerController{
    private OwnerRepository repository= new OwnerRepository();
} // OwnerContoller가 사용할 의존성을 스스로 만들어서 사용하고 있음. 즉, 제어권이 OwnerController 본인한테 있음

IoC: "내가 사용할 의존성을 누군가가 알아서 해준다"

=> 의존성 제어권의 역전


class OwnerController{
    private OwnerRepository repo;
    
    public OwnerController(OwnerRepository repo){
		this.repo= repo; //의존성 관리를 외부에 넘긴다(Dependency Injection(의존성 주입) -> Ioc의 일종)
    }
}
class OwnerControllerTest{
    @Test
    public void create(){
        OwnerRepository repo= new OwnerRepository(); //OwnerRepository 타입의 repo repo 객체를 만들고
        OwnerController controller= new OwnerController(repo); //OwnerController의 객체를 만드는 생성자 메서드에 넘겨줌으로써 OwnerController 객체가 만들어진다.
    }
}

즉, OwnerControllerTest가 OwnerController에 있는 repo 객체의 의존성을 주입해준 것이다.(Ioc)

이와 같이, 스프링의 IoC 컨테이너가 객체를 빈으로 등록하고, 관리하는 역할을 한다.

IoC(Inversion of Control) 컨테이너(ApplicationContext, BeanFactory)

빈(Bean)을 만들고 ,빈들 사이의 의존성을 엮어주고, 빈들을 제공해준다


빈 설정(ApplcationContext에 있는 빈 조회하기)

  • 빈의 이름이나 ID
  • 빈의 타입으로
  • 스코프(싱글턴 스코프: 객체를 재사용 할 수 있음. 이를 IoC 컨테이너를 통해 실현)

빈(Bean)

스프링 IoC 컨테이너가 관리하는 객체. 빈들만 의존성 주입을 해줌


등록하는 방법(To IoC Container)

  • Component Scanning(해당 어노테이션이 붙어있는 모든 클래스를 찾아 그 클래스의 인스턴스를 빈으로 등록)

    • @Component
      • @Repository
      • @Service
      • @Controller
      • @Configuration
  • 빈으로 직접 등록

    @Configuration //빈 설정 파일
    public class SampleConfig{
        @Bean
        public SampleController sampleController(){
    		return new SampleController();
        }
    }// SampleController를 직접 빈으로 등록

의존성 주입받는 방법

  • @Autowired or @Inject
  • ApplicationContext에서 getBean()으로 직접 꺼냄

의존성 주입(Dependency Injection)

필요한 의존성 주입받는 방법

@Autowired와 @Inject를 붙이는 곳

  • 필드

    @Autowired
    private OwnerRepository owners;
  • 생성자(스프링 4.3부터 클래스에 생성자가 단 하나이고, 생성자로 주입받는 매개변수가 빈으로 등록되어 있다면, 해당 빈을 자동으로 주입 해줌)

    @Autowired
    public OwnerController(OwnerRepository clinicService){
        this.owners=clinicService;
    }
  • setter

    @Autowired
    public void setOwner(OwnerRepository owners){
    	this.owners= owners;
    }
  • 생성자를 사용하는 방법을 권장(필수적으로 사용 해야 하는 레퍼런스 없이는 해당 인스턴스를 만들 수 없도록 강제함)

참고

https://www.inflearn.com/course/spring_revised_edition

profile
Always's Archives

0개의 댓글