디자인 패턴

이동훈·2022년 12월 15일

CS

목록 보기
1/1

디자인 패턴이란

  • 설계 중 발생할 수 있는 오류를 -> 객체 간의 상호 관계 등을 이용해 -> 해결할 수 있도록 하는 기법

1. 싱글톤 패턴

  • 하나의 클래스를 기반으로 오직 하나의 인스턴스만 가지는 패턴
  • 주로 DB 연결 모듈에 사용

단점?

  • TDD 난관. 테스트가 서로 독립적이지 못함
  • 모듈 간의 결합을 강하게 만들게됨. DI로 느슨하게 가능

2. 팩토리 패턴

  • 객체 생성 부분을 떼어내 추상화
  • 중요한 뼈대는 상위 클래스가 만들고, 상속받은 하위 클래스가 구체적 내용 결정

3. 전략 패턴

4. 옵저버 패턴

  • 상태 변화를 관찰하다 상태 변화가 있을 때마다 -> 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴 -- watch? 옵저버 패턴은 주로 이벤트 기반 시스템에 사용하여 MVC 패턴에서도 사용됨
  • 자바스크립트에서 프록시 객체를 통해 구현 가능
    ++ 프록시 객체) 필터? 처럼 기본 동작 작업을 가로챌 수 있는 객체. js에서는 두개 매개변수를 가짐. target, handler

★ Vue도 프록시 객체를 이용한 옵저버 패턴을 쓴다!

5. 프록시 패턴

  • 대상 객체에 접근하기 전 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴
    ++ 프록시 서버) nginx 등. 로드밸런싱이나 보안(포트 번호?), CORS 제약 해소 등등을 위해 쓰인다
    +++ 보안 - DDOS 방어, HTTPS 구축(CloudFalre 쓰면 더 간단)
    ++ 프록시 서버에서의 캐싱) 캐시에 정보를 담아두고 재요청 시 캐시 내 데이터 활용하는 것. computed?
    ++ 버퍼 오버플로우) 버퍼 공간을 벗어나 덮어씌워지는 에러
    ++ gzip 압축 등을 사용할때, 전송량 감소 vs CPU 오버헤드를 잘 고려할 것

6. 이터레이터 패턴

  • 이터레이터 프로토콜을 통해 다른 객체라도 순회 가능
    ++ e.g. for each문

7. 노출모듈 패턴

  • 즉시 실행 함수(정의하자마자 호출되는 함수)를 통해 접근 제어자를 만드는 패턴을 지칭
  • 자바스크립트에서 유용 -> 접근 제어자가 존재하지 않고 전역 범위에서 실행되는게 디폴트 -> 노출모듈 패턴을 통해 접근 제어자 구현을 꾀함

8. MVC 패턴

  • Model, View, Controller 구성
  • 각 구성 요소 별 집중 개발 가능

장점) 재사용성 확장성 용이
단점) 복잡해질 수록 모델<->뷰 복잡해짐

주요 예시) React.js

  • DOM을 통해 DOM 조작
  • 대표적 특징) 불변성: state는 setState를 통한 수정만 가능하다거나, props를 기반으로 만들어진 컴포넌트 pureComponent라던지...
  • MVVM과 달리 단방향 바인딩. 자유도가 높다

9. MVP 패턴

  • MVC 패턴에서 파생. Controlle가 Presenter로 교체된 패턴
  • View와 Presenter는 1:1 관계이므로 MVC 패턴보다 강한 결합을 지님

10. MVVM

  • 1) Model-View-View_Model. VM은 V를 더 추상화 시킨 계층이다.
  • 2) V와 VM 사이 양방향 데이터 바인딩 지원
  • 3) 함수를 사용하지 않고 양방향 바인딩, html을 토대로 컴포넌트 구축하는 것이 특징
  • 4) 재사용 가능한 컴포넌트 기반으로 UI 구축 가능

장점) 4)처럼 UI를 별도 코드 수정 없이 재사용 가능, 단위 테스트 용이

주요 예시)

  • Vue.js: watch, computed
  • 4) 사용예: BMW, 구글, 루이비통

