728x90
싱글톤 패턴이란?
하나의 인스턴스만 생성하여 사용하는 디자인 패턴 (클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴)
사용법
- static 영역에 객체 instance를 하나 미리 생성한다
- 이 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회할 수 있도록 한다 (이 메서드는 항상 같은 인스턴스를 반환함)
- 오직 하나의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막아준다
public class SingletonService {
// static 영역에 객체를 "1개"만 생성해둔다
private static final SingletonService instance = new SingletonService();
// public으로 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용
public static SingletonService getInstance() {
return instance;
}
// 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다
private SingletonService() {
}
public void logic() {
System.out.println("싱글톤 객체 로직 호출");
}
}
참고: 싱글톤 패턴을 구현하는 방법은 여러가지가 있음!!
여기서는 객체를 미리 생성해두는 가장 단순하고 안전한 방법을 보여주었음
장점
- 불필요한 낭비를 막아준다
- api가 호출될때 마다 새로운 객체를 생성하는 것이 아닌, 미리 만들어둔 객체를 공유해서 효율적으로 사용할 수 있음
- 싱글톤으로 구현한 인스턴스는 전역이므로 다른 클래스들의 인스턴스들이 데이터를 공유할 수 있다
단점
- 멀티스레드 환경에서 동기화 처리를 하지 않았을 때, 인스턴스가 2개가 생성될 수 있음
- 싱글톤 패턴을 구현하는 코드 자체가 많이 들어감
- 의존관계상 클라이언트가 구체 클래스에 의존한다 -> DIP 위반
- 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높음
- 내부 속성을 변경하거나 초기화하기 어려움
- private 생성자로 자식 클래스를 만들기 어려움
- 결합도가 높아져 유연성이 떨어짐 -> 유지보수 힘들어짐, 테스트하기 어려움
- 안티패턴으로 불리기도 함
728x90
'개발일지 > Spring' 카테고리의 다른 글
Spring 다양한 의존성 주입 (0) | 2023.03.14 |
---|---|
스프링 싱글톤 컨테이너 (Spring Singleton Container) (0) | 2023.03.03 |
좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2023.02.25 |
Spring-boot Querydsl 사용해보기! (0) | 2023.01.23 |
캐시 사용해보기 @Cacheable, @CacheEvict (Spring-boot) (0) | 2023.01.13 |