본문 바로가기
IT/javascript

자바스크립트 콜백 지옥(CallBackHell)

by 뉴코딩맨 2023. 4. 17.
자바스크립트에서 비동기 작업을 처리할 때 콜백 함수(callback function)를 사용하는데, 콜백 함수를 중첩해서 사용하면 코드의 가독성이 나빠지고 유지보수도 어려워지는 문제가 발생할 수 있습니다. 이러한 문제를 일컬어 "콜백 지옥(callback hell)"이라고 합니다.
 
콜백 지옥은 콜백 함수를 여러 겹 중첩해서 사용하면서 코드의 흐름이 꼬이고 가독성이 나빠지는 문제를 의미합니다. 예를 들어, 서버로부터 데이터를 가져와서 화면에 출력하는 코드를 작성한다고 가정해보겠습니다. 이 경우에는 다음과 같은 순서로 작업을 수행해야 합니다.

 

 

콜백 지옥 예시

 
1. 서버로부터 데이터를 가져옵니다.
2. 가져온 데이터를 처리합니다.
3. 처리된 데이터를 화면에 출력합니다.
 
이 작업을 콜백 함수를 사용하여 구현하면 다음과 같은 코드가 됩니다.
 
getData(function(data) {
	processData(data, function(processedData) {
		renderData(processedData, function() {
			console.log('Done!');
		});
	});
});
 
 
위 코드에서 getData 함수는 서버로부터 데이터를 가져오는 비동기 함수입니다. processData 함수는 가져온 데이터를 처리하는 함수이고, renderData 함수는 처리된 데이터를 화면에 출력하는 함수입니다. 각 함수는 콜백 함수를 인자로 받아서 작업을 수행합니다.
 
이 코드는 작동하지만, 콜백 함수를 중첩해서 사용하면 코드의 가독성이 나빠지고 유지보수도 어려워집니다. 예를 들어, getData 함수가 실패할 경우에는 어떻게 처리할지, processData 함수에서 오류가 발생할 경우에는 어떻게 처리할지 등에 대한 예외 처리를 추가해야 합니다. 이러한 예외 처리를 중첩해서 작성하면 코드의 가독성이 더욱 나빠지며, 디버깅도 어려워집니다.
 
 

해결책

 

이러한 콜백 지옥의 해결책으로는 다음과 같은 방법이 있습니다.
 
Promise 객체를 사용하는 방법: Promise 객체를 사용하면 비동기 작업을 순차적으로 처리할 수 있습니다. Promise 객체를 반환하는 함수에서 then 메서드를 호출하여 다음 작업을 지정하면, 이전 작업이 완료된 후에 다음 작업이 실행됩니다. 이를 통해 콜백 지옥에서 벗어날 수 있습니다.
 
getData()
    .then(processData)
    .then(renderData)
    .then(function() {
    console.log('Done!');
})

 

댓글