밤빵's 개발일지
[TIL]20240917 Singleton! 본문
🤓싱글턴(Singleton)에 대해 알아보기
최근 디자인 패턴 중 하나인 싱글턴 패턴(Singleton Pattern)에 대해 알게 되었다. 싱글턴 패턴은 객체지향 프로그래밍에서 자주 사용하는 패턴 중 하나인데, 이번 개발일지를 통해 싱글턴 패턴이 무엇인지, 어떤 상황에서 사용되는지, 그리고 어떻게 구현하는지에 대해 정리하려 한다!
▶ 싱글턴 패턴이란?
싱글턴 패턴은 하나의 클래스에 대해 단 하나의 객체만 생성되도록 보장하는 디자인 패턴이다. 프로그램이 실행되는 동안 해당 클래스의 인스턴스가 딱 하나만 존재해야 할 때 사용된다. 이는 주로 애플리케이션 전체에서 공유되는 리소스를 관리할 때 사용된다. 싱글턴 패턴을 적용하면, 여러 곳에서 해당 객체를 생성하려 해도 동일한 인스턴스를 반환하게 되어 시스템 자원을 절약하고, 데이터 일관성을 유지할 수 있다.
▶싱글턴 패턴이 필요한 상황
싱글턴 패턴은 공유 리소스를 관리하거나, 전역 상태를 유지해야 할 때 유용하다.
싱글턴 패턴을 적용할 수 있는 대표적인 상황들:
→ 데이터베이스 연결:
애플리케이션에서 데이터베이스 연결 객체는 여러 개를 생성할 필요 없이 하나만 있으면 충분하다. 하나의 데이터베이스 연결 객체를 공유함으로써 자원을 효율적으로 사용할 수 있다.
→ 로그 시스템:
로그 기록을 관리하는 클래스는 애플리케이션 전반에서 하나의 인스턴스를 공유하는 것이 좋다. 여러 개의 로그 인스턴스가 존재하면 로그가 중복되거나 일관성 문제가 발생할 수 있다.
→ 설정 클래스:
애플리케이션의 설정 값은 일반적으로 하나의 인스턴스로 관리되어야 한다. 설정 값이 여러 곳에서 변경되면 애플리케이션의 동작이 예측할 수 없게 되므로, 하나의 설정 인스턴스를 사용하는 것이 바람직하다.
▶싱글턴 패턴의 구현
싱글턴 패턴을 구현하기 위해서는 세 가지 주요 원칙을 따른다.
→ 하나의 인스턴스만 생성:
클래스가 단 하나의 인스턴스만 생성되도록 보장해야 한다.
→ 전역 접근을 제공:
클래스 외부에서 해당 인스턴스에 접근할 수 있는 전역적인 접근 방식을 제공해야 한다.
→ 외부에서 객체 생성 불가:
클래스 외부에서 생성자를 통해 객체를 만들지 못하도록 생성자를 private으로 설정해야 한다.
▶싱글턴 패턴 구현 예시
public class Singleton {
// 1. 하나의 인스턴스를 유지하기 위한 정적 변수
private static Singleton instance;
// 2. 외부에서 객체를 생성하지 못하도록 생성자를 private으로 선언
private Singleton() {
// private 생성자
}
// 3. 인스턴스를 반환하는 메서드 (객체가 없을 경우에만 생성)
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton(); // 최초로 호출될 때 객체 생성
}
return instance;
}
}
→ 이 코드는 간단한 싱글턴 패턴의 예시로, 중요한 점은 private 생성자로 인해 외부에서는 이 클래스의 인스턴스를 직접 생성할 수 없다는 것이다. 대신, getInstance() 메서드를 통해 이미 생성된 객체를 반환받게 된다. 만약 객체가 아직 생성되지 않았다면, getInstance()에서 처음으로 객체를 생성한다.
▶멀티스레드 환경에서의 싱글턴 패턴
위 코드에서는 단일 스레드 환경에서는 문제가 없지만, 멀티스레드 환경에서는 문제가 발생할 수 있다. 두 개 이상의 스레드가 동시에 getInstance() 메서드를 호출할 경우, 동일한 객체가 여러 번 생성될 수 있기 때문이다. 이를 해결하기 위해서는 동기화(synchronization)를 추가해야 한다. 동기화된 getInstance() 메서드는 여러 스레드가 동시에 접근하더라도 객체가 하나만 생성되도록 보장해 준다.
public class Singleton {
private static Singleton instance;
private Singleton() {
// private 생성자
}
// 동기화된 getInstance() 메서드
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
→ 이 코드는 synchronized 키워드를 사용하여 스레드 간의 충돌을 방지하고, 여러 스레드가 동시에 접근하더라도 하나의 인스턴스만 생성되도록 보장한다.
▶싱글턴 패턴의 장점
→ 리소스 절약:
하나의 인스턴스만 생성하여 메모리 사용을 최적화할 수 있다. 이는 특히 자원이 제한된 환경에서 중요하다.
→ 전역 상태 관리:
애플리케이션 전역에서 객체의 상태를 일관되게 유지할 수 있다.
→ 데이터 일관성:
여러 곳에서 동일한 인스턴스를 사용하므로 데이터 일관성을 유지할 수 있다.
▶싱글턴 패턴의 단점
→ 테스트 어려움:
싱글턴 패턴은 전역 상태를 가지기 때문에 유닛 테스트에서 독립적인 테스트가 어렵다. 객체를 재설정하기가 쉽지 않다.
→멀티스레드 환경:
앞서 언급한 것처럼 동기화 없이 싱글턴을 구현하면 멀티스레드 환경에서 문제가 발생할 수 있다. 이를 해결하기 위해 동기화를 추가하면 성능이 저하될 수 있다.
▶정리
싱글턴 패턴은 하나의 인스턴스를 유지해야 할 때 유용하고, 특히 리소스를 절약하고 전역 상태를 관리하는 데 효과적이다. 하지만 멀티스레드 환경에서의 문제나 테스트의 어려움 등도 함께 고려해야 한다. 싱글턴 패턴은 자바의 다양한 애플리케이션에서 많이 사용되고, 특히 리소스를 공유해야 하는 상황에서 그 유용성을 발휘한다.
'개발Article' 카테고리의 다른 글
[TIL]20240919 REST 와 SOAP (0) | 2024.09.19 |
---|---|
[TIL]20240918 TCP? UDP? (0) | 2024.09.18 |
[TIL]20240916 결제 연동 흐름의 보완점 (7) | 2024.09.16 |
[WIL]20240915 JSON직렬화/역직렬화 (0) | 2024.09.15 |
[TIL]20240914 Gradle과 Maven의 차이점 (0) | 2024.09.15 |