[Spring]Spring Framework 심화

이용준·2023년 1월 4일
0

Spring

목록 보기
3/6

Spring Container

  • 객체 생성, 연결, 구성, 생성, 제거 하는 등 전체 생명 주기 관리

  • DI를 사용해 애플리케이션 구성 요소(component) 관리하며, 이를 Bean이라 한다.

  • 애너테이션 기반의 자바 설정 클래스로 만들 수 있다.(ApplicationContext)

    두 가지 타입의 컨테이터

    1) Spring BeanFactory Container

    • DI에 대한 기본 지원을 제공하는 컨테이너
    • org.springframework.beans.factory.BeanFactory interface에 의해 정의

    2) Spring ApplicationContext Container

    • 응용 프로그램 이벤트 게시 기능과 같은 엔터프라이즈 관련 기능 추가
    • org.springframework.context에 의해 정의
  • ApplicationContextBeanFactory 컨테이너의 모든 기능이 포함되므로 일반적으로 ApplicationContext 권장


Spring Bean

  • spring 컨테이너가 관리하는 자바 객체(POJO)

  • 인스턴스화된 객체를 의미한다.

  • ApplicationContext를 사용해 bean 정의를 읽고 액세스할 수 있다.

  • 즉, ApplicationContext가 만들어서 그 안에 담고 있는 객체를 의미한다.

    Spring IoC 컨테이너에 빈 등록하는 방법

    1) Component Scanning

    • @ComponentScan/@Component 어노테이션을 사용해 빈 등록
      1. @ComponentScan - 어느 지점부터 컴포넌트 찾으라고 알려주는 역할
      2. @Component - 실제로 찾아 빈으로 등록할 클래스 의미

      라이프 사이클 콜백 : Spring IoC 컨테이너가 IoC 컨테이너를 만들고 그 안에 빈 등록할 때 사용하는 인터페이스들

    2) 빈 설정 파일에 직접 빈 등록

    • 자바 클래스 생성을 통한 자바 설정 파일 작성
    • 일반적으로 ~Configuration으로 작성
      1) @Configuration 어노테이션 붙이기
      2) @Bean 어노테이션을 통한 빈 정의
      @Configuration
      public class BasicConfiguration{
        @Bean
        public BasicController basicController(){
          return new BasicController;
        }
      }  

      @Configuration 어노테이션도 @Component를 사용하므로 @Component의 스캔 대상이 되므로 빈 설정 파일이 읽힐때 내부에 정의된 빈들이 IoC 컨테이너에 등록된다.


Bean Scope

  • Bean의 범위 의미
  • bean 등록시 별도 설정 없을 경우, bean은 singleton scope 를 갖는다.
Scope설명
SingletonSpring 컨테이너에 대한 단일 객체 인스턴스에 대한 단일 bean definition의 범위 지정
Prototype프로토타입 빈의 생성과 의존관계 주입까지 관여하고 더는 관리하지 않는 짧은 범위의 스코프
Request웹 요청 출입까지 유지되는 스코프
Session웹 세션 생성 및 종료까지 유지되는 스코프
Application웹의 Servlet Context와 같은 범위로 유지되는 스코프
Websocket- 단일 Bean Definition 범위를 WebSocket의 라이프 사이클까지 확장
- Spring ApplicationContext의 context에서만 유효

Singleton

클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인 패턴

  • 스프링 컨테이너의 시작과 함께 생성되며 컨테이너 종료까지 유지

  • 싱글톤 빈은 하나의 공유 인스턴스만 관리

    • private 생성자 통해 외부에서 new 사용 못하게 함.
  • 싱글톤 스코프의 스프링 빈은 여러번 호출해도 모두 같은 인스턴스 참조 주소값을 갖는다.

    public SingletonCode{
      private static final SingletonCode instance = new SingletonCode();
      
      // 객체 인스턴스 필요한 경우 getInstance() 메서드를 통해서만 조회 가능
      public static SingletonCode getInstance(){
         return instance;
       }
       
       // 생성자 private선언해 외부에서 new로 새로 생성하는 것 방지
       privaet SingletonCode(){}

    문제점

  • 구현하는데 드는 코드가 많음

  • 클라이언트가 구체 클래스에 의존한다.

  • 지정해 가져오므로 테스트 어려움

  • private 생성자 사용해 자식 클래스를 만들기 어려우므로 유연성 저하 등

    그러나 해당 문제들은 싱글톤 컨테이너를 통해 해결된다.

profile
뚝딱뚝딱

0개의 댓글