노트

심플 디자인

Simple Design

설계#architecture · 연결된 개념 16개

쉽게 말하면

심플 디자인은 '테스트 통과, 의도가 보임, 중복 없음, 요소 최소' 네 가지를 차례로 지키는 설계 규칙이에요. 여행 짐을 쌀 때 필요한 건 다 챙기되 같은 물건을 두 번 넣지 않고 가방 수를 줄이는 것과 비슷해요.

비유가 깨지는 곳 짐과 달리 '나중에 필요할 테니 미리 칸을 똑같이 나눠 두자'는 과도한 일관성이 오히려 구성요소를 늘려요. 네 규칙엔 우선순위도 있어서 테스트 통과가 늘 먼저예요.

켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.

박영록의 강의는 이를 한 줄로 더 줄인다. 중복이 없으면서 구성요소가 최소인 코드.

알아차리기 어려운 중복

  • 평행한 클래스 계층처럼 구조에 숨은 중복
  • 여러 곳에 퍼지는 같은 if 조건 → 산탄총 수술과 뒤엉킨 변경, 조건부 로직을 다형성으로 바꾸기
  • 엔티티·DTO(Data Transfer Object)·서비스에 같은 필드를 반복 나열하는 것
  • 서버와 클라이언트가 같은 타입과 검증을 따로 정의하는 것. OpenAPI 같은 스키마 공유로 줄일 수 있다

일관성의 함정

"나중에 복잡해질 테니 미리 같은 구조로 나눠 두자"는 과도한 일관성은 구성요소를 늘린다. 깨지면 클릭 수·중복·버그 같은 실제 손해가 생기는 일관성만 중요하고, 중복을 잘 없애다 보면 그런 일관성은 저절로 따라온다.

단순한 설계를 방해하는 생각

  • 품질을 높이려면 시간이 더 든다: 품질이 중요한 이유가 빨리 끝내기 위해서다. 리팩터링할 시간이 없는 게 아니라 리팩터링을 안 해서 시간이 없다
  • 처음부터 제대로 해야 한다: 처음부터 완벽히 설계할 수는 없다. 고객도 써 봐야 원하는 걸 알고, 개발하는 동안 모두가 배운다(골의 법칙)
  • 자동화는 좋은 것이다: 복잡한 것을 자동화하면 복잡함이 굳는다. 먼저 단순화하고 자동화한다

얼마나 철저히 지킬지는 숙련도에 따라 다르다. 초보는 규칙으로, 전문가는 직관으로 일한다는 드레퓌스 모델(Dreyfus Model)처럼, 아직 초보라면 극단적으로 지켜 볼 만하다(수파리). DRY 원칙, KISS 원칙, YAGNI가 같은 방향을 가리키고, 테스트가 첫 규칙인 이유는 테스트 주도 개발 (TDD)에 있다.

출처: 인프런 『심플 디자인』 박영록 · Martin Fowler: Beck Design Rules

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 디자인 패턴

    반복해서 나타나는 설계 문제에 대한 검증된 해결 구조와 그 이름. 복사해 쓰는 완성 코드가 아니라 객체들이 협력하는 방식을 설명하는 어휘다. 1994년 이른바 GoF(Gang of Four, 네 명의 저자)의 책 『Design Patterns: Elements of Reusable Object-Oriented Software』가 23개 패턴을 정리하며 널리 퍼졌다.

  • 소프트웨어 공학의 법칙들

    소프트웨어 시스템과 팀, 의사결정에 반복해서 나타나는 경험칙들을 모아 부르는 말. 법칙이라고 부르지만 대부분 증명된 정리가 아니라 관찰과 격언이다. 판단할 때 떠올릴 이름표로 쓴다. 따로 노트를 둔 것은 링크로, 나머지는 한 줄로 적었다.

  • 섣부른 최적화

    "섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(Donald Knuth)가 1974년 글 「Structured Programming with go to Statements」에서 쓴 말이다. 원문의 맥락은 작은 효율은 대부분(약 97%)의 경우 잊으라는 것이고, 정말 중요한 3%는 놓치지 말라는 말이 이어진다.

  • 구조와 동작, 옵션의 가치

    켄트 벡이 정리 시점을 판단하려고 꺼내는 경제학 틀. 소프트웨어는 두 가지 가치를 만든다. 오늘 하는 일(동작)과, 내일 새로 할 수 있게 되는 일(옵션)이다. 구조는 동작을 바꾸지 않지만 옵션을 만든다.

  • 결합도

    한 요소를 바꿀 때 다른 요소도 바꿔야 하는 관계. 결합도는 언제나 "어떤 변경에 대해" 결합되어 있는지를 함께 말해야 의미가 있다. 같은 두 모듈도 어떤 변경에는 묶여 있고 어떤 변경에는 독립적일 수 있다.

보기 옵션