본문 바로가기

[협업] 협업을 위한 코드컨벤션 설정하기

들어가며

Prettier, ESLint를 정리한 글에 이어, 협업에 필요한 내용들을 계속해서 정리하고 있습니다. 앞으로 저와 함께 협업하는 팀원분들에게 도움이 되고 싶습니다. 이 글은 Airbnb code convention style 주로 참고하여 작성했습니다.

 


 

 

 

변수(함수) 명에 대한 Naming Convention

변수, 함수, 인스턴스

변수, 함수, 인스턴스를 작성할 때는 *Camel Case(카멜 케이스)*를 사용합니다.

ex) camelCase

 

함수명 작성

함수명을 작성할 때는 동사+명사 형태로 구성합니다.

ex) getUserInfomation()

 

Class, Constructor

Class, Constructor를 작성할 때는 *Pascal Case(=upper 카멜 케이스)*를 사용합니다.

ex) CamelCase

 

글자의 길이

글자의 길이는 20자 이내로 제한합니다. 4 단어 이상이 들어가거나, 부득이하게 20자 이상이 되는 경우 팀원과의 상의를 거칩시다.

 

 

Flag로 사용되는 변수

플래그(Flag)란 '깃발'이란 의미이지만, 프로그래밍에서는 '상태를 기록하고 처리 흐름을 제어하기 위한 boolean 변수'를 의미합니다.

Boolean의 경우 조동사+flag 종류로 구성됩니다. ex) isNum, hasNum

 

약칭의 사용

약어는 되도록 사용하지 않는 것이 좋습니다. 부득이하게 약어가 필요하다고 판단되는 경우 팀원과의 상의를 거쳐봅시다.

let idx; // bad
let index; // good

let cnt; // bad
let count; // good

let arr; // bad
let array; // good

let seoul2Bucheon; // bad
let seoulToBucheon; // good

 

 


 

 

최대 tab depth의 제한

tab의 최대 depth는 4로 제한합니다. 만약 이 이상으로 depth가 깊어지면 함수를 통해 나눌 수 있도록 합니다. 그 이상으로 개선할 수 없다고 판단되는 경우, 팀원들과의 코드 리뷰를 통해 개선합니다.

function func () {
  //tab1
  if() {
    //tab2
    array.reduce((pre, cur) => {
      //tab3
      if(cur == status) {
        //tab4
       }
     }
   }
 }

 

 


 

주석 규칙

한줄은 //로 적고, 그 이상은 /** */로 주석을 작성합니다.

// 한 줄 주석일 때
/**
* 여러줄
* 주석일 때
*/

 

함수에 대한 주석

backend에서 공통적으로 사용하는 함수의 경우, 모듈화를 통해 하나의 파일로 관리합니다. 하나의 파일의 시작 부분에 주석으로 상세 내용을 작성합니다. 정리해야 하는 부분은 다음과 같습니다.

 

  • 함수의 전체 기능에 대한 설명
  • 함수의 파라미터에 대한 설명 (type: ..., 역할)
  • router 또는 api일 때에는 성공 여부도 적어준다.
  • 예시 코드
/**
 * @api {get} /study/:roomNumber/questions?sort_by=created&order_by=asc 방의 질문 목록을 가져옴
 * @apiName GetQuestions
 * @apiGroup Question
 *
 * @apiParam {String} roomNumber 유일한 방 번호
 *
 * @apiSuccess {Boolean} success API 호출 성공 여부
 * @apiSuccess {String} message 응답 메시지
 * @apiSuccess {Object} data 해당 방의 질문 리스트
 */
 
router.get(
  "/study/:roomNumber/questions",
  [checkParamAndQuery("roomNumber").isNumeric()],
  getQuestions.default
);

 

가장 먼저 함수가 어떤 기능을 하는지 설명하고, API의 이름은 GetQuestions라고 설명합니다. 함수의 param값으로는 roomNumber를 받고, String형태입니다. 또한 이 함수가 실행됐을 때, 성공 여부가 apiSuccess처럼 나오게 됩니다. 

 

 


 

bracket({}) 규칙

if문의 중괄호는 여러 줄로 작성합니다.

 

if(trigger) {
  return;
}
// logic start

주요 중괄호 앞에는 스페이스를 1개 넣어주세요.

 

if (trigger) {   -> bad
  return;
}

if (trigger) {  -> good
  return;
}

 


 

magic number 지양

magic number란 코드에서 숫자를 직접 사용하는 것을 말합니다.  magic number나 문자열을 비교할 경우, constant.js에 상수화 하여 관리합니다. 

//constant.js
const LEFT = 'left';

//other_logic_file.js
if (dir === LEFT) {
    //...
}

 

 

만약, 에러 메시지를 반환할 필요가 있는 경우 constant.js에 상수를 대문자로 생성합니다.

//constant.js
const LOGIN_ERROR_MESSAGE = '로그인에 실패했습니다.';

 


 

함수 사용

else if의 사용

불가피한 경우를 제외하고 else if의 사용을 최대한 줄여야 합니다. ex) 조건을 만족하면 탈출하는 if로 구현하는 등

 

