소프트웨어 개발과 디자인 패턴

JS (TIL & Remind)·2022년 2월 15일
1

소프트웨어 개발과 What-Why-How 생각 모델

소프트웨어 개발 개념 또는 철학

현재까지 소프트웨어 개발을 위한 개념이나 철학으로 정립된 것은 크게 구조적인 것과 객체지향적인 것으로 나눌 수 있다.

  • 구조적인 것은 소프트웨어를 기능 위주의 관점으로 바라보면서 원하는 기능을 하향식으로 세분화, 구체화 시킴으로써 해결책을 만들어 낸다.
  • 객체지향적인 것은 소프트웨어를 데이터 위주의 관점으로 바라보면서 구체적인 데이터들간의 상호 관계를 정의함으로써 원하는 목적을 달성할 수 있는 해결책을 만들어 낸다.

What-Why-How 생각 모델

What-How 생각 모델

소프트웨어 개발은 추상화 레벨을 구체화시켜나가면서 무엇을(What) 어떻게(How) 할지를 반복해나가는 과정이다.

예를 들어 “Hello World” 문자열을 출력한다고 했을 때, 추상화 레벨 0 에서 무엇(What)에 해당하는 것은 “Hello World” 문자열을 출력한다는 것이 되고, 어떻게(How)에 해당하는 부분은 ‘파일로부터 “Hello World” 문자열을 입력받아서 다시 출력한다.’ 와 같은 부분이 될 수 있다.

그리고 추상화 레벨 0에서의 어떻게(How)가 추상화 레벨 1의 무엇을(What)이 되면서, 다시 어떻게(How) 부분이 구체화 되는 방식이 What-How 생각 모델 이다.

What-Why-How 생각 모델

What-Why-How 모델은 무엇(What) 이나 어떻게(How) 보다도 왜(Why)를 강조한 모델이다.

What-Why-How 생각 모델(Thinking Model)

‘왜(Why) 그것을 해야 하는가’에 대한 검증 기준은 목적(Goal)이 무엇인가가 될 것이며,

‘왜(Why) 그렇게 해야 하는가’에 대한 검증 기준은 어떤 것이 최적(Optimization)의 방법인가가 될 것이다.

이처럼 What-Why-How 모델은 기존의 What-How 모델에 왜(Why) 라는 질문과 함께 구체적으로 무엇(What)과 어떻게(How)를 검증하기 위한 목적(Goal)과 최적(Optimization)이라는 기준을 제시하므로, 소프트웨어 개발에서 최적의 해결책을 만들어내기 위한 가장 기본적인 틀이 될 것이다.


소프트웨어 설계 및 디자인 패턴

디자인 패턴이란?

a general, reuseable solution to a commonly occurring problem within a given context in software design
빈번한 문제에 대해 재사용 가능한 해결책으로 이미 검증된 해결방법

디자인 패턴은 문제 해결방법의 Best Practice(모범 사례) 이다.

비슷한 문제에 대해 해결한 방법들을 보면 공통적인 방법이 사용되었다는 것이다.

대부분의 소프트웨어 문제는 이미 예전에 누군가 겪은 문제이고, 이를 해결하기 위한 여러 방법을 사용해 보았을 것이다. 그 방법들에서는 공통된 패턴이 나타났는데, 이 패턴을 모은 것이 디자인 패턴이다.

디자인 패턴의 장/단점

장점

  • 재사용성을 높이고 변경을 쉽게 할 수 있는 구조를 설계할 수 있다.
    • 설계 과정의 속도를 높일 수 있다.
  • 소프트웨어 구조 파악이 용이하다.
    • 개발자들간의 원활한 의사 소통이 가능하다.

단점

  • 객체지향 설계 / 구현 위주로 사용된다.
    • 초기 투자 비용이 부담될 수 있다.
💡 디자인 패턴을 사용함에 있어서 정답은 없다. ’문제에 대한 어떤 디자인 패턴을 사용해보니 장/단점이 어떻다’ 정도의 제안일 뿐이다.

좋은 소프트웨어 설계의 특성

  • 이해 용이성(Understandability)
    • 전체 소프트웨어나 개별 구성 요소에 대해 쉽게 이해할 수 있어야 한다.
  • 수정 용이성(Modifiability or Flexibility)
    • 요구 사항의 변경에 따른 수정이 용이해야 한다.
  • 관리 용이성(Maintainability)
    • 소프트웨어 유지, 보수, 관리 단계에서 버그 수정이나 장애 대처, 요구 사항 변경, 성능 향상 등의 이유로 소프트웨어를 수정해야 할 경우 이를 쉽게 수행할 수 있어야 한다.
  • 재사용 용이성(Reuseability)
    • 개발된 소프트웨어 구성 요소들은 다른 소프트웨어를 개발할 때 쉽게 재사용 가능해야 한다.
  • 테스트 용이성(Testability)
    • 소프트웨어가 원하는 동작이나 기능을 수행하는지 테스트하기 쉬워야 한다.
  • 높은 안정성(Reliability)
    • 소프트웨어가 오류없이 원하는 작업을 수행할 수 있는 확률이 높아야 한다.

좋은 소프트웨어를 설계하기 위한 도구

  • 추상화(Abstraction)와 구체화(Refinement)
  • 모듈화(Modularization)와 계층화(Hierarchy)
    • 모듈 간의 결합도는 약하게, 모듈의 응집도는 강하게, 모듈의 크기는 작게
  • 정보 은닉(Information Hiding)과 변경의 국지화(Localization of Change)
  • 방법론(Method) 및 지침(Guideline)
profile
노션에 더욱 깔끔하게 정리되어있습니다. (하단 좌측의 홈 모양 아이콘)

0개의 댓글