Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

Suhee Coding Archive

[디자인 패턴] 싱글톤 패턴 본문

CS

[디자인 패턴] 싱글톤 패턴

sueee_y 2022. 10. 12. 13:16

➕ 라이브러리 vs 프레임워크

라이브러리는 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것을 의미한다. 폴더명, 파일명 등에 대한 규칙이 없고 프레임워크에 비해 자유롭다. 예를 들어 무언가를 자를 떄 '도구'인 '가위'를 사용해 '내가' 직접 컨트롤하여 자르는데, 라이브러리는 이와 비슷하다.

프레임워크는 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것을 의미한다. 폴도명, 파일명 등에 대한 규칙이 있으며 라이브러리에 비해 좀 더 엄격하다. 다른 곳으로 이동할 때 '도구'인 비행기를 타고 이동하지만 '비행기'가 컨트롤하고 나는 가만히 앉아 있어야 한다. 프레임워크는 이와 비슷하다.

 

➕ 디자인 패턴

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

 

👉 싱글톤 패턴

하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다. 데이터베이스 연결 모듈에 많이 사용한다.

장점 : 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스를 생성할 때

          드는 비용이 줄어듬

단점 : 의존성이 높아짐

 

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

public class HelloWorld{ 
     public static void main(String []args){ 
        Singleton a = Singleton.getInstance(); 
        Singleton b = Singleton.getInstance(); 
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());  
        if (a == b){
         System.out.println(true); 
        } 
     }
}
/*
705927765
705927765
true

 

- 클래스안에 클래스(Holder)가  static이며 중첩된 클래스인 singleInstanceHolder를 기반으로 객체를 선언했기 때문에 한 번만 로드되므로 싱글톤 클래스의 인스턴스는 애플리케이션 당 하나만 존재하며 클래스가 두 번 로드되지 않기 때문에 두 스레드가 동일한 JVM에서 2개의 인스턴스를 생성할 수 없다. 그렇기 때문에 동기화, 즉 synchronized를 신경쓰지 않아도 된다. 
- final 키워드를 통해서 read only 즉, 다시 값이 할당되지 않도록 했다.
- 중첩클래스 Holder로 만들었기 때문에 싱글톤 클래스가 로드될 때 클래스가 메모리에 로드되지 않고 
어떠한 모듈에서 getInstance()메서드가 호출할 때 싱글톤 객체를 최초로 생성 및 리턴하게 된다.

 

👉 MySQL 싱글톤 패턴 

// 메인 모듈 -데이터베이스 연결에 관한 인스턴스 정의
const mysql = require('mysql');
const pool = mysql.createPool({
    connectionLimit: 10,
    host: 'example.org',
    user: 'sueee',
    password: '1234',
    database: '수희디비'
});
pool.connect();
//모듈 A 또는 B에서 해당 인스턴스를 기반으로 쿼리를 보내는 형식
// 모듈 A
pool.query(query, function (error, results, fields) {
    if (error) throw error;
    console.log('The solution is: ', results[0].solution);
});
// 모듈 B
pool.query(query, function (error, results, fields) {
    if (error) throw error;
    console.log('The solution is: ', results[0].solution);
});

 

 

👉 싱글톤 패턴 단점

- TDD(Test Driven Development)를 할 떄 걸림돌이 된다.TDD를 할 때 단위 테스트를 주로 하는데, 단위 테스트는

  테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행 할 수 있어야 한다.

- 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 '독립적인' 인스턴스를

  만들기 어렵다.

- 싱글톤 패턴은 모듈간 결합이 강하다. -> 의존성 주입을 통해 모듈간의 결합을 조금 느슨하게 만들어 해결한다.

 

👉 의존성 주입

의존성은 종속성이라고도 하며 A가 B에 의존성이 있다는 것은  B의 변경 사항에 대한 A 또한 변해야 되는 것을 의미.

 

메인모듈이 직접 하위 모듈에 대한 의존성을 주기 보다는 중간에 의존성 주입자가 이 부분을 가로채 메인 모듈이 '간접'적으로 의존성을 주입하는 방식. -> 상위 모듈은 하위 모듈에 대한 의존성이 떨어짐 '디커플링이 된다'라고 한다

 

👉 의존성 주입의 단점

모듈들이 더욱더 분리되므로 클래스 수가 늘어나 복잡성이 증가될 수 있으며 약간의 런타임 페널티가 생기기도 한다.

 

👉 의존성 주입 원칙

- 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 한다.

- 둘다 추상화에 의존해야 하며 이때 추상화는 세부 사항에 의존하지 말아야 한다

Comments