개발이야기
JavaScript Code-Refactoring(코드 리펙토링) 을 해보자
나는안울어
2024. 11. 20. 16:06
오늘도 여느 날과 같이
개발하던 중 문득 코드를 봤는데
흠....
function addWishList(gdsId){
const like = document.getElementById('like'+gdsId);
if(like.classList.contains('on')){
if(confirm('즐겨찾기를 취소 하시겠습니까?')){
console.log('찜하기 취소');
const url = "<c:url value='/product/addWishList.do'/>";
fetch(url,{
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
gdsId: gdsId
})
}).then(response => {
if(response.ok){
return response.json();
}else{
throw new Error('찜하기 취소 에러');
}
}).then(json => {
console.log(json);
if(json.result == 'success'){
like.classList.remove('on');
}
}).catch(error => {
console.error('찜하기 취소 에러:', error);
});
like.classList.remove('on');
}
}else{
if(confirm('즐겨찾기 추가 하시겠습니까?')){
console.log('찜하기');
const url = "<c:url value='/product/addWishList.do'/>";
fetch(url,{
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
gdsId: gdsId
})
}).then(response => {
if(response.ok){
return response.json();
}else{
throw new Error('찜하기 에러');
}
}).then(json => {
console.log(json);
if(json.result == 'success'){
like.classList.add('on');
}
}).catch(error => {
console.error('찜하기 에러:', error);
});
like.classList.add('on');
}
}
}
똑같은 코드가 너무 반복되는 느낌을 받았고 뭔가 이쁘지가 않았다
그래서 반복된 코드를 한번 줄이고 로직도 손좀 보고 내 코드 이쁘게 성형을 좀 시켜줘볼까 해서 코드 정리를 해봤다
이게 나름 코드 리펙토링 아니겠는가?
먼저 가장 큰 중복은 fetch를 손봤고 confirm 도 하나의 함수로 통합했다
그리고 if 문 안에 like.classList.contains('on') 이렇게 길게 들어가 있으니까
가독성이 좀 떨어지는거 같아서 이것도 수정했다
그리고 class 에 직접 on 붙였다 제거 했다 하는것도 복잡해 보여서 classLsit.toggle 매서드를 활용하여 좀 더 짧게 만들었다
그리고 confirm 메세지도 사실상 문구가 '취소' or '추가' 이 차이기 때문에 합쳐 보았다
이로써 정리한 코드는
function addWishList(gdsId){
const like = document.getElementById('like' + gdsId);
const isOn = like.classList.contains('on');
const action = isOn ? '취소' : '추가';
const confirmMessage = `즐겨찾기를 ` + action + `하시겠습니까?`;
if (confirm(confirmMessage)) {
let url = '';
if(isOn){
url = "<c:url value='/product/deleteProductWishData.do'/>";
}else {
url = "<c:url value='/product/addProductWishData.do'/>";
}
fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ gdsId: gdsId })
})
.then(response => {
if (response.ok) return response.json();
throw new Error(`즐겨찾기를` + action + `실패`);
})
.then(json => {
console.log(json);
if (json == 'true') {
like.classList.toggle('on', !isOn);
alert(`즐겨찾기를 ` + action + `하였습니다.`);
}else if(json == 'login'){
if(confirm("로그인 후 이용 가능한 서비스입니다. \n로그인 페이지로 이동하시겠습니까?")){
// 로그인 페이지로 이동
location.href = "<c:url value='/cmm/login.do' />";
} else {
return ;
}
}
})
.catch(error => {
alert(`즐겨찾기를 ` + action + `하는 중 오류가 발생하였습니다.`);
console.error(`즐겨찾기를 ` + action + ` 에러:`, error);
});
}
}
오호 코드를 반이나 줄일 수 있었자나?
예전 같았으면 아 뭐 동작만 하면 되는거 아닌가! 라는 마인드였지만
이런 작업을 해보니 동작도 잘 하고 코드도 깔끔하면 나중에 내가 수정할 일이 생겨서
아 이게 어떤 코드였지? 하고 코드를 분석할 때 훨씬 빠르게 하고 그러면 또 업무 효율이 올라가는거 아니겠는가
라는 생각으로 바뀌었다
지금부터라도 반복되는 코드들은 좀 개선을 해나가야 겠다