Overview

“나 혼자 프로젝트를 하니 주석은 안 달아도 무방해요”
이렇게 말하는 개발자는 그 코드를 가장 많이 보는 것도 자신이라는 사실을 잊고 있을지도 모릅니다. 구린 코드를 보고 욕했는데 3개월 전 자신이 작성한 코드란 걸 알면 그제서야 얼굴이 붉어지기 일쑤죠. 작은 습관이지만 약간의 변화만 준다면 분명 즐겁고 생산적인 개발을 할 수 있을 겁니다. 얼굴 붉어질 일도 없고요. 오늘은 그 노하우를 전해드립니다.

혼돈을 피하는 여섯 가지 코드 작성법

  1. 조건문은 긍정적으로 쓰자
  2. 조건문의 성능은 생각하지 말자
  3. 조건 검증을 깔끔하게 하자
  4. 주석은 적절하게, 적당하게 하자
  5. 상수를 활용하자
  6. 복잡한 코드는 풀어서 쓰자


넌나에게모욕감을줬어
과거의 나 자신아, 넌 나에게 똥을 줬어


1.조건문은 긍정적으로 쓰자

”쟤가 그 아이가 아니지 않지 않나?!”
프로그램 코드를 마지막으로 실행하는 건 컴퓨터지만 코드를 작성하고 관리하는 건 결국 사람입니다. 수많은 조건문이 존재하는 프로그램에서 조건이 부정적이라면 한 번 더 생각해야 합니다. 반대로 조건문을 긍정적으로 작성하면 보다 편리하게 개발을 진행할 수 있습니다. 가능하다면 긍정적인 마인드로 조건문을 적어봅시다.

<?php
// 예제는 PHP로 작성 되었습니다.
$title = $_POST['title'];   // 공지사항 제목

if (empty($title)) {
    echo '제목을 입력해주세요';
    return;
}

// 위의 경우보다 한번 더 생각해야한다.
if (!isset($title)) {
    echo '제목을 입력해주세요';
    return;
}


cf)비슷한 사례

  • for 증감식을 i– 처럼 적는 경우
    꼭 필요한 경우가 아니라면 삼가는 것이 좋다.
  • for로 작성 가능한 반복을 while로 구현하는 경우
    for는 끝이 명확하지만 while은 언제나 불안하다.

2.조건문의 성능을 생각하지 말자

간혹 조건문에 성능을 고민해 줄여보려는 개발자가 있습니다. 10개의 and 조건을 2개로 줄인다면 얼마나 이득일까요? 하지만 이것은 티도 나지 않는 적은 양입니다.1)
조건문을 압축하지 마세요. 시간이 지나면 자신의 코드가 마치 보물지도처럼 보일 수도 있습니다. 조건문을 최적화하려고 하기보다는 보기 좋고 읽기 편하게 변경합시다.

3.조건 검증을 깔끔하게 하자

만약 게시물에 글을 쓰는 프로그램을 제작한다면 요청된 값들이 정상인지 확인해야 합니다. ‘게시물 제목이 있고, 글 내용이 있고, 글 분류가 정상이고, 뭐뭐 하면 등록!’이라고 작성하면 논리적인 접근으로 보이지만 코드의 상태는 그렇지 않습니다.

<?php
$title = $_POST['title'];   // 공지사항 제목
$content = $_POST['content'];   // 공지사항 내용
$category = $_POST['category'];   // 공지사항 분류

if (!empty($title)) {
    if (!empty($content)) {
        if (!empty($category)) {
            // 게시글을 등록한다.!
        } else {
            echo '카테고리를 선택해주세요';
        }
    } else {
        echo '내용을 입력해주세요';
    }
} else {
    echo '제목을 입력해주세요';    
}


