
기능이 정상적으로 동작한다고 해서 좋은 코드가 되는 것은 아니다. 실제 프로젝트에서는 새로운 기능 개발보다 기존 코드 수정 비율이 더 높은 경우가 많다. 유지보수가 어려운 코드는 시간이 지날수록 수정 비용과 버그 발생 가능성을 크게 높인다.
작은 코드 습관 하나가 프로젝트 전체 품질에 영향을 줄 수 있다. 중복 코드, 하드코딩, 긴 함수 구조 같은 코드 스멜은 초기에 발견하고 수정하는 편이 훨씬 유리하다.
같은 코드를 반복 복사하는 중복 코드 패턴
중복 코드는 가장 흔하게 발견되는 코드 스멜 중 하나다.
다음 예제를 보자.
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는 코드 스멜과 복잡도를 분석한다.
좋은 코드는 처음부터 완벽하게 만들어지는 경우보다 반복적으로 개선되는 경우가 훨씬 많다.