디자인패턴(1) - 싱글톤 패턴

BBB·2023년 8월 30일
0

디자인패턴

목록 보기
1/5

https://thebook.io/080326/0004/

질문 모음

	1. 싱글톤 패턴이란?
    2. 싱글톤 패턴의 예시
    3. 싱글톤 패턴의 장점
    4. 싱글톤 패턴을 언제 사용하면 좋을까?
    5. 싱글톤 패턴의 단점

1. 싱글톤 패턴이란?

하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴입니다.
애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴입니다.
보통 데이터베이스 연결 모듈에 많이 사용합니다.

GoF 디자인 패턴을 분류하는 기준 중, 싱글톤 패턴은 생성객체에 해당한다. 생성 패턴의 의미는 객체의 생성 과정에 관여를, 객체패턴은 객체간의 관련성을 다루고, 런타임에 변경될 수 있는 동적인 성격을 갖는다.

2. 싱글톤의 예시 (자바 - Eager Initialization)

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

3. 싱글톤 패턴의 장점

  1. 객체를 생성할 대마다 메모리 영역을 할당받아야 하지만, 한번의 new를 통해 객체를 생성한다면 메모리 낭비를 방지할 수 있다.
  2. 생성된 인스턴스를 활용하기 때문에 속도 측면에서도 이점이 있다.
  3. 싱글톤으로 구현한 인스턴트는 전역이므로, 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능하다.

4. 싱글톤 패턴을 언제 사용하면 좋을까?

주로 사용하는 경우는 주로 공통된 객체를 여러개 생성해서 사용해야하는 상황

데이터베이스 커넥션 풀, 스레드 풀, 캐시, 로그 기록 객체 등
& 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 때 사용

+) 데이터베이스 커넥션 풀이란? (+ HikariCP)
WAS(Web Application Server) - 데이터베이스 간 연결할 때는 많은 비용이 드는데, 그중 connecting이 크게 차지한다. 이를 보완한 것이 Connection Pool
커넥션 풀
이처럼 커넥션들을 풀안에 넣어서, 필요할 때마다 풀안에 커넥션을 이용하고 반환하는 기법 -> 그렇다면 커넥션의 비용을 낮출 수가 있다

+) HikariCP
가벼운 용량과 빠른 속도를 가지는 JDBC 커넥션풀 프레임워크. Springboot에서 사용중 (자주 봤던 기억이 있다!)

5. 싱글톤 패턴의 단점

  1. 멀티스레드 환경에서 동시성 문제 - (Lazy initialization)
    멀티스레드 환경에서 인스턴스가 없을 경우, 동시에 getInstance()를 실행한다면 각각 새로운 인스턴스들이 만들어지게 된다. 그렇다면 여러 스레드에서 동시에 진행하게 된다면 일정하지 않은 값들이 된다

    위의 코드는 멀티스레트 환경에서도 안전하지만, 예외처리 및 static의 메모리 적재로, 공간 자원 낭비 발생 가능의 문제가 있다. 하지만 크지 않은 객체라면 적용해도 무리는 없다

  2. 개방-폐쇄 원칙 위배
    만약 한 인스턴스에 데이터가 많이 공유되고 결합도가 높아진다면 개방-폐쇄 원칙에 위배가 된다 (결합도가 높아진다면, 유지보수가 어렵고, 테스트도 어렵게 된다)

앞서 언급한 코드에서 단점1을 해결할 수 있는 것이 두가지 -> privatesynchronized 라고 한다
하지만 synchronized의 경우, 코드의 특성을 잘 알지못하고 적용하게 되면, 오히려 더 복합해질 수 있는 상황에 처할 수 있다 (무조건 동기화의 느낌?)

그렇기 때문에 이와 관련된 것들은 JVM을 활용
싱글톤 문제 해결 방법

profile
꾸준히 성장하기

0개의 댓글