본문 바로가기

Dev/CS 컴퓨터사이언스

[CS, Computer Science] 디자인 패턴 #1 (싱글톤 패턴, 팩토리 패턴, 전략 패턴, 옵저버 패턴, 프록시 패턴과 프록시 서버)

728x90
반응형

디자인 패턴이란?

: 프로그램 설계 시 발생한 문제를 객체간의 상호관계 등을 이용해 해결할 수 있도록 하는 것

 

1. 싱글톤 패턴(Singleton pattern)

: 하나의 클래스에 하나의 인스턴스를 가지는 것 (예: 데이터베이스 연결 모듈 - mongoDB의 mongoose 모듈, MySQL 등)

[장점] 인스턴스 생성 비용 감소

[단점] 의존성 증가 → TDD (Test Driven Development)의 걸림돌이 됨 (단위 테스트를 위한 독립적인 인스턴스를 생성하지 못하기 때문)

 

의존성 증가 문제를 해결하기 위한 도구로 '의존성 주입(DI, Dependency Injection)' 을 사용

: 메인모듈 말고 '의존성 주입자'가 간접적으로 하위 모듈에 의존성을 주입함 (=디커플링 되다)

(장점) 테스팅이 용이, 마이그레이션(운영환경을 이주하는 것) 용이, 추상화 레이어를 통한 모듈간 관계를 명확/쉽게 추론

(단점) 분리되는 모듈의 수가 증가하기 때문에 복잡성이 증가함. 이는 곧 런타임 패널티로도 이어짐

 

2. 팩토리 패턴(Factory pattern)

: 상위 클래스에서 중요한 뼈대를 결정하고, 하위 클래스에서 구체적인 구현 내용을 겨정하는 것

[장점] 상위 클래스와 하위 클래스를 분리함으로써 '느슨한 결합' 성립 (=의존성 주입) → 유연성과 유지보수성 증가

* 정적 메소드를 사용한다면, 인스턴스 없이 메서드 호출이 가능하므로 메모리를 절약할 수도 있음

 

3. 전략 패턴/정책패턴 (Stategy pattern/Policy pattern)

: 객체의 행위를 캡슐화한 알고리즘, 즉 전략으로 컨텍스트 내에서 교체 (예: 결제 시스템에서 다양한 결제 방법 선택이용)

: 대표적으로 passport 라이브러리가 있음 - Node.js에서 인증모듈을 구현할 때 쓰는 미들웨어 (Local Strategy + OAuth ... )

 

4. 옵저버 패턴(Observer pattern)

: 객체의 상태 변화를 관찰하여, 변화가 발생할 때 옵저버들에게 변화를 알리는 패턴

(예: 트위터의 트윗 알람 서비스, 이벤트 기반 시스템, MVC 패턴 등에 사용)

 

* 잠깐 살펴보고 가는 자바에서의 상속(extends)과 구현(emplements)의 차이!

상속(extends) 구현(implements)
- 일반 클래스, abstract 클래스 이용
- 재사용성, 중복성 최소화
- interfact 클래스 이용
- 반드시 부모 클래스의 메서드를 재정의하여 구현해야 함

* 자바스크립트에서의 옵저버 패턴 → 프록시 객체를 통해 구현 (Vue.js 3.0의 옵저버 패턴 - DOM값 자동 변경)

→ 프록시 객체란? 어떤 대상의 기본적인 동작의 작업을 가로챌수 있는 객체 (target 매개변수와 handler 매개변수로 구성)

→ target : 프록시 대상

→ handler : 가로챌 target의 동작과 대신 수행할 동작 정의

 

5. 프록시 패턴과 프록시 서버

프록시 패턴이란? 대상 객체에 접근하는 흐름을 가로채어 인터페이스 역할을 수행

(예: 보안, 데이터 검증, 로깅, 캐싱 (트래픽을 낮춰주는 효과가 있음) 등...)

 

 

프록시 서버란? 서버-클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 시스템 및 프로그램 

(예1: nginx - nginx을 프록시 서버 앞단에 두고, 프록시 서버를 실제 웹서버 앞단에 두고 사용할 때 보안성 강화)

(예2: CloudFare - DDOS 공격 방어, HTTPS을 SSL인증서 없이 손쉽게 구축)

 

* CORS (Cross-Origin Resource Sharing): 서버가 웹 브라우저에서 리소스를 로드할 때, 다른 오리진을 통해 로드하지 못하게 하는 HTTP 헤더 기반 메커니즘

 

 

본 포스트의 내용은 면접을 위한 CS 전공지식 노트 내용을 기반으로 작성되었습니다

728x90
반응형