JAVA 자바 디자인 패턴 : 싱글톤 패턴, 장단점, 의존성 주입, 예시

2024. 4. 16. 18:18코딩/코딩 테스트

JAVA 자바 디자인 패턴 : 싱글톤 패턴

 

자바에서 싱글톤(Singleton) 패턴은 객체의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다. 이 패턴은 전역 변수를 사용하지 않고 객체를 접근할 수 있게 하며, 같은 객체 인스턴스만을 계속해서 재사용합니다. 주로 공유 리소스에 대한 접근 제어나, 설정 정보 같은 경우에 유용하게 사용됩니다.

 

자바에서 싱글톤 패턴 구현 예시

싱글톤 패턴을 구현하는 방법은 여러 가지가 있지만, 가장 보편적인 방법은 private 생성자와 static 메소드를 사용하는 것입니다. 여기서는 Thread Safe하고 성능도 비교적 우수한 방법인 "Initialization-on-demand holder idiom"을 예로 들어 설명하겠습니다.

 

public class Singleton {
    private Singleton() {
        // private 생성자
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

 

 

싱글톤 패턴의 장점

  1. 인스턴스 제어: 인스턴스가 프로그램 전역에서 하나만 존재함을 보장하며, 이를 통해 리소스에 대한 접근을 제어할 수 있습니다.
  2. 메모리 절약: 동일한 객체를 여러 번 생성하지 않으므로 메모리 사용이 줄어듭니다.
  3. 데이터 공유: 싱글톤 인스턴스를 통해 다양한 클래스와 환경에서 데이터를 공유할 수 있습니다.

 

 

싱글톤 패턴의 단점

  1. 유연성 감소: 싱글톤 패턴은 OOP의 원칙 중 하나인 "개방-폐쇄 원칙"을 위반할 수 있으며, 코드의 유연성을 저하시킬 수 있습니다.
  2. 테스트 어려움: 싱글톤 인스턴스는 전역 상태를 가지므로 테스트가 어려워질 수 있습니다. 특히 모의 객체(mock objects)를 사용할 때 문제가 발생할 수 있습니다.
  3. 모듈간의 결합성 증가: -> 의존성 주입 (DI)를 통해 해결

 

 

의존성 주입(Dependency Injection)이란?

의존성 주입은 객체의 생성과 사용의 관심을 분리하여 객체간의 결합도를 낮추는 디자인 패턴입니다. 객체가 필요로 하는 의존 객체(dependency)를 외부에서 주입해주기 때문에, 객체는 필요한 의존성을 직접 생성하거나 검색할 필요가 없습니다. 이를 통해 코드의 모듈성과 테스트 용이성이 향상됩니다

 

  1. 결합도 감소: 클라이언트 코드는 인스턴스 생성 방법이나 생명주기를 몰라도 되므로, 다른 구현체로 쉽게 교체할 수 있습니다.
  2. 코드 유연성 향상: 싱글톤 객체를 인터페이스를 통해 주입받기 때문에, 다양한 상황에서 다른 객체로 대체할 수 있어 테스트와 유지보수가 용이해집니다.
  3. 테스트 용이성 증가: 싱글톤 객체 대신 모의 객체나 다른 구현체를 주입하여 테스트가 용이해집니다.

 

 

 

예시: 자바에서 의존성 주입 적용하기

자바의 스프링 프레임워크는 의존성 주입을 지원하는 대표적인 예입니다. 싱글톤 빈(bean)을 정의하여 스프링 컨테이너가 관리하도록 할 수 있습니다. 스프링은 기본적으로 싱글톤 스코프를 사용하여 빈을 생성합니다.

 

@Component
public class SingletonService {
    // 필요한 의존성은 자동으로 주입됨
}

@Service
public class ConsumerService {
    private final SingletonService singletonService;

    @Autowired
    public ConsumerService(SingletonService singletonService) {
        this.singletonService = singletonService;  // 의존성 주입
    }
}

 

 

 

 

 

 

 

 

 

 

 

JAVA 자바 디자인 패턴 : 싱글톤 패턴, 장단점, 의존성 주입, 예시