LogoSEO Jing
  • All Posts
  • SEO Jing
  • okayJing
  • KD Team
  • CLAB Coreteam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

프론트엔드 스터디 8주차: 클로저, Promise, async/await | SEOJing
프론트엔드스터디JavaScript클로저Promise비동기

프론트엔드 스터디 8주차: 클로저, Promise, async/await

2026년 5월 18일·25분 읽기

8주차 학습 자료

  • 입문 강의 (처음이라면): 얄코 JS 입문 강의

    Section 4 (함수·일급 객체·매개변수) 챕터 — 3:25:25부터, 클로저 이해의 전제


    ※ 얄코 무료 파트에는 Promise/async 비동기 파트가 포함되어 있지 않으므로, 비동기 부분은 아래 본문과 심화 자료로 학습하세요.
  • 강의 스킵 가능: 아래 스킵 진단 문제 10개를 모두 맞히면 강의 시청 스킵 가능합니다.
  • 심화 자료 (딥다이브 대비):

    딥다이브 요약 GitHub

안녕하세요. 8주차입니다. 이번 주는 두 가지 큰 주제를 다룹니다. 클로저는 지난 주에 배운 렉시컬 스코프에서 자연스럽게 이어지는 개념으로, React의 useState 같은 훅이 어떻게 동작하는지를 이해하는 기반입니다. 비동기 처리는 서버에서 데이터를 가져오거나 파일을 읽는 등 시간이 걸리는 작업을 처리하는 JS의 핵심 방법입니다. 콜백에서 Promise, async/await으로 이어지는 발전 흐름을 이해하는 것이 목표입니다.

이번 주 비대면 자료는 대면 8주차의 API와 통신 주제와 바로 이어집니다. Promise와 async/await은 문법 자체보다, 서버에 요청하고 응답을 받아 화면 상태로 연결할 때 가장 많이 쓰입니다. 그래서 이번 주는 "비동기 문법을 안다" 에서 끝내지 말고, 요청 성공·실패·로딩 상태를 어떻게 다룰지까지 같이 생각해보면 좋습니다.


스킵 진단 문제

아래 10문제를 막힘없이 풀 수 있다면,

이번 주 학습 자료를 생략하거나, 모르는 부분만 선택적으로 읽으셔도 좋습니다.

바로 하단의 더 알면 좋을 것들을 확인해보세요.

Quiz1 / 10
Q.클로저(Closure)란 무엇인가요?

1. 클로저(Closure) — 렉시컬 환경을 기억하는 함수

먼저 한 줄 리마인드 —

렉시컬 스코프는 "함수가 선언된 위치"를 기준으로 접근 가능한 상위 변수가 정해지는 규칙

이었어요(week6 복습). 클로저는 바로 이 렉시컬 환경을 함수가 끝난 뒤에도 계속 기억하는 현상입니다. 렉시컬 스코프의 자연스러운 결과물이고, 이 특성이 없으면 React의 useState 같은 것도 동작 못 해요.

js
function makeCounter() {
  let count = 0; // 외부 함수의 변수

  return function () {
    // 내부 함수 — 클로저
    count++;
    return count;
  };
}

const counter = makeCounter();
// makeCounter()는 이미 종료됐지만
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
// count 변수가 여전히 살아있음

데이터 은닉

클로저를 활용하면 외부에서 직접 접근할 수 없는 private 변수를 만들 수 있습니다.

js
function createAccount(initialBalance) {
  let balance = initialBalance; // 외부에서 직접 접근 불가

  return {
    deposit(amount) {
      balance += amount;
    },
    withdraw(amount) {
      if (amount > balance) return "잔액 부족";
      balance -= amount;
    },
    getBalance() {
      return balance;
    },
  };
}

const account = createAccount(1000);
account.deposit(500);
console.log(account.getBalance()); // 1500
console.log(account.balance); // undefined — 직접 접근 불가

React와 클로저

지금 이 문단은 React를 배우지 않은 상태에서 전부 이해할 필요 없습니다.

