- 싱글톤 디자인 패턴은 뭘까?
- 싱글톤 디자인 패턴을 어떻게 적용할까?
- 싱글톤 디자인 패턴의 장/단점은 뭘까?

싱글톤 디자인 패턴이 뭐야?
시스템 상에서 어플리케이션이 실행될 때 최초 단 한 번만 객체를 메모리에 할당하고 공유해 사용하는 디자인 패턴
인스턴스가 필요할 때 기존의 생성된 인스턴스를 사용하게 한다.
DBCP (DataBase Connecting Pool)처럼 공통된 객체를 생성해서 사용해야할 때 사용한다.
싱글톤 디자인 패턴을 어떻게 적용할까?
싱글톤 디자인 패턴의 핵심은 객체를 단 하나만 만들고 그 객체를 공유해 사용한다는 것이다.
Thread Safe하게 싱글톤 패턴 적용하기
public class MockDAO {
private static MockDAO instance = new MockDAO();
private MockDAO() {}
public static synchronized MockDAO getInstance() {
return instance;
}
}
1. 생성자의 접근 제어자를 private으로 명시에 외부에서 객체 생성하는 것을 막는다
2. 클래스 로딩시점에 자신의 생성자를 이용해 객체를 생성하고 static 영역에 주소값을 저장한다.
3. public static Getter 메서드로 객체를 외부로 공유한다. 또한 synchronized 키워드를 이용하여 thread-safe하게 만든다.
하지만 이렇게 싱글톤 디자인 패턴을 적용하면, synchronized 특성상 큰 성능저하가 발생한다.
Holder에 의한 초기화
public class MockDAO {
private MockDAO() {
}
private static class LazyHolder {
public static final MockDAO INSTANCE = new MockDAO();
}
public static MockDAO getInstance() {
return LazyHolder.INSTANCE;
}
}
클래스 안에 Holder 클래스를 두어, JVM의 클래스 초기화 과정에서 보장되는 원자적 특성을 이용하여 객체를 재할당되지 않게 하였다. holder안에 인스턴스가 static이기 때문에 클래스 로딩시점에 한번만 호출되며 final 키워드를 사용해 값의 재할당을 막음으로써 싱글톤 디자인 패턴을 적용하였다.
싱글톤 패턴을 왜 써야하는가
하나의 객체만 생성하기 때문에 메모리 낭비를 방지할 수 있다.
또한, 두번째 이용시부터는 객체 로딩 시간을 현저히 감소시킬 수 있다.
싱글톤으로 만들어진 클래스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
싱글톤 패턴 적용시 주의해야할 점
싱글톤 인스턴스가 너무 많은 일을 할 경우에는 다른 클래스의 인스턴스들과 결합도가 높아져 수정과 테스트가 어려워진다. 따라서, 꼭 필요한 경우가 아니라면 지양하는 것이 좋다.
Reference
'Develop' 카테고리의 다른 글
| [Eclipse] Tomcat 에러, Serval port(8005, 8888) required by Tomcat 해결하는 법 (0) | 2022.05.11 |
|---|---|
| [Spring] Web Application Context 설정 (0) | 2022.05.10 |
| [Spring] properties 파일을 이용한 DI (0) | 2022.04.27 |
| [Spring] @Autowired, @Resource, @Inject의 차이 (0) | 2022.04.26 |
| [Spring] XML을 이용한 DI (0) | 2022.04.26 |