본문 바로가기
스터디/오브젝트

15장 - 디자인 패턴과 프레임워크

by 검은도자기 2023. 11. 14.

개요

이번 장에서는 객체지향 관점에서 디자인 패턴과 프레임워크가 설계에 어떻게 영향을 주는지에 대해 알아봅니다.

 

 

소프트웨어 패턴이란 무엇일까?

패턴이란 하나의 실무 컨텍스트에서 유용하게 사용해 왔고 다른 실무 컨텍스트에서도 유용할 것이라고 예상되는 아이디어입니다.

이러한 패턴을 잘 이해하기 위해서는, 단순한 정의를 넘어서 패턴이 내포하는 미묘한 의미와 적용의 배경을 파악하는 것이 중요합니다.

패턴은 문제와 그 해결책을 연결하는 방식으로 정리되며, 이를 통해 개발자들 사이의 의사소통을 돕고, 추상적인 원칙과 실제 코드 사이의 간극을 메우는 역할을 합니다.

 

 

패턴의 장점은 무엇일까?

1. 실무에서 얻은 경험을 효과적으로 요약하고 전달할 수 있다는 점입니다. 이는 초보자들이 경험을 통해 검증된 방법론을 배우고, 유연하고 고품질의 소프트웨어를 개발할 수 있게 해 줍니다.

 

2. 패턴이 제공하는 효율적인 커뮤니케이션입니다. 패턴의 '이름'은 개발자 커뮤니티에 공유되는 어휘집 역할을 하며, 복잡한 아이디어를 간결하고 명확하게 전달할 수 있게 해 줍니다. 예를 들어, 'Strategy 패턴'이라는 용어는 긴 설명 대신에 쉽고 빠르게 특정 설계 전략을 전달할 수 있는 수단이 됩니다. 이는 고수준의 대화를 가능하게 하며, 소프트웨어 설계의 깊이와 효율을 높여줍니다.

 

 

소프트웨어 패턴은 어떻게 분류될까?

 

패턴을 분류하는 가장 일반적인 방법은 패턴의 범위나 적용 단계에 따라 아키텍처 패턴(Architecture Pattern)분석 패턴(Analysis Pattern)디자인 패턴(Design Pattern)이디엄(Idiom)의 4가지로 분류됩니다.

 

1. 아키텍처 패턴 (Architecture Pattern)

소프트웨어의 전체적인 구조를 결정하기 위해 사용됩니다.

이 패턴은 구체적인 소프트웨어 아키텍처를 위한 템플릿을 제공하며, 디자인 패턴과 마찬가지로 프로그래밍 언어나 프로그래밍 패러다임에 독립적입니다.

대표적인 예로 MVC (Model-View-Controller) 패턴이 아키텍처 패턴이 있습니다.

 

2. 디자인 패턴 (Design Pattern) 

특정 상황에서 발생하는 일반적인 설계 문제를 해결하는 데 사용합니다.

이 패턴은 중간 규모의 패턴으로, 특정한 설계 문제를 해결하는 것을 목적으로 하며, 프로그래밍 언어나 프로그래밍 패러다임에 독립적입니다.

대표적인 예로 싱글턴 (Singleton)이나 팩토리 (Factory)는 디자인 패턴이 있습니다.

 

3. 이디엄 (Idiom)

특정 프로그래밍 언어에만 국한된 하위 레벨 패턴으로, 주어진 언어의 기능을 사용해 컴포넌트, 혹은 컴포넌트 간의 특정 측면을 구현하는 방법을 서술합니다.

이 패턴은 언어에 종속적이기 때문에 특정 언어의 이디엄이 다른 언어에서는 무용지물이 될 수 있습니다.

대표적인 예로 C++의 RAII (Resource Acquisition Is Initialization)이 있습니다.

 

4. 분석 패턴 (Analysis Pattern) 

도메인 내의 개념적인 문제를 해결하는 데 사용됩니다.

이 패턴은 업무 모델링 시에 발견되는 공통적인 구조를 표현하는 개념들의 집합입니다.

분석 패턴은 단 하나의 도메인에 대해서만 적절할 수도 있고 여러 도메인에 걸쳐 적용할 수도 있습니다.

 

 

객체 지향 설계에서 패턴이 갖는 역할은 무엇일까?

객체지향 설계에서 가장 중요한 일은 올바른 객체에게 할당하고 객체 간의 유연한 협력 관계를 구축하는 일입니다.

