https://thebook.io/080326/0004/
질문 모음
1. 싱글톤 패턴이란?
2. 싱글톤 패턴의 예시
3. 싱글톤 패턴의 장점
4. 싱글톤 패턴을 언제 사용하면 좋을까?
5. 싱글톤 패턴의 단점
하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴입니다.
애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴입니다.
보통 데이터베이스 연결 모듈에 많이 사용합니다.
GoF 디자인 패턴을 분류하는 기준 중, 싱글톤 패턴은 생성
과 객체
에 해당한다. 생성
패턴의 의미는 객체의 생성 과정에 관여를, 객체
패턴은 객체간의 관련성을 다루고, 런타임에 변경될 수 있는 동적인
성격을 갖는다.
class Singleton {
private static class singleInstanceHolder {
private static final SingleTon INSTANCE = new Singleton();
// 핵심! private 로 만들어서 외부에서객체 생성을 막아야한다!
}
public static synchronized SingleTone getInstance() {
return singleInstanceHolder.INSTANCE;
}
}
public class HelloWorld {
public static void main(String[] args) {
Singleton a = Singleton.getInstance();
Singleton b = Singleton.getInstance();
if (a == b) {
System.out.println(true);
}
}
}
// true
new
를 통해 객체를 생성한다면 메모리 낭비를 방지할 수 있다.전역
이므로, 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능하다.주로 사용하는 경우는 주로 공통된 객체를 여러개 생성해서 사용해야하는 상황
데이터베이스 커넥션 풀, 스레드 풀, 캐시, 로그 기록 객체 등
& 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 때 사용
+) 데이터베이스 커넥션 풀이란? (+ HikariCP)
WAS(Web Application Server) - 데이터베이스 간 연결할 때는 많은 비용이 드는데, 그중 connecting
이 크게 차지한다. 이를 보완한 것이 Connection Pool
이처럼 커넥션들을 풀안에 넣어서, 필요할 때마다 풀안에 커넥션을 이용하고 반환하는 기법 -> 그렇다면 커넥션의 비용을 낮출 수가 있다
+) HikariCP
가벼운 용량과 빠른 속도를 가지는 JDBC 커넥션풀 프레임워크. Springboot에서 사용중 (자주 봤던 기억이 있다!)
멀티스레드 환경에서 동시성 문제 - (Lazy initialization)
멀티스레드 환경에서 인스턴스가 없을 경우, 동시에 getInstance()를 실행한다면 각각 새로운 인스턴스들이 만들어지게 된다. 그렇다면 여러 스레드에서 동시에 진행하게 된다면 일정하지 않은 값들이 된다
위의 코드는 멀티스레트 환경에서도 안전하지만, 예외처리 및 static의 메모리 적재로, 공간 자원 낭비 발생 가능의 문제가 있다. 하지만 크지 않은 객체라면 적용해도 무리는 없다
개방-폐쇄 원칙 위배
만약 한 인스턴스에 데이터가 많이 공유되고 결합도가 높아진다면 개방-폐쇄 원칙에 위배가 된다 (결합도가 높아진다면, 유지보수가 어렵고, 테스트도 어렵게 된다)
앞서 언급한 코드에서 단점1
을 해결할 수 있는 것이 두가지 -> private
와 synchronized
라고 한다
하지만 synchronized
의 경우, 코드의 특성을 잘 알지못하고 적용하게 되면, 오히려 더 복합해질 수 있는 상황에 처할 수 있다 (무조건 동기화의 느낌?)
그렇기 때문에 이와 관련된 것들은 JVM
을 활용
싱글톤 문제 해결 방법