부트캠프 기록/Serction2

[Spring Core] spring container 와 bean

bbangduck 2022. 10. 14. 11:35

학습목표

  • Spring 컨테이너(Container)와 빈(Bean)의 의미를 이해할 수 있다.
  • 빈 스코프(Bean Scope)의 의미를 이해할 수 있다.
  • Java 기반 컨테이너(Container) 설정에 대해 이해할 수 있다.
  • Spring DI(Dependency Injection)의 의미를 이해할 수 있다.
  • Component 스캔에 대해 이해할 수 있다.

 

 

▶Spring 컨테이너

  • 애플리케이션 빈의 생성, 관리, 제거 등 생명주기를 관리
  • 개발자가 정의한 빈을 객체롤 만들어 관리하고 개발자가 필요로 할 때 제공
  • 의존성 주입을 통해 애플리케이션의 컴포넌트를 관리
    • 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로움
  • ApplicationContext 를 스프링 컨테이너라고 하고 인터페이스로 구현되어 있음(다형성)
  • 사용 방법: xml, annotation 기반의 자바 설정 클래스
  • 컨테이너 사용 이유: 애플리케이션 규모가 커지고 객체가 무수히 많아지고 서로 참조하게 됨(의존성), 낮은 결합도와 높은 캡슐화가 객체지향프로그래밍의 핵심 중 하나인데 높은 의존성으로 이를 못지키는 상황에 처함 => 객체 간의 의존성을 낮추기 위해 스프링 컨테이너가 사용됨 
  • 구현 클래스에 있는 의존을 제거하고 인터페이스에만 의존하도록 설계할 수 있음
  • 종류: BeanFactory, ApplicationContext(빈팩토리를 상속받고 MessageSource, EnvironmentCapable, ApplicationEventPublisher, ResourceLoader 와 같은 부가기능을 제공)

 

▶ 빈(Bean)

  • 스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트
  • @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록
  • BeanDefinition(빈 설정 메타정보)으로 정의되고 이에 따라서 활용하는 방법이 달라짐

 

▶빈스코프

  • 빈이 존재할 수 있는 범위
singleton (Default) 각 Spring 컨테이너에 대한 단일 객체 인스턴스에 대한 단일 bean definition의 범위 지정
prototype 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위
request 웹 요청이 들어오고 나갈때 까지 유지
session 웹 세션이 생성되고 종료될 때 까지 유지
application 웹의 서블릿 컨텍스와 같은 범위로 유지
websocket 단일 bean definition 범위를 WebSocket의 라이프사이클까지 확장
Spring ApplicationContext의 컨텍스트에서만 유효

 

▶ 자바 기반 컨테이너 설정

  • AnnotationConfigApplicationContext
  • ApplicationContext 구현은 아래와 같은 애너테이션이 달린 클래스를 파라미터로 전달받음
    • @Configuration 클래스
      • 해당 객체가 bean definitions의 소스임을 나타내는 애너테이션
      • 빈을 선언
      • @bean 메서드에 대한 호출을 사용하여 bean 사이의 의존성을 정의
    • @Component 클래스
    • JSR-330 메타데이터(@Autiwired 또는 @Inject 같은 DI 메타데이터가 사용되는 것을 의미)
  • Config → Config@CGLIB : 스프링 컨테이너에 등록되어 있지 않을 때에만 필요한 빈을 생성하고 스프링 컨테이너에 등록
  • 자바 코드에서 애너테이션을 사용해 Spring 컨테이너를 구성하는 방법

 

▶Component 스캔

  • 설정 파일에서 빈들을 직접 작성하지 않아도 됨
  • @ComponentScan: @Component가 붙은 모든 클래스를 스프링 빈으로 등록해줌, 설정 정보에 붙임
  • @Autowired : 의존관계 자동으로 주입
  • 기존에 작성한 AppConfig가 있다면 정상적으로 작동하지 않음
  • DependencyConfig 등 @Configuration 설정이 된 파일이 있을 시
    • 코드 추가 : @ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class))