"React도 클로저 위에 얹혀 돌아가는구나" 정도만 감 잡고, 자세한 이야기는 week10 React 주차에서 다시 만납니다. React의 useState 훅이 클로저를 기반으로 동작합니다. 컴포넌트가 리렌더링될 때마다 이벤트 핸들러 내부의 count, setState 등이 클로저로 기억됩니다. useEffect의 의존성 배열을 빠뜨리면 오래된 클로저(stale closure)를 참조하는 버그가 생기는 이유도 클로저 때문입니다.


2. Promise — 콜백 지옥 탈출

서버에서 데이터를 가져오는 fetch, 타이머 setTimeout 등은 결과가 나중에 옵니다. 과거에는 콜백으로 처리했고, 중첩이 깊어지면 콜백 지옥 이 생겼습니다. Promise는 비동기 작업의 결과를 값(객체)으로 표현하여 이를 해결합니다.

js
// 콜백 지옥
fetch("/user", function (user) {
  fetch("/posts?userId=" + user.id, function (posts) {
    fetch("/comments?postId=" + posts[0].id, function (comments) {
      // 점점 깊어짐...
    });
  });
});

// Promise 체이닝 — 수평으로 나열
fetch("/user")
  .then((user) => fetch("/posts?userId=" + user.id))
  .then((posts) => fetch("/comments?postId=" + posts[0].id))
  .then((comments) => console.log(comments))
  .catch((err) => console.error(err));

Promise 상태

  • pending: 비동기 작업 진행 중 (초기 상태)
  • fulfilled: 작업 성공 — .then() 콜백 실행
  • rejected: 작업 실패 — .catch() 콜백 실행
  • 한 번 fulfilled/rejected 상태가 되면 변경 불가

여러 Promise 동시 처리

아래 코드에 await가 미리 등장합니다. await는 3번 섹션에서 정식으로 설명합니다 — 지금은 "Promise가 완료될 때까지 기다렸다가 값을 꺼낸다" 정도로만 읽어주세요.

js
// 순차 실행 — 느림 (앞이 끝나야 다음 시작)
async function sequential() {
  const a = await fetchA();
  const b = await fetchB();
  return [a, b];
}

// 병렬 실행 — 동시에 시작하고 모두 완료 기다림
async function parallel() {
  const [a, b] = await Promise.all([fetchA(), fetchB()]);
  return [a, b];
}

// 가장 먼저 완료된 것만 사용
async function race() {
  return await Promise.race([fetchA(), fetchB()]);
}

3. async/await — Promise를 동기처럼

async/await은 Promise를 기반으로 한 문법적 설탕(syntactic sugar)입니다. 비동기 코드를 마치 동기 코드처럼 읽기 쉽게 작성할 수 있게 해줍니다.

js
// Promise 체이닝
function getUser(id) {
  return fetch(`/users/${id}`)
    .then((res) => res.json())
    .then((user) => user)
    .catch((err) => {
      throw err;
    });
}

// async/await — 같은 동작, 더 직관적
async function getUser(id) {
  try {
    const res = await fetch(`/users/${id}`);
    const user = await res.json();
    return user;
  } catch (err) {
    throw err;
  }
}

주의: await 병렬 실행

js
// 잘못된 예 — 순차 실행 (불필요하게 느림)
async function bad() {
  const a = await fetchA(); // fetchA 완료 대기
  const b = await fetchB(); // 그 다음에야 fetchB 시작
}

// 올바른 예 — 병렬 실행
async function good() {
  const [a, b] = await Promise.all([fetchA(), fetchB()]);
}

실무에서는 React 컴포넌트에서 데이터를 가져올 때 useEffect 안에서 async 함수를 정의하고 호출하는 패턴을 주로 사용합니다. 아래 코드는 React 문법이라 지금 당장 이해 안 해도 됩니다. "async 함수를 만들고 그 안에서 await를 쓴다" 패턴만 눈에 익혀두세요. React는 week10에서 만납니다.

js
useEffect(() => {
  async function fetchData() {
    try {
      const res = await fetch("/api/data");
      const data = await res.json();
      setData(data);
    } catch (err) {
      setError(err);
    }
  }

  fetchData();
}, []);

