자주 실수하는 코드 패턴과 개선 방법Coding

자주 실수하는 코드 패턴과 개선 방법

4분 읽기

코드 패턴

기능이 정상적으로 동작한다고 해서 좋은 코드가 되는 것은 아니다. 실제 프로젝트에서는 새로운 기능 개발보다 기존 코드 수정 비율이 더 높은 경우가 많다. 유지보수가 어려운 코드는 시간이 지날수록 수정 비용과 버그 발생 가능성을 크게 높인다.

작은 코드 습관 하나가 프로젝트 전체 품질에 영향을 줄 수 있다. 중복 코드, 하드코딩, 긴 함수 구조 같은 코드 스멜은 초기에 발견하고 수정하는 편이 훨씬 유리하다.

같은 코드를 반복 복사하는 중복 코드 패턴

중복 코드는 가장 흔하게 발견되는 코드 스멜 중 하나다.

다음 예제를 보자.

if(user.age >= 18){
    console.log("성인");
}

if(admin.age >=18){
    console.log("성인");
}

if(member.age >=18){
    console.log("성인");
}

처음에는 빠르게 개발할 수 있다.

하지만 조건 변경이 발생하면 여러 위치를 수정해야 한다.

함수 분리를 적용하면 수정 범위를 줄일 수 있다.

function checkAdult(person){

   return person.age >=18;

}

console.log(checkAdult(user));
console.log(checkAdult(admin));
console.log(checkAdult(member));

같은 코드가 여러 파일에 존재할수록 유지보수 비용은 빠르게 증가한다.

코드 곳곳에 숨어 있는 하드코딩 문제

숫자나 문자열 값을 직접 입력하면 초기 개발은 빠르다.

하지만 프로젝트 규모가 커지면 수정 작업이 어려워진다.

if(user.role==="ADMIN"){

   showDashboard();

}

상수를 사용하면 관리가 쉬워진다.

const USER_ROLE={

   ADMIN:"ADMIN",

   USER:"USER"

};

if(user.role===USER_ROLE.ADMIN){

   showDashboard();

}

설정값과 비즈니스 로직을 분리하면 수정 범위를 크게 줄일 수 있다.

하나의 함수가 너무 많은 일을 하는 경우

함수 길이가 계속 길어진다면 여러 역할이 섞여 있을 가능성이 높다.

function processOrder(){

   validateOrder();

   calculatePrice();

   saveDatabase();

   sendEmail();

   createLog();

}

책임을 나누면 구조가 단순해진다.

function validate(){}

function calculate(){}

function save(){}

function sendNotification(){}

하나의 함수가 하나의 역할만 수행하도록 만드는 것이 유지보수에 유리하다.

복잡하게 쌓이는 조건문 구조 개선하기

조건문이 계속 늘어나면 수정 난이도도 함께 증가한다.

if(role==="admin"){

}
else if(role==="manager"){

}
else if(role==="member"){

}
else if(role==="guest"){

}

객체 매핑 방식으로 단순화할 수 있다.

const permissions={

   admin:"전체 권한",

   manager:"관리 권한",

   member:"기본 권한",

   guest:"읽기 전용"

};

console.log(permissions[role]);

의미 없는 변수 이름 사용

의미 없는 변수 이름은 시간이 지나면서 읽기 어려운 코드를 만든다.

좋지 않은 이름 개선 예시
data userData
temp paymentResult
a totalPrice

변수 이름은 작성자보다 나중에 코드를 읽는 사람을 위해 존재한다.

에러 처리를 생략하는 습관

실패 상황을 고려하지 않으면 예상하지 못한 문제가 발생할 수 있다.

fetchUser()
.then(data=>{

   console.log(data);

});

예외 처리 추가:

fetchUser()

.then(data=>{

   console.log(data);

})

.catch(error=>{

   console.error(error);

});

정상 상황보다 실패 상황을 먼저 고려하는 습관이 서비스 안정성을 높인다.

실무에서 코드 스멜을 발견하는 방법

실무에서는 다음 방법을 자주 사용한다.

  • 코드 리뷰 진행
  • 정적 분석 도구 활용
  • 작은 단위 리팩토링 반복

ESLint는 문법과 코드 스타일 문제를 탐지한다.

Prettier는 코드 형식을 자동으로 정리한다.

SonarQube는 코드 스멜과 복잡도를 분석한다.

좋은 코드는 처음부터 완벽하게 만들어지는 경우보다 반복적으로 개선되는 경우가 훨씬 많다.