본문 바로가기
Backend - Java Spring/Spring Core

[SpringCore 핵심원리] 빈 설정과 싱글톤

by VictorMeredith 2024. 2. 17.

1. 스프링 빈 설정 메타정보 : BeanDefinition

- XML 이던, 뭐든간에 결국 BeanDefinition을 만들어버리면 스프링컨테이너는 이거만 알면 된다.

- 즉, 스프링컨테이너는 BeanDefinition 에만 의존한다. (BeanDefinition 추상화에만 의존하도록 설계한거당)

- 직접 스프링컨테이너에 등록할 수도 있다. 하지만 실무에선 안씀

 

2. 웹앱과 Singleton 

- 고객요청이 많은 웹앱에서 순수Java로된 DI컨테이너를 만들게되면 객체를 미친듯이 많이 생성하게 됨(메모리 낭비)

- 해당 객체가 1개만 생성되고, 공유하도록 설계하면 된다. (싱글톤)

엄청 많이 생성하면 안된다

 

- 싱글톤은 클래스 인스턴스가 딱 1개만 생성되도록 보장하는 패턴이다.

- private 생성자를 이용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막는다.

 

- 이제 꺼내려면 getInstance() 밖에 방법이 없다. (항상 같은 인스턴스를 반환한다.)

 

- 사용하기

통과

 

- 스프링컨테이너를 쓰면 객체를 모두 싱글톤으로 만들어서 관리해준다! 

- 싱글톤 패턴의 단점 : 

  : 구현하는 코드 자체가 많이 들어감

  : 클라이언트가 구체 클래스에 의존함 (DIP 위반)

  : 구체클래스를 의존하므로 OCP 위반 가능성이 높아짐

  : 내부 속성 변경/초기화가 어렵다

  : 유연성이 떨어진다

  : 안티패턴이다. 

 

- 스프링컨테이너는 단점들을 모두 해결하고 싱글톤으로 관리해준다.

 

3. 싱글톤 컨테이너

- 스프링 빈은 싱글톤으로 관리되는 빈이다.

- 스프링컨테이너는 싱글톤 컨테이너 역할을 한다. 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라고 한다.

 

처음 등록한 빈을 계속 반환한다.

- 요청할 때마다 새로운 객체를 생성해서 반환하는 기능도 있긴 하다. (라이프사이클 관련 빈스코프 특별한 기능 사용 시)

 

- 싱글톤 방식의 주의점

  : 싱글톤방식은 여러 클라이언트가 같은 객체인스턴스를 공유하므로, 싱글톤 객체는 상태를 stateful(유지) 하게 설계하면 안된다.

  : 무상태(stateless) 로 설계해야한다

    - 특정 클라이언트에게 의존적이면 안됨

    - 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안됨

    - 가급적 읽기만 가능해야함

    - 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal등을 사용해야 한다.

- 싱글톤 빈의 필드에 공유 값을 설정하면 큰 장애가 발생할 수 있다.

 

- 주의점 확인해보자

주문금액이 중간에 바뀌어버리는 큰 장애가 생겨버림
특정 클라이언트가 필드를 변경하면 안된다.

 

- 아래와 같이 그냥 지역변수 쓰셈

바로 리턴해버리셈

 

댓글