if문 블럭이 중첩되어 가로 스크롤 압박에 시달릴 것이기 때문입니다. 또한 나중에 수정하려면 많이 고생해야 합니다. 조건 검증을 하는 코드라면 아닌 경우를 체크하는 것이 더 좋습니다. 아래와 같은 형태로 작성하는 게 깔끔하고, 유지 보수에도 도움이 됩니다.

  • 게시물 제목이 없으면 오류 출력
  • 글 내용이 없으면 오류 출력
  • 글 분류가 정상이 아니면 오류 출력
  • 그 외 등등…

<?php
// 예제는 PHP로 작성 되었습니다.
$title = $_POST['title'];   // 공지사항 제목
$content = $_POST['content'];   // 공지사항 내용
$category = $_POST['category'];   // 공지사항 분류 

if (empty($title)) {
    echo '제목을 입력해주세요';
    return;
}
if (empty($content)) {
    echo '내용을 입력해주세요';
    return;
}
if (empty($category)) {
    echo '카테고리를 입력해주세요';
    return;
}

// 게시글을 등록한다.!



4.주석은 적절하게, 적당하게 하자

주석이 많아야 좋을까요, 아니면 적어야 좋을까요? 이 논제는 여전히 개발자 사이에서 뜨거운 감자입니다. 다양한 의견이 있지만 저는 ‘적당한게 좋다’고 생각합니다. 주석이 없어서 고생한 적도 있지만, 주석이 너무 많거나 쓸모없었던 적도 겪어봤기 때문입니다. 가끔 “코드 한 줄마다 주석을 달아”라는 미친 선임도 있었고 “주석이 필요 없게 깔끔하게 짜”라고 말하는 기괴한 선임도 있었습니다.

사고의 최종 결과물인 프로그램 코드가 아무런 설명 없이 다른 사람 혹은 미래의 자신을 이해시키는 건 불가능한 일이라고 생각합니다. 다양한 테크닉과 아름다운(?) 코딩으로 주석을 줄여나갈 수는 있겠지만 꼭 필요한 곳엔 적어야 한다고 생각합니다.

4-1) 주석이 꼭 필요하다고 생각할 때

  • 깊은 사고의 결과를 코드로 작성하였고, 다음에 왜 그렇게 작성했는지 헷갈릴 것 같을 때
  • 함정 카드가 발동되어 헤맬 것 같은 코드일 때
  • 코드가 길어져 기능의 단위별로 나눠서 보는 게 좋을 때
  • 기술된 함수나 클래스가 이름과 다르게 동작하는 코드일 때
  • 한참 디버깅 후에 허무함을 안겨준 코드일 때
  • 함수 클래스 파일에 대한 주석일 때
  • 변수가 특이성을 가지고 있거나, 타입별로 세팅되는 값일 때
  • 플러그인이나 라이브러리 사용법을 공유할 때

4-2) 주석을 줄여 나가야 한다고 생각할 때

  • 조건문의 내용을 한글로 다시 기술하고 있을 때
  • 프로그램과 관계 없는 내용일 때
  • 변수명으로 설명이 가능한 내용을 기술하고 있을 때

4-3) 주석이 잘못 되었다고 생각할 때

  • 나만 이해할 수 있는 단어나 문장으로 기술된 주석일 때
  • 주어가 없는 주석일 때



5.상수를 활용하자

코드값에 따라 분기를 작성 중이라면 상수를 활용하는 게 좋습니다. ‘F’보다는 FACEBOOK_SERVICE 가 더 직관적이기 때문입니다.

<?php
// 예제는 PHP로 작성 되었습니다.
if ($userAccountType == 'F') {
    // 페이스북 유저 처리 로직
}


/** 유저 구분 값 페이스북 */
define('ACCOUNT_TYPE_FACEBOOK', 'F');

// 코드는 좀 더 길어보이지만 별다른 주석 없이도 어떤 코드인지 알 수 있다.
if ($userAccountType == ACCOUNT_TYPE_FACEBOOK) {
    // 페이스북 유저 처리 로직
}


