본문 바로가기
Web Development/Design Patterns

[디자인 패턴] 디자인 패턴이란?

by Krystal K 2023. 12. 10.

디자인 패턴이란?

[index]

1. 디자인 패턴이란?

2. 디자인 패턴 구조

3. 왜 디자인 패턴을 알아야할까?

4. 디자인 패턴에 대한 부정적인 시각

5. 디자인 패턴의 분류

6.마무리

 


 

 

1. 디자인 패턴이란?

패턴은 알고리즘과 자주 혼동됩니다. 왜냐하면 두 개념 모두 알려진 문제에 대한 일반적인 해결책을 설명하기 때문입니다. 알고리즘은 요리법에 비유할 수 있지만 패턴은 요리법이 아닌 청사진에 더 가깝습니다. 알고리즘과 요리법 둘 다 목표를 달성하기 위한 명확한 단계들이 제시되어 있습니다. 반면에 청사진은 결과와 기능들은 제시하나 구현 단계 및 순서는 사용자가 결정합니다.

- 출처 : https://refactoring.guru/ko/design-patterns/what-is-pattern 

 

디자인 패턴은 소프트웨어 개발에서 반복적으로 발생하는 문제들을 해결하기 위해 만들어진 일종의 설계 템플릿입니다. 소프트웨어 개발자들이 프로그램을 작성할 때 자주 마주치는 문제들은 대개 비슷하며, 이러한 문제들을  문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 '규약' 형태로 만들어 놓은 것을 의미합니다. 

 

2. 디자인 패턴 구조

디자인 패턴은 일반적으로 콘텍스트(Context), 문제(Problem), 해결(Solution)의 세 가지 핵심 요소로 구성됩니다. 각 요소는 패턴을 이해하고 적용하는 데 도움이 되는 다양한 정보를 제공합니다.

  1. 콘텍스트 (Context)
    패턴이 어떤 상황에서 사용되는지를 설명합니다. 패턴이 어떤 소프트웨어 디자인 상황에서 필요한지를 제시하며, 어떤 클래스나 객체들이 상호작용하는지에 대한 맥락을 제공합니다.
  2. 문제 (Problem)
    어떤 디자인 이슈나 문제를 다루고 있는지를 설명합니다. 특정한 상황에서 발생하는 디자인적인 어려움, 불편함, 또는 변화에 대응하기 위한 문제를 명시합니다. 패턴은 이러한 문제에 대한 해결책을 제공합니다.
  3. 해결 (Solution)
    어떻게 디자인 문제를 해결할 수 있는지에 대한 방법을 설명합니다. 특정 문제에 대한 해결을 위한 디자인 구조와 패턴의 요소를 소개합니다. 클래스 및 객체 간의 역할, 책임, 협력 방식 등을 구체적으로 제시하여 개발자가 해당 패턴을 이해하고 구현할 수 있도록 돕습니다.

 

3. 왜 디자인 패턴을 알아야할까?

사실 디자인 패턴을 몰라도 개발을 할 수 있습니다. 실제로 많은 개발자들이 디자인 패턴에 대한 지식없이 개발을 하고 있습니다. 그럼에도 불구하고 패턴을 알아야하는 이유가 뭘까요?

 

디자인 패턴은 주로 다음과 같은 이점을 제공합니다:

  • 재사용성 (Reusability)
    패턴은 일반적인 문제에 대한 재사용 가능한 해결책을 제공하기 때문에 코드를 재사용할 수 있습니다. 디자인 패턴을 사용하면 다양한 상황에서 재사용이 가능한 설계를 만들 수 있습니다. 따라서, 개발자는 새로운 프로젝트를 시작할 때마다 처음부터 설계를 다시 시작할 필요 없이, 이전에 사용한 디자인 패턴을 재사용하여 개발 시간과 비용을 절감할 수 있습니다.
  • 유지보수성 (Maintainability)
    일관된 디자인 패턴을 사용하면 코드가 더 읽기 쉽고 유지보수하기 쉬워집니다. 디자인 패턴을 사용하면 개발자가 코드를 쉽게 이해하고 유지보수할 수 있습니다. 디자인 패턴은 일관된 방식으로 코드를 구성하도록 지원하므로, 코드의 가독성을 높이고 유지보수에 용이하게 만들어 줍니다.
  • 확장성 (Scalability)
    디자인 패턴은 시스템이 변화하거나 확장될 때 쉽게 대처할 수 있도록 해줍니다. 디자인 패턴은 소프트웨어 시스템이 확장되는 상황에서도 쉽게 대응할 수 있도록 해줍니다. 디자인 패턴은 모듈화된 구조로 설계되어 있어, 새로운 요구사항이나 기능 추가에 유연하게 대응할 수 있습니다.
  • 유연성 (Flexibility)
    패턴은 특정 구현에 결합되지 않도록 하여 코드를 더 유연하게 만들어줍니다. 
  • 이해도 향상 (Understanding)
    디자인 패턴은 개발자 간의 의사 소통을 향상시키며, 일반적인 언어를 제공하여 코드 이해도를 향상시킵니다. 디자인 패턴을 사용하면 개발자들 간의 코드 표준화가 가능해집니다. 디자인 패턴은 일관된 설계 방식을 제공하므로, 개발자들 간의 협업이 원활해지고, 코드의 가독성을 높여줍니다.

