강연 정리 : 의식적인 연습으로 TDD, 리팩토링 연습하기 by 박재성 (OKKYCON: 2018)

정우성·2021년 12월 18일
0

Lecture
[OKKYCON: 2018] 박재성 - 의식적인 연습으로 TDD, 리팩토링 연습하기

Lecture Material
[OKKYCON] 박재성 - 의식적인 연습으로 TDD, 리팩토링 연습하기

시작하면서, 의식적인 연습

  • TDD와 리팩토링을 왜 해야하는지 알고 있다고 가정 하에 진행

  • 의식적인 연습

    • 컴포트 존을 깨자

    • 피드백을 받을 수 있는 환경을 조성, 피드백에 따라 행동을 변경하자

    • 한 번에 많은 것을 연습하지 말고 한 가지를 중심으로 설계하자

1단계 : 단위 테스트 연습

  • 사용하는 API들이 잘 작동하는지 input, output을 넣어보고 예상한 결과와 맞는지 검증하는 cycle을 연습하자

2단계 : TDD 연습

  • 2단계 부터는 다음과 같은 코드를 예시로 들면서 설명하셨습니다.

    • String Calculator

    • 요구사항 : 쉼표 또는 콜론을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환

  • 발표자님께서는 2~3단계가 가장 중요하다고 언급하셨습니다.

  • 원칙

    1. 회사 프로젝트가 아닌 토이 프로젝트로 연습하기

    2. 웹, 모바일 UI나 DB에 의존관계를 가지지 않는 요구사항으로 연습하기

  • TDD Cycle : Test Fails → Test Passes → Refactor → 다시 처음으로

    • 일단 Test Fails → Test Passes 까지 연습하고 Refactor는 익숙해지면 진행하자, 어려우니까.
  • Production code보다 test code를 먼저 만들기

3단계 : 리팩토링 연습

  • Input과 Output이 바뀌지 않으면서 읽기 좋고 깔끔한 코드를 만드는것이 리팩토링!

  • 테스트 코드는 변경하지 말고 프로덕션 코드를 개선하는 연습을 한다.

  • 메소드 분리

    • 원칙

      1. 정량적인 기준을 가지고 메소드를 분리

        • 한 메소드에 오직 한 단계의 들여쓰기만 한다.

        • else를 쓰지 않는다.

      2. 메소드가 한 가지 일만 하도록 메소드를 분리

      3. 로컬 변수가 꼭 필요한지 판단

      4. Compose method 패턴 적용

        • 메소드의 의도가 잘 드러나도록 동등한 수준의 작업을 하는 여러 단계로 나눈다.

        • 잘 이해가 안되지만 내가 이해하기로는 한 메소드 내부에서 작업하는 요소들이 대부분 함수라면 웬만해서 다 함수들로 만들어서 작업해라 정도의 의미인듯...?

    • 연습할때는 극단적으로 해야 insight가 생긴다 ex) 메소드의 라인 수 제한 설정 등등

    • 한 번에 한 가지 명확하고 구체적은 목표를 가지고 연습하라

  • 클래스 분리

    • 위 예시에 음수는 적용할 수 없다는 요구사항을 추가했다 가정, 테스트 코드 추가

    • 원칙

      1. 모든 원시값과 문자열을 포장한다.

        • 위 예시에서 value를 positive class의 number로 설정
        • 원시값과 문자열로 돌아다니는 것이 아닌 positive class로 돌아다니게 된다. 이는 양수값임을 보장함
        • 객체지향적인 코드가 됨!
      2. 일급 콜렉션을 쓴다.

        • 콜렉션을 클래스로 래핑
      3. 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

        • 어려우면 4개부터 3개, 2개 이런식으로 점점 줄여나가며 연습하기

4단계 : 장난감 프로젝트 난이도 높이기

  • 앞의 원칙들을 준수하면서 연습해보기

  • 점진적으로 요구사항이 복잡한 프로그램 구현

  • 연습하기 좋은 프로그램 요구사항

    • 게임과 같이 요구사항이 명확한 프로그램
    • 의존관계 없이 연습 (DB나 API 등 없이)
    • 약간은 복잡한 로직이 있는 프로그램

5단계 : 의존관계를 추가하여 난이도 높이기

  • 필요한 역량

    • 테스트하기 쉬운 코드와 어려운 코드를 보는 눈

    • 테스트하기 어려운 코드를 테스트하기 쉬운 코드로 설계하는 센스

한 단계 더 나아간 연습

  • 컴파일 에러를 최소화하면서 리팩토링하기

  • ATDD기반으로 응용 애플리케이션 개발하기

  • 레거시 애플리케이션에 테스트 코드 추가해 리팩토링하기

마무리

  • 연습을 위해 필요한 것은?

    • 여유

    • 인내력

    • 나만의 장난감 프로젝트

    • 가장 필요한 것은 꾸준히 도전할 수 있는 용기

정리 후기

첫 프로젝트를 끝내고 코드를 쭉 보면서 옛날에 짜놓았던 코드와 현재 짜넣은 코드들 사이에서 아슬아슬하게 구동하고 있는 느낌이 들었다.
코드를 좀 더 체계적이고 잘짜야 할 필요성을 느껴 찾아보던 중 클린 코드, TDD, 리팩토링에 대해서 알게 되었다.
그렇게 TDD와 리팩토링의 존재를 알고만 있는 상태에서 깃헙을 돌아다니다 여기서 좋은 강연을 발견해 공부도 할 겸 정리해보았다.
앞으로 위 강연에서 배웠던 TDD와 리팩토링을 연습하는 방법을 node.js 사용 프로젝트에 적용시켜보도록 하겠다.

0개의 댓글