-
(스프링 기본) 13 - 싱글톤 패턴개발/Spring 2024. 10. 23. 16:59
싱글톤 패턴이란 클래스 인스턴스가 딱 1개만 생성되는 것을 보장하는 패턴이다.
package hello.core.singleton; public class SingletonService { //자기 자신을 내부 private 으로 //static 으로 만들어 하나만 존재함 private static final SingletonService instance = new SingletonService(); public static SingletonService getInstance() { return instance; } }
static 으로 생성하여 하나만 존재하게 만들고 static 메서드를 통해 불러본다.
이렇게 되면 자바가 뜰 때 new SingletonService(); 생성해서 인스턴스 참조로 넣어놓는다.
해당 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회 가능하며,
메서드 호출하면 같은 인스턴스를 반환한다.
static 을 사용하여 딱 1개의 객체 인스턴스만 존재해야 하므로,
생성자를 private 으로 막아서 외부에서 new 키워드로 객체 인스턴스 생성을 막는다.
private SingletonService() {}
다음과 같이 private 으로 생성자를 만들어버려서
다른 곳에서 아예 생성을 못하게 막는 방법도 많이 사용한다.
@Test @DisplayName("싱글톤 패턴을 적용한 객체 사용") void singletonServiceTest() { SingletonService singletonService1 = SingletonService.getInstance(); SingletonService singletonService2 = SingletonService.getInstance(); System.out.println("singletonService1 = " + singletonService1); System.out.println("singletonService2 = " + singletonService2); assertThat(singletonService1).isSameAs(singletonService2); }
이렇게 test 코드로 비교하면 둘이 같은 인스턴스로 생성된 것을 확인할 수 있다.
그러나 스프링 컨테이너는 기본적으로 객체를 싱글톤으로 만들어서 관리해준다.
즉, 요청이 와도 객체를 계속 만드는게 아니라 이미 만들어진 객체를 공유해서 효율적으로 사용하는 것이다.
※ isEqualTo(값 비교) vs isSameAs(참조 비교 즉, == 비교)
* isEqualTo
String a = new String("test"); String b = new String("test"); assertThat(a).isEqualTo(b); // true, 값이 같음
새로운 인스턴스 생성해서 참조값 다르지만 값이 같기 때문에 True 가 나온다.
자바의 equals() 메서드 기반으로 비교한 것이다.
사용예) 객체의 상태나 필드 값이 같은지 비교할 때
* isSameAs
String a = new String("test"); String b = new String("test"); assertThat(a).isSameAs(b); // false, 참조가 다름
a와 b 는 동일 값ㅇㄹ 가지지만 다른 인스턴스로 참조값이 다르다.
따라서 False 결과값이 나온다.
즉, 두 객체의 참조가 같은지 비교하고, 같은 메모리 주소 참조하는지를 확인한다.
사용예) 동일한 객체(같은 인스턴스)를 가리키고 있는지 확인하고 싶을 때 사용
■ 싱글톤 패턴 문제점
- 구현 코드 자체가 많이 들어간다.
- 클라이언트가 구체 클래스에 의존한다 -> DIP 위반
- 클라이언트가 구체 클래스를 의존하게 되면 클라이언트 코드를 수정해야 하는 OCP 위반 가능성이 높아짐
- 테스트 어렵다
- 내부 속성 변경 및 초기화 어렵다
- privatet 생성자로 자식 클래스 만들기 어렵다
- 유연성 떨어진다
- 안티 패턴으로 불리기도 한다.
스프링 프레임워크는 싱글톤 문제는 해결하면서 싱글톤을 유지해준다.
출처 : 김영한 스프링 핵심 원리 - 기본편
'개발 > Spring' 카테고리의 다른 글
(스프링 기본) 15 - 싱글톤 방식의 주의점 (공유필드) (0) 2024.10.24 (스프링 기본) 14 - 싱글톤 컨테이너 (0) 2024.10.24 (스프링 기본) 12 - 웹 애플리케이션과 싱글톤 (0) 2024.10.23 (스프링 기본) 11 - 스프링 빈 설정 메타 정보(BeanDefinition) (2) 2024.10.09 (스프링 기본) 10 - 다양한 설정 형식 지원(자바코드, XML) (0) 2024.10.09