fetch 실전 패턴 — 성공, 실패, 로딩을 나눠서 보기

fetch()를 사용할 때 가장 많이 하는 실수는 "응답이 왔으니 성공"이라고 생각하는 것입니다. fetch()는 네트워크 자체가 실패한 경우에는 reject되지만,

404나 500 같은 HTTP 에러 응답은 Promise reject로 처리하지 않습니다

. 서버가 응답을 보내긴 했기 때문입니다. 그래서 res.ok나 res.status를 직접 확인해야 합니다.

js
async function fetchUser(userId) {
  const res = await fetch(`/api/users/${userId}`);

  if (!res.ok) {
    throw new Error(`HTTP error: ${res.status}`);
  }

  const data = await res.json();
  return data;
}

화면에서는 보통 데이터를 가져오는 동안의 로딩 상태, 실패했을 때의 에러 상태, 성공했을 때의 데이터 상태를 나눠서 다룹니다. 아직 React를 배우기 전이라도 이 세 가지 이름은 꼭 기억해두세요.

js
let loading = true;
let error = null;
let data = null;

try {
  data = await fetchUser(1);
} catch (err) {
  error = err;
} finally {
  loading = false;
}

요청끼리 서로 의존하지 않는다면 Promise.all()로 병렬 실행할 수 있습니다. 예를 들어 사용자 정보와 알림 개수는 동시에 가져와도 됩니다. 반대로 두 번째 요청이 첫 번째 요청 결과에 의존한다면 순차적으로 await해야 합니다.

js
// 서로 독립적인 요청 — 병렬 가능
const [user, notifications] = await Promise.all([
  fetchUser(userId),
  fetchNotifications(userId),
]);

// 앞 요청 결과가 뒤 요청에 필요 — 순차 실행
const user = await fetchUser(userId);
const posts = await fetchPostsByUser(user.id);

이 패턴들이 대면 8주차의 API 계약 이야기와 연결됩니다. 프론트엔드 개발자는 단순히 요청을 보내는 것에서 끝나지 않고, 실패 응답이 어떤 형태로 오는지, 빈 데이터는 어떻게 오는지, 어떤 요청을 병렬로 묶을 수 있는지까지 백엔드와 맞춰야 합니다.


📝 학습 이해 퀴즈

아래 코드를 브라우저 콘솔에서 직접 실행해보고 결과를 입력해보세요.

Quiz1 / 3
Q.아래 코드의 출력 결과를 순서대로 입력하세요.
js
function makeAdder(x) {
return function (y) {
  return x + y;
};
}

const add5 = makeAdder(5);
const add10 = makeAdder(10);

console.log(add5(3));
console.log(add10(3));
console.log(add5(add10(1)));

📝 8주차 스터디 인증 미션

아래 질문 중 하나를 직접 찾아보고 답을 댓글로 남겨주세요.
Quiz1 / 4
Q.아래 코드에서 클로저가 만들어지는 위치를 찾고, makeCounter()를 두 번 호출했을 때 각 카운터가 독립적으로 동작하는 이유를 설명하세요.
js
function makeCounter() {
let count = 0;
return function () {
  count++;
  return count;
};
}

const counterA = makeCounter();
const counterB = makeCounter();

console.log(counterA()); // ?
console.log(counterA()); // ?
console.log(counterB()); // ?

관련 포스팅

  • 프론트엔드 스터디 7주차 학습 자료: 불변성, 프로토타입, 타입 체크

  • 프론트엔드 스터디 8주차 학습 자료: 클로저, Promise, async/await

  • 프론트엔드 스터디 9주차 학습 자료: React 입문 전 필수 JS 문법

Post Q&A

오케이징에게 물어보기

프론트엔드 스터디 8주차: 클로저, Promise, async/await 전체를 기준으로 질문과 피드백을 받아요.답을 본 뒤에는 이 내용을 댓글로 달아서 서징에게도 물어볼 수 있어요. 작성자가 직접 볼 수 있어요!

