싱글톤 패턴(Singleton Pattern)

문딤·2022년 7월 19일
1

의존성 주입

의존성 주입이란❓

클래스간의 의존성을 클래스 외부에서 주입하는 것.

클래스 간의 의존성❓

한 클래스를 수정 시 다른 클래스가 영향을 받는다.

하나의 객체 A가 다른 객체 B를 사용해야 할 때 , A의코드 내부가 아닌 외부에서 만들고,
생성자 혹은 setter메소드 등을 활용해서 A의 내부로 주입하는 것을 의미 한다.

ex) 스프링 적용 예시

스프링 컨테이너: BeanFactory, ApplicationContext
Bean 객체 : @Component, 직접 .XML 파일에 등록

멀티 프로세스 vs 멀티 스레드

프로세스

코드로 작성된 프로그램이 메모리에 적재되어 사용할 수 있는 상태가 된 것이다.
즉, 프로세스는 실행 중인 프로그램이라 말할 수 있다.

스레드

프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행하고, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 부른다.

💨 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료 될 위험을 갖고 있다.

💨 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있다.

💨 두 방법은 동시에 여러 작업을 수행하는 점에서 동일하지만, 각각의 장단이 있으므로 적용하는 시스템에 따라 적합한 동작 방식을 선택하고 적용해야 한다.

싱글톤 패턴의 예시

싱글톤 패턴이란?

Application 시작시 어떤 클래스가 최초 한 번만 메모리를 할당하고, 그 메모리에 인스턴스를 만들어 사용한다.

싱글톤 패턴의 장단점

⭕장점

💨 한번의 new 연산자를 통해 고정된(static)메모리를 사용, 메모리 낭비 방지
💨 용이한 데이터 공유 static 영역에 저장되므로, 데이터에 접근이 쉽다.

❌문제점

💨멀티 스레딩 환경에서 발생하는 동시성 문제를 해결하기 위해 syncronized를 사용해야한다.
💨테스트하기 어렵다.(자원을 공유하므로, 테스팅마다 인스턴스를 초기화해서 사용해야함.)
💨자식클래스를 만들 수 없다.
💨내부 상태를 변경하기 어렵다.
💨결합도가 높아져 "개방-폐쇄 원칙" 을 위배한다.
결국 유연성이 떨어진다.

  1. private 접근제한자로 static 변수인 instance를 1개로 제한.
  2. instance가 없을때 new 생성자를 통해 1번 생성.
  3. 생성한 instance의 주소가 같다.

동시성 문제(thread unsafe)

해결 방법.

  1. 인스턴스를 호출할 때 생성x, 처음부터 생성.
💨 불필요한 경우에도 인스턴스가 생성되므로, 리소스 낭비가 있다. 
  1. Thread safe Lazy initialization 방법 - synchronized
💨 큰 성능저하가 발생한다. 권장하지않는다.
  1. Holder initialization 방법 - LazyHolder

💨 getInstance()메서드에서 LazyHolder.INSTANCE를 호출하는 순간 
💨 Class가 로딩되며 초기화가 진행되고,이 시점에 thread-safe를 보장한다.

참고

https://mangkyu.tistory.com/150
https://ksbsite.tistory.com/4

싱글톤 문제점 해결

https://wookkingkim.tistory.com/entry/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-vs-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C

https://kotlinworld.com/64

profile
풀스택개발자가 될래요

0개의 댓글