본문 바로가기
Dev/Clean Code

[클린 소프트웨어] PART 2 - CHAPTER 7 - 애자일 설계란 무엇인가?

by 돈코츠라멘 2022. 1. 18.
애자일 팀에서는 나중의 요구사항과 필요에 대해서는 그리 오래 생각하지 않는다. 그보다는, 현재 구조에 초점을 두고 더욱 개선하기 위해 노력한다. 

잘못된 설계의 증상

  1. Rigidity(경직성): 설계를 변경하기 어려움 - 변경을 하기 위해 시스템의 다른 부분들까지 많이 변경해야 하기 때문이다.
  2. Fragility(취약성): 설계가 망가지기 쉬움 - 변경을 하면 시스템에서 그 부분과 개념적으로 아무런 관련이 없는 부분이 망가진다.
  3. Immobility(부동성): 설계를 재사용하기 어려움 
  4. Viscosity(점착성): 제대로 동작하기 어려움
  5. Needless Complexity(불필요한 복잡성): 과도한 설계 - 직접적인 효용이 전혀 없는 기반구조가 설계에 포함되어 있다.
  6. Needless Repetition(불필요한 반복): 마우스 남용 - 단일 추상 개념으로 통합할 수 있는 반복적인 구조가 설계에 포함되어 있다. 
  7. Opacity(불투명성): 혼란스러운 표현 - 읽고 이해하기 어렵다.

이 증상들은 Code Smell과 비슷하지만, 조금 더 높은 단계에서의 문제이다. 이 악취는 코드의 작은 부분이 아니라 소프트웨어의 전체 구조로 고루 펴져 나간다. 설계의 악취는 대개 하나 이상의 원칙을 위반했을 때 발생한다. 예를들어 경직성의 악취는 많은 경우 개방 폐쇄 원칙(OCP)를 충분히 고려하지 않았기 때문에 발생한다.

 

따라서 <Clean Software(Agile Software Development)> PART 2. 애자일 설계에서는 개발자가 코드의 악취를 제거하고 현시점에서의 최적의 설계를 구성할 수 있도록 돕는, 객체지향 설계 원칙들을 배운다!

 

주의! 아무런 악취가 나지 않을 때는 원칙을 적용하지 않는다. 그저 원칙이라는 이유만으로 따르다보면 불필요한 복잡성이라는 새로운 악취를 낳을 수 있다. 

 

애자일 설계란 무엇인가?

앞으로의 내용에서의 '설계'는 코드와는 별개의 UML 다이어그램을 뜻하는 것이 아니다. 소프트웨어 프로젝트의 설계는 추상적인 개념으로, 구체적인 모듈, 클래스, 메소드의 형태와 구조뿐만 아니라 프로그램의 전체 형태와 구조와도 관련되어 있다. 이것은 다양한 방법으로 표현될 수 있지만, 최종적인 구현은 소스 코드가 된다. 결국, 소스코드가 바로 설계다.

설계의 악취: 부패하고 있는 소프트웨어의 냄새

위의 잘못된 설계의 증상을 가지고 있는 경우 소프트웨어가 부패하고 있음을 알 수 있다. 애자일이 아닌 환경에서는, 초기 설계에서 예상하지 않았던 요구사항 변경 때문에 설계가 퇴화하게 된다. 하지만 요구사항의 표류를 탓할 수는 없다. 요구사항은 변경되기 마련이다. 

애자일 팀은 소프트웨어가 부패하도록 내버려두지 않는다. 애자일 팀은 변경을 보람으로 삼는다. 팀은 시스템의 설계를 가능한 한 명료하고 단순하게 유지하고, 이것을 많은 단위 테스트와 인수 테스트로 뒷받침한다. 이런 작업을 통해 설계를 유연하고 변경하기 쉬운 것으로 유지할 수 있다. 이를통해 각 반복이 가능한 한 해당 반복의 요구사항에 가장 적합한 설계를 가진 시스템을 만들어내는 것으로 끝나게 한다. 

변화를 예상하라

대부분의 소프트웨어 프로젝트에서 가장 변덕스러운 요소는 바로 요구사항임을 잊지 말자. 요구사항은 끊임없이 변화한다. 이는 우리가 개발자로서 받아들여야 하는 사실이다! 우리는 변하는 요구사항의 세계에 살고 있고, 우리가 만든 소프트웨어가 이런 변화 속에서 살아남을 수 있게 만드는 것이 바로 우리가 해야 하는 일이다. 만약 소프트웨어 설계가 요구사항 변경 때문에 퇴화한다면, 우리는 애자일 방식대로 하고 있지 않은 것이다.

 

결국, 애자일 설계는 과정이지 결과가 아니다. 이것은 원칙, 패턴, 그리고 소프트웨어의 구조와 가독성을 향상하기 위한 방식의 연속적인 적용이다. 모든 시점에서 시스템의 설계를 가능한 한 간단하고, 명료하고, 표현적으로 유지하려는 노력이다. 

 

 


Reference

  • Robert C. Martin - <Clean Software(Agile Software Development)>

책에 나오는 예제 코드는 제외
그냥 내가 기억하고 싶은 내용 위주로 정리

댓글