Spring Context에서 주입해줄 수 있는 빈(Bean) 컴포넌트

Sorbet·2021년 6월 6일
0

Spring Context 주입 가능한 Bean의 종류

  • 내용은 아직 이해하지 못해서 하나씩 채워나가겠습니다..!

Required

Autowired 와 Inject

Qualifier

CustomAutowireConfigurer

Resource

PostConstruct and PreDestroy

이후로는 Classpath scanning and managed components 들 입니다

Component

Service

참고

출처


Spring Context란?

  • 메타데이터들 (자바 @어노테이션 / XML 파일 / configuration files)을 읽어서 Bean을 주입해주는 일을합니다.
  • 결국 Spring Context 는 IoC 컨테이너입니다. instantiating(객체의 실체화)과, configuring(자바빈을 초기화&구성) 하고 assembling(조립)해줍니다.

IoC 컨테이너(혹은DI 컨테이너)

  • 스프링에서 객체의 생성(실체화) 와 객체의 연결(Wired) 해주는 책임이 있는 논리적인 일종의 바구니(컨테이너)
  • 자바클래스는 의존성을 정의하고, IoC 컨테이너는 객체를 만들고 의존성을 연결한다.
  • IoC(제어의 역전)을 구현한 방법으로, DI 의존성 주입을 사옹하는것이기 때문에 그게 그거인데
    • 그냥 IoC컨테이너, DI컨테이너는 완전히 동일하다

스프링 Bean

Bean의 정의

  • 그냥 자바 객체인데, 스프링이 생성해주고, 관리(생명주기 등)해주고, 의존성을 주입해주는 자바 객체를 빈(콩)이라고 부름
  • 빈을 생성해야하는 클래스에서 @Component 어노테이션을 사용하면 런타임 시점에 IoC 컨테이너가 객체들을 스캔하며 빈으로 등록해준다.
  • 별도의 목적을 가진 레이어 별로 빈을 생성하고자할 경우에는 @Controller, @RestController, @Service, @Repository를 사용할 수 있다.
  • 이렇게 컨테이너에 의해 관리되는 빈을 컨테이너 관리 빈이라고 한다.

Bean의 장점

  • 의존성 생성(실체화)에 대한 책임이 없다
    • 따라서 느슨한 결합도를 유지할 수 있다
    • 코드가 좋아진다(응집도는 높게, 결합도는 낮게) = 옆팀에서 코드를 수정했는데, 내 서비스가 이상해지는 일이 줄어든다!
  • 컨테이너가 빈을 관리하므로 코드의 단순화, 유지보수, 기능확장 아무튼 다 좋다!

Bean의 스코프

  • 스프링 빈은 여러 스코프로 만들 수 있다. 기본 스코프는 싱글톤 이다.

싱글톤

  • 스프링 IoC 컨테이너 인스턴스당 오직 하나의 빈 인스턴스만 생성되는 경우를 말한다.
  • 싱글톤 빈은 무상태여야하고, 여러번 참조되어도 하나의 인스턴스만 생성되고 반환하기 때문에 시간적, 공간적 이점이 있다.

프로토타입

  • 스프링 컨테이너에서 빈이 요청될 때마다 새로운 인스턴스가 생성된다. 빈이 상태를 가지고 있는 경우 사용한다.

리퀘스트

  • 모든 HTTP 요청마다 빈 인스턴스가 생성되고, 스프링 웹 컨텍스트에서만 사용할 수 있다. 요청이 완료되면 즉시 폐기된다.

애플리케이션

  • 웹 애플리케이션당 하나의 빈 인스턴스로 생성되고 웹 컨텍스트에서만 사용할 수 있다.

Bean의존성 주입(Wiring) 방식 3가지

setter 주입

  • 직접 setter를 구현해도 되지만, 의존 필드에 @Autowired을 지정하면 자동으로 setter 주입 방식을 사용한다.
  • 순환참조의 위험이 있어 의존 관계가 명확하거나 테스트할 때 주로 사용된다.

생성자 주입

  • 생성자를 정의하면 스프링이 알아서 의존관계를 찾아서 연결해준다. 직접 의존관계를 정의하기 때문에 순환참조의 위험이 덜하다. 또한 의존 객체를 불변객체로 지정한다면 생성자 주입 방식을 사용해야한다.

필드 주입

DI의 3가지 방법

참고
https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/

출처

https://docs.spring.io/spring-framework/docs/3.0.x/spring-framework-reference/html/beans.html

profile
Sorbet is good...!

0개의 댓글