[Java] 싱글톤 패턴

Junwon SEO·2023년 1월 8일
0

Java 스터디

목록 보기
1/1

1. 싱글톤 패턴이란?

싱글톤 패턴은 디자인 패턴의 한 종류로 정의를 살펴보면 아래와 같다.

싱글톤 패턴(SingleTon Pattern) : 객체의 인스턴스가 단 1개만 생성되는 패턴

조금 풀어서 설명하자면, 프로그램이 시작될 때 어떤 클래스에 최초 한 번만 메모리를 할당하고 해당 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 이를 위해 static 키워드를 사용해 메모리를 공유하게 되며 프로그램 전역에서 접근이 가능하다.

2. 싱글톤 패턴을 왜 사용할까?

이처럼 인스턴스를 하나만 생성하여 공유하면 어떠한 이점이 있을까?

가장 우선이 되는 이점은 아무래도 메모리 측면일 것이다. 최초에 new 연산자를 한번만 실행해서 메모리 영역을 고정시켜 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 뿐만 아니라 이미 생성된 인스턴스를 활용하기 때문에 속도 측면에서도 이점이 있다고 볼 수 있다.

다음으로는 다른 클래스 간에 데이터 공유가 쉽다는 것이다. 싱글톤 패턴을 사용하면 프로그램 전역에서 해당 인스턴스에 접근할 수 있기 때문에 클래스 간 데이터 공유를 보다 쉽게 할 수 있다. 하지만 여러 클래스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성(Concurrency) 문제가 발생할 수 있으니 이점에 유의해서 설계해야한다.

이 외에 도메인 관점에서 인스턴스가 한개만 존재해야 함을 코드적으로 보증하고 싶은 경우 싱글톤 패턴을 사용하기도 한다.

3. 싱글톤 패턴의 단점

싱글톤 패턴을 적절히 사용하면 위와 같은 이점을 얻을 수 있지만 무분별한 싱글톤 패턴의 사용은 아래와 같은 문제점을 수반하기 때문에 이러한 trade-off를 잘 고려하여 사용해야 한다.

우선 싱글톤 패턴을 남발하게 되면 테스트를 하기 어렵다. 싱글톤 패턴의 인스턴스는 메모리를 공유하고 있기 때문에 격리된 환경에서 테스트를 하려면 매번 인스턴스의 상태를 초기화 해주어야한다. 그렇지 않으면 프로그램 전역에서 상태를 공유하기 때문에 테스트를 온전히 수행할 수 없다.

다음으로 의존 관계상 클라이언트가 구체 클래스에 의존하게 된다. new 키워드를 직접 사용하여 클래스 안에서 객체를 생성하고 있으므로, 이는 SOLID 원칙 중 DIP를 위반하게 되고, 프로그램 전역에서 접근이 가능한 만큼 다른 클래스들의 인스턴스들과 결합도가 높아져 OCP 원칙 또한 위반할 가능성이 높다.

이외에도 자식클래스를 만들수 없다는 점과, 내부 상태를 변경하기 어렵다는 점 등 여러가지 문제들이 존재한다. 결과적으로 이러한 문제들을 안고있는 싱글톤 패턴은 유연성이 많이 떨어지는 패턴이라고 할 수 있다.

4. 싱글톤 패턴의 구현

public class Company{
	// #1 
    private static Company instance = new Company();
    
    // #2
    private Company{
    
    }
    
    // #3
    public static Company getInstance() {
    	return instance;
    }
    
}

#1
Company 인스턴스를 new 키워드를 통해 생성한다. 유일한 하나의 인스턴스를 생성해야 하므로 private static 키워드를 추가한다.

#2
생성자를 만들지 않으면 컴파일러는 public 디폴트 생성자를 만들어준다. 이렇게 되면 프로그램 전역에서 Company 인스턴스를 생성할 수 있게 된다. 따라서 이를 방지하고자 private으로 기본 생성자를 하나 만들어준다.

#3
앞서 생성한 인스턴스는 private으로 설정되어 있기 때문에 해당 인스턴스에 접근하기 위한 public 메서드를 생성한다. 이 때 외부에서 별도의 인스턴스 생성 없이 클래스 이름만으로 해당 인스턴스에 접근할 수 있도록 static 키워드를 추가한다.

5. 결론

싱글톤 패턴이 무엇이고, 어떤 이점과 문제점이 있으며 이를 구현하기 위한 방법에 대해 알아보았다. 오직 한 개의 인스턴스 생성을 보증하여 효율을 찾을 수 있지만 그에 못지많게 수반되는 문제점도 많다. 싱글톤 패턴은 안티패턴으로 불릴 만큼 단독으로 사용한다면 객체 지향 원칙을 위반하게 되는 문제가 있다.

하지만 스프링 컨테이너 같은 프레임워크의 도움을 받으면 싱글톤 패턴의 문제점들을 보완하면서 싱글톤 패턴의 이점을 살릴 수 있다. 예를 들어 스프링 빈은 컨테이너의 도움을 받아 싱글톤 scope로 관리되고 있다.

이처럼 프레임워크의 도움을 받아 싱글톤 패턴을 적절하게 사용할 수 있으며 프레임워크의 도움 없이 직접 코드를 통해 싱글톤 패턴을 사용하고 싶다면 앞서 설명한 trade-off를 잘 고려하여 설계해야 한다.

0개의 댓글