Self-Dev/Design Patterns R&D

[6] 소프트웨어 디자인 원칙들 - 좋은 디자인 특징

Khadra 2024. 5. 31. 22:12

출처 : 디자인 패턴에 뛰어들기 - 알렉산더 슈베츠 도서


코드 재사용

소프트웨어 제품을 개발할 때 가장 중요한 두 가지 지표는 비용과 시간이다.
개발 시간을 단축하면 경쟁자들보다 일찍 시장에 진입할 수 있고, 개발 비용을 절감하면 마케팅에 더 많은 자금을 투자하여 더 많은 잠재 고객에게 접근할 수 있기 때문이다.



코드 재사용의 중요성

코드 재사용은 개발 비용을 줄이는 중요한 방법 중 하나다.
이 개념은 아래와 같은 장점을 가지고 있다.

  • 효율성 증가: 기존 코드를 재사용함으로써 개발 시간을 절약할 수 있다.
  • 품질 향상: 이미 검증된 코드를 사용하면 버그 발생 가능성이 줄어든다.

그러나 새로운 상황에서 기존 코드를 작동하게 하는 것은 쉽지 않으며, 아래와 같은 이유가 있다.

  • 컴포넌트 간의 단단한 결합
  • 인터페이스 대신 구상 클래스에 대한 의존
  • 하드코딩된 작업

디자인 패턴의 역할

디자인 패턴은 소프트웨어 컴포넌트의 유연성을 높이고 재사용을 쉽게 만든다.

에릭 감마는 재사용을 세 가지 수준으로 설명한다.

  • 클래스 재사용
    • 가장 낮은 수준으로, 개별 클래스를 재사용한다.
    • 예를 들어, 클래스 라이브러리나 컨테이너 클래스가 이에 해당한다.
  • 패턴 재사용
    • 중간 수준으로, 디자인 패턴을 재사용한다.
    • 디자인 패턴은 몇 개의 클래스들이 어떻게 관련되어 있고 상호작용하는지에 대한 상세한 설명을 제공한다.
    • 이는 프레임워크보다 더 작고 추상적이다.
  • 프레임워크 재사용
    • 가장 높은 수준으로, 프레임워크를 재사용한다.
    • 프레임워크는 문제를 해결하기 위한 핵심 추상화를 식별하고, 이를 클래스들로 표현하며, 그들 사이의 관계를 정의한다.
    • 프레임워크는 사용자가 특정 작업을 할 때 호출한다.

디자인 패턴의 장점

  • 재사용성: 패턴은 다양한 프로젝트에서 재사용할 수 있는 해결책을 제공한다.
  • 유연성: 소프트웨어 컴포넌트의 유연성을 높여준다.
  • 효율적 의사소통: 팀 내에서 공통 언어를 정의하여 더 효율적으로 의사소통할 수 있게 한다.
  • 예를 들어, 팀이 디자인 패턴을 이해하면 '그 문제를 위해서는 그냥 싱글턴을 사용하세요'라는 말로 모두가 어떤 해결책을 의미하는지 바로 이해할 수 있다.

확장성

변화는 프로그래머의 삶에서 유일하게 변하지 않는 것이다.

소프트웨어 개발자는 항상 변화에 대응해야 한다.
예를 들어, 윈도우용으로 비디오 게임을 출시했는데 사용자들이 맥용 버전을 요구하거나, 네모난 버튼을 사용하던 인터페이스에 둥근 버튼이 유행하게 되는 경우가 있다. 이러한 변화는 개발 과정에서 자주 발생하며, 이를 잘 이해하고 대처하는 것이 중요하다.



변화가 발생하는 이유

  • 문제에 대한 이해도 향상

    • 첫 번째 이유는 문제를 해결하기 시작하면 문제를 더 잘 이해하게 되기 때문이다.
      종종 개발자들은 앱의 첫 번째 버전 개발을 마칠 때쯤 문제의 여러 측면을 훨씬 더 잘 이해하게 되며, 처음부터 다시 개발하고 싶어 할 수 있으며, 개발자로서 실력이 향상되면서 작성한 코드가 쓰레기처럼 보일 수도 있다.
  • 외부 요인의 변화

    • 두 번째 이유는 통제할 수 없는 무언가가 변경되었기 때문이다.
      이는 많은 개발 팀들이 원래 아이디어에서 새로운 아이디어로 선회하는 이유이기도 하다.
      예를 들어, 온라인 앱에서 플래시에 의존했던 개발자들은 브라우저들이 플래시에 대한 지원을 중단했을 때 코드를 재작성하거나 마이그레이션해야 하는 경우가 종종 일어난다.
  • 목표의 변화

    • 세 번째 이유는 목표들이 변했기 때문이다.
      예를 들어, 고객이 앱의 현재 버전에 만족하고 이제 원래 기획 단계 미팅에서 언급하지 않은 여러 '작은' 변경을 원할 수 있다. 사실 이러한 변경은 사소하지 않으며, 첫 번째 버전이 훌륭하여 고객에게 더 많은 가능성을 보여주었기 때문이다.

긍정적인 측면

변경 요청이 들어온다는 것은 누군가가 여전히 당신의 앱에 관심이 있다는 긍정적인 신호이다.
이는 소프트웨어가 계속해서 사용되고 있음을 의미하는 것이다.



미래 변경을 위한 설계

모든 노련한 개발자들은 앱의 아키텍처를 설계할 때 미래의 변경에 유연하게 대응할 수 있도록 노력한다.
이를 위해 아래와 같은 전략들을 사용할 수 있어야 한다.

  • 모듈화: 소프트웨어를 모듈화하여 특정 기능을 독립적으로 변경할 수 있도록 한다.
  • 디자인 패턴: 재사용성과 확장성을 고려한 디자인 패턴을 적용한다.
  • 유연한 아키텍처: 변경이 용이하도록 유연한 아키텍처를 설계한다.
  • 테스트 주도 개발(TDD): 코드 변경 시 문제가 발생하지 않도록 자동화된 테스트를 작성한다.

결론

변화는 불가피하며, 이는 소프트웨어 개발의 자연스러운 부분인 것 같다.
이러한 변화에 유연하게 대응할 수 있는 아키텍처와 설계를 준비하는 것은 성공적인 소프트웨어 개발의 핵심 요소이며, 노련한 개발자는 변화에 대비하여 소프트웨어를 설계하고, 이를 통해 지속적으로 유연하고 확장 가능한 소프트웨어를 제공하는 것 같다.