디자인패턴 이란
- 프로그램 설계 중 발생했던 여러 문제들을 패턴화 시켜 해결책을 제시한 것.
1) Singleton pattern - 싱글톤 패턴
객체의 인스턴스가 하나만 생성되는 패턴. 하나의 클래스에 하나의 인스턴스만 가지는 패턴.
그 하나의 인스턴스를 다른 모듈에서 참조할 수 있도록 한다.
장점
- 하나만 생성하기 때문에 인스턴스 생성 비용이 줄어든다.
단점
- 하나만 생성하기 때문에 의존성이 높아진다.
의존성 주입 DI(Dependency Injection)을 통해 모듈간의 결합을 느슨하게 만들어 해결할 수 있다.
*의존성 주입 원칙 : 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 한다. 둘 다 추상화에 의존해야 하며, 이 때 추상화는 세부사항에 의존하지 말아야 한다.
- 의존성 주입에 대한 추가 설명: https://velog.io/@moongq/Dependency-Injection
- 여러곳에서 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있으니 고려해서 설계해야 한다.
- 테스트가 어렵다.
싱글톤 인스턴스는 하나의 객체를 전역에서 다같이 공유하는 것이기 때문에,
테스트가 격리된 환경에서 실행되기 위해서는 매번 인스턴스의 상태를 초기화 시켜주어야 한다.
쓰임새
공통된 객체를 여러개 생성해서 사용해야 하는 경우 사용된다.
데이터베이스 연결 모듈에 쓰인다.
const URL = 'mongodb://localhost:27017/kundolapp'
const createConnection = url => ({"url" : url})
class DB {
constructor(url) {
if (!DB.instance) {
DB.instance = createConnection(url)
}
return DB.instance
}
connect() {
return this.instance
}
}
const a = new DB(URL)
const b = new DB(URL)
console.log(a === b) // true
2) Factory pattern - 팩토리 패턴
객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴. 사용과 생성을 분리한 패턴.
클래스의 인스턴스를 만드는 일을 서브 클래스에게 맡기는 것.
상위 클래스와 하위 클래스의 분리로 인한 느슨한 결합
상위 클래스에서는 인스턴스 생성 방식에 대해 알 필요 없다 : 유연성
생성 로직이 별도로 작성되어 있기 때문에 고치더라도 한 곳만 고치면 된다 : 유지 보수성 증가
class Latte {
constructor() {
this.name = "latte"
}
}
class Espresso {
constructor() {
this.name = "Espresso"
}
}
class LatteFactory {
static createCoffee() {
return new Latte()
}
}
class EspressoFactory {
static createCoffee() {
return new Espresso()
}
}
const factoryList = { LatteFactory, EspressoFactory }
class CoffeeFactory {
static createCoffee(type) {
const factory = factoryList[type]
return factory.createCoffee()
}
}
const main = () => {
// 라떼 커피를 주문한다.
const coffee = CoffeeFactory.createCoffee("LatteFactory")
// 커피 이름을 부른다.
console.log(coffee.name) // latte
}
main()
3) Strategy pattern - 전략패턴
객체의 행위를 바꾸고 싶은 경우 직접 수정 하지 않고 '전략' 이라고 부르는 캡슐화된 알고리즘을 통해 수정할 수 있게 하는 것.
동일한 문제를 다른 알고리즘으로 해결할 수 있게 한다.
passport 라이브러리를 활용한 전략패턴 예시.
- 기존 구조 : 행위 변경이 필요한 경우 기존의 코드의 수정이 필요하다는 문제점.
- 전략패턴 적용 구조
4) Observer pattern - 옵져버 패턴
옵서버 패턴은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴.
주로 이벤트 기반 시스템에 사용된다. (사용자가 마우스를 클릭했을 때 ! )
MVC 패턴에도 사용된다. (model이 변경되었을 때 view가 변경되는, Model과 View 사이를 느슨하게 하기 위해 사용된다)
일 대 다(one to many) 의 의존성
ex) 트위터 ( 팔로워들 : 옵저버, 팔로잉 하는 사람 : 객체 , 팔로잉 하는 사람의 상태변화를 팔로워들에게 통지한다.)
참고사이트
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
면접을 위한 CS전공지식노트
'Frontend Study - 2 > 디자인패턴' 카테고리의 다른 글
MVC 패턴이란 ? (0) | 2022.11.11 |
---|