성장일기

내가 보려고 정리하는 공부기록

백엔드/스프링

[Spring] 3. 싱글톤 컨테이너 - 스프링 핵심원리 기본편

와나나나 2024. 2. 5. 22:44
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

 

오늘의 주제는 싱글톤 컨테이너이다.


싱글톤 패턴

스프링 애플리케이션은 대부분 웹 애플리케이션이고, 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 그런데 요청을 할 때마다 새로운 객체가 생성된다면 어떻게 될까 ?  요즘에는 하드웨어 성능이 좋아서 괜찮지만 그래도 메모리 낭비가 심하다는 단점이 있다. 이를 해결하는 방법은 해당 객체가 1개만 생성되고, 공유하도록 설계하면 된다. 이를 싱글톤 패턴이라고 한다.

 

정리하면 싱글톤 패턴은

  • 클래스의 인스턴스가 딱 1개만 생성되는 것이 보장되는 패턴
  • 객체 인스턴스가 2개 이상 생성하지못하게 해야함 

 

만드는 방법은 다음과 같다.

  1. static 영역에 객체 instance를 미리 한 개 생성
  2. 이 instance가 필요하면 getInstance() 메소드를 통해서만 조회 가능. 이 메소드를 호출하면 항상 같은 인스턴스반환
  3. 생성자를 private으로 해서 외부에서 new 키워드로 객체가 생성되는거 막기  

이렇게 하면 호출할 때마다 같은 객체가 반환된다!

 

하지만 싱글톤 패턴을 구현할 때 코드가 많이 들어가고, 클라이언트가 구체 클래스에 의존하여 DIP를 위반한다는 문제점이  있다. 또한 테스트나 내부 속성을 변경, 초기화가 어려워 유연성이 떨어진다는 문제들이 있다. 이런 문제점을 해결하면서 싱글톤으로 관리해주는 것이 스프링 컨테이너이다.

 

 

싱글톤 컨테이너

스프링 컨테이너가 싱글톤 패턴의 문제점을 해결하는 동시에 싱글톤으로 객체를 관리한다. 스프링 빈이 싱글톤으로 관리되는 빈인 것이다!

- 스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도 객체를 싱글톤으로 관리함
- 스프링 컨테이너가 싱글톤 컨테이너 역할을 한다. 이런 기능을 싱글톤 레지스트리라고 함

이런 기능 덕에 싱글톤 패턴의 모든단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다.
         # 싱글톤 패턴을 위한 지저분한 코드 필요X
         # DIP, OCP, 테스트, private 생성자로부터 자유롭게 싱글톤을 사용 가능

 

 

싱글톤 방식의 주의점 🌟 

싱글톤 방식은 여러 클라이언트가 하나의 같은 객체를 공유하므로 상태를 유지하게 설계하면 안된다.

즉, 무상태로 설계해야한다.

  • 특정 클라이언트에 의존적인 필드 있으면 X
  • 특정 클라이언트가 값을 변경할 수 있는 필드 있으면 X

즉 수정할 수 없게, 읽기만 가능하게 해야한다. 

 

@Configuration 또한 싱글톤을 보장해준다!! AnnotationConfigApplicationContext에 파라미터로 넘긴 값은 스프링으로 자동 등록되므로 AppConfig도 스프링 빈이 된다.