본문 바로가기
Spring/Basic

왜 싱글톤 패턴을 이용하는가?

by JHyun0302 2023. 8. 2.
728x90

[본 포스팅은 인프런 스프링 핵심 원리 - 기본 편을 기반으로 작성하였습니다.]

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com

 

 

 

 

스프링은 본래 온라인 서비스 기술이다. 즉 사용자가 많아질수록 트래픽이 심해지는 웹 어플리케이션을 만드는데 특화된 기술이다.

 

if) 스프링 없는 DI 컨테이너를 이용한다면 고객의 요청이 올 때마다 객체가 생성되고 소멸된다.

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

 

하지만 싱글톤 패턴에도 문제점이 있다.

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

위의 문제점을 스프링 컨테이너는 해결하고 객체 인스턴스를 싱글톤으로 관리한다.

싱글톤 컨테이너 적용 후

 

싱글톤 방식의 주의점: 공유 필드를 조심하자! 항상 무상태(stateless)로 설계할 것!

  • 특정 클라이언트에 의존적인 필드가 있으면 안된다.
  • 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다.
  • 가급적 읽기 전용으로 만들 것!
  • 필드 대신에 자바에서 공유되는 않는, 지역변수, 파라미터, TreadLocal 등을 사용해야 한다.

 

 

마지막으로 가장 중요한 스프링 컨테이너가 싱글톤을 보장해주는 이유에 대해 작성하겠다.

결론부터 말하자면 @Configuration이 CGLIB 바이트조작 라이브러리를 호출해서 싱글톤을 보장해준다.

 

 

스프링 컨테이너에 Bean을 등록하여 출력한 결과이다.

bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d70

바이트코드 조작 라이브러리를 사용해 AppConfig 클래스를 상속받은 임의의 클래스를 스프링 빈으로 등록!

 

반응형

'Spring > Basic' 카테고리의 다른 글

빈 생명주기 콜백  (0) 2023.08.02
조회 대상 빈이 2개 이상 - 문제  (0) 2023.08.02
롬복과 최신 트랜드  (0) 2023.08.02
의존관계 자동 주입  (0) 2023.08.02
AppConfig의 관심사 분리  (0) 2023.08.01