제로부터 쌓는 개발일지
article thumbnail
반응형

콜백 함수 (callback function)

  • 콜백함수는 함수의 매개변수로 전달되는 함수
    다른 함수에 의해 호출되거나 실행
  • 비동기 작업에서 사용되며, 비동기 작업이 완료되면 호출되어 결과를 처리하거나 어떤 동작을 수행

 

콜백 함수의 역할

  • 비동기 작업의 완료 처리: 비동기 작업(Ex. 파일 로딩, 네트워크 요청)이 완료된 후에 실행
    결과를 처리하거나 화면 업데이트 등의 동작을 수행할 수 있음
  • 이벤트 처리: 웹 애플리케이션에서 사용자의 이벤트(클릭, 입력 등)에 응답하기 위해 콜백함수를 등록
  • 제어권 양도: 콜백 함수를 사용하면 제어권(control flow)을 다른 함수에 양도할 수 있음
    비동기 작업을 수행한 후 다른 코드를 실행할 수 있음

 

콜백 함수의 사용

  • 콜백 함수는 함수의 인수로 전달
// 1. 비동기 작업의 완료 처리
function fetchData(callback) {
  // 비동기 작업 수행
  setTimeout(function() {
    const data = "비동기 작업 결과";
    callback(data); // 콜백 함수 호출
  }, 1000);
}

function processResult(result) {
  console.log("결과 처리:", result);
}

fetchData(processResult); // fetchData 함수에 processResult 함수를 콜백으로 전달

// 2. 이벤트 처리
document.getElementById("myButton").addEventListener("click", function() {
  alert("버튼이 클릭되었습니다.");
});

// 3. 제어권 양도
function performTask(callback) {
  console.log("작업 시작");
  callback();
  console.log("작업 종료");
}

performTask(function() {
  console.log("콜백 함수 실행");
});

 

콜백 지옥 (Callback Hell)

  • 콜백 함수를 중첩하여 사용하면 코드의 가독성과 유지보수가 어려워짐
    이러한 문제를 해결하기 위해 Promise나 async/await와 같은 비동기 패턴을 사용할 수 있음
getData(function(data) {
  processData(data, function(result) {
    saveResult(result, function(response) {
      // 중첩된 콜백 함수
    });
  });
});

 

에러 처리

  • 콜백 함수 내부에서 예외가 발생할 수 있으므로 에러 핸들링이 필요
fetchData(function(data) {
  try {
    // 데이터 처리
  } catch (error) {
    console.error("에러 발생:", error);
  }
});

 

콜백 함수와 this

  • 콜백 함수 내부에서 this 키워드의 동작은 주의해야됨
    this는 호출 컨텍스트에 따라 달라질 수 있음
  • 화살표 함수를 사용하면 this는 외부 스코프에서 상속되므로 다른 값으로 바인딩할 수 있음
const obj = {
  name: "객체",
  regularFunction: function() {
    console.log("일반 함수, this.name:", this.name);
  },
  arrowFunction: () => {
    console.log("화살표 함수, this.name:", this.name);
  }
};
obj.regularFunction(); // this는 obj 객체를 가리킴
obj.arrowFunction(); // this는 외부 스코프를 가리킴

 

Promise

비동기 작업을 처리하기 위한 객체로, 작업이 성공 또는 실패하는 시점을 처리하기 위한 메커니즘을 제공

  • Promise 세 가지 형태
    1. 대기(Pending): 비동기 작업이 아직 완료되지 않은 상태
    2. 이행(Fulfilled): 비동기 작업이 성공적으로 완료된 상태
    3. 거부(Rejected): 비동기 작업이 실패한 상태
// Promise 체이닝을 통해 여러 개의 비동기 작업을 순차적으로 처리
function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const data = "비동기 작업 결과";
      resolve(data); // 성공적으로 작업 완료
    }, 1000);
  });
}

fetchData()
  .then(data => {
    console.log("데이터 처리:", data);
  })
  .catch(error => {
    console.error("에러 발생:", error);
  });

 

async/await

async 함수는 Promise를 반환하며, await 키워드를 사용하여 비동기 작업이 완료될 때까지 기다릴 수 있음

async function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const data = "비동기 작업 결과";
      resolve(data); // 성공적으로 작업 완료
    }, 1000);
  });
}

async function main() {
  try {
    const data = await fetchData();
    console.log("데이터 처리:", data);
  } catch (error) {
    console.error("에러 발생:", error);
  }
}

main();

 

Promise vs async/await

  • Promise는 좀 더 직접적으로 비동기 작업을 다룰 수 있으며, 콜백 지옥을 피하기 위한 좋은 대안
  • async/await는 코드를 더 읽기 쉽고 구조화된 형태로 작성할 수 있으며, 비동기 코드를 동기식처럼 보이게 만듦
    가독성과 유지보수성을 높일 수 있음 (추천)
반응형

'backend > JavaScript' 카테고리의 다른 글

자바스크립트 Class  (0) 2023.10.31
자바스크립트 DOM  (0) 2023.10.31
자바스크립트 this 바인딩  (0) 2023.10.22
자바스크립트 실행컨텍스트  (0) 2023.10.20
자바스크립트 데이터 타입 심화  (1) 2023.10.20
profile

제로부터 쌓는 개발일지

@PachyuChepe

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...