디자인 패턴들은 소프트웨어 디자인의 다양한 측면에 적용되어 문제를 해결하고 코드를 더 효과적으로 조직화할 수 있도록 도와줍니다. 패턴을 이해하고 적용함으로써 코드의 품질을 향상시키고, 협업 시에 일관성 있는 이해를 공유할 수 있습니다. 또한, 객체 지향 디자인 원칙들을 실제 코드에 적용하면서 더 나은 소프트웨어를 개발하는 데 도움이 됩니다.

 

3. 디자인 패턴에 대한 부정적인 시각

  1. 복잡성 증가
    디자인 패턴을 사용하면 코드의 일반적인 구조가 개선되지만, 때로는 더 많은 클래스와 객체를 도입하여 전체적인 복잡성을 증가시킬 수 있습니다. 또한  너무 많은 디자인 패턴을 사용하면 코드가 복잡해지고 유지보수가 어려워질 수 있습니다. 오버 엔지니어링이 발생할 우려가 있습니다.
  2. 학습 곡선
    디자인 패턴은 처음에는 학습이 어려울 수 있습니다. 새로운 프로그래머가 이해하기에는 추상적이고 복잡할 수 있으며, 패턴의 적절한 사용을 익히려면 시간이 필요할 수 있습니다.
  3. 오용
    모든 문제에 모든 패턴이 적합한 것은 아닙니다. 특정한 상황이나 요구사항에 맞지 않는 패턴을 사용하면 오히려 불필요한 복잡성을 초래할 수 있습니다. 이미 널리 사용되는 문제 해결 방식을 패턴이 체계화한 것이라서, 이미 간단한 방법으로 해결 가능한 문제에 패턴을 사용하면 비효율적일 수 있습니다.
  4. 유연성 제한
    일부 디자인 패턴은 코드의 유연성을 제한할 수 있습니다. 특정한 디자인 패턴을 따르면 나중에 변경이 어려울 수 있으며, 새로운 요구사항에 대응하기가 어려울 수 있습니다.
  5. 과도한 일반화
    일부 패턴은 너무 일반화되어 있어서 특정한 상황에 맞지 않거나 비효율적일 수 있습니다. 과도한 일반화로 인해 성능 문제가 발생할 수 있습니다.
  6. 비용 증가
    디자인 패턴을 구현하는 데 시간과 노력이 필요하며, 때로는 비용이 증가할 수 있습니다. 특히 작은 규모의 프로젝트나 간단한 문제에는 과도한 디자인 패턴이 필요하지 않을 수 있습니다.
  7. 클루지의 위험
    약한 프로그래밍 언어에서는 디자인 패턴이 클루지로 작용할 수 있습니다. 이는 언어의 부족한 추상화 수준을 보완하기 위한 임시적인 해결책으로 사용될 수 있습니다.

이러한 단점들은 디자인 패턴을 사용할 때 고려해야 할 중요한 측면입니다. 디자인 패턴을 적절하게 활용하기 위해서는 문제의 복잡도와 프로젝트의 요구에 맞게 패턴을 선택하고 사용하는 것이 중요합니다.

 

 

5. 디자인 패턴의 분류

