티스토리 뷰
개요
개발 중 자주 나오는 디자인 패턴에 대한 기본 정보를 알아보고 정리하게 되었다.
전체적인 흐름을 알아보고 다음 발표부터 순차적으로 패턴 사용법을 알아볼 예정이다.
https://sourcemaking.com/design_patterns
https://www.freecodecamp.org/news/javascript-design-patterns-explained/#singleton-pattern
내용
디자인 패턴이란?
4명의 C++ 개발자가 1994년 출판한 "Design Patterns: Elements of Reusable Object-Oriented Software" 책으로 객체 지향 프로그래밍의 기능과 함정을 탐구하고 일반적인 프로그래밍 문제를 해결하기 위해 구현할 수 있는 23가지 패턴을 소개하며 대중화 되었다.
- 소프트웨어 디자인에서 일반적으로 발생하는 문제에 해결할 수 있는 반복 가능한 솔루션
- 특정 종류의 문제를 해결하기 위해 사용할 수 있는 아이디어, 의견 및 추상화에 가까운 것
- 알고리즘이나 특정 구현이 아니다.
- 다양한 요인에 따라 구현 방법이 달라질 수 있다.
- OOP C++ 프로그래밍을 염두해내고 생각해 낸 것으로 javaScript 또는 기타 프로그래밍 패러다임과 같은 보다 현대적인 언어의 경우 유용하지 않은 패턴이 있을 수 있다.
디자인 패턴의 종류
- 창조적인 디자인 패턴 (Creational design patterns)
- 클래스를 인스턴스화 하는 패턴
- 클래스 생성 패턴과 객체 생성 패턴으로 나뉨
- 클래스 생성 패턴 : 인스턴스화 프로세스에서 상속을 효과적으로 사용
- 객체 생성 패턴 : 위임을 효과적으로 사용하기 위한 작업
- 구조 디자인 패턴 (Structural design patterns)
- 클래스 및 개체 구성에 관한 패턴
- 상속을 사용하여 인스턴스를 구성함
- 새로운 기능을 얻기 위해 개체를 구성하는 방법을 정의
- 동작 디자인 패턴 (Behavioral design patterns)
- 클래스 개체간의 통신에 관한 패턴
- 개체 간의 통신과 가장 구체적으로 관련됨
창조적인 디자인 패턴 (Creational design patterns)
- Abstract Factory
- 구체적인 클래스를 지정하지 않고도 관련 객체의 상속 클래스를 생성할 수 있음.
- 일부 속성과 메서드만 공유하는 개체를 만들어야하는 상황에서 유용
- Builder
- 일반적으로 객체에 특정 속성이나 메서드를 추가하는 함수나 메서드가 존재함.
- 속성과 메서드 생성을 다른 Entity로 분리함.
- Factory Method
- 객체 생성 후 수정할 수 있는 객체 생성을 위한 인터페이스를 제공하는 패턴
- 개체를 생성하는 코드가 한곳에 중앙 집중화 되어 코드를 단순화하고 더욱 잘 구성할 수 있음
- Object Pool
- 객체를 필요로 할 때 풀을 요청하고 반환하는 일련의 작업을 수행하는 패턴
- 많은 수의 인스턴스 생성하거나 무거운 객체를 매번 인스턴스화 할 때 성능 향상을 가져오기도 함.
- pool이란 메모리에 보관되어 사용할 준비가 된 리소스의 모음
- Prototype
- 다른 개체의 청사진으로 사용하여 개체의 속성과 메서드를 상속하는 개체를 만들 수 있음.
- JavaScritp의 Prototype 상과 동일한 매커니즘
- 동일한 클래스에 의존하지 않고 개체 간의 속성과 메서드를 공유할 수 있음.
- Singleton
- 클래스가 변경 불가능한 인스턴스를 하나만 갖도록 하는 디자인 패턴
- 복사하거나 수정할 수 없는 객체 (불변)
구조 디자인 패턴 (Structural design patterns)
- Adapter
- 호환되지 않는 인터페이스가 있는 두 개체를 서로 상호작용할 때 사용하는 패턴
- Bridge
- 대규모 클래스 또는 밀접하게 관련된 클래스들을 서로 독립적으로 개발할 수 있는 두 개의 개발 계층(추상 및 구현)으로 분할하는 구조적 디자인 패턴
- Composite
- 개체를 트리 구조로 구성한 다음 이러한 구조를 개별 개체인 것 처럼 작업할 수 있는 디자인 패턴
- 앱의 핵심 모델을 트리로 나타낼 수 있는 경우에 사용해야 이 패턴이 의미를 가진다.
- Decorator
- 동작을 포함하는 특수 래퍼 개체 안에 개체를 배치하여 새로운 동작을 추가하는 패턴
- Facade
- 라이브러리, 프레임워크 또는 기타 복잡한 클래스에 대한 단순화된 인터페이스를 제공하는 패턴
- 선언적 프로그래밍에 대해 생각할 때 복잡성을 숨기는 추상화를 제공함.
- Flyweight
- 각 개체에 모든 데이터를 유지하는 대신 여러 개체 간에 상태의 공통 부분을 공유하여 사용 가능한 RAM 양에 더 많은 개체를 맞출 수 있는 패턴
- Flyweight 패턴을 사용하는 개체는 다른 컨텍스트에 사용될 수 있으므로 해당 상태를 수정할 수 없는 불변성을 가져야함
- Private Class Data
- 속성(데이터) 의 가시성을 최소화하여 클래스 상태를 보호하는 디자인 패턴
- Proxy
- 다른 개체에 대한 대체 또는 자리 표시자를 제공하는 패턴
- 원래 객체에 대한 액세스를 제어하여 요청이 실제 원본 객체에 도달하기 전이나 후에 일종의 작업을 수행함
- ExpressJS에 익숙하면 자주 접하는 패턴
동작 디자인 패턴 (Behavioral design patterns)
- Chain of responsiblity
- 일련의 핸들러를 따라 요청을 전달하는 패턴
- 각 핸들러는 요청을 처리할지 또는 체인의 다음 핸들러로 전달할지를 결정함
- Command
- 요청에 대한 모든 정보를 포함한 독립 실행형 개체로 바꾸는 패턴
- 요청을 메서드 인수로 전달하고, 요청 실행을 지연하거나 대기열에 추가하거나 실행 취소를 하는 작업을 지원함.
- Interpreter
- 도메인 언어를 간단한 언어 문법으로 정의하고, 도메인 규칙을 언어 문장으로 나타내며 이러한 문장을 해석하여 문제를 해결하는 디자인 패턴
- 클래스를 사용하여 각 문법 규칙을 나타내고, 일반적으로 계층 구조이므로 규칙 클래스의 상속 계층 구조가 잘 매핑됨.
- Iterator
- 컬렉션의 요소를 순회하는데 사용하는 패턴
- for, forEach, map, reduce, filter 등을 반복하기 위해 마음대로 사용할 수 있는 모든 JavaScript 내장 함수는 반복자 패턴의 예시.
- Mediator
- 개체 간의 혼란스러운 종속성을 줄일 수 있는 패턴
- 개체 간의 직접적인 통신을 제한하고, 중재자 개체를 통해서만 공동 작업을 수행하도록 함
- Memento
- 구현 세부 정도를 공개하지 않고 개체의 이전 상태를 저장하고 복원할 수 있는 패턴
- 개체가 나중에 해당 상태로 복원될 수 있도록 개체의 내부 상태를 캡쳐하고 외부화 함.
- Null Object
- 적절한 기본 동작을 수행하지 않는 대체 가능한 대안을 제공하여 개체가 없음을 캡슐화하는 패턴
- Observer
- 관찰하는 개체에 발생하는 모든 이벤트에 대해 여러 개체에 알리는 구독 메커니즘을 정의하는 패턴
- 주어진 객체에 이벤트 리스너가 있는 것과 같다.
- React의 useEffect가 좋은 예시.
- State
- 개체 내부 상태가 변경될 때 개체의 동작을 변경할 수 있도록 하는 패턴
- 행동이 상태에 의존하게 만드는 문제에 대한 해결책
- Strategy
- 일련의 알고리즘을 정의하고, 각각 별도의 클래스에 넣어 객체를 상호 교환하게 만드는 패턴
- 객체 지향 5원칙 중 하나인 개방 폐쇄 원칙을 지킬 수 있다.
- Template Method
- 슈퍼 클래스에서 알고리즘의 골격을 정의하지만 서브 클래스가 구조를 변경하지 않고 알고리즘의 특정 단계를 재정의 할 수 있도록 하는 패턴
- 알고리즘을 일련의 단계로 나누고, 이러한 단계를 메서드로 전환하고, 단일 템플릿 메서드 내에서 메서드에 대한 일련의 호출을 넣는 방식을 제시함.
- Visitor
- 작동하는 개체에서 알고리즘을 분리할 수 있는 패턴
- 동작을 수행하는 개체는 Visitor 메서드 중 하나에 인수로 전달되어 개체 내에 포함된 모든 필수 데이터에 대한 접근 권한을 제공함.
결론
평소에 접해본 패턴도 많았고, 처음 접하는 패턴도 있었는데
앞으로 스터디를 진행하면서 javascript에서 패턴을 적용해보고 이해할 수 있도록 공부해야겠다.
'새롭게 시작하는 개발 이야기' 카테고리의 다른 글
한 입 크기로 잘라 먹는 리액트 1장 - 자바스크립트 기초 (0) | 2023.05.31 |
---|---|
한 입 크기로 잘라먹는 리액트 3장 - node.js (1) | 2023.05.24 |
JavaScript의 Event - 4월 6일 발표 (0) | 2023.04.06 |
Http response status code의 종류 - 3월 30일 발표 (0) | 2023.03.30 |
서버사이드 렌더링과 클라이언트 사이드 렌더링 - 3월 23일 스터디 발표 (0) | 2023.03.23 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Request Handler
- graphQL
- Spring
- 멀티모듈
- body
- 자바스크립트
- homebrew
- 개발
- @Autowired
- 모듈
- springboot
- HTTP
- header
- spring-boot
- 인텔리J
- 회고
- MySQL
- mapping
- 일지
- JAR
- web
- 프로그래머스
- JavaScript
- 한 입 크기로 잘라먹는 리액트
- Gradle
- 스터디 회고
- Spring Boot
- Java
- RequestHandler
- 개발일지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함