본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/JAVA

[Java] 자바에서 싱글톤 패턴 이해하기

by 미노드 2024. 1. 13.

싱글톤 패턴이란 클래스의 인스턴스를 하나만 생성하여 사용하는 패턴이입니다.
주로 1개의 인스턴스를 여러곳에서 공유해야 할 때 사용합니다.
싱글톤 패턴을 이용함으로써 메모리에 인스턴스 하나를 등록해 여러 쓰레드에서 동시에 하나의 객체를 이용할 수 있게 합니다.

하나만 있어도 잘돌아가는 것이 어떤게 있을까요?
로그기록용 객체, 사용자 설정 객체, 커넥션 풀 객체 같은게 있을 것 같습니다.
객체가 2개 이상이면 프로그램이 이상하게 돌아가거나 자원을 불필요하게 잡아먹을 수 있습니다..

큰 특징으로, 생성자가 private으로 설정되어, 내부 getInstance() 로 호출할때 객체가 빈값일 경우에만 생성되도록 합니다.
getInstance()  정적 메소드(static methods)   

객체를 생성하게 되면 그 클래스의 인스턴스는 Heap 메모리에 올라가게 되고, 그 인스턴스를 가리키고 있는 변수는 Stack 메모리 영역에 생기게 됩니다.
이 중 Singleton으로 사용되는 객체는 Static으로 메서드 에어리어에 인스턴스가 올라가며, 원할 때 getInstance로 내려받아 사용하는 것이 Singleton Pattern 입니다. 

=> 즉, 객체가 생성될 때 한번 이후 매번 생성하지 않으며, 여러 영역에서 공통된 하나의 인스턴스를 참조하여를 자원 소모를 줄일 수 있습니다.
다만, 동시에 접근해서 생길 수 있는 문제(동기화 문제)를 점검해야 합니다.

장점도 있지만 장점 도 있는 패턴이긴 하지만...
스프링을 쓰게되면 Bean으로 등록해 사용할 경우 싱글턴 패턴으로 사용하는 것이니 별도로 신경 쓸 부분이 아니게 되겠지만, 그래도 정리해보자면 싱글턴 패턴의 단점으로 어떤게 있을까요?

싱글톤 패턴 문제점

- 의존관계상 클라이언트가 구체 클래스에 의존한다. DIP를 위반한다. 
- 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다. 
- 테스트하기 어렵다.
- 내부 속성을 변경하거나 초기화 하기 어렵다. 
- private 생성자로 자식 클래스를 만들기 어렵다. 
- 결론적으로 유연성이 떨어져, 안티패턴으로 불리기도 한다.

이런 이유로 spring에서 bean으로 설계할때에도 생각을 하면서 설계해야 할 것 같습니다.