패턴을 알고 있으면, 복잡한 핵심 주도 설계 절차를 거치지 않고도 시스템 내에 객체들의 역할, 책임, 협력 관계를 효율적으로 구성할 수 있습니다.

 

예를 들어, 변경을 캡슐화하는 방법으로는 합성과 상속이 있습니다. 스트래티지 패턴은 합성을 통해 변경을 캡슐화하며, 템플릿 메서드 패턴은 상속을 이용해 알고리즘을 캡슐화합니다. 디자인 패턴의 핵심은 구현 방법이나 구조가 아니라, 어떤 변경을 캡슐화하는지 이해하는 데 있습니다.

 

패턴은 클래스나 메서드가 아닌, 역할과 책임의 관점에서 접근되어야 합니다. 이러한 접근은 구체적인 구현 방법에 대한 제한을 두지 않습니다. 대부분의 디자인 패턴은 일관성 있고 유연한 협력을 설계하는 것을 목적으로 합니다.

따라서 각 디자인 패턴은 특정한 변경을 캡슐화하기 위한 독자적인 방법을 제안합니다.

 

 

패턴 사용 시 주의사항

1. 패턴은 목표가 아닌 나침반

디자인 패턴은 설계의 최종 목표가 아니라, 올바른 방향을 제시하는 도구입니다.

현재 요구사항이나 기술에 적합하지 않다면, 패턴을 목적에 맞게 조정해야 합니다.

 

2. 맹목적인 패턴 사용 피하기

패턴을 무분별하게 사용하면 복잡하고 난해한 시스템이 될 수 있습니다.

모든 패턴은 사용에 있어서 정당한 이유가 필요합니다.

 

3. 팀원들과의 공유와 이해

적용된 패턴에 대해 팀원들이 잘 이해하고 있는지 확인하세요.

패턴에 익숙하지 않은 팀원이 있다면, 필요한 설계 지식과 함께 패턴에 대해서도 공유하는 것이 중요합니다.

 

 

패턴을 가장 효과적으로 적용하는 방법은 뭘까?

이 책에서는 패턴을 지향하거나 패턴을 목표로 리팩터링 하는 것이라고 말합니다.

패턴이 적용된 최종 결과를 이해하는 것보다는 패턴을 목표로 리팩터링 하는 이유를 이해하는 것이 훨씬 가치 있으며, 훌륭한 소프트웨어 설계가 발전해 온 과정을 공부하는 것이 훌륭한 설계 자체를 공부하는 것보다 훨씬 중요합니다.

패턴은 공통적인 문제에 적절한 해법을 제공하지만 공통적인 해법이 우리가 직면한 문제에 적합하지 않을 수도 있습니다.

문제를 분석하고 창의력을 발휘함으로써 패턴을 현재의 문제에 적합하도록 적절하게 수정해야 합니다.

비록 패턴이 현재의 문제에 딱 들어맞지 않는다고 해도 참조할 수 있는 모범적인 역할과 책임의 집합을 알고 있는 것은 큰 도움이 될 것입니다.

 

 

패턴의 단점은 없을까?

디자인 패턴은 언어에 종속적인 구현 코드를 정의하지 않기 때문에 디자인 패턴을 적용하기 위해서는 설계 아이디어를 프로그래밍 언어의 특성에 맞춰 가공해야 하고 매번 구현 코드를 재작성해야 한다는 단점이 있습니다.

재사용 관점에서 설계 재사용보다 더 좋은 방법은 코드 재사용입니다.

하지만 실제로 여러 프로젝트에서 적용하는 과정에서 현실적이지 않다는 사실이 드러났습니다.

따라서 추상적인 수준에서의 설계 재사용을 강조하는 디자인 패턴은 재사용을 위해 매번 유사한 코드를 작성해야만 합니다.

 

 

설계를 재사용하면서도 유사한 코드를 반복적으로 구현하는 문제를 피할 수 있는 방법은 없을까?

이 질문에 대한 객체지향 커뮤니티의 대답이 바로 프레임워크입니다.

 

 

프레임워크란?

추상 클래스나 인터페이스를 통해 애플리케이션의 일부 또는 전체의 구조를 재사용 가능한 설계로 구현한 것입니다.

프레임워크가 제공하는 아키텍처가 요구사항에 적합하다면 다양한 환경에서 테스트를 거친 견고한 구현 코드를 쉽고 빠르게 재사용할 수 있습니다.

프레임워크의 핵심은 추상 클래스나 인터페이스 같은 추상화라고 할 수 있습니다.

 

 

추상 클래스와 인터페이스가 가지는 어떤 특징이 프레임워크의 재사용성을 향상하는 것일까?

