면접을 위한 CS 지식공부 디자인패턴 - 싱글톤 패턴

강성준·2024년 2월 18일

개발을 하면서 당연하게 사용하지만 명확히 왜 무엇때문에 쓰는지 명확하게
설명하기 힘든 경우가 있다. 대충 무엇인지 알고는 있는데 질문을 받았을 때, 면접시 설명해야할때
난감한 경우들이 더러 있다. 그런 불상사를 막기 위해서 CS(Computer Science)
공부하면 어렴풋이 알고 있던 지식을 면접시 설명하기에 굉장히 수월해질 것이다.

나도 마찬가지로 그런 상황들이 비일비재했고, 또 현재 구직준비를 다시 하면서 준비해보려한다.
얼마전 관련 도서를 구매하기 위해 중고서점에 다녀왔는데, 잠깐 읽어보았지만 굉장히 쉽고 빠르게
CS 지식을 공부할 수 있는 도서를 발견해서 공부 및 면접 준비겸 시리즈로 기록하려 한다.


디자인 패턴

디자인 패턴이란?
디자인 패턴은 자주 발생하던 문제점을 객체간의 상호작용을 통해 해결하는
하나의 규약 형태로 만들어 둔것을 칭한다.(문제 해결을 하기위한 공통화된 틀이라고 보자.)

대표적으로 싱글톤 패턴, 팩토리 패턴 등 여러가지의 패턴이 존재한다.
면접시에 대부분 디자인 패턴을 아는데로 이야기 해보라고 하는 곳도 있었고, 말했던 디자인패턴을
직접 손코딩으로 구현해보라는 곳도 있었다. 그만큼 디자인 패턴은 여러 상황에 많이 쓰이는것 같다.

싱글톤 패턴(Singleton Pattern)

싱글톤 패턴이란?
싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴을 싱글톤 패턴이라 한다.
인스턴스가 하나만 존재하여야 하는것이 보장 되어야하는 경우 사용된다.
보통 데이터베이스 연결 모듈에 많이 사용되며, 대표적으로 Spring의 Bean이 싱글톤 패턴이다.

싱글톤 패턴이라고 하면 인스턴스가 하나만 존재하여야 하는 경우 사용된다고 알고있다.
하지만 왜 인스턴스가 하나만 존재하여야 하는가? 이에 대한 답을 한번 찾아보자.


싱글톤 패턴을 사용하는 이유

먼저 싱글톤 패턴을 사용하는 이유에 대해서 알아보자.
싱글톤 패턴은 최초 1회만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용한다.
왜 굳이 이렇게 할까? 이유는 간단하다. 메모리 낭비를 방지하기 위해서다.

하나의 인스턴스를 생성해두고 다른 모듈들이 공유하면서 사용하기 때문에 (전역 인스턴스)
인스턴스를 필요할때마다 생성하지 않고 사용할 수 있어 메모리를 낭비하지 않기 때문이다.

이해가 잘 안간다면 Spring의 Bean을 떠올려보자.


싱글톤 패턴의 단점

반대로 싱글톤 패턴을 사용했을때의 단점도 존재한다.

  1. 단위 테스트(TDD)시에 문제가 될 수 있음.
  2. 싱글톤 패턴 사용시 결합도가 높아지는 단점.

단위 테스트시 싱글톤 패턴의 단점

요즘엔 주로 TDD 방식의 개발을 진행하면서, 단위 테스트를 주로 하게 되는데, 단위 테스트는
테스트가 서로 독립적이여하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로
구현하는 패턴이므로 테스트마다 '독립적인' 인스턴스를 만들기가 어렵기 때문이다.

한줄정리
테스트별 독립적인 인스턴스를 만들기 어려우므로 단위 테스트시 부적합할 수 있다.


싱글톤 패턴 사용시 결합도가 높아지는 단점

싱글톤 패턴은 사용하기 쉽고 굉장히 실용적이지만 모듈간의 결합도를 높일 수 있다는 단점이 있다.
이를 해결하는 방법으로는 의존성 주입(DI : Dependency Injection) 을 통하여 모듈간
의존성을 낮추는 방법으로 해결할 수 있다.

한줄정리
싱글톤 패턴 사용시 결합도가 높아질 수 있으나, 의존성 주입을 통해 해결할 수 있다.


Java로 싱글톤 패턴을 구현

위에서 말한데로 싱글톤 패턴을 손코딩으로 구현해보라는 곳들도 있다.
한번 Java로 싱글톤 패턴을 구현을 해보자.

먼저 가장 Basic한 싱글톤 패턴의 구현 코드다.

public class Singleton {
	private static final singleton instance = new Singleton();
    
    private Singleton() {}
    
    public static Singleton getInstance() {
    	return instance;
    }
}

대부분 싱글톤을 구현하는 코드는 위와 같이 많이 보았을 것이다.
나도 싱글톤 구현하는 방법은 이렇게만 알고 있었는데, 싱글톤 패턴을 구현하는 방식이
여러가지가 있다. 그 중에 제일 널리 쓰인다는 방식이 아래와 같다.

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

Inner Class를 두어 싱글톤 인스턴스를 갖게 한다.
이 방법은 Singleton 클래스가 로드 될 때에도 인스턴스가 만들어 지지 않다가
getInstance 메서드를 통해 호출시 메모리를 할당받고 인스턴스를 생성한다.
위의 방식은 클래스가 로드되자 마자 인스턴스가 생성되어 사용하지 않아도 불필요하게
메모리를 낭비할 수 있지만, 해당 방식은 그렇지 않다.


정리

  1. 디자인 패턴은 자주발생하는 문제를 해결하기 위한 틀이다.
  2. 메모리 낭비를 방지하기 위해, 인스턴스가 하나만 존재해야할때 사용한다.
  3. 싱글톤 패턴을 사용하면 단위테스트가 어려워질 수 있고, 결합도가 강해질 수 있다.
  4. 싱글톤 패턴을 구현하는 방식은 여러가지가 있으나 자주 사용하는 방식도 있다.
profile
Java, Spring Framework로 백엔드 개발을 하는 개발자입니다.

0개의 댓글