728x90
싱글톤 패턴?
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.
그래서 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다. private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다.
Test 코드에서 진행한다.
싱글톤 패턴 적용
package hello.core.singleton;
public class SingletonService {
// 1. static 영역에 객체를 딱 1개만 생성해둔다.
private static final SingletonService instance = new SingletonService();
// 2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다.
public static SingletonService getInstance() {
return instance;
}
// 3. 생성자를 private으로 선언해서 외부에서 new키워드를 사용한 객체 생성을 못하게 막는다.
// new SingletonService로 객체 생성하는 걸 막는다.
private SingletonService() {
}
public void logic() {
System.out.println("싱글톤 객체 로직 호출");
}
}
- static 영역에 객체 instance를 미리 하나 생성해서 올려둔다.
- 이 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회할 수 있다. 이 메서드를 호출하면 항상 같은 인스턴스를 반환한다.
- 딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드 로 객체 인스턴스가 생성되는 것을 막는다.
싱글톤 패턴을 테스트 해보자
싱글톤을 무시하고 new를 사용하여 SingletonService() 객체를 호출해보겠다.
new로 SingletonService를 호출하면 " SingletonService() has private access"라는 error가 뜬다.
그렇다면, 싱글톤을 적용한 getInstance()로 2번 SingletonService를 호출해서 2개가 같은 것인지 비교해보겠다.
singletonService1과 singletonService2가 동일한 SingletonService를 참조하고 있는 것을 알 수 있다.
📌 isSameAs와 isEqualTo의 차이
테스트 코드에서 사용되는 객체 또는 값의 동등성을 비교할 때 사용되는 메서드
isSameAs | ● 자바의 == 참조어 비교 ● 객체의 참조 동등성을 비교 ● 두 객체가 동일한 인스턴스인 경우 ● 객체의 메모리 주소를 직접 비교하므로 내용이 같아도 다른 인스턴스일 경우 실패 |
isEqualTo | ● 자바의 Equal ● 객체의 내용 동등성을 비교 ● 두 객체의 값이 같은 경우 ● 내부적으로는 객체의 필드나 상태를 비교 |
싱글톤의 장점
객체를 생성하는 것보다 이렇게 객체를 가져오는 비용이 훨씬 저렴하기 때문이다.
객체를 공유할 수 있다.
싱글톤의 단점
- 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
- 의존관계상 클라이언트가 구체 클래스에 의존한다.
- DIP를 위반한다.
- 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다.
- 테스트하기 어렵다.
- 내부 속성을 변경하거나 초기화 하기 어렵다.
- private 생성자로 자식 클래스를 만들기 어렵다.
- 결론적으로 유연성이 떨어진다.
- 안티패턴으로 불리기도 한다.
그렇다면 왜 사용하는가? 스프링 프레임워크는 싱글톤의 단점으로 모두 해결해서 사용할 수 있게 한다.
다음 게시글 참고!
'공부 > Spring' 카테고리의 다른 글
[Spring] 싱글톤 방식의 주의점 (1) | 2023.11.20 |
---|---|
[Spring] 싱글톤 컨테이너 (0) | 2023.11.20 |
[Spring] 웹 애플리케이션과 싱글톤 (1) | 2023.11.14 |
[Spring] 스프링 빈 설정 메타 정보 - BeanDefinition (0) | 2023.11.10 |
[Spring] 다양한 설정 형식 지원 - 자바 코드, XMl (0) | 2023.11.09 |