Suhee Coding Archive
[디자인 패턴] 싱글톤 패턴 본문
➕ 라이브러리 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 또한 변해야 되는 것을 의미.

메인모듈이 직접 하위 모듈에 대한 의존성을 주기 보다는 중간에 의존성 주입자가 이 부분을 가로채 메인 모듈이 '간접'적으로 의존성을 주입하는 방식. -> 상위 모듈은 하위 모듈에 대한 의존성이 떨어짐 '디커플링이 된다'라고 한다
👉 의존성 주입의 단점
모듈들이 더욱더 분리되므로 클래스 수가 늘어나 복잡성이 증가될 수 있으며 약간의 런타임 페널티가 생기기도 한다.
👉 의존성 주입 원칙
- 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 한다.
- 둘다 추상화에 의존해야 하며 이때 추상화는 세부 사항에 의존하지 말아야 한다
'CS' 카테고리의 다른 글
| [디자인 패턴] 옵저버 패턴 (0) | 2022.10.12 |
|---|---|
| [디자인 패턴] 전략 패턴 (0) | 2022.10.12 |
| [디자인 패턴] 팩토리 패턴 (0) | 2022.10.12 |
| [자료구조] 선형 자료 구조 - 연결 리스트 / 배열 / 벡터 / 스택 / 큐 (1) | 2022.10.05 |
| [자료구조] 복잡도 - 시간 복잡도 / 공간 복잡도 (1) | 2022.10.05 |