[JavaScript 심화] 비동기 - 콜백 함수

2025. 11. 11. 20:42·React/JavaScript 심화
자바스크립트는 기본적으로 한 줄씩 순서대로 실행되는 "동기" 언어임!
하지만 현실적으로 "서버에서 데이터 받아오기", "파일 읽기", "타이머 기다리기" 등 시간이 걸리는 작업이 많음.

이런 작업을 다 기다리다보면 브라우저가 멈추기 때문에, 비동기 방식으로 처리해야 함

1. 기본적인 비동기 예시

function task() {
  setTimeout(() => {
    console.log("안녕!");
  }, 3000);
}

task();

// (3초 후) 안녕!

`setTimeout()`은 대표적인 비동기 함수임.

3초(3000ms) 뒤에 `console.log("안녕")`을 실행하는데,

그동안 JS는 멈추지 않고 다음 코드를 계속 실행함.

즉, `setTimeout()`은 나중에 실행할 일을 예약하는 함수임


2. 비동기 함수의 결과를 외부에서 쓰기 어려운 이유

function add(a, b) {
  setTimeout(() => {
    const sum = a + b;
    console.log(sum);
  }, 4000);
}

add(1, 2);

// (4초 후) 3

이 코드에서 `sum`은 함수 내부에서만 접근이 가능함

그렇기 때문에 함수 외부에서 결과값을 받아 사용할 수가 없음

왜냐면 `setTimeout()` 안의 코드는 나중에 실행되기 때문임.


그렇다면 방법이 아예 없나??

그렇지 않음.

3. 콜백을 이용한 해결

콜백 함수는 "다 끝나면 이걸 실행해줘"라는 의미임
function add1(a, b, callback) {
  setTimeout(() => {
    const sum1 = a + b;
    callback(sum1);
  }, 5000);
}

add1(3, 4, (value) => {
  console.log(value);
});

// (5초 후) 7
  • `callback`은 나중에 실행할 함수를 뜻함
  • `add1`이 5초 동안 기다리다가 계산이 끝나면
    -> 그 결과인 `sum1`을 `callback()`으로 전달함
  • 즉, `callback(sum1)`은 "결과 다 나왔으니 이제 네 차례임"이라고 하는 신호임

이 구조 덕분에 비동기 결과를 외부에서 활용할 수 있게 됨


4. 콜백이 여러 번 중첩될 때 (콜백 지옥)

음식 주문 -> 음식 식히기 -> 음식 얼리기 를 예시로 들어보겠음

// 음식 주문
function orderFood(callback) {
  setTimeout(() => {
    const food = "타코야끼";
    callback(food);
  }, 5000);
}

// 음식이 식음
function cooldownFood(food, callback) {
  setTimeout(() => {
    const cooldownedFood = `식은 ${food}`;
    callback(cooldownedFood);
  }, 2000);
}

// 음식을 얼림
function freezeFood(food, callback) {
  setTimeout(() => {
    const freezedFood = `냉동된 ${food}`;
    callback(freezedFood);
  }, 2000);
}

orderFood((food) => {
  console.log(food);

  cooldownFood(food, (cooldownedFood) => {
    console.log(cooldownedFood);

    freezeFood(food, (freezedFood) => {
      console.log(freezedFood);
    });
  });
});

// (5초 후) 타코야끼
// (7초 후) 식은 타코야끼
// (9초 후) 냉동된 타코야끼
  • `orderFood`가 끝나면 -> `cooldownFood` 실행
  • `cooldownFood`가 끝나면 -> `freezeFood` 실행
  • 각각의 함수가 다 끝난 뒤 다음 단계로 넘어가는 구조임

이렇게 단계마다 콜백을 넣는 방식이 바로 콜백 기반 비동기 처리임

하지만 이런 구조가 계속 깊어지면

task1(() => {
  task2(() => {
    task3(() => {
      task4(() => {
        ...
      });
    });
  });
});

이런식으로 중첩이 심해지는 현상이 생김. 이를 콜백 지옥이라고 부름.

그럼 이건 어떻게 해결하냐??

 

다음에 공부할 `Promise`와 `async/await`를 사용하면 됨. 실제로 이걸 더 자주씀

이건 다음에 다뤄보겠음!

'React > JavaScript 심화' 카테고리의 다른 글

[JavaScript 심화] 비동기 - async/await  (0) 2025.11.11
[JavaScript 심화] 비동기 - Promise  (0) 2025.11.11
[JavaScript 심화] 동기와 비동기  (0) 2025.11.11
[JavaScript 심화] Date 객체  (0) 2025.11.11
[JavaScript 심화] 배열 메서드 (배열 변형)  (0) 2025.11.10
'React/JavaScript 심화' 카테고리의 다른 글
  • [JavaScript 심화] 비동기 - async/await
  • [JavaScript 심화] 비동기 - Promise
  • [JavaScript 심화] 동기와 비동기
  • [JavaScript 심화] Date 객체
이도서
이도서
  • 이도서
    도서의 코딩노트
    이도서
  • 전체
    오늘
    어제
    • 분류 전체보기 (249)
      • Today I Learned (79)
        • 2024 (78)
      • Swift (25)
        • Swift 문법 정리 (19)
        • RxSwift (5)
      • Swift Study (12)
        • Playground (2)
        • Storyboard (9)
        • UIKit (1)
      • Flutter (27)
        • Dart 언어 (16)
        • Flutter Study (11)
      • React (37)
        • HTML & CSS (8)
        • JavaScript 기본 (12)
        • JavaScript 심화 (14)
        • Node.js (2)
        • React (1)
      • Git (3)
      • 코딩테스트 (60)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 개발 공부 공유 링크
  • 인기 글

  • 태그

    iOS앱개발
    Swift
    내일배움캠프
    객체지향
    Til
    DART
    React
    function
    javascript 기본
    Flutter
    함수
    코딩테스트
    CLASS
    html
    ios앱개발자
    코딩테스트 level.1
    javascript
    ios
    storyboard
    코딩테스트Level.1
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이도서
[JavaScript 심화] 비동기 - 콜백 함수
상단으로

티스토리툴바