Post

오브젝트: 디자인 패턴과 프레임워크의 실전 활용법

디자인 패턴은?

  • 소프트웨어 설계에서 반복적으로 발생하는 문제에 대해 반복적으로 적용할 수 있는 해결 방법
  • 재사용이 목적
  • 협력을 일관성 있게 만들기 위해 재사용할 수 있는 설계의 묶음

프레임워크는?

  • 설계와 코드를 함께 재사용
  • 일관성 있는 협력을 제공하는 확장 가능한 코드

1. 디자인 패턴과 설계 재사용

패턴 분류

패턴은 일반적으로 패턴의 범위나 적용 단계에 따라 4가지로 나눈다.

  1. 아키텍쳐 패턴
    • 미리 정의된 서브 시스템들을 제공 & 각 서브시스템들의 책임을 정의하며 서브 시스템 사이의 관계를 조직화하는 규칙과 가이드 라인을 포함
  2. 분석 패턴
    • 업무 모델링 시 발견되는 공통적인 구조를 표현하는 개념들의 집합
  3. 디자인 패턴
    • 특정 상황 속에서 일반적인 설계 문제를 해결하고 협력하는 컴포넌트 사이에서 반복적으로 발생하는 구조를 서술
  4. 이디엄
    • 특정 프로그래밍 언어에 국한된 하위 레벨 패턴
    • 주어진 언어의 기능을 사용해 컴포넌트나 컴포넌트 간의 특정 측면을 구현하는 방법을 서술

패턴과 책임-주도 설계

  • 객체지향 설계에서 가장 중요한 것은?
    • 올바른 책임을 올바른 객체에게 할당하고 객체 간의 유연한 협력관계를 구축하는 것.
      • 책임과 협력의 윤곽은 캡슐화, 크기, 의존성, 유연성, 성능, 등 다양한 요소들의 트레이드 오프로 결정됨
  • 패턴은
    • 공통으로 사용할 수 있는 역할, 책임, 협력의 템플릿
    • 패턴을 따르면 특정한 상황에 적용할 수 있는 설계를 쉽고 빠르게 떠올릴 수 있다.
    • 디자인 패턴의 구성요소가 클래스와 메서드가 아니라 역할과 책임이라는 것을 이해하는 것이 중요하다.

캡슐화와 디자인 패턴

  • 어떤 디자인 패턴이 어떤 변경을 캡슐화 하는지를 이해하는 것이 중요하다.
  • 더 중요한 것은 각 디자인 패턴이 변경을 캡슐화 하기 위해 어떤 방법을 사용했는지 이해하는 것이다.

패턴은 출발점이다.

  • 디자인 패턴이 현재의 요구사항이나 적용 기술, 프레임워크에 적합하지 않다면 패턴을 그대로 따르지 말고 목적에 맞게 패턴을 수정해야한다.
  • 패턴 만능주의를 조심해야한다.
  • 패턴을 적용할 때는 항상 설계를 좀 더 단순하고 명확하게 만들 수 있는 방법이 없는지를 고민해야 한다.
  • 패턴을 가장 효과적으로 적용하는 방법은 패턴을 지향하거나 패턴을 목표로 리팩터링 하는 것이다.

2. 프레임워크와 코드 재사용

프레임워크는

  • 코드를 재사용함으로써 설계 아이디어를 재사용한다.
  • 애플리케이션의 아키텍처를 제공하며, 문제 해결에 필요한 설계 결정과 필요한 기반 코드를 함께 포함한다.
  • 애플리케이션을 확장할 수 있도록 부분적으로 구현된 추상 클래스와 인터페이스 집합뿐만 아니라, 추가적인 작업 없이도 재사용 가능한 다양한 종류의 컴포넌트를 함께 제공한다.

상위 정책과 하위 정책으로 패키지 분리하기

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

  • 추상 클래스와 인터페이스는 일관성 있는 협력을 만드는 핵심이다.
    • 협력을 일관성있고 유연하게 만들기 위해서는 추상화를 이용해 변경을 캡슐화 해야한다.
    • 협력을 구현하는 코드 안의 의존성은 가급적이면 추상 클래스나 인터페이스와 같은 추상화를 향하도록 작성한다.
  • 상위 정책이 세부 사항보다 더 다양한 상황에서 재사용 될 수 있어야 한다.
    • 만약 상위 정책이 세부 정책에 의존하게 되면 상위 정책이 필요할 때 세부 사항도 같이 필요하게 되기 때문에 상위 정책의 재사용성이 낮아진다.
      • 이 문제를 해결하기 위한 가장 좋은 방법은 의존성 역전 원칙을 지켜 상위 정책과 세부 사항 모두 추상화에 의존하는 것이다.

제어 역전 원리

  • 의존성을 역전시키면 제어 흐름도 역전된다. 이를 제어 역전(IOC)원리 또는 할리우드 원리라고 한다.
    • 개발자는 프레임워크가 적절한 시점에 호출할 것으로 예상되는 코드를 작성한다. 이는 제어가 개발자에서 프레임워크로 역전 되었다는 것을 뜻한다.
This post is licensed under CC BY 4.0 by the author.