Spring
[스프링] 싱글톤 패턴
문승주
2023. 7. 17. 12:58
반응형
본 내용은 인프런의 김영한 님의 강의 "스프링 핵심 원리 - 기본편" 내용을 바탕으로 정리한 내용입니다.
싱글톤 패턴이란?
- 객체 지향 소프트웨어 디자인 패턴 중 하나로 어떤 클래스가 오직 하나의 인스턴스만을 갖도록 보장하며, 해당 인스턴스에 대한 전역적인 접근점을 제공하는 패턴이다.
- 기본적으로 빈(Bean) 객체의 생명 주기를 관리하는 컨테이너에 적용되고, 스프링은 컨테이너에 빈으로 등록된 객체를 싱글톤으로 관리하며, 기본적으로 싱글톤 스코프(Singleton Scope)로 빈을 생성한다.
- 멀티스레드 환경에서 동시에 여러 클라이언트가 동일한 싱글톤 객체에 접근하는 경우 동기화 문제가 발생할 수 있지만 스프링은 이러한 동기화 문제를 해결하기 위해 싱글톤 빈 객체의 동시 접근을 안전하게 보장한다.
싱글톤 패턴의 장점
자원 절약 : 하나의 인스턴스를 여러 번 생성하는 것이 아니라, 하나의 인스턴스를 공유하여 사용하기 때문에 메모리와 같은 자원을 절약할 수 있다.
전역적인 접근 : 전역적으로 접근할 수 있는 접근점을 제공하므로, 어디서든 동일한 인스턴스에 접근하여 데이터를 공유할 수 있다.
싱글톤 방식의 주의점
상태 변조 문제 : 싱글톤 객체의 공유 필드를 여러 클라이언트가 동시에 사용할 경우, 한 클라이언트가 공유 필드를 변경하면 다른 클라이언트들에게도 영향을 미치게 된다. 이로 인해 의도하지 않은 결과가 발생할 수 있다.
스레드 안전성 문제 : 싱글톤 객체가 멀티스레드 환경에서 사용되는 경우, 공유 필드의 동시 접근으로 인한 스레드 안전성 문제가 발생할 수 있다. 여러 스레드가 동시에 공유 필드를 읽거나 쓰면 예기치 않은 동작이 발생할 수 있습니다.
※ 무상태로 설계하자!
싱글톤 객체의 공유 필드 사용을 최소화하거나, 공유 필드를 불변(immutable)으로 만들어야한다.
특정 클라이언트에 의존적인 필드가 있으면 안된다.
가급적 읽기만 가능해야 한다.
필드 대신 자바에서 공유되지 않는 변수를 사용해야 한다.
의존성 주입(Dependency Injection)을 통해 필요한 상태를 외부에서 주입받는 방식을 사용하면 된다. 이렇게 하면 싱글톤 객체는 상태를 유지하지 않고, 의존성을 명시적으로 표현할 수 있다
스프링 컨테이너란?
- 스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트 중 하나로,싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.
- 스프링 컨테이너는 애플리케이션의 객체를 생성하기 위해 설정 정보를 참조하는데 이 설정 정보는 주로 XML, Java Configuration, 어노테이션 등의 형태로 제공된다.
- 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.
- DIP, OCP, 테스트, private 생성자로 부터 자유롭게 싱글톤을 사용할 수 있다.
@Configuration
- 스프링 프레임워크에서 제공하는 어노테이션 중 하나로, 스프링 빈(Bean) 구성 정보를 포함하는 클래스임을 나타낸다.
- @Configuration 어노테이션이 지정된 클래스는 스프링 컨테이너에 의해 관리되며, 빈으로 등록된 객체를 생성하고 구성하는 데 사용된다.
- 스프링은 클래스의 바이트코드를 조작하는 CGLIB이라는 라이브러리를 사용하는데 이는 @Bean이 붙은 메서드마다 빈이 스프링 컨테이너에서 존재하면 빈을 반환하고 없으면 새로 생성해준다.
- @Configuration이 없이 @Bean만 사용하면 싱글톤이 보장되지 않는다.
- 스프링 설정 정보에는 항상 @Configuration 사용해야 싱글톤이 보장된다.
반응형