[ 2022.10.30 TIL-스프링 컨테이너와 빈 ]

Coosla·2022년 10월 29일
0

TIL

목록 보기
5/29
post-thumbnail

스프링 컨테이너

✏️ 스프링 컨테이너란?

  • 자바 객체의 생명 주기를 관리
  • 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할
  • new연산, 인터페이스 호출, 팩토리 호출 방식으로 객체 생성/소멸을 스프링 컨테이너가 대신 해줌
  • 객체 간의 의존관계를 런타임 과정에서 자동으로 설정

✏️ 스프링 컨테이너의 종류

  • BeanFactory

    • 빈 객체 생성, 의존관계 설정
    • 가장 기본적인 IoC 컨테이너이자 클래스
    • 사용할 때 빈 객체를 로딩하는 방식인 on-demand 방식
    • 빈 생성,의존 관계 설정하는 IoC의 기본 기능에 초점
    • BeanFactory로 구현한 컨테이너는 의존성 주입 관점만 가지고 있어, 빈이 필요할 때 로딩해주기 때문에 가벼운 경량 컨테이너로 불림
  • ApplicationContext

    • BeanFactory를 상속받아 구현한 것으로 BeanFacroty의 확정된 버전으로 생각
    • 런타임 실행 시 모든 빈을 로딩하는 방신인 Eager loading 방식
    • 별도의 정보를 참고해서 빈 생성, 관계 설정 등의 제어를 총괄하는 것에 초점
    • 런타임 시점에 모든 빈을 로딩하기 때문에 무거운 컨테이너라 불림

✏️ BeanFactory VS ApplicationContext

  • 결론적으로 특별한 이유가 없다면 ApplicationContext를 사용하는 것이 좋음
  • ApplicationContext는 BeanFactory를 상속받아 구현되었기 때문에 BeanFactory의 모든 기능을 포함하고 있고, 추가 기능을 제공
  • ApplicationContext 추가 기능
    • Environment
      • 프로파일을 설정하고 어떤 것을 사용할지 선택할 수 있게 해주며, 소스 설정 및 프로퍼티 값을 가져옴
    • MessageSource
      • 메시지에 대한 국제화를 제공하는 인터페이스
      • 메시지 설정 파일을 모아서 각 국가마다 로컬라이징을 함으로써 각 지역에 맞춤 메시지를 제공할 수 있는 것

스프링 빈

✏️ 스프링 빈이란?

  • 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)를 의미

✏️ 스프링 빈 등록 방식

  • @Component 어노테이션 이용
    • @Component 어노테이션을 붙이면 스프링에서 알아서 스프링 컨테이너에 등록
    • 컴포넌트 스캔 대상
      • @Controller : 스프링 MVC 컨트롤러로 인식
      • @Repository : 스프링 데이터 접근 계층으로 인식하고 해당 계층에서 발생하는 예외는 모두 DataAccessException으로 반환
      • @Service : 핵신 비즈니스 계층으로 인식
      • @Configuration : 스프링 설정 정보를 인식, 스프링 빈이 실글통을 유지하도록 추가 처리
  • 자바 코드로 설정
    • @Configuration 어노테이션과 @Bean 어노테이션 이용
    • 빈을 등록하기 위해 인스턴스를 생성하는 메소드 위에 @Bean을 명시
    • @Configuration 내부에 @Component가 있어 자동으로 스캔대상에 포함
      @Configuration
      public class 클래스명{
      	@Bean
      	public 클래스명 메소드명(){
      		...
      	}
      }

✏️ @Bean VS @Component

  • @Bean
    • 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 사용
    • 메소드 또는 어노테이션 단위
  • @Component
    • 개발자가 직접 컨트롤이 가능한 클래스인 경우 사용
    • 클래스 또는 인터페이스 단위

✏️ 싱글톤 빈

  • 스프링 컨테이너에서 한 번만 생성, 컨테이너가 사라질 때 제거
  • Spring Beans Cache에 저장
  • 빈에 대한 요청과 참조가 있으며 캐시된 객체를 반환
  • 하나만 생성되기 때문에 동일 참조를 보장
  • 빈 스코프를 명시하지 않으면 싱글톤 빈
  • 동기화 문제를 해결하지 않으면 멀티 스레드 환경에서 부작용이 발생할 수 있음
  • 적합한 객체 종류
    • 상태가 없는 공유 객체
    • 읽기 전용으로만 상태를 가진 객체
    • 쓰기가 가능한 상태를 지니면서 사용 빈도가 매우 높은 객체(동기화 전략이 필요)
  • 생명 주기
    1. 스프링 컨테이너 생성
    2. 스프링 빈 생성
    3. 의존관계 주입
    4. 초기화 콜백
    5. 사용
    6. 소멸 전 콜백
    7. 스프링 종료

✏️ 프로토타입 빈

  • DI가 발생할 때 마다 새로운 객체가 생성되어 주입
  • 빈 소멸에 스프링 컨테이너가 관여하지 않고, GC에 의해 빈이 제거
  • Scope("prototype")을 붙이면됨
  • 적합한 객체 종류
    • 사용할 때마다 상태가 달라져야 하는 객체
    • 쓰기가 가능한 상태가 있는 객체
  • 생명 주기
    • 스프링 컨테이너 생성
    • 스프링 빈 생성
    • 의존 관계 주입
    • 초기화 콜백
    • 사용
    • GC에 의해 제거

참고

스프링 컨테이너

스프링 빈

profile
프로그래밍 언어 공부 정리

0개의 댓글