[CS정리] 디자인 패턴 - 싱글톤 패턴

10000DOO·2023년 6월 29일
1

CS정리

목록 보기
1/3

🔶디자인 패턴

디자인 패턴이란 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 '규약' 형태로 만들어 놓은 것을 의미한다.

🔶싱글톤 패턴

🔹정의

싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴

🔹구현 방법

자바에서 싱글톤 패턴을 사용한다면 멀티스레드 환경을 고려하여 작성해야된다.

Thread safe Lazy initialization

public class ThreadSafeLazyInitialization{
 
    private static ThreadSafeLazyInitialization instance;
 
    private ThreadSafeLazyInitialization(){}
     
    public static synchronized ThreadSafeLazyInitialization getInstance(){
        if(instance == null){
            instance = new ThreadSafeLazyInitialization();
        }
        return instance;
    }
}

private static으로 변수를 만들고 생성자를 private으로 만들어 외부에서 생성하지 못하게 했다.
synchronized를 통해 멀티스레드 환경에서 발생할 수 있는 동시성 문제를 해결했다.
하지만 synchronized를 사용해 성능이 좋지 못하다.

Thread safe lazy initialization + Double-checked locking

public class ThreadSafeLazyInitialization {
 
    private volatile static ThreadSafeLazyInitialization instance;
 
    private ThreadSafeLazyInitialization(){}
     
    public static ThreadSafeLazyInitialization getInstance(){
        
        if(instance == null){
            synchronized (ThreadSafeLazyInitialization.class) {
                if(instance == null)
                    instance = new ThreadSafeLazyInitialization();
            }
 
        }
        return instance;
    }
}

인스턴스의 존재 여부 확인을 synchronized를 만나기 전에 실행하기 때문에 성능 이슈를 완화할 수 있고 동시성 문제 또한 해결할 수 있다.

Initialization on demand holder idiom (holder에 의한 초기화)

public class Something {
    private Something() {
    }
 
    private static class LazyHolder {
        public static final Something INSTANCE = new Something();
    }
 
    public static Something getInstance() {
        return LazyHolder.INSTANCE;
    }
}

holder안에 선언된 instance가 static이기 때문에 클래스 로딩시점에 한번만 호출될 것이며 final을 사용해 다시 값이 할당되지 않도록 만든 방법이다.

https://youtu.be/3rfbnQYOCFA
https://youtu.be/4Sk9dzXgKwo
위 동영상을 참고하여 싱글톤 패턴 구현 방법을 알 수 있다.

🔹사용 이유

데이터베이스에서 커넥션풀, 스레드풀, 캐시, 로그 기록 객체 등 공통된 객체를 여러개 생성해야되는 경우 자주 사용된다.

🔹장점

하나의 인스턴스를 만들어 해당 인스턴스를 공유하여 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어든다.

싱글톤 패턴을 사용해 만들어진 인스턴스는 공유되기 때문에 데이터를 공유하기 쉽다.

🔹단점

멀티쓰레드환경에서 동기화처리를 안하면 인스턴스가 두개 이상 생성되는 경우가 발생할 수 있다.

싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 OCP를 위배한다.

🔹단점 보안 방법

의존성 주입

의존성 주입(DI)를 사용하여 모듈간 결합도를 낮출 수 있다.

※의존성 주입※
객체가 필요로 하는 어떤 것을 외부에서 전달해주는 것

의존성 주입 원칙

의존성 주입은 상위 모듈이 하위 모듈에서 가져오면 안된다.

추상화에 의존해야하며 추상화는 세부 사항에 의존하지 말아야된다.

의존성 주입 장점

결합도가 낮아져 코드의 재사용성, 유연성이 높아진다.

객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다.

유지보수가 쉬우며 테스트가 용이해진다.

확장성이 높아진다.

의존성 주입 단점

책임이 분리되어 있기 때문에 클래스 수를 늘림으로써 복잡성이 증가한다.

동일한 이유로 약간의 런타임 패널티가 존재한다.

주입된 객체들에 관한 코드 추적이 어렵다.

📚참고 자료

https://jeong-pro.tistory.com/86
https://velog.io/@sana/DI-의존성-주입Dependency-Injection-의-개념과-방법

profile
iOS 개발자 지망생 https://github.com/10000DOO

0개의 댓글