Today
-
Yesterday
-
Total
-
  • 기본 값(default value)을 언제 사용할까?
    Practice/Coding, Debugging 2018.01.02 18:57

    얼마 전, 기본 매개변수(default parameter) 때문에 문제를 겪었다.
    큰 규모의 리펙토링 후에 문제가 발생했다.
    이 함수를 호출할 때 문제의 매개변수를 누락한 것이 원인이다.
    그러나, 기본 값이 있어서 오류가 드러나지 않았고,
    테스트에 사용한 값이 오류를 보여주지 못하는 값이었다.[각주:1]


    위 사건 이후로 기본 값에 대해서 고민하게 되었다.


    매번 값을 특정하는 것은 꽤 귀찮은 일이다.
    가령, ssh 접속할 때 포트 번호 22를 항상 입력하는 것은 불편하다.
    기본 값[각주:2]은 이런 불편함을 덜어준다.
    이는 곧 개발의 생산성과 사용의 편의성으로 이어진다.


    반면, 무분별하게 사용하면 위에 가치를 훼손하게 된다.
    가능한 많은 인자에 적당한 기본값으로 붙여놓은 경우가 대표적이다.
    기본값일 수 밖에 없는 근거가 빈약하면 고치기 어려운 버그를 만들 수 있다.


    기본 값을 사용하는 원칙을 정하자.
    명백하고 합리적인 이유가 반드시 있어야 한다.


    예를 들면, 일반적인 HTTP 클라이언트를 개발한다면,
    HTTP 프로토콜의 기본 포트인 80을 기본 값으로 사용할 수 있다.
    스펙이 그렇게 명시되어 있기 때문이다.


    데이터베이스 테이블과 클래스 이름 간에 생성 규칙[각주:3]이 있다면,
    테이블의 이름을 생략할 수 있다.
    멤버 변수나 함수의 인자의 기본 값으로 클래스 명에서 도출된 테이블 이름을 사용한다.


    그런데, 사내 HTTP API 서버들의 포트가 다양하다면,
    또는 개발 서버와 테스트 서버, 실 서버 간에 포트가 다르다면,
    포트에 기본 값을 지정할 지 고민이 필요하다.


    예를 들면, 개발환경의 값을 기본값으로 사용하는 경우이다.
    개발 과정에서 인자나 설정값을 매번 입력하기 귀찮다.
    자주 사용함으로 이것을 기본값으로 정했다.
    실서비스에서 일부 값을 누락할 수 있다.
    원래는 값이 필요하다는 적절한 알림을 보내야 한다.
    안타깝게도, 기본값이 있어서 나중에 장애가 터진 다음에 그 사실을 알 수도 있다.


    다른 예로, 어떤 인자에 특정 값만 사용하는 것을 발견한 경우다.
    그 값만 사용하는 확실한 이유를 찾으면 기본값으로 충분하다.
    이유를 모르면서 현재 상황만 보고 기본으로 정하면 안된다.
    미지의 상황은 변할 수 있고 기본값은 "놓치지 쉬운 버그"이기 때문이다.


    '일단 이 값을 기본으로 하자.'와 같은 위험천만한 기본 값은 조심해야 한다.[각주:4]
    당장은 개발의 생산성으로는 이어진다.
    하지만, 이것은 기술 부채가 되어 자신의 발목을 잡을 것이다.
    기본 값은 명백하고 합리적인 접근으로 판단해야 한다.

    1. 이 매개변수는 함수의 로직에서 중요한 것이 아니었기 때문에 크게 신경쓰지 않았다. [본문으로]
    2. 하드 코딩, 기본 매개변수 등 [본문으로]
    3. Convention over Configuration [본문으로]
    4. 문제 탐색 과정에서 탐색만 하고 버릴 코드는 예외이다. 빨리 작성하고 파악하는데 주력해야 하기 때문이다. 대신에, "XXX"나 "HARD CODE"와 같은 주석을 꼭 남긴다. 탐색 이후에 재사용하기로 마음을 먹었다면, 이런 주석을 찾아서 모두 고친다. [본문으로]

    댓글 0

Designed by Tistory.