디자인 패턴을 사용해서 리팩터링을 하면서 계속해서 어떤 패턴을 사용해야 하는지 고민을 하고 매번 찾아보게 되는 거 같아서 내가 쉽게 이해하고 다시 보기 위해 디자인 패턴에 대해서 정리를 해보려고 한다.
일단 가장 기본이 되는 싱글턴 패턴 부터 정리를 해보도록 하겠다.
⚡싱글턴 패턴이란?
싱글턴(singleton)은 클래스에 인스턴스가 하나만 생성되도록 하는 패턴이다. 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
클래스의 생성자를 private으로 선언하여 외부에서 인스턴스를 직접 생성할 수 없게 만든 다음, 클래스 내부에서 유일한 인스턴스를 생성하고 이를 반환하는 static 메서드를 구현한다. 이렇게 구현된 클래스를 사용하면 전역 변수처럼 어디서든 접근이 가능한 하나의 인스턴스를 사용할 수 있게 된다.
⚡싱글턴은 어떤 경우에 사용하는가?
개발 내에서는 어떻게 사용하는지 대표적인 예시를 정리해보려고 한다.
- 로그 클래스: 로그를 기록하는 기능을 수행하는 클래스는 전체 시스템에서 공유되어야 하며, 로그를 중복으로 남기면 안 되기 때문에 사용한다.
- 데이터베이스 연결: 데이터베이스 연결 객체는 매번 새로 생성하는 것이 비효율적이므로, 전체 시스템에서 하나만 존재하도록 한다.
- 시스템 설정: 시스템 설정을 저장하는 클래스는 전체 시스템에서 유일하게 사용되어야 하므로 싱글턴 패턴을 사용한다.
- 캐싱: 캐시 객체는 전체 시스템에서 하나만 존재해야 하며, 캐시를 중복으로 생성하면 메모리를 낭비하게 된다.
- 스레드 풀: 스레드 풀은 전체 시스템에서 공유되어야 하며, 스레드를 매번 새로 생성하는 것이 비효율적이다.
⚡싱글턴의 장단점
싱글턴 패턴 장점
- 전역 변수를 사용하지 않고도 하나의 인스턴스를 공유할 수 있다.
- 인스턴스 생성을 제어하여 메모리를 절약할 수 있다.
- 인스턴스 생성이 한 번만 이루어지므로, 인스턴스의 동일성을 보장할 수 있다.
- 단일 책임 원칙(SRP)을 준수하여, 클래스의 책임이 명확해진다.
싱글턴 패턴 단점
- 멀티 스레드 환경에서 안전성을 보장하지 못하면, 인스턴스가 여러 개 생성될 수 있다.
- 디자인이 복잡해지고, 의존성이 높아질 수 있다.
- 단위 테스트의 어려움 등이 있다.
⚡싱글턴 패턴에 대한 소스 정리
기본적으로 싱글턴 패턴 사용 방법부터 synchronized, LazyHolder를 사용하는 부분까지 gitHub에 올려놓고 간단하게 설명까지 적어 놓았다.
⚡생각
싱글턴 패턴에 대해서 검색을 해봤다면 무수히 많은 예제와 어떻게 사용을 해야 하는지 잘 정리가 되어있다.
내가 웹을 개발하면서 사용하는 부분은 위에서 적은 내용 외에 실제 개발에 적용해서 사용하는 경우는 거의 없었다. 싱글턴을 정리하면서 synchronized의 성능 이슈부터 LazyHolder에서 static class가 어떻게 초기화되는지를 다시 한번 정리해 볼 수 있었다.
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 어댑터 패턴에 대한 내용 정리 (0) | 2023.03.24 |
---|---|
[디자인 패턴] 프로토 타입 패턴에 대한 내용 정리 (0) | 2023.03.21 |
[디자인 패턴] 빌더 패턴에 대한 내용 정리 (0) | 2023.03.20 |
[디자인 패턴] 추상 팩토리 패턴에 대한 내용 정리 (0) | 2023.03.16 |
[디자인 패턴] 팩토리 메소드 패턴에 대한 내용 정리 (0) | 2023.03.14 |