실용주의 프로그래머 Topic 10

Topic 10 직교성 (orthogonality)

데이비드 토머스, 앤드류 헌트

Alt text

느낌표 ! (인상 깊은 문장 | 문맥)

직교성은 설계와 빌드, 테스트, 확장이 쉬운 시스템을 만드는 데에 있어 매우 중요한 개념이다.

p.54

하나가 바뀌어도 나머지에 어떤 영향도 주지 않으면 서로 직교한다고 볼 수 있다. 잘 설계된 시스템에서는 데이터베이스 코드가 사용자 인터페이스와 서로 직교할 것이다. 데이터베이스에 영향을 주지 않으면서 인터페이스를 바꿀 수 있고, 또한 인터페이스를 바꾸지 않으면서 데이터베이스를 교체할 수 있다.

p.55

직교한다는 것은 독립적인 코드로 결합도가 낮은 것을 의마하는 것 같다. 하나를 수정할 때 다른 부분이 영향을 받지 않기 위해서는 독립적이고 결합도가 낮아야하기 때문이다. 결합도가 낮게 코드가 작성되어 있다면 테스트가 쉽고, 테스트가 쉽기 때문에 기능 추가하기가 쉬울 것이다.

필자는 React Native 로 앱을 개발할 때 여러 component 를 보기 쉽도록 해주는 storybook 을 사용한다. 과거에 막 개발하다보니 component 가 통신 코드랑 상태 관련, 데이터 등이 얽혀있다보니 storybook 을 사용하기가 매우 번거로웠다. 이유는 때로는 간단히 UI 만 보고싶은데 서버가 연결되어있지 않으면 화면이 안 보이고 때로는 서버와 연동되어있는 상태에서 동작을 테스트해보고 싶기도 하고 때로는 특정 상태값일 때를 바로 확인하고 싶은 상황도 있기 때문이다. 조그만한 화면을 테스트 하고 싶은데도 분리가 안되어있다면 NavigationContainer 감싸고 때로는 Auth 인증 데이터도 사용해야한다. 이럴 때 사용하기 좋은 기법은 Container & Presentation 이다.

Container 는 데이터와 상태를 관장하고 Presentation 은 Container 로부터 props 를 전달받아 rendering 만 하는 것이다. 이렇게 Container 와 Presentation 으로 분리한다면 UI 만 테스트해보고 싶으면 Presentation 을 사용하면 되고 상태와 통신이 결합된 것을 확인하고 싶다면 Container 를 사용해서 확인하면 된다. 이렇게 했을 때 일단 Presentation 을 만들고 뒤에 상태 관련 작업을 하기 때문에 각 단계에 따라 해야할 일이 명확하기 때문에 코드를 좀 더 명확히 작성할 수 있는 것을 경험하였다.

직교성 있게 코드를 작성한다면 확장성있는 시스템이 될 것이다.

관련 없는 것들 간에 서로 영향이 없도록 하라.

p.56

우리가 설계하고 싶은 것은 자족적(self-contained)인 컴포넌트, 즉 단일하고 잘 정의된 목적을 가진 독립적인 컴포넌트다.

p.56

해당 컴포넌트의 외부 인터페이스를 바꾸지 않는 한 전체 시스템으로 퍼져 나가는 문제를 일으키지는 않으리라고 확신할 수 있다.

p.57

로망 같은 말이다. 해당 부분을 수정하면 다른 부분에 영향을 받지 않는.. 노력은 한다고 하지만 명세가 바뀔 때 가끔은 전체를 바꿔야하기도하는 상황을 겪어보았다. 독립적으로 코드를 작성한다는 것은 단순히 키보드로 코드를 작성하는 것이 아니라 명세 파악까지 잘해야 가능한 것 같다. 개발할 대상을 개발자가 제대로 이해하지 못했는데 개발할 대상이 설계가 잘 될리가 없기 때문이다. 필자의 경우는 일단 키보드에 손 올리기 전에 A4 용지에 글씨를 끄적이면서 정리를 해보는 습관이 있다.

DRY 원칙으로 무장하고 직교성 원칙을 충실히 적용한다면 개발하고 있는 시스템이 유연하고 이해하기 쉬워질 것이다. 디버깅, 테스트, 유지 보수 또한 쉬워질 것이다.

p.64

테스트 케이스를 작성하지 못한 시스템을 보고 개발자에게 왜 없는지 물어보면 대게 시간이 부족해서라고 혹은 테스트 케이스를 모른다고 대답했던 것 같다. 시간이 부족해서 작성하지 못한다는 말에 어떤 취지인지는 공감은 되지만 테스트 케이스를 작성해본 경험이 있다면 대체로 이 말이 틀린 말이라고 생각할 것이다. 테스트 케이스는 개발 시간을 줄여주기 때문이다. 오류나 예상한대로 결과값이 나오는지를 확인해주기 때문이다. 테스트 케이스를 잘 작성하기 위해서는 단순히 테스트 케이스에서 사용되는 데이터 뿐만 아니라 코드가 테스트하기 좋은 코드여야한다. 테스트하기 좋은 코드라는 것은 독립적이고 결합도가 낮은 코드를 의미할 것이다.

Topic 10 느낌

Topic 10 에서는 직교성이라는 말처럼 코드는 가능하다면 서로 간섭 없이 갈 길을 가야한다고 말하고 있는 것 같다.


실용주의 프로그래머 Topic 9

Topic 9 DRY: 중복의 해악

실용주의 프로그래머 Topic 11

Topic 11 가역성

NCloud LB & SourcePipeline 구축하기
tech collection 서비스 성능 개선하기
Selenium 복권 구매 자동화 만들어보기
디자인 패턴
책 리뷰
블로그 챌린지