소프트웨어 디자인 패턴 : 문제에 대한 해결책

Julie·2021년 8월 9일
0

Software Engineering

목록 보기
1/1


소프트웨어 개발 경험이 있다면 디자인 패턴이라는 용어를 들어본 경험이 있을 것입니다. 아니면 싱글톤, 추상 팩토리, 빌더 등의 용어를 들어본 경험이 있지 않나요? 과연 디자인 패턴이 무엇이길래 널리 알려져 있을까요?

본 글은 소프트웨어 디자인 패턴을 소개하는 글입니다. 각 디자인 패턴을 상세하게 소개하기 보다는 디자인 패턴을 공부하기 위해 알아두면 좋은 사실들을 정리하였습니다. 본 글은 Refactoring Guru 사이트를 주로 참고하여 작성한 글입니다.

1. 디자인 패턴이란?


소프트웨어 설계 단계에서 적용할 수 있는 해결책

디자인 패턴은 소프트웨어 설계 단계에서 자주 발생하는 문제를 해결하기 위한 일반적인 해결책입니다. 일반적인 해결책이기 때문에 디자인 패턴은 다양한 개발 프로젝트에서 적용할 수 있습니다.

문제 해결을 위한 개념

디자인 패턴은 구체적인 소스코드가 아닙니다. 디자인 패턴은 문제를 어떻게 해결하는지에 대한 설명 또는 템플릿입니다. 개발자는 상황에 맞는 디자인 패턴을 선정하고, 디자인 패턴에 따라 코드를 구현해야 합니다.

2. 디자인 패턴은 어떻게 만들어졌나요?


패턴의 정의

패턴이란 객체지향 설계 시 공통적으로 발생하는 문제를 해결하기 위한 전형적인 해결책을 말합니다. 해결책은 수많은 프로젝트에서 문제를 반복적으로 해결하면서 발견되었습니다. 누군가 그 해결책에 이름을 붙이고 상세한 설명을 기술하면서 해결책이 패턴으로 굳혀진 것입니다.

패턴의 유래

그럼 패턴의 개념은 어디서부터 시작된 것일까요? 패턴의 개념은 건축 분야에서 시작되었습니다. 1977년 Christopher Alexander는 A Pattern Language: Towns, Buildings, Construction 책에서 패턴의 개념을 사용하기 시작했습니다. 이 책은 도시를 설계하기 위한 패턴(문제와 해결책)을 소개하고 있습니다.

디자인 패턴의 유래

프로그래밍 분야에서 디자인 패턴은 네 명의 저자(Erich Gamma, John Vlissides, Ralph Johnson, and Richard Helm)로부터 도입되었다고 합니다. 이들은 1994년 Design Patterns: Elements of Reusable Object-Oriented Software 책을 통해 객체지향 설계 시 발생하는 문제에 대한 23가지 패턴을 소개했습니다. 23가지 패턴은 본 글의 "5. 디자인 패턴에 대하여 알고싶어요!" 를 참고해주세요.

3. 왜 알아야 하나요?


전체적인 개발 시간 단축

디자인 패턴은 다양한 프로젝트에서 적용되고 검증된 것입니다. 문제를 해결하기 위한 방법을 처음부터 끝까지 생각해 나가려고 한다면 매우 오랜 시간이 걸릴 것입니다. 이미 잘 정리된 패턴을 사용한다면 당연히 전체적인 개발 시간이 단축되겠죠!

용이한 커뮤니케이션 수단

디자인 패턴은 소프트웨어 엔지니어에게 널리 알려져 있습니다. 저도 회사에서 싱글톤, 빌더, 팩토리 등 디자인 패턴과 관련된 용어를 많이 사용했습니다. 원활한 소통을 위해서 디자인 패턴을 알아두면 좋을 것이라고 생각합니다. 더불어 설계 담당자가 디자인 패턴을 안다면 더 고차원적인 설계 방안을 논의할 수 있을 것입니다.

4. 오 좋군요! 근데 꼭 좋기만 하나요?


부적절한 사용은 오히려 독이 됨

디자인 패턴을 적용하지 않아도 되는 부분에 굳이 디자인 패턴을 적용한다면 불필요한 설계사항이 증가하고, 구현할 코드가 늘어날 것입니다. 또한 디자인 패턴을 억지로 끼워맞춘다면 오히려 코드를 복잡하게 만드는 상황이 발생할 수 있습니다.

모든 문제를 해결해주지 않음

디자인 패턴은 다양한 프로젝트에서 "주로" 발생하는 문제에 대한 해결책입니다. 모든 문제를 다루지 않습니다. 그렇기 때문에 디자인 패턴만 적용한다고 문제가 없는 것은 아니겠죠?

디자인 패턴에 대한 신랄한 비판

Design Patterns are Bad Design 포스팅에서는 디자인 패턴을 아주 신랄하게 비판하고 있습니다. 이 글의 작성자는 디자인 패턴은 구시대적이고, 디자인 패턴이 다루는 문제가 정말 일반적으로 발생하는 문제인지 의심하고 있습니다. 심지어 디자인 패턴을 도입한 저자들을 사기꾼이라는 식으로 말하기도 합니다. 저도 무분별하게 디자인 패턴을 맹신하는 것을 경계합니다. 디자인 패턴에 대한 비판적 의견을 더 알고싶다면, 해당 포스팅을 읽어보길 바랍니다.

5. 디자인 패턴에 대해 알고싶어요!


디자인 패턴은 Refactoring Guru 사이트에 매우 잘 정리되어 있습니다. 각 디자인 패턴의 목적, 해결하려는 문제, 해결 방법, 구조, 적용 사례, 구현 방법, 장/단점, 구현 예제 등을 설명하고 있습니다. 개인 학습 목적으로 추후에 세부 내용을 정리할 예정이지만, 해당 사이트에 직접 방문하여 디자인 패턴을 학습하는 것을 추천드립니다.

디자인 패턴의 분류

디자인 패턴은 크게 생성 패턴, 구조 패턴, 행위 패턴 3가지로 분류합니다.

  • 생성 패턴 : 객체 생성 방법을 다룸

  • 구조 패턴 : 더 큰 구조를 만들기 위한 클래스 및 객체 조합 방법을 다룸

  • 행위 패턴 : 객체 간 상호작용 및 책임 분배 방법을 다룸

디자인 패턴의 세부 내용은 다음 시리즈에서 소개하겠습니다.

6. 디자인 패턴에 대한 개인적 의견


저의 지극히 개인적이고 짧은 경험담입니다. 재직 시 디자인 패턴을 적용하면 고급 개발자라고 인식하는 경우가 있었습니다. 저도 물론 디자인 패턴을 적용했었습니다. 하지만 패턴을 정말 잘 알고 사용했냐고 한다면.. NO 입니다. 그냥 좋다고만 알고 사용했던 것 같습니다. 굳이 적용하지 않아도 되는 경우에도 고급스러운(?) 인상을 주기 위해, 대대로 내려오는 관습처럼 당연하게 디자인 패턴을 사용했습니다.

디자인 패턴은 특정 문제에 대한 해결책입니다. "문제"에 대한 "해결책"이죠. 그냥 사용하는 것이 아니라 잠재적으로 발생할 수 있는 문제를 이해하고, 이에 적절한 패턴을 채택하고 적용해야 합니다. 불필요한 디자인 패턴을 그냥 적용하고 있는 것은 아닌지, 정말 내가 알고 사용하는 것인지 생각해 볼 필요가 있습니다.

7. 참고 자료


profile
Software Engineer

0개의 댓글