[CS] 10가지 디자인 패턴

윤경·2022년 6월 3일
0

CS

목록 보기
5/6
post-thumbnail

라이브러리와 프레임워크
공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것

프레임워크는 폴더명, 파일명 등 명확한 규칙이 있어 규칙이 없는 라이브러리에 비해 엄격하다.

싱글톤 패턴

singleton pattern
하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴

하나의 인스턴스를 다른 모듈들이 공유해 인스턴스 생성 비용을 절감할 수 있지만, 의존성이 높아질 수 있다.

싱글톤 패턴은 데이터베이스 연결 인스턴스 생성 비용을 아낄 수 있어 데이터베이스 연결 모듈에 많이 사용된다.

싱글톤 패턴의 단점

싱글톤 패턴은 TDD(Test Driven Development)를 할 때 걸림돌이 된다.

TDD는 단위 테스트가 주인데 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 한다.

TDD
: Test Driven Development, 테스트 주도 개발
테스트 코드를 먼저 작성하는 개발 방법론

깔끔한 코드를 작성할 수 있으며 장기적으로 개발 비용을 절감할 수 있다.

TDD 방법 및 순서
1. 실패하는 작은 단위 테스트 작성하기
2. 빨리 테스트를 통과하기 위해 프로덕션 코드를 작성. 이를 위해 정답이 아닌 가짜 구현 코드를 작성할 수 있음.
3. 그 다음의 테스트 코드 작성하기. 실패 테스트가 없을 경우에만 성공 테스트를 작성.
4. 새로운 테스트를 통과하기 위해 프로덕션 코드를 추가 또는 수정하기
5. 1~4 단계를 반복하며 실패/성공 모든 테스트 케이스 작성하기
6. 개발된 코드들에 대해 모든 중복을 제거하며 리팩토링하기

TDD 참고

싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이라 각 테스트마다 독립적인 인스턴스를 만들기 어렵다.

또한, 싱글톤 패턴은 의존성이 높아질 수 있다.
이는 의존성 주입(DI, Dependency Injection)을 통해 모듈간 결합을 조금 느슨하게 만들어 해결할 수 있다.

의존성 주입이란 메인 모듈과 하위 모듈 사이 의존성 주입자(dependency injection)을 두어 간접적으로 의존성을 주입해주는 것을 말한다.

이를 '디커플링 된다'라고도 한다.

의존성 주입을 통해 어플리케이션 의존성 방향이 일관되고, 쉽게 추론할 수 있으며, 모듈 간 관계가 더 명확해질 수 있다.

팩토리 패턴

factory pattern
객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴

상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴

많은 유연성을 가지며 리팩토링 시 유지 보수성이 증가된다.

자바스크립트의 static
: 정적 메소드를 사용하면 클래스의 인스턴스 없이 호출이 가능하여 메모리를 절약할 수 있고 개별 인스턴스에 묶이지 않으며 클래스 내의 함수를 정의할 수 있다.

자바의 Enum
: 상수 집합을 정의할 때 사용하는 타입

리팩토리 시 강점을 가진다.

전략 패턴

strategy pattern 또는 policy pattern
객체의 행위를 변경할 때 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주며 상호 교체가 가능하도록 만드는 패턴

옵저버 패턴

observer pattern
주체가 어떤 객체의 상태 변화를 관찰하며 메소드 등을 통해 옵저버 목록에 있는 옵저버들에게 상태 변화를 알려주는 디자인 패턴

옵저버 observer
: 관측자 혹은 감시자

옵저버 패턴은 MVC(Model View Controller) 패턴에도 사용된다.

Model(주체)에서 변경 사항이 생기면 update() 메소드로 View(옵저버)에 알려주고 이를 기반으로 Controller가 작동한다.

프록시 패턴

proxy pattern
대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 앞단 인터페이스 역할을 하는 디자인 패턴

프록시 서버

proxy server
서버 - 클라이언트 사이 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있도록 해주는 응용 프로그램

Ex. nginx, CloudFlare

CORS(Cross-Origin Resource Sharing) 에러를 마주쳤을 때 프록시 서버를 두면 된다.
(해당 에러는 프론트엔드 서버와 백엔드 서버의 포트 번호가 다르기 때문에 발생한다.)

이터레이터 패턴

iterator pattern
이터레이터를 사용해 컬렉션 요소들에 접근하는 디자인 패턴

노출모듈 패턴

revealing module pattern
즉시 실행 함수를 통해 private, public 같은 접근 제어자를 만드는 패턴

MVC 패턴

Model, View, Controller로 이루어진 디자인 패턴

Model
어플리케이션 데이터인 데이터베이스, 상수, 변수 등을 뜻함

뷰에서 데이터를 생성/수정하면 컨트롤러를 통해 모델을 생성하거나 갱신

View
사용자 인터페이스 요소

모델을 기반으로 사용자가 볼 수 있는 화면

Controller
하나 이상의 모델과 하나 이상의 뷰를 이어주는 다리 역할

메인 로직을 담당하며 모델과 뷰의 생명주기도 담당

MVP 패턴

MVC 패턴으로부터 파생
Model-View-Presenter

뷰와 프레젠터는 1:1 관계로 MVC 패턴보다 더 강한 결합을 가진다.

MVVM 패턴

Model-View-View Model

뷰모델은 뷰를 더 추상화한 계층


참고: 면접을 위한 CS 전공지식 노트
profile
개발 바보 이사 중

0개의 댓글