0/500

포스트 목록

/study/clab-26-1
파일 13개, 폴더 2개
프론트엔드 스터디 1주차: 마크업 그 이상, 실무를 위한 중급 HTML 가이드프론트엔드 스터디 2주차: 사용자와 소통하는 폼 & CSS의 시작프론트엔드 스터디 3주차: 프론트엔드의 첫 번째 벽, 박스 모델과 스타일링프론트엔드 스터디 4주차: 자유자재 레이아웃 (포지션과 플렉스박스)프론트엔드 스터디 5주차: JavaScript 시작 — 타입, 변수, 그리고 JS가 이상한 이유프론트엔드 스터디 6주차: 객체, 함수, 그리고 스코프프론트엔드 스터디 7주차: 불변성, 프로토타입, 타입 체크프론트엔드 스터디 8주차: 클로저, Promise, async/await프론트엔드 스터디 9주차: React 입문 전 필수 JS 문법 — map, 구조 분해, 스프레드프론트엔드 스터디 10주차: React 기초 1 — 컴포넌트, JSX, props, useState프론트엔드 스터디 11주차: React 기초 2 — useEffect, 이벤트 처리, 폼프론트엔드 스터디 심화: this, 실행 컨텍스트, 이터러블프론트엔드 스터디 심화: 에러 처리와 정규 표현식

같은 섹션의 대표 이미지

27 posts · latest first
Study26. 06. 08.

프론트엔드 스터디 11주차: React 기초 2 —.

useEffect로 사이드 이펙트를 다루고, 이벤트 처리와 폼 상태 관리까지 — React로 실제 동작하는 앱을 만들기 위한 핵심 기술을 배웁니다.

26. 06. 08.SEOJing
Study26. 06. 08.

프론트엔드 스터디 심화: 에러 처리와 정규 표현식.

지금 당장 읽지 않아도 됩니다. React를 배우면서 에러 처리가 필요해지거나 면접 대비가 필요할 때 참고하세요.

26. 06. 08.SEOJing
Study26. 06. 01.

프론트엔드 스터디 10주차: React 기초 1 — 컴포넌트,.

React를 처음 시작합니다. 컴포넌트, JSX, props, useState까지 — React 앱을 만들기 위한 핵심 네 가지를 한 번에 배웁니다.

26. 06. 01.SEOJing
Study26. 06. 01.

프론트엔드 스터디 심화: this, 실행 컨텍스트, 이터러블.

React를 배우면서 this가 헷갈리거나, 면접 대비가 필요할 때 참고하는 JS 심화 자료입니다. 이 내용을 지금 당장 완벽히 이해하지 않아도 React를 배우는 데 지장이 없습니다.

26. 06. 01.SEOJing
Study26. 05. 25.

프론트엔드 스터디 대면 9주차: Next.js 렌더링 진화와 웹.

Next.js가 무엇이고 왜 필요한지 React와 비교해 이해한 뒤, CSR부터 SSR, SSG, ISR, PPR까지 렌더링 전략과 Web Vitals를 정리하며 스터디를 마무리합니다.

26. 05. 25.SEOJing
Study26. 05. 25.

프론트엔드 스터디 9주차: React 입문 전 필수 JS.

다음 주부터 React를 시작합니다. React 코드에서 매 줄 등장하는 map/filter, 구조 분해, 스프레드, 옵셔널 체이닝, 모듈까지 — React 코드를 막힘없이 읽기 위한 JS 문법을 한 번에 정리합니다.

26. 05. 25.SEOJing
Study26. 05. 18.

프론트엔드 스터디 대면 8주차: API와 통신 — 프론트엔드와.

비동기와 async/await를 배운 뒤, 대면에서는 API를 단순 호출 방법이 아니라 프론트엔드와 백엔드 사이의 계약으로 바라봅니다. HTTP, REST, CORS, 프록시, API 클라이언트 구조, TanStack Query와 파일 배치까지 연결합니다.

26. 05. 18.SEOJing
Study26. 05. 18.

프론트엔드 스터디 8주차: 클로저, Promise,.