상수는 프로그램마다 다양한 형태로 지원되기 때문에 선언 후 참조해서 쓴다면 주석을 줄이는 데에 많은 도움이 될 것입니다.

6.복잡한 코드는 풀어서 쓰자

여러 가지 사고의 결정이 다시금 엮여서 또 다른 결과를 만들어야 하는 복잡한 코드입니까? 우선 서술형 문장으로 먼저 정리하십시오. 그 다음 오류가 없다면 이어서 작성하는 것이 좋습니다. 2)

// 기획전이 시작 되면 세팅한 값으로 할인을 하고 
// 기획전이 끝나면 원래의 할인율로 돌아오게 하는 프로그램 이다.

1. 대상 기획전을 찾는다.
    * 기획전 시작일이 오늘인가? 종료일이 오늘인가?
2. 트랜잭션을 연다.
3. 대상 기획전 건수 만큼 루프를 돌며
    1. 조건 체크
        case 1. 시작일이 오늘이면
            1. 상품 상태를 기획전 데이터로 업데이트
        case 2. 종료일이 오늘인면
            1. 상품 상태를 시작일 이전 히스토리 데이터로 변경
    2. 상품 히스토리를 남긴다.
4. 커밋한다.


저는 사고의 결과를 주석 형태로 작성하고, 순번을 달아서 진행을 정리합니다. 다음으로 정리된 내용을 검증하고, 주석을 중간 크기로 작성해 쪼갭니다. 그 밑에 코드를 작성하면 두 마리 토끼를 잡을 수 있습니다. 중간 크기의 주석은 프로그램의 진행 단위를 나눠서 보기 편하고, 단계별로 검증할 때에도 유용합니다.

<?php
/*****************************************************
* 1. 대상 기획전을 찾는다.
*    - 기획전 시작일이 오늘인가? 종료일이 오늘인가?
**************************************************** */
// 세부 로직은 생략함
$list = getPlainedPromotionList();
/*****************************************************
* 2. 트랜잭션을 연다.
**************************************************** */
beginTransaction();
/*****************************************************
* 3. 대상 기획전 건수 만큼 루프를 돌며
*****************************************************/
foreach ($list as $obj) {
/*****************************************************
*        case 1. 시작일이 오늘이면
*            1. 상품 상태를 기획전 데이터로 업데이트
*****************************************************/
    if ($obj['startDate'] == $today) {
        updateProductDistRate($obj['productNo'], $obj['distRate']);
    }
/*****************************************************
*        case 2. 종료일이 오늘인면
*            1. 상품 상태를 시작일 이전 히스토리 데이터로 변경
*****************************************************/
    if ($obj['endDate'] == $today) {
        recoveryProductFromHistory($obj['productNo']);
    }
/*****************************************************
*    2. 상품 히스토리를 남긴다.
*****************************************************/
    addProductHistory($obj['productNo']);
}
/*****************************************************
* 4. 커밋한다.
*****************************************************/
commit(); 



Conclusion

영화 <인터스텔라(Interstellar, 2014)>의 주인공 쿠퍼(매튜 맥커너히)가 책장 너머 다른 차원에서 과거의 자신에게 신호를 보냈던 명장면이 생각납니다.
“ STAY”
그의 메시지는 분명 후회의 몸부림이었을 겁니다. 마찬가지로 당신이 조건문을 부정적으로 만들고 있다면 잠시 키보드에서 손을 떼는 게 좋습니다. 다른 차원의 자신이 어딘가에서 메시지를 보내고 있을지도 모르니까요.
“STOP….”


참고
1) 1초에 수백억 번 이상 연산이 가능한 컴퓨터에선 10회와 2회의 차이가 거의 없다.
2) 동료에게 정리한 문장을 이해시킬 수 있다면 정리가 잘 되었을 확률이 높다.



천보성 팀장 | R&D 개발2팀
chunbs@brandi.co.kr
브랜디, 오직 예쁜 옷만