CS

[CS] 디자인 패턴

5kiran 2023. 2. 20.
반응형

디자인 패턴

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

 

싱글톤 패턴(singleton pattern)

  • 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴
    • 데이터 베이스 연결 모듈에 주로 사용
하나의 인스턴스를 생성하여 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스 생성 비용이 줄어드는 장점이 있으나 의존성이 높아지는 단점 또한 존재한다
//main 모듈
const mysql = require('mysql');
const sql = mysql.createPool({
  connectionLimit: 10,
  host: 'example',
  user: 'root',
  password: 'secret',
  database: '싱글톤패턴',
});
sql.connect();

//서로 다른 A, B모듈에서 main 모듈에서 정의한 인스턴스를 사용
sql.query(query, function (error, results, fields) {
  console.log('hi');
});

 

팩토리 패턴(factory pattern)

  • 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴으로 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴
상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 더 많은 유연성을 가지게 됩니다 또한 객체 로직의 분리로 유지 보수성이 증가한다
class Benz {
  constructor() {
    this.name = 'benz';
  }
}

class Bmw {
  constructor() {
    this.name = 'bmw';
  }
}

class BenzFactory {
  static createCar() {
    return new Benz();
  }
}

class BmwFactory {
  static createCar() {
    return new Bmw();
  }
}

const factoryList = { BenzFactory, BmwFactory };

class CarFactory {
  static createCar(carFactory) {
    const factory = factoryList[carFactory];
    return factory.createCar();
  }
}

const main = () => {
  const car = CarFactory.createCar('BenzFactory');
  console.log(car.name);
};

main();

 

전략 패턴(strategy pattern)

  • 정책 패턴이라고도 불리며 객체의 행위를 바꾸고 싶은 경우 '직접' 수정하지 않고 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔 상호 교체가 가능하게 만드는 패턴
전략 패턴을 활용한 라이브러리로는 Node.js의 passport가 있다

 

옵저버 패턴(observer pattern)

  • 주체가 어떤 객체의 상태 변화를 감시하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 패턴
옵저버 패턴을 활용한 서비스로는 트위터가 있다 또한 옵저버 패턴은 이벤트 기반 시스템에 사용하며 MVC패턴에도 사용된다
자바스크립트에서의 옵저버 패턴은 프록시 객채를 통해 구현할 수 있다

프록시 패턴

  • 대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴입니다.
객체의 속성, 변환 등을 보완하며 보안, 데이터 검증, 캐싱, 로깅에 사용합니다

프록시 서버

  • 서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램입니다.
Node.js에서 주로 사용되는 프록시 서버로는 nginx가 있으며 Node.js의 버퍼 오버플로우 취약점을 예방하기 위해서는 nginx를 프록시 서버로 앞단에 놓고 Node.js를 뒤쪽에 놓는 것이 좋습니다
이를 통해 익명 사용자가 직접적으로 서버에 접근하는 것을 차단하고, 간접적으로 한 단계를 더 거치게 만들어 보안을 강화할 수 있습니다

 

이터레이터 패턴(iterator pattern)

  • 이터레이터를 사용하여 컬렉션의 요소들에 접근하는 디자인 패턴
여러 가지 자료형의 구조와 상관없이 이터레이터라는 하나의 인터페이스로 순회가 가능합니다

 

노출모듈 패턴

  • 즉시 실행 함수를 통해 private, public 같은 접근 제어자를 만드는 패턴
자바스크립트는 private, public 같은 접근 제어자가 존재하지 않고 전역 범위에서 스크립트가 실행되기 때문에 노출 모듈 패턴을 통해 접근 제어자를 구현하기도 합니다

 

MVC 패턴

  • 모델(Model), 뷰(View), 컨트롤러(Controller)로 이루어진 패턴
애플리케이션의 구성 요소를 세 가지로 구분하여 개발 프로세스에서 각각의 구성 요소에만 집중해서 개발이 가능합니다
재사용성과 확장성이 용이하지만 애플리케이션이 크거나 복잡해질수록 모델과 뷰의 관계가 복잡해집니다

모델

  • 애플리케이션의 정보, 데이터베이스, 상수, 변수 등을 뜻합니다

  • 모델을 기반으로 사용자가 볼 수 있는 화면을 뜻합니다(사용자 인터페이스 요소)

컨트롤러

  • 모델과 뷰의 다리 역할을 하며 이벤트 등 메인 로직을 담당합니다 또한 모델이나 뷰의 변경 통지를 받으면 이를 해석하여 해당 내용을 각각의 구성 요소에 알려줍니다

 

MVP 패턴

  • MVC 패턴으로부터 파생되었으며 MVC의 컨트롤러가 프레젠터로 교체된 패턴
뷰와 프레젠터는 일대일 관계이기 때문에 MVC 패턴보다 강한 결합을 가지고있다
반응형

'CS' 카테고리의 다른 글

[CS] 프로세스와 스레드  (0) 2023.04.13
[CS] 데이터베이스의 기본  (0) 2023.04.07
[CS] HTTP, HTTPS  (0) 2023.02.20
[CS] Cors와 허용 방법  (0) 2023.02.07
[CS] ERD와 정규화  (0) 2023.02.06

댓글