본문 바로가기

CS 지식

디자인 패턴 - 1

디자인 패턴에 대해 자세히 설명해주는 사이트를 발견해 정리해보고자 한다.
https://refactoring.guru/ko/design-patterns/what-is-pattern

 

디자인 패턴이란?

디자인 패턴이란? 디자인 패턴은 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결책입니다. 이는 코드에서 반복되는 디자인 문제들을 해결하기 위해 맞춤화할 수 있는

refactoring.guru

 

디자인 패턴이란?

디자인 패턴은 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결책이다. 이는 코드에서 반복되는 디자인 문제들을 해결하기 위해 맞춤화할 수 있는 미리 만들어진 청사진과 비슷하다.
표준화된 라이브러리들이나 함수들을 코드에 복사해 사용하는 것처럼 패턴들을 붙여넣기식으로 사용할 수 없습니다. 패턴은 재사용할 수 있는 코드 조각이 아니라 특정 문제를 해결하는 방식을 알려주는 일반적인 개념이다.
패턴은 알고리즘과 자주 혼동되는데, 두 개념 모두 알려진 문제에 대한 일반적인 해결책을 설명하기 때문이다. 알고리즘은 어떤 목표를 달성하기 위해 따라야 할 명확한 일련의 절차를 정의하지만, 패턴은 해결책에 대한 더 상위 수준의 설명이다.
디자인 패턴은 객체 지향 설계의 일반적인 문제들에 대한 일반적인 해결책입니다. 같은 해결책이 다양한 프로젝트에서 계속해서 반복적으로 사용된다면, 결국 누군가 그것에 이름을 붙여 개념을 자세히 설명하게 되는데, 디자인 패턴은 이렇게 발견된다.
이 개념은 에릭 감마, 존 블리시디스, 랄프 존슨, 리처드 헬름이라는 4명의 작가에 의해 정리되었다. 1994년, 이들은 "디자인 패턴: 재사용성을 지닌 객체지향 소프트웨어의 핵심 요소"라는 책을 발간하였고, 거기서 디자인 패턴의 개념을 프로그래밍에 적용하였다. 이 책은 다양한 객체 지향 디자인 관련 문제를 해결하는 23가지 패턴을 소개한다.

왜 패턴을 배워야 하나?

디자인 패턴은 소프트웨어 디자인의 일반적인 문제들에 대해 시도되고 검증된 해결책들을 모은 것이다. 이러한 문제들을 다루지 않더라도 패턴을 알고 있으면 객체 지향 디자인의 원칙들을 사용해 많은 종류의 문제를 해결하는 방법을 배울 수 있다.
디자인 패턴은 동료간의 더 효율적인 의사소통에 필요한 공통 언어를 정의한다. 예를 들어 '그 문제에 싱글턴을 사용하세요'라고 한다면, 모두가 무슨 뜻인지 알아들을 수 있으며 싱글턴 패턴에 포함된 개념들을 설명할 필요도 없다.

패터에 대한 비판

약한 프로그래밍 언어를 위한 클루지로 작동한다.
일반적으로 패턴의 필요성은 개발자가 추상화 수준이 부족한 프로그래밍 언어나 기술을 선택했을 때 발생한다. 이 경우 패턴은 약한 프로그래밍 언어에 필요한 초능력을 부여하는 클루지​(문제의 어지럽고 임시변통의 그러나 효과적인 해결책)​로 작동할 수 있다.

비효율적인 해결책
패턴은 이미 널리 사용되는 문제 해결 방식의 체계호를 시도한다. 많은 사람이 이렇게 통합된 패턴들을 도그마처럼 신봉하여 패턴을 프로젝트 맥락에 따라 적용하는게 아닌 문자 그대로 구현하게 된다.

부당한 사용
많은 초보자들은 패턴을 갓 배운 후, 더 간단한 코드로도 문제 해결할 수 있는 상황에서 패턴을 적용하려 한다.

패턴의 분류

디자인 패턴은 복잡성, 상세도 및 설계 중인 전체 시스템에 대한 적용 범위에 따라 분류된다. 필자는 도로 건설에 비유하는 걸 좋아하는데, 교차로를 더 안전하게 만들기 위해 신호등을 설치하거나 보행자를 위한 지하도가 있는 전체 다층 인터체인지를 구축하는 작업에 비유할 수 있다.
가장 기본적인 하위 설계 패턴을 이디엄이라고 한다. 일반적으로 이디엄은 단일 프로그래밍 언어에만 적용할 수 있습니다.
아키텍처 패턴은 상위 설계 패턴이며 가장 보편적으로 사용된다. 개발자들은 거의 모든 언어로 아키텍처 패턴들을 구현할 수 있으며 다른 패턴들과 달리 애플리케이션 전체의 구조​(아키텍처)​를 설계하는 데 사용할 수 있다.

728x90

'CS 지식' 카테고리의 다른 글

리눅스를 사용하는 이유  (0) 2022.05.24
SEO 검색 엔진 최적화  (0) 2022.05.24
Micro-Frontends 구현  (0) 2022.05.03
CI/CD  (0) 2022.04.29
Rest API (Representational State Transfer)  (0) 2022.04.08