일반적으로 디자인 패턴은 크게 세 가지 카테고리로 나뉩니다.

  1. 생성 패턴(Creational Patterns)
    객체 생성과 관련된 패턴으로, 객체를 생성하는 방법과 객체를 조합해 새로운 객체를 생성하는 방법을 다룹니다.
    • 싱글톤(Singleton) 패턴
    • 팩토리 메서드(Factory Method) 패턴
    • 추상 팩토리(Abstract Factory) 패턴
    • 빌더(Builder) 패턴
    • 프로토 타입(Prototype) 패턴
  2. 구조 패턴(Structural Patterns)
    클래스와 객체를 조합해 더 큰 구조를 형성하는 방법에 관련된 패턴입니다.
    • 어댑터 (Adapter) 패턴
    • 데코레이터 (Decorator) 패턴
    • 브리지 (Bridge) 패턴
    • 복합체 (Composite) 패턴
    • 퍼사드 (Facade) 패턴
    • 플라이웨이트 (Flyweight) 패턴
    • 프록시 (Proxy) 패턴
  3. 행위 패턴(Behavioral Patterns)
    클래스나 객체 사이의 알고리즘과 책임 분배에 관련된 패턴으로, 객체들이 상호작용하는 방법을 다룹니다.
    • 옵저버 (Observer) 패턴
    • 전략 (Strategy) 패턴
    • 책임 연쇄 (Chain of Responsibility Pattern) 패턴 
    • 커맨드 (Command) 패턴
    • 반복자 (Iterator) 패턴
    • 중재자 (Mediator) 패턴
    • 메멘토 (Memento) 패턴
    • 상태 (State) 패턴
    • 템플릿 메서드 (Template Method) 패턴
    • 비지터 (Visitor) 패턴

 

마무리

디자인 패턴은 소프트웨어 개발에서의 강력한 도구로 코드를 더 구조적이고 유지보수 가능하며 확장 가능하게 만들어 주지만, 모든 상황에 무조건적으로 패턴을 적용할 필요는 없습니다. 또한, 모든 패턴을 알 필요도 없습니다. 개발자는 상황과 요구사항에 맞게 적절한 패턴을 선택하여 사용하는 데에 중점을 두어야 합니다.

 

학습 곡선이 존재하고, 코드 복잡성이 증가할 수 있지만, 올바르게 적용된 디자인 패턴은 유지보수성과 확장성을 향상시키는 데 큰 도움이 됩니다. 패턴을 잘 활용하면 코드를 효율적으로 작성하고, 강력한 소프트웨어 아키텍처를 개발하는 능력이 향상됩니다.  디자인 패턴은 개발자들 간의 공통된 언어를 제공하며, 최적의 실천 방법을 공유함으로써 소프트웨어 개발 생태계를 풍성하게 만들어 줍니다. 그러나 패턴을 적용할 때에는 주변 환경과 문제의 본질을 잘 파악하고, 필요한 패턴을 신중하게 선택하여 사용해야 합니다. 디자인 패턴을 잘못 사용할 경우 오히려 상황을 악화 시킬수도 있기 때문입니다.

 

개발자들은 디자인 패턴을 도구로서 적절하게 활용하고, 프로젝트의 맥락에 맞게 조절하는 습관을 기르는 것이 중요합니다. 패턴의 목적은 더 나은 코드 구조와 유지보수성을 제공하는 것이므로, 항상 이를 목표로 하여 신중한 판단과 유연한 접근을 바탕으로 개발하는 것이 좋습니다.

 

 


참고 교재

면접을 위한 CS전공지식 노트 - 주홍철 지음(길벗 출판)

 

참고 문헌

https://blog.stackademic.com/using-design-patterns-in-functional-programming-a-comprehensive-guide-e6dee5b8bc8a

https://stfalconcom.medium.com/software-design-patterns-every-dev-have-to-know-efb88accf446

https://www.indeed.com/career-advice/career-development/types-of-design-patterns

https://ryax.tech/design-pattern-what-is-it-and-why-use-it/

https://www.tutorialspoint.com/design_pattern/design_pattern_overview.htm

https://stackify.com/introduction-to-design-patterns-in-software-development/

https://www.netsolutions.com/insights/software-design-pattern/

https://www.freecodecamp.org/news/the-basic-design-patterns-all-developers-need-to-know/

 https://codehive.kr/entry/개발이론-개발에서-디자인-패턴이-왜-중요한가 

https://refactoring.guru/ko/design-patterns

728x90