싱글톤 패턴 (Singleton Pattern)
어플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static)
그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다
즉 객체의 인스턴스가 오직 1개만 생성되는 패턴이라고 보면 된다
인스턴스가 필요할 때 새로 만들지 않고 기존의 인스턴스를 활용하는 것이다
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
class Main {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
instance.printMsg();
instance2.printMsg();
}
}
싱글톤 패턴의 사용 이유
- 메모리 측면
- 데이터 공유가 쉬움
예를들어 레지스트리 같은 설정 파일의 경우 객체가 여러개 생성되면
설정 값이 변경될 위험이 생길수 있다
이때 싱글톤패턴을 이용하면 하나의 인스턴스를 메모리에 등록해서
여러 쓰레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있게
할 수 있어서 요청이 많은 곳에서 사용하면 효율을 높일 수 있다
주의할 점은 싱글톤을 만들 때 동시성 (Concurrency) 문제를 고려해서 설정해야 한다
싱글톤 패턴의 장점
- 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다
- 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이
데이터를 공유하기 쉽다
- 인스턴스가 절대적으로 한 개만 존재하는 것을 보장하고 싶을 경우 사용한다
- 두 번째 이용시 부터는 객체 로딩 시간이 줄어 성능이 좋아지는 장점이 있다
- DBCP (DataBase Connection Pool) 처럼 공통된 객체를 여러개 생성해서
사용해야 하는 상황에서 많이 사용된다
싱글톤 패턴의 단점
- 싱글톤 인스턴스가 너무 많은 일을 하거나많은 데이터를 공유시킬 경우에
다른 클래스의 인스턴스들 간에 결합도가 높아져 개방-폐쇄 원칙을 위배하게 된다
- 객체지향설계 원칙에 어긋나기 때문에 수정이 어려워지고 유지보수의 비용이 높아질 수 있다
- 멀티쓰레드 환경에서 동기화 처리를 안하면 인스턴스가 2개가 생성 될 수 있는 가능성이 있다
syncronized 키워드를 사용해서 해결해야한다
- 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번
인스턴스의 상태를 초기화시켜줘야한다 그렇지 않으면 어플리케이션 전역에서 상태를
공유하기 때문에 테스트가 온전하게 수행되지 못해 테스트의 어려움이 있다
오직 한개의 인스턴스 생성을 보증해 주어 좋은점도 있지만 나쁜점도 많다
싱글톤 패턴은 안티패턴으로 불릴 만큼 단독으로 사용한다면
객체지향에 위반되는 사례가 많이 있다
스프링 컨테이너 같은 프레임워크의 도움을 받으면 문제점들을 보완하며
장점의 혜택을 누릴 수도 있다
실제로 스프링 빈은 컨테이너의 도움을 받아 싱글톤 스콥으로 관리되고 있다
'CS' 카테고리의 다른 글
[CS] 매개변수(parameter), 전달인자(argument) (0) | 2022.10.06 |
---|---|
[CS] HTTP Status Code (0) | 2022.10.06 |
[CS] 트랜잭션 (0) | 2022.10.05 |
[CS] 빌드관리도구, Maven, Gradle (0) | 2022.10.04 |
[CS] DTO, DAO, VO 차이점 (0) | 2022.10.04 |