디자인 패턴에 대하여

AmeriKano·2024년 1월 16일
0

디자인 패턴

목록 보기
1/1

들어가기 전에

얘기는 안했지만 작년 12월 초에 입사하여 열심히 교육받고 공부 중이다. 개발에 필요한 지식을 여러 가지 습득 중에 있는데, 그 중에 면접에서도 질문받았으면서 생각보다 다양하고 복잡하고 중요하다 생각이 드는 디자인 패턴에 대해 전반적인 내용을 정리해봤다. 각각 패턴에 대해서도 하나씩 정리해볼 예정이다.


디자인 패턴이란?

디자인 패턴은 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결책이다. 코드에서 반복되는 디자인 문제를 해결하기 위한 청사진과 같다. 청사진이라는 의미는 구체적인 구현은 개발자가 직접 해야 한다는 의미이다.

라이브러리나 함수 코드는 복사해서 사용할 수 있지만 패턴은 그렇게 사용할 수는 없다. 위에서 말한 것 처럼 구현된 코드가 아니라, 문제를 해결할 수 있는 일반적인 개념이기 때문이다.

디자인 패턴이 왜 필요한가?

그렇다면 디자인 패턴은 왜 필요할까? 디자인 패턴은 일반적인 소프트웨어 디자인 문제들에 대해 시도되었으며 검증된 해결책들을 모은 것이다. 꼭 다루지 않더라도 패턴을 알고 있다면 객체 지향 디자인 원칙들로 많은 종류의 문제를 해결하는 방법을 배울 수 있기 때문이다.

그리고, 개발자들끼리 서로 효율적으로 소통할 수 있는 공통 표준/언어 를 디자인 패턴으로 정의한다. 예를 들어 “이 문제를 해결하기 위해 해당 인스턴스를 애플리케이션 전역적으로 하나만 정의하고 어디에서든 접근할 수 있도록 구현하였습니다.” 라고 말해도 되겠지만 이 말은 결국 “해당 인스턴스를 싱글톤(singleton) 패턴을 이용해 구현하였습니다.” 라고 말해도 의미가 통할 것이다. 싱글톤 패턴에 대해서 알고 있는 개발자라면 상세하게 설명할 필요도 없어질 것이다.

디자인 패턴의 한계점

그렇지만 디자인 패턴에는 명확한 한계점도 존재한다.

약한 프로그래밍 언어에서 야매(?) 해결책이 되어버릴 수 있다.

💡 두 가지 짚고 넘어가야 할 부분이 있는데, 약한 프로그래밍 언어란 변수나 데이터 타입을 명시적으로 선언하지 않으며, 컴파일러나 인터프리터가 알아서 타입 변환을 수행하는 언어를 말한다. 예를 들어 자바스크립트 같은 언어를 의미한다. 자바스크립트에서 var a = “Hello” 처럼 변수를 선언하면 알아서 문자열로 인식하게 된다.
’야매’ 는 참고한 글의 원문에서는 클루지(Kludge, 그냥 빨리 날림으로 그 문제만을 해결하기 위해 만든 허술하고 조잡한 코드) 라고 나와있었지만 바로 이해하는 데에는 야매 라는 단어가 더 편할 것 같아서 임의로 고쳤다.

일반적으로 패턴은 개발자가 추상화 수준이 부족한 프로그래밍 언어나 기술을 선택했을 때 발생한다. 이런 경우 패턴은 결국 어디에나 다 들어가 버릴 수 있는 초능력을 가진 야매 해결책이 되어버린다. 예를 들어 전략(Strategy) 패턴은 대부분의 최신 프로그래밍 언어에서 간단한 익명(람다) 함수로 구현 가능한데 패턴만을 적용하면 나중에 문제가 발생할 수도 있지 않을까?

비효율적인 해결책이 될 수도 있다.

패턴은 널리 사용되는 문제 해결 방식을 체계화한 것이다. 이렇게 통합된 패턴들을 프로젝트의 맥락에 따라 적용하지 않고 그대로 사용하여 구현해버리면 오히려 비효율적인 방법이 될 수도 있다.

불필요한 부분에서 사용할 수도 있다.

패턴을 처음 배운 사람이 패턴을 배운 후, 굳이 패턴이 필요하지 않은 간단한 문제도 억지로 패턴을 적용하려 할 수도 있다. 분명 좋은 해결 방법일 수는 있지만 상황에 맞게 적절히 적용하는 것이 중요하다고 할 수 있겠다.

패턴의 분류

디자인 패턴은 복잡성, 상세도, 적용 범위에 따라 분류할 수 있다.

가장 기본적인 하위 설계 패턴을 이디엄(idiom) 이라고 한다. 일반적으로 단일 프로그래밍 언어에 적용할 수 있다.

아키텍처(architecture) 패턴은 상위 설계 패턴으로 가장 보편적으로 사용된다. 거의 모든 언어로 아키텍처 패턴을 구현할 수 있으며 다른 패턴들과 달리 어플리케이션 전체 구조(아키텍처)를 설계하는 데 사용할 수 있다.

그리고 모든 패턴은 패턴의 의도나 목적에 따라 분류할 수 있다.

  • 생성 패턴(Creational patterns)
  • 구조 패턴(Structural patterns)
  • 행동 패턴(Behavioral patterns)

생성 패턴

생성 패턴은 기존 코드의 재활용과 유연성을 증가시키는 객체 생성 매커니즘들을 제공한다. 생성 패턴에는 팩토리 메서드(factory method), 추상 팩토리(abstract factory), 빌더(builder), 프로토타입(prototype), 싱글톤(singleton) 등이 있다.

구조 패턴

구조 패턴은 구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명한다. 구조 패턴에는 어댑터(adapter), 브릿지(bridge), 컴포지트(composite), 데코레이터(decorator), 퍼사드(facade), 플라이웨이트(flyweight), 프록시(proxy) 등이 있다.

행동 패턴

행동 패턴은 객체 간의 효과적인 의사소통과 책임 할당을 처리한다. 행동 패턴에는 책임 연쇄(Chain of Responsibility), 커맨드(command), 반복자(iterator), 중재자(mediator), 메멘토(memento), 옵저버(observer), 상태(state), 전략(strategy), 템플릿 메서드(template method), 비지터(visitor) 등이 있다.


참고 자료

디자인 패턴들

profile
똑똑한 사람이 되게 해주세요

0개의 댓글