DEV/회고록

Magic Number 나만의 정의

9thxg 2024. 11. 29. 22:41

Magic Number

컴퓨터 프로그래밍에서 **매직 넘버(Magic Number)**는 다음 중 하나를 의미합니다:
  - 명확한 설명이 없거나 여러 번 반복되어 나타나는 고유 값으로, (가능하면) 이름이 지정된 상수로 대체될 수 있는 값.
  - 파일 형식이나 프로토콜을 식별하는 데 사용되는 고정된 숫자 또는 텍스트 값 (파일과 관련된 내용은 파일 서명 목록을 참조).
  - 다른 의미로 오인될 가능성이 적은 독특하고 고유한 값 (예: 전역 고유 식별자, Globally Unique Identifiers).

첫 만남

 2년간 개발해 왔지만 Magic Number에 대해 알게 된 것은 최근이다. 부끄럽게도 모른 채 진행해 왔고 꽤 많은 곳에서 사용해 왔다. 회사의 한 프로젝트가 마무리될 시점에 고객의 요청으로 코드 리뷰를 하다 알게 되었다. 그래서 처음에 개념부터 잡는 것이 어려웠다. 특히 적용해야 할 범위에 대해서 많은 고민이 있었다. 생각으로는 도저히 느낌이 오질 않을 것 같아 적용해야 할 페이지를 진행하면서 나만의 범위를 잡아갔다.

그래서 내가 정한 범위는

 코드를 읽을 때 내가 다른 개발자라는 가정을 하고 읽어보았고 이런 관점은 많은 도움이 됐다. "그래서 0, 1, 2가 뭔데?", "그래서 U, D, C가 뭔데?" 등과 같이 나에게 질문을 던졌고 이는 상수명에 반영하게 되었다.

// index에서의 Magic Number
{selectedIndex === 0 && <div>View Grid<div>}
{selectedIndex === 1 && <div>View Chart<div>}
{selectedIndex === 2 && <div>View Other Info<div>}

// 다음과 같이 변환
const VIEW_GRID_INDEX = 0;
const VIEW_CHART_INDEX = 1;
const VIEW_OTHER_INDEX = 2;

{selectedIndex === VIEW_GRID_INDEX && <div>View Grid<div>}
{selectedIndex === VIEW_CHART_INDEX && <div>View Chart<div>}
{selectedIndex === VIEW_OTHER_INDEX && <div>View Other Info<div>}
// status에 대한 Magic Number
if(item.status === "C"){
    // 생성 처리
} else if(item.status === "U"){
    // 수정 처리
} else if(item.status === "D"){
    // 삭제 처리
}

// 다음과 같이 변경
const CREATE_STATUS = "C";
const UPDATE_STATUS = "U";
const DELETE_STATUS = "D";

if(item.status === CREATE_STATUS){
    // 생성 처리
} else if(item.status === UPDATE_STATUS){
    // 수정 처리
} else if(item.status === DELETE_STATUS){
    // 삭제 처리
}

 예시와 같이 명확히 다른 개발자가 알아보기 힘든 Magic Number의 경우는 쉽게 변환할 수 있었지만 여전히 범위에 대해서 고민이 많았다. 

 

if(itemList.length >= 1){...}

if(itemList.length < 1){...}

// 다음과 같은건 너무 오버하는 느낌이 들었다.
const MIN_ITEM_LIST_LENGTH = 1;

if(itemList.length >= MIN_ITEM_LIST_LENGTH){...}

if(itemList.length < MIN_ITEM_LIST_LENGTH){...}

 배열의 개수를 통해서 빈배열을 확인할 때 이때의 Number는 상수처리를 해야 하는지 특히 고민했다. 실제로 적용해 보니 너무 오버해서 쓰는듯한 느낌이 강했다.

 

const isEmptyList = itemList.length < 1;

if(isEmptyList){...}

if(!isEmptyList){...}

 Magic Number를 제거하는 것은 다른 개발자가 읽었을 때 쉽게 코드가 읽히도록 만드는 것이라 생각했고 과도하게 제거하지 않으려고 했다. 오히려 위와 같은 상황은 if문의 조건을 변수로 빼서 사용하는 것이 더 쉽게 읽힐 것이라 생각한다.

느낀 점

 다른 많은 개발자들과 함께 작업해 본 경험이 없어서 Magic Number 등과 같이 다른 개발자를 배려하는 부분이 부족하다고 느꼈다. 다른 개발자뿐만 아니라 추후 많은 프로젝트를 진행하고 유지보수하게 되었을 때 나 자신에게도 유용할 것 같다. 여전히 개발에 대해서 모르는 부분이 많고 미지의 세계이지만 하나씩 경험해 나만의 것으로 만들 것이다.