본문 바로가기

Spring/Core

Spring Core - IOC 컨테이너와 빈

-Contents

  - IOC 컨테이너란?

  - 빈이란?

  - applicationContext의 설정방식

 

IOC 컨테이너란?

의존 관계 주입이라고도 하며,

객체를 직접 생성시키는게 아니라

어떤 장치를 통해서 주입을 받아서 사용하는 방법을 IOC 라고 한다.

 

빈이란?

IOC 컨테이너가 관리 하는 객체라고 할 수 있다.

 

 

그렇다면, 객체를 직접 생성시키지 않고

왜 컨테이너가 빈을 관리 하게 했을까?

 

 

객체를 빈으로 등록되면 장점-

  • 의존성 주입
  • 빈의 스코프 관리
  • 빈의 라이프사이클 관리

의존성 주입을 하는 장점은 

만약 테스트를 하려고 할때 한 객체가 다른 객체의 의존성을 가지고 있을때

의존 객체를 생성 시켜야지 테스트를 할 수 있는데 

객체 수가 많아질수록 단위테스트를 하기 힘들어진다.

이걸 의존 주입을 통해 mock 으로 쉽게 넣어줄수 있게 된다.

 

 

빈의 스코프 관리 때문이다.

인스턴스는 오직 하나만 있어도 되는데 , 이 객체를 싱글톤으로 쉽게 관리를 하고 싶을때 빈을 쓰면된다.

기본적으로 싱글톤 스코프로 생성이된다.

싱글톤이 아닌건 프로토 타입이 있다.

프로토 타입은 매번 다른 객체를 생성하는것.

 

 

라이프사이클 인터페이스가 있다.

어떤 빈이 만들어졌을때 추가 적인 작업을 하고싶을때 빈을 만들어 쓰면된다.

 

라이프 사이클 인터페이스를 쓴 예

 

 

ApplicationContext

IOC 컨테이너는 빈 설정 파일이 있어야한다.

아주 고전적인 빈 설정 파일은 xml 형식이다.

이런식으로 bean 을 xml에서 만들어서 쓸 수 있었다.

이미지의 스코프 .. singleton 제외 나머지는 모두 prototype

기본값은 singleton이다.

 

이런 고전적인 xml 방식에서는 의존성 주입을 위해 

property 로 넣어주고 있는 모습이다.

ref 에 다른 빈 이름을 넣어주고 property name 에서는 bookService에 있는 setter 이름을 넣어준것이다

ClassPathXmlApplicationContext 로 ApplicationContext를 만들어서 쓰고 있는 모습이다.

물론 요새는 이렇게 쓰지 않는다.

 

이렇게 빈을 하나 하나 만드는건 엄청 귀찮은 작업이다.

모두 의존성 주입을 property로 넣어주고 매우 귀찮고 힘든 작업이다.

 

그래서 이걸 보완하기 위해 나온게

component-scan 이다.

이 패키지 부터 컨테이너에 등록을 해서 쓰겠다라고 선언하는 것.

이 패키지 하위에서 @Service, @Component 등으로 어노테이션을 붙이면

빈으로 등록이된다.

의존성 주입은 @autowired 로 의존성을 주입시켜준다.

여기 까지가 스프링 2.5 에서 나온 버전이다.

 

 

여기서 빈 설정 파일을 xml 이 아니라 자바로 만들수 없을까 해서 나온게 자바 설정 파일이다.

@Configuration 어노테이션을 붙여주고 컴포넌트 스캔을 가져왔다.

 

여기서 AnnotationConfig 으로 ApplicationContext를 만들어줬는데,

이것도 스프링부트에서는

SpringBootApplication 을 붙이면 ApplicationContext 를 만드는것도 생략한다.

@SpringBootApplication 안에서는

여기에 이미 ComponenetScan 이 존재하고

@SpringBootConfiguration 내부에

Configuration이 붙어 있다.

따라서 , 모든 설정이 SpringBootApplication 하나면 해결된다.

 

'Spring > Core' 카테고리의 다른 글

Spring Core - Validation, Data binding 추상화  (0) 2020.04.18
Spring Core - Resource 추상화  (0) 2020.04.18
Spring Core - Application Context 의 기능들  (0) 2020.04.17
Spring Core - bean 의 스코프  (0) 2020.04.16
Spring Core - Annotation  (0) 2020.04.16