직관적으로 간추린 토비의스프링 1장.4 - 싱글턴 레지스트리와 빈 스코프

디퐁·2022년 12월 25일
0
post-thumbnail

1장. 오브젝트와 의존관계

일러두기

  • 토비의스프링3.1 Vol.1을 읽고 정리한 글입니다.
  • 책을 이미 읽으신 분이 빠르게 훑으며 복습하는 용도로 보시면 좋을 것 같습니다.
  • 임의로 핵심만 간추렸습니다. 책과 설명하는 순서가 바뀌거나 장/절 목차 이름이 바뀌거나 아예 빠진 내용이 많습니다.

1 싱글턴 레지스트리

DaoFactory에 @Configuration을 붙임으로써 달라지는 것


  • 붙이기 전의 DaoFactory는 항상 새로운 객체를 반환하지만
  • getBean()으로 얻는 객체는 여러 번 호출해도 '동일'한 객체를 반환해준다
    • 스프링 빈 팩토리는 기본적으로 싱글턴 스코프로 빈을 만들어주기 때문이다.

싱글턴 레지스트리로서의 애플리케이션 컨텍스트

싱글턴 패턴

  • 어떤 클래스에 대한 인스턴스가 하나만 존재하도록 강제하는 것
  • 생성자를 private으로 제한해 여러 개 생성되지 못하도록 막고
  • public static 필드나 public static 메서드를 통해 단 하나만 생성된 인스턴스에 접근하도록 한다

싱글턴 레지스트리

  • 싱글턴 패턴으로 만들어지는 객체를 저장하고 관리하는 것
  • 애플리케이션 컨텍스트는 IoC 컨테이너이면서 싱글턴 레지스트리이기도 하다

왜 스프링은 싱글턴으로 빈을 만들까?

  • 주로 적용되는 대상이 자바 엔터프라이즈 기술을 사용하는 서버환경이기 때문이다.
    • 높은 성능이 요구되는 환경
    • 요청이 올 때마다 오브젝트를 새로 만든다면 서버가 감당하기 힘들다.

싱글턴 패턴의 한계

  • private 생성자를 갖고 있기 때문에 상속할 수 없다
  • 테스트하기 어렵다
    • 직접 생성할 수 없어서 Mock 오브젝트를 만들 수 없다
    • 싱글턴 오브젝트가 이용할 오브젝트를 테스트용 오브젝트로 대체하기 힘들다
  • 서버환경에서는 싱글턴이 하나만 만들어지는 것을 보장하지 못한다
    • 클래스 로더 구성법에 따라 두 개 이상 만들어질 수 있음
  • 전역 상태를 만들 수 있기 때문에 바람직하지 못하다

서비스 오브젝트

  • 엔터프라이즈 분야에서 일찍부터 사용해왔던 개념
  • 서블릿이 대표적인 서비스 오브젝트 중 하나다
    • 서블릿 클래스당 하나의 오브젝트만 만들어두고
    • 사용자의 요청을 담당하는 여러 스레드에서
    • 하나만 만들어진 오브젝트를 공유해 동시에 사용한다

싱글턴 레지스트리

  • 스프링은 싱글턴이 서비스 오브젝트 방식으로 사용되는 것을 적극 지지한다
  • 대신 스프링이 직접 싱글턴 형태의 오브젝트를 만들고 관리한다
    • 싱글턴 스코프의 빈으로 등록하면 된다.
  • 장점
    • 평범한 자바 클래스를 싱글턴으로 활용할 수 있게 해준다
      • public 생성자를 두어도 된다!
      • Mock 오브젝트로 간단히 대체할 수 있어 테스트가 간편하다.

싱글턴 빈 사용 시 주의 사항

  • 멀티스레드 환경이라면 여러 스레드가 동시에 접근/사용할 수 있다
  • 따라서 기본적으로 무상태 방식으로 만들어져야 한다
  • 예외로, 싱글턴 빈을 저장하려는 용도라면 인스턴스 변수를 사용해도 좋다
    • 스프링이 한 번 초기화하고 이후 수정되지 않기 때문에 읽기전용이나 다름없다

스프링 빈의 스코프

빈의 스코프

  • 빈이 생성되고, 존재하고, 적용되는 범위를 뜻한다
  • 기본 스코프: 싱글턴

싱글턴 스코프

  • 하나의 오브젝트만 만들어져서
  • 스프링 컨테이너가 존재하는 동안 계속 유지된다

싱글턴 외의 스코프들

  • 프로토타입 스코프
    • 빈을 요청할 때마다 새로 생성한다
  • 요청 스코프
    • 새로운 HTTP 요청이 생길때마다 생성한다
  • 세션 스코프
    • 웹의 세션과 유사한 스코프

2 스프링 빈의 스코프

빈의 스코프

  • 빈이 생성되고, 존재하고, 적용되는 범위
  • 기본 스코프
    • 싱글턴

싱글턴 스코프

  • 하나의 오브젝트만 만들어져서
  • 스프링 컨테이너가 존재하는 동안 계속 유지된다

싱글턴 외의 스코프

  • 프로토타입 스코프
    • 컨테이너에 빈을 요청할 때마다 생성
  • 요청 스코프
    • 새로운 HTTP 요청이 생길때마다 생성
  • 세션 스코프
    • 웹의 세션과 유사
profile
Backend 취준생

0개의 댓글