1. 추상화와 유연성

추상 클래스와 인터페이스는 구체적인 구현을 강제하지 않으면서, 필요한 행동의 틀을 제공합니다. 이 추상화는 개발자가 필요에 따라 다양한 방식으로 구현할 수 있는 유연성을 제공합니다.

 

2. 일관성 있는 협력 구조

추상 클래스와 인터페이스를 통해 일관된 협력 구조를 만들 수 있습니다. 이는 프레임워크를 사용하는 모든 애플리케이션에서 동일한 방식으로 컴포넌트가 상호작용하도록 도와줍니다.

 

3. 의존성 역전 원칙

추상 클래스와 인터페이스는 구체적인 클래스보다 변화의 가능성이 적습니다. 따라서, 이들에 의존함으로써 하위 레벨의 세부 사항이 아닌, 더 안정적인 추상화에 의존하게 됩니다. 이는 의존성 역전 원칙을 따르며, 상위 수준의 정책의 재사용성을 향상합니다.

 

4. 분리 및 재사용 가능성

추상 클래스와 인터페이스를 사용하여 변하는 부분과 변하지 않는 부분을 명확히 분리할 수 있습니다. 이를 통해 프레임워크의 일부분만을 재사용하거나, 특정 애플리케이션에 특화된 방식으로 확장할 수 있습니다.

 

 

객체 지향 설계에서 프레임워크가 갖는 역할은 무엇일까?

객체지향 설계의 재사용성은 개별 클래스가 아니라 객체들 사이의 공통적인 협력 흐름으로부터 나옵니다.

프레임워크 내에서는 제어 흐름의 주체가 역전되어, 프레임워크가 애플리케이션의 서브클래스 메서드를 호출합니다.

따라서 프레임워크는 협력 제어를 프레임워크로 역전하여 변경에 유연하게 대처하는 역할을 합니다.

그렇기에 개발자는 특정 오퍼레이션(기능)을 작성하지만, 언제 이 코드가 호출될지는 프레임워크가 결정합니다.

이는 프레임워크의 핵심 개념인 동시에 코드 재사용을 가능하게 하는 힘입니다.

 

 

디자인 패턴과 프레임워크 정리

디자인 패턴과 프레임워크 모두 일관성 있는 협력과 관련이 있습니다.

디자인 패턴은 특정한 변경을 일관성 있게 다룰 수 있는 협력 템플릿을 제공하며, 프레임워크는 특정한 변경을 일관성 있게 다룰 수 있는 확장 가능한 코드 템플릿을 제공합니다.

디자인 패턴이 협력을 일관성 있게 만들기 위해 재사용할 수 있는 설계의 묶음이라면, 프레임워크는 일관성 있는 협력을 제공하는 확장 가능한 코드라고 할 수 있습니다.

결론적으로 디자인 패턴과 프레임워크 모두 협력을 일관성 있게 만들기 위한 방법입니다.

 

 

마무리

오늘은 오브젝트 15장을 스터디하고 이해한 내용들을 정리해 보았습니다.

처음 읽었을 때는 디자인 패턴과 프레임워크의 공통점과 차이점, 패턴 사용시 주의사항에 대한 이해 정도만 하고 넘어갔었는데, 두 번 이상 읽어보니 "객체지향에서 프레임워크와 디자인 패턴이 어떤 역할을 하는지?"에 대한 이해가 잘 되어서 좋았습니다.

대망의 오브젝트 책 정리도 오늘로 마무리 되었네요.

다음 스터디할 책은 현재 제 수준에 필요한 책을 서칭 후 고민한 다음에 정리하는 글을 작성할까 합니다.

이번 포스팅은 마무리하면서 다른 주제의 포스팅에서 뵙겠습니다.

 

 

참고

http://www.yes24.com/Product/Goods/74219491

 

오브젝트 - 예스24

역할, 책임, 협력을 향해 객체지향적으로 프로그래밍하라!객체지향으로 향하는 첫걸음은 클래스가 아니라 객체를 바라보는 것에서부터 시작한다. 객체지향으로 향하는 두번째 걸음은 객체를

www.yes24.com

 

'스터디 > 오브젝트' 카테고리의 다른 글

14장 - 일관성 있는 협력  (1) 2023.10.26
13장 - 서브클래싱과 서브타이핑  (0) 2023.10.16
12장 - 다형성  (0) 2023.09.20
11장 - 합성과 유연한 설계  (0) 2023.08.28
10장 - 상속과 코드 재사용  (0) 2023.08.06