if ( a > b ) {
  //...
} else if ( b > a ){   -> bad
  //...
}

if ( a > b) {
  //...
} else {  -> good
  //...     
}

 

arrow function의 사용 (익명 함수)

테스트가 필요한 기능이면 arrow function을 사용하지 않습니다. 만약 한 줄로 끝나는 경우, 테스트가 필요 없는 경우 등에는 arrow function의 사용이 가능합니다.

 

함수 파라미터 개수 제한

함수의 인자로 변수를 선언하는 것은 3개까지 가능합니다.

 

function test (a, b, c, d) {
    console.log(a, b, c, d) => bad
}

function test (a, b, c) {
    console.log(a, b, c) => good
}

 

비동기 함수의 사용

Promise함수의 사용은 지양하고 async, await를 사용하도록 합니다. 다만 로직을 짜는 데 있어 promise를 불가피하게 사용할 경우, 주석으로 표시하고 commit에 그 이유를 작성합니다.

 


 

데이터 베이스 명명 규칙

DB 이름 (스키마)

  • 데이터베이스 명은 영어 대문자, 길이는 8자 이내로 구성합니다.
// config.json

"development": {
   ...,
  "database": "SOPT_27",
   ...
},

 

테이블

테이블은 영어 대문자로 구성, 대분류_의미 있는 테이블 명 형태로 작성합니다.

module.exports = (sequelize, DataTypes) => sequelize.define('EXERCISE_VIDEO_TB', {

}, {

});
  • 테이블 명의 구성은 최대 3 단어까지 사용할 수 있습니다.
  • 테이블임을 표시하기 위해 테이블 명 뒤에 '_TB'라는 구분을 사용합니다.
  • 각 단어의 최대 길이는 8자 이내로 구성합니다.
  • 최대 길이는 26자 이내로 구성합니다.

 

컬럼

  • 컬럼은 snake 표기법을 따르고, 의미 있는 컬럼명_접미사 형태로 작성합니다. 컬럼의 성질을 나타내는 접미사를 사용합니다. (사용하는 데이터의 타입을 나타내는 것이 아님에 유의)
module.exports = (sequelize, DataTypes) => sequelize.define('EXERCISE_VIDEO_TB', {
      title: {
            type: DataTypes.STRING,
            allowNull: false,
      },
      runtime: {
            type: DataTypes.INTEGER,
            allowNull: false,
      },
      link: {
            type: DataTypes.STRING(200),
            allowNull: false,
      },
      timecategory: {
            type: DataTypes.INTEGER,
            allowNull: false,
      },
}, {

});

 

접미사 list

  • CNT : count 조회수 등의 count에 사용됩니다.
  • DT : date 날짜인 경우를 나타냅니다.
  • FK : foreign key를 나타내는 데 사용합니다.
  • FL : flag 0, 1로 구성된 상태를 나타냅니다.
  • ID : id 계정 등의 아이디를 나타냅니다.
  • NM : name 이름, 별명 등 식별 가능하며 중복이 가능한 문자열 나타내는 데 사용합니다.
  • NO : number 나이, 휴대폰 번호 등 숫자를 나타냅니다.
  • ORD : order 정렬에 사용되는 index를 나타냅니다.
  • PK : primary key를 나타내는 데 사용합니다.
  • ST : status 회원의 등급, 성별 등의 상태를 나타냅니다.

 

 


 

 

 

마치며

지금까지 코드 컨벤션에 대해서 알아봤습니다. 아직 협업을 위해 모르는 것이 너무도 많습니다. 어려운 기술들을 공부하는 것도 물론 중요하지만, 기본적인 협업의 자세, 협업의 태도부터 잘 정립하는 것이 중요하다고 생각합니다. 기본을 갖춘 개발자가 되고 싶습니다. 앞으로 협업을 위한 자료들을 잘 정리해서 팀원들에게 도움이 될 수 있는 사람이 되고 싶습니다.