Kim-Baek 개발자 이야기

[백기선 - 예제로 배우는 스프링 입문] 스프링 IoC 본문

개발/Spring

[백기선 - 예제로 배우는 스프링 입문] 스프링 IoC

김백개발자 2020. 9. 20. 10:49
인프런에서 백기선 님의 [예제로 배우는 스프링 입문] 을 듣고 정리한 내용입니다

Inversion of Control

제어권이 뒤바꼈다고?

일반적인 (의존성에 대한) 제어권: “내가 사용할 의존성은 내가 만든다.” 

class OwnerController {

   private OwnerRepository repository = new OwnerRepository();

}

IoC: “내가 사용할 의존성을 누군가 알아서 주겠지”

  • 내가 사용할 의존성의 타입(또는 인터페이스)만 맞으면 어떤거든 상관없다.

  • 그래야 내 코드 테스트 하기도 편하지.

 

class OwnerController {

   private OwnerRepository repo;


   public OwnerController(OwnerRepository repo) {

       this.repo = repo;

   } 

   // repo를 사용합니다.
}

class OwnerControllerTest {

   @Test

   public void create() {

         OwnerRepository repo = new OwnerRepository();

         OwnerController controller = new OwnerController(repo);

   }

}

 

참고

 

Inversion of Control Containers and the Dependency Injection pattern

Explaining the Dependency Injection pattern, by contrasting it with Service Locator. The choice between them is less important than the principle of separating configuration from use.

martinfowler.com

 

IoC (Inversion of Control) 컨테이너

ApplicationContext (BeanFactory)

빈(bean)을 만들고 엮어주며 제공해준다.빈 설정

  • 이름 또는 ID

  • 타입

  • 스코프

아이러니하게도 컨테이너를 직접 쓸 일은 많지 않다.

 

참고

 

빈 (Bean)

스프링 IoC 컨테이너가 관리하는 객체

어떻게 등록하지?

  • Component Scanning

    • @Component

      • @Repository

      • @Service

      • @Controller

      • @Configuration

  • 또는 직접 일일히 XML이나 자바 설정 파일에 등록

    • @Configuration 안에서 @Bean 으로 등록한다

어떻게 꺼내쓰지?

  • @Autowired 또는 @Inject

  • 또는 ApplicationContext에서 getBean()으로 직접 꺼내거나

특징

  • 오로지 “빈"들만 의존성 주입을 해줍니다.

 

의존성 주입 (Dependency Injection)

필요한 의존성을 어떻게 받아올 것인가..

@Autowired / @Inject를 어디에 붙일까?

  • 생성자
    • 파라미터로 받는 빈이 없으면 객체가 안만들어지는 것을 보장하기 때문에 더 좋다
    • final 키워드가 사용가능하여, 레퍼런스가 변경되지 않는다.
      • 필드나 setter는 객체가 만들어지고, 빈을 만드는데 final로 되어있는 경우 변경이 안되기 때문에 만들 수가 없다
  • 필드
  • Setter
반응형
Comments