++ 커맨드) 여러 가지 요소에 대한 처리를 하나의 액션으로 처리할 수 있게 하는 기법



프로그래밍 패러다임

  • 프로그래밍을 어떤 관점으로 보는지에 따라 나누는 개발 방법론.
  • 크게 선언형/명령형으로 나뉜다.
    ++ 선언형은 함수형이라는 하위 집합을 갖는다.
    ++ 명령형은 객체지향, 절차지향으로 나뉜다.

+++ 자바도 jdk 1.8부터는 함수형 프로그래밍 패러다임을 지원함. 람다나 스트림이 그것


1. 선언형/함수형 프로그래밍

  • '무엇을' 풀어내는가에 집중하는 패러다임 -> '프로그램은 함수로 이루어진 것'

  • 함수형 프로그래밍은 '순수 함수'를 블록처럼 쌓아 로직을 구현 -> 고차 함수를 통해 재사용성을 높인 프로그래밍 패러다임.
    ++ 순수 함수) 출력이 입력에만 의존하는 것을 의미. 전역 변수가 출력에 영향을 주면 안됨.
    ++ 고차 함수) 함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것을 뜻함
    +++ 고차 함수를 쓰기 위해서는 해당 언어가 일급 객체라는 특징을 가져야 함. 필요한 특징은 다음과 같다.
    ++++ 1) 변수나 메서드에 함수를 할당할 수 있다
    ++++ 2) 함수 안에네 함수를 매개변수로 담을 수 있다
    ++++ 3) 함수가 함수를 반환할 수 있다

  • 번외) 함수형의 특징: 커링, 불변성 등. 이 부분은 차후 더 조사하고 보강하겠음

2. 객체지향 프로그래밍

  • 객체들의 집합으로 프로그램의 상호 작용을 표현
  • 데이터를 객체로 취급
  • 객체 내부에 선언된 메서드를 활용하는 방식을 뜻함
  • 상대적으로 설계에는 많은 시간을, 처리에는 많은 비용을 소모

★ 객체지향 프로그래밍의 특징

  • 추상화
    ++ 현실의 것을 코드로 나타날 때 -> 핵심적인 개념 또는 기능을 간추려내는 것. (Interface)
  • 캡슐화
    ++ 객체의 속성과 메소드를 하나로 묶고 일부를 외부에 감추어 은닉하는 것
  • 상속성
    ++ 상위 클래스의 특성을 하위 클래스가 이어 받아 재사용 및 추가, 확장하는 것.
    ++ 장점) 재사용성 증대, 계층구조 형성, 유지보수 효율 증대
  • 다형성
    ++ 오버로딩, 오버라이딩

★ 설계 원칙

  • SOLID!

  • S: 단일 책임 원칙 (SRP)
    ++ '모든 클래스는 각각 하나의 책임만 가진다' -> 하나의 책임만 갖고, 유지보수하더라도 그것은 유지.

  • O: 개방-폐쇄 원칙 (OCP)
    ++ 기존의 코드는 잘 변경하지 않으면서도 확장은 쉽게 할 수 있어야 한다

  • L: 리스코프 치환 원칙 (LSP)
    ++ 부모 자식 객체를 바꿔도 문제가 없게끔 설계해야 함.

  • I: 인터페이스 분리 원칙 (ISP)
    ++ 하나의 일반적인 인터페이스 <<<<<< 여러 개의 구체적인 인터페이스

  • D: 의존 역전 원칙(DIP)
    ++ 상위 계층은 하위 계층의 '변화에 대한 구현'으로부터 독립해야 함. 타이어 어느 브랜드걸 끼든 뭔 상관이람?

3. 절차형 프로그래밍

  • 로직이 수행되어야 할 연속적인 계산 과정으로 이루어짐
  • 진행되는 방식으로 구현하면 되기에, 가독성이 좋고 빠름 -> 계산 작업에 사용된다는 뜻
  • 모듈화 힘듦, 유지 보수성 하락
profile
Fool Snack Developer

0개의 댓글