JS 비동기 처리의 흐름을 배웁니다. 클로저가 왜 중요한지, 콜백 지옥을 해결한 Promise, 그리고 현대 JS의 표준인 async/await까지 이어지는 흐름을 이해합니다.

26. 05. 18.SEOJing
Study26. 05. 11.

프론트엔드 스터디 대면 7주차: React 입문과 프로젝트 구조.

바닐라 JS의 한계에서 React가 등장한 이유까지, 컴포넌트와 렌더링 방식을 이해하고 프로젝트 구조 감각을 만들어가는 대면입니다.

26. 05. 11.SEOJing
Study26. 05. 11.

프론트엔드 스터디 7주차: 불변성, 프로토타입, 타입 체크.

JS에서 가장 낯선 개념 중 하나인 프로토타입 기반 상속을 다룹니다. const가 왜 불변을 보장하지 않는지, 타입을 런타임에 정확히 확인하는 방법까지 함께 배웁니다.

26. 05. 11.SEOJing
Study26. 05. 05.

프론트엔드 스터디 6주차: 객체, 함수, 그리고 스코프.

JavaScript에서 거의 모든 것은 객체입니다. 함수가 일급 객체라는 의미, var와 let의 스코프 차이, 그리고 렉시컬 스코프까지 다룹니다.

26. 05. 05.SEOJing
Study26. 05. 04.

프론트엔드 스터디 대면 6주차(1): HTML/CSS/JS.

4~6주차 공백 이후 진행하는 첫 번째 대면입니다. HTML/CSS/JS 핵심을 가볍게 다시 연결하고, 브라우저가 코드를 실제 화면으로 바꾸는 과정을 통해 렌더링 파이프라인과 성능 감각을 잡습니다.

26. 05. 04.SEOJing
Study26. 05. 04.

프론트엔드 스터디 대면 6주차(2): AI 시대의 개발 방식과.

길어진 6주차 대면의 두 번째 차시입니다. AI 시대에 개발자가 실제로 어떻게 일하는지, 그리고 프론트엔드 개발자가 디자이너·백엔드·PM 사이에서 어떤 연결과 리딩 역할을 하는지 다룹니다.

26. 05. 04.SEOJing
Study26. 04. 28.

프론트엔드 스터디 5주차: JavaScript.

JavaScript를 처음 제대로 배우는 주차입니다. var/let/const의 차이, JS만의 독특한 타입 시스템, 그리고 호이스팅·TDZ까지 다룹니다.

26. 04. 28.SEOJing
Study26. 04. 13.

