디자인 패턴이란
- 설계 중 발생할 수 있는 오류를 -> 객체 간의 상호 관계 등을 이용해 -> 해결할 수 있도록 하는 기법
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. 절차형 프로그래밍
- 로직이 수행되어야 할 연속적인 계산 과정으로 이루어짐
- 진행되는 방식으로 구현하면 되기에, 가독성이 좋고 빠름 -> 계산 작업에 사용된다는 뜻
- 모듈화 힘듦, 유지 보수성 하락