본문 바로가기

Dev/Spring Boot

[예제로 배우는 스프링 입문] IoC 컨테이너가 하는 일, 쓰는 이유

ApplicationContext는 BeanFactory보다 다양한 일을 하고, 많이 쓰인다.

 

ioc 컨테이너의 주요 기능

: 빈을 만들고, 빈 들 사이의 의존성을 엮어주고, 컨테이너가 가진 빈들을 제공한다. 참고로, ioc 컨테이너는 ioc 컨테이너 안에 있는 빈에만 서로 의존성을 주입한다.

 

OwnerRepository, PetRepository는 ioc 안에 빈으로 등록이 되어 있다.

하지만 모든 클래스가 빈으로 등록 되어있는 건 아니다.

Intelij 에서 연두콩 모양이 옆에 뜨면 빈에 등록되어 있는 것이라고 한다.

 

직접 빈으로 등록하는 방법은 @Bean 어노테이션을 쓰고, 객체를 만들어 리턴한다.

 

우리가 실제 ioc 컨테이너를 사용하긴 어렵지만, 임의로 사용해 보겠다.

OwnerControllerTest.java

시각적으로 보기위해 웹페이지에 bean을 띄우도록 코드를 수정했다.

OwnerController.java

 

petClinicApplicaton.java를 실행하면 다음과 같이 보인다.

 

그러나 ioc 컨테이너가 알아서 의존성 주입해주므로

applicationContext를 직접 getBean() 이런식으로 사용할 일은 거의 없다.

OwnerController.java

따래서 위를 아래와 같이 수정한다. 

 

이번엔 owner repository를 가져와서 출력해보겠다.

OwnerController.java

applicationContext에서 가져온 값과 ioc로 받아온 결과의 해시값이 값다.

=> 둘이 같은 인스턴스인 걸 알 수있다.

=> 싱글톤 스코프 : 객체 하나를 애플리이션 전반에서  계속해서 재사용함.

 

ioc 쓰는 이유

 멀티스레드 상황에서 싱글톤 스코프 사용은 번거롭지만 ioc 컨테이너에 등록되어 있으면 훨씬 편하게 싱글톤 스코프를 달성할 수있다. 이것이 ioc 컨테이너를 사용하는 이유 중 하나이다.