JAVA/Design Pattern

[디자인 패턴] 자바의 싱글톤 패턴 (static)

빅콜팝 2022. 11. 4. 23:22
728x90
반응형

싱글톤 패턴(Singleton Pattern)


하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴으로, 보통 데이터베이스 연결 모듈(DBCP, DataBase Connection Pool)에 많이 사용된다. 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에  인스턴스를 생성할 때 드는 비용이 줄어드는 장점이 있고, 반대로 의존성이 높아진다는 단점이 있다.

 

자바에서 static 키워드를 사용하면 오직 하나의 인스턴스를 사용하는 싱글톤 패턴이 된다.

class Singleton{
    private static class singleInstanceHolder{
        private static final Singleton INSTANCE = new Singleton();
    }
    public static synchronized Singleton getInstance(){
        return singleInstanceHolder.INSTANCE;
    }
}

public class HelloSingleton {
    public static void main(String[] args) {
        Singleton a = Singleton.getInstance();
        Singleton b = Singleton.getInstance();

        System.out.println(a.hashCode());
        System.out.println(b.hashCode());

        if(a==b) System.out.println(true);
    }
}
// result
1018547642
1018547642
true

참고로 스프링의 Bean은 기본적으로 싱글톤 형식을 띄고 있다.

 

싱글톤 패턴의 장점


1. 메모리 관리

최초 한번의 new 연산자를 통해 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다.

또한 이미 생성된 인스턴스를 활용함으로 재사용시 속도 측면에서도 이점이 있다.

 

2. 데이터 공유

싱글톤 인스턴스는 전역으로 사용되기 때문에 다른 클래스에서 인스턴스의 접근하여 사용할 수 있어 데이터 공유가 수월하다.

 

 

싱글톤 패턴의 단점


1. 성능저하

동시성 문제해결을 위한 synchronzied 사용 시 Thread-safe 보장을 위한 성능 저하 발생한다.

스레드 안전(Thread-safe) :  멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻함

 

2. 테스트 코드 작성

싱글톤 패턴은 TDD(Test Driven Development)를 할 때 걸림돌이 된다.

TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 한다.

하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 독립적인 인스턴스를 만들기가 어렵다.

 

싱글톤 패턴은 사용하기가 쉽고 실용적이지만 모듈 간의 결합을 강하게 만들 수 있다는 단점이 있다.

이때 의존성 주입(DI, Depnedency Injection)을 통해 모듈간의 결합을 조금 더 느슨하게 만들어 해결할 수 있다.

 

// TODO 스프링의 3가지 의존성 주입 방법

 

 

Reference

https://thebook.io/080326/ch01/01/01-01/

https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/

728x90
반응형