프론트엔드 스터디 4주차: 자유자재 레이아웃 (포지션과.

배경 이미지를 제어하고, Position으로 요소를 원하는 위치에 배치하며, Flexbox로 유연한 가로·세로 레이아웃을 구성합니다. 요소를 화면 정중앙에 띄우거나, 내비게이션 바처럼 가로로 예쁘게 정렬하는 것이 이번 주 목표입니다.

26. 04. 13.SEOJing
Study26. 04. 10.

프론트엔드 스터디 대면 3주차: 박스 모델 실전,.

3주차 박스 모델과 스타일링 복습, 과제 풀이, 4주차 Position과 Flexbox 레이아웃까지 다룬 대면 스터디 정리입니다. 면접에서 자주 나오는 마진 겹침, box-sizing, Flexbox 관련 질문도 함께 준비합니다.

26. 04. 10.SEOJing
Study26. 04. 06.

프론트엔드 스터디 3주차: 프론트엔드의 첫 번째 벽, 박스.

폰트와 색상을 다루고, 인라인과 블록 요소의 차이를 이해하며, 마진·패딩으로 구성되는 박스 모델을 완벽하게 익힙니다. 요소들 사이의 여백을 자유자재로 제어하고 화면이 찌그러지지 않게 박스 크기를 다루는 것이 이번 주 목표입니다.

26. 04. 06.SEOJing
Study26. 04. 03.

프론트엔드 스터디 대면 2주차: 폼(Form), CSS.

2주차 폼과 CSS 선택자 복습, 과제 풀이, 3주차 박스 모델과 스타일링까지 다룬 대면 스터디 정리입니다. 면접에서 자주 나오는 GET vs POST, CSS 우선순위, 박스 모델 관련 질문도 함께 준비합니다.

26. 04. 03.SEOJing
Study26. 03. 30.

프론트엔드 스터디 2주차: 사용자와 소통하는 폼 &.

사용자 입력을 받는 폼(Form)을 만들고, CSS를 HTML에 연결하는 방법과 원하는 요소를 정확히 선택하는 CSS 선택자 규칙을 배웁니다. 로그인·회원가입 폼을 직접 만들고, CSS로 원하는 요소를 콕 집어내는 것이 이번 주 목표입니다.

26. 03. 30.SEOJing
Study26. 03. 27.

프론트엔드 스터디 대면 1주차: HTML 마크업과 폼, 그리고.

1주차 HTML 핵심 복습과 과제 풀이, 2주차 폼(Form)과 CSS 선택자까지 다룬 대면 스터디 정리입니다. 면접에서 자주 나오는 시맨틱 HTML, img alt 속성 관련 질문도 함께 준비합니다.

26. 03. 27.SEOJing
Study26. 03. 23.

프론트엔드 스터디 1주차: 마크업 그 이상, 실무를 위한.

기초 태그 강의에서 한 걸음 더 나아갑니다. 카카오톡 공유 썸네일, 모바일 데이터 절약, 스크린 리더기를 위한 숨은 정보 등 실무에서 마주하게 될 중급 HTML 개념들을 가볍게 훑어봅니다.

26. 03. 23.SEOJing
Study26. 03. 20.

프론트엔드 스터디 대면 0주차: 프론트엔드 개발자란? 그리고.

프론트엔드 개발자가 실무에서 하는 일, 2025-2026 기술 스택, 현실적인 연봉과 채용 트렌드를 정리했습니다. 스터디 자료 구조와 앞으로의 방향도 함께 안내합니다.

26. 03. 20.SEOJing
Study26. 03. 19.

사전 진단 퀴즈 3단계 (변수와 DOM).

스터디 커리큘럼 방향을 정하기 위한 세 번째 사전 진단 퀴즈입니다. 자바스크립트의 스코프, 참조 타입의 메모리 할당, DOM 제어와 이벤트 흐름 등 React 실무의 근간이 되는 CS 지식을 점검합니다.

26. 03. 19.SEOJing
Study26. 03. 19.

사전 진단 퀴즈 4단계 (배열, 함수, 비동기).

스터디 커리큘럼 방향을 정하기 위한 마지막 사전 진단 퀴즈입니다. React 컴포넌트를 다루기 위해 필수적인 배열 고차 함수(map, filter)와 비동기 통신(async/await) 능력을 점검합니다.

26. 03. 19.SEOJing
Study26. 03. 19.

사전 진단 퀴즈 5단계 (선언적 UI와 상태).

스터디 커리큘럼 방향을 정하기 위한 마지막 사전 진단 퀴즈입니다. 선언적 UI, 상태(State), 단방향 데이터 흐름, 부수 효과(Side Effect) 등 React 생태계 진입을 위한 필수 개념을 점검합니다.

26. 03. 19.SEOJing
Study26. 03. 18.

사전 진단 퀴즈 1단계 (HTML/CSS).

스터디 커리큘럼 방향을 정하기 위한 첫 번째 사전 진단 퀴즈입니다. HTML 태그 구조부터 CSS 박스 모델까지, 실무와 React 환경에서 이 기초들이 왜 중요한지 점검합니다.

26. 03. 18.SEOJing
Study26. 03. 18.

사전 진단 퀴즈 2단계 (HTML/CSS 활용).

스터디 커리큘럼 방향을 정하기 위한 두 번째 사전 진단 퀴즈입니다. 시맨틱 마크업, 폼 이벤트 제어, CSS 우선순위, Flexbox 레이아웃 등 실전 활용 능력을 점검합니다.

26. 03. 18.SEOJing