스프링 핵심 원리 - 기본편 | 싱글톤 컨테이너

Yunny.Log ·2022년 5월 31일
0

Spring Boot

목록 보기
63/80
post-thumbnail

1. 웹 애플리케이션과 싱글톤

  • 웹애플리케이션은 여러 고객이 동시에 호출

  • 문제상황 : 이렇게 계속적으로 호출이 일어나게 된다면 , 고객 요청이 올 때마다 똑같은 객체를 계속 새롭게 생성해야 함

스프링 없는 순수 DI 컨테이너는 ?

  • 요청을 할 때 마다 객체를 새로 생성
    고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸
    => 메모리 낭비가 심하다.
  • 싱글톤 패턴 : 해결방안은 해당 객체가 딱 1개만 생성되고, 공유하도록 설계하기
  • 생성된 객체 인스턴스를 공유할 수 있도록 설정하는 것

2. 싱글톤 패턴

  • 클래스 인스턴스가 딱 하나만 생성되는 것을 보장하는 디자인 패턴
  • 객체 인스턴스를 2개 이상 생성하지 못하도록 보장해주는 패턴
    - private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다
 1. static 영역에 객체 instance를 미리 하나 생성해서 올려둔다.
2. 이 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회할 수 있다. 
=> 이 메서드를 호출하면 항상 같은 인스턴스를 반환한다.
3. 딱 1개의 객체 인스턴스만 존재해야 하므로, 
생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막는다.
  • NEW 가 아니라 GET을 이용해서 딱 하나의 인스턴스만 가져올 수 있도록 하기
    => 외부에서 이를 생성하려고 들면 컴파일 에러 나게 설정을 해두는 것 !~

SAME 은 객체 주소 비교, EQUAL은 내용

장점 : 이미 만들어진 객체를 공유해서 효율적으로 사용할 수 있다.
단점 : 싱글톤 패턴은 다음과 같은 수 많은 문제점들을 가지고 있다.

- 싱글톤 패턴 문제점
- 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
- 의존관계상 **클라이언트가 구체 클래스에 의존**한다. DIP를 위반한다.
- 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다.
- 테스트하기 어렵다
- 내부 속성을 변경하거나 초기화 하기 어렵다.
- private 생성자로 자식 클래스를 만들기 어렵다.
- 결론적으로 유연성이 떨어진다.
- 안티패턴으로 불리기도 한다.

=> 그러나 스프링 컨테이너에선 이 싱글톤 구현할 때 단점은 다 없애주고 좋은 점만 남겨둠

3. 싱글톤 컨테이너

  • 스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리
  • 빈으로 등록하면 등록된 하나의 빈으로 모든 곳에서 활용을 한다.
    `
    • 싱글톤 패턴을 위한 지저분한 코드가 들어가지 않아도 된다.
  • DIP, OCP, 테스트, private 생성자로 부터 자유롭게 싱글톤을 사용

4. 싱글톤의 주의점 :

  • 여러 클라이언트가 같은 하나의 객체 인스턴스만 공유,
  • 싱글톤 객체는 여러 클라이언트가 공유
  • 따라서 상태를 STATE하게 유지하면 안된다, STATELESS하게 설계해야해
    - 특정 클라이언트에 의존적인 필드가 있으면 안된다.
    - 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다!
    - 가급적 읽기만 가능해야 한다.
    - 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.
  • 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다!!

5. @Configuration과 싱글톤

  • new로 찍어서 다른 인스턴스일 것 같다는 생각이 든다.
  • 그러나 스프링이 어떤 수를 써서라도 싱글톤으로 유지시킨다, 무엇을 인스턴스를

6. @Configuration과 바이트코드 조작의 마법

  • @Configuration 에 비밀이 존재

  • 스프링이 우리가 만든 AppConfig라는 애를 상속받은 클래스로 만듦,

  • 그래서 내가 만든 객체가 아닌 임의의 다른 클래스를 등록시켜서, 얘를 통해서 싱글톤으로 보장되게 해주는 것

  • @Configuration 붙이면 싱글톤 보장, 그러나 @Configuration 뻬고 @Bean으로만 하면 cglb로 변환 x => 싱글톤 보장 안해준다는 것, 이때는 new 로 찍으면 진짜 그때 그때 새로운 인스턴스를 생성하는 꼴이 되고 만다.

0개의 댓글