관리 메뉴

Ming's develop story

동기(Synchronous), 비동기(Asynchronous) λ³Έλ¬Έ

D E V E L O P πŸ’»/CS

동기(Synchronous), 비동기(Asynchronous)

Ming 2025. 2. 14. 21:11

동기(Synchronous)와 비동기(Asynchronous)의 차이

1. 동기(Synchronous)

  • κ°œλ…: μš”μ²­μ„ 보낸 ν›„ 응닡을 받을 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” 방식
  • νŠΉμ§•: ν•œ μž‘μ—…μ΄ λλ‚˜μ•Ό λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있음
  • μž₯점:
    • μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œκ°€ 직관적이며 μ΄ν•΄ν•˜κΈ° 쉬움
    • 디버깅이 비ꡐ적 쉬움
  • 단점:
    • ν•˜λ‚˜μ˜ μž‘μ—…μ΄ 였래 걸리면 전체 ν”„λ‘œκ·Έλž¨μ΄ 멈좜 수 있음
    • 병렬 μ²˜λ¦¬κ°€ 어렀움

βœ… 동기 μ½”λ“œ 예제 (JavaScript)

function taskA() {
  console.log("μž‘μ—… A μ‹œμž‘");
  for (let i = 0; i < 1e9; i++) {} // CPUλ₯Ό 많이 μ‚¬μš©ν•˜λŠ” μ—°μ‚°
  console.log("μž‘μ—… A μ™„λ£Œ");
}

function taskB() {
  console.log("μž‘μ—… B μ‹€ν–‰");
}

taskA();
taskB();  // taskAκ°€ λλ‚œ ν›„ 싀행됨

μ‹€ν–‰ κ²°κ³Ό

μž‘μ—… A μ‹œμž‘
(λͺ‡ 초 ν›„)
μž‘μ—… A μ™„λ£Œ
μž‘μ—… B μ‹€ν–‰

μž‘μ—… Aκ°€ 끝날 λ•ŒκΉŒμ§€ μž‘μ—… BλŠ” μ‹€ν–‰λ˜μ§€ μ•ŠμŒ.


2. 비동기(Asynchronous)

  • κ°œλ…: μš”μ²­μ„ 보낸 ν›„ 응닡을 기닀리지 μ•Šκ³  λ‹€μŒ μž‘μ—…μ„ μ§„ν–‰ν•˜λŠ” 방식
  • νŠΉμ§•: μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” μž‘μ—…(예: λ„€νŠΈμ›Œν¬ μš”μ²­, 파일 읽기 λ“±)이 μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μž‘μ—…μ΄ λ™μ‹œμ— 싀행될 수 있음
  • μž₯점:
    • 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ΄ μžˆμ–΄λ„ ν”„λ‘œκ·Έλž¨μ΄ λ©ˆμΆ”μ§€ μ•Šκ³  싀행됨
    • CPU와 I/O μž‘μ—…μ„ 효율적으둜 μ‚¬μš©ν•  수 있음
  • 단점:
    • μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§ˆ 수 있음 (콜백 지μ˜₯, Promise, async/await ν•„μš”)
    • 디버깅이 μ–΄λ ΅κ³  흐름을 νŒŒμ•…ν•˜κΈ° 어렀움

βœ… 비동기 μ½”λ“œ 예제 (JavaScript - setTimeout)

function taskA() {
  console.log("μž‘μ—… A μ‹œμž‘");
  setTimeout(() => {
    console.log("μž‘μ—… A μ™„λ£Œ");
  }, 3000); // 3초 ν›„ μ‹€ν–‰
}

function taskB() {
  console.log("μž‘μ—… B μ‹€ν–‰");
}

taskA();
taskB();  // taskAκ°€ λλ‚˜κΈ° 전에 싀행됨

μ‹€ν–‰ κ²°κ³Ό

μž‘μ—… A μ‹œμž‘
μž‘μ—… B μ‹€ν–‰
(3초 ν›„)
μž‘μ—… A μ™„λ£Œ

μ„€λͺ…:

  • setTimeout()이 비동기 ν•¨μˆ˜μ΄λ―€λ‘œ taskA() μ‹€ν–‰ 쀑에도 taskB()κ°€ λ°”λ‘œ 싀행됨.
  • 3초 후에 μž‘μ—… A μ™„λ£Œκ°€ 좜λ ₯됨.

동기와 λΉ„λ™κΈ°μ˜ 차이점

ꡬ뢄 동기(Synchronous) 비동기(Asynchronous)

μ‹€ν–‰ 방식 μš”μ²­μ„ 보내면 응닡을 받을 λ•ŒκΉŒμ§€ λŒ€κΈ° μš”μ²­μ„ 보내고 λ‹€λ₯Έ μž‘μ—…μ„ 진행
μ½”λ“œ 흐름 순차적 병렬 처리 κ°€λŠ₯
응닡 속도 ν•˜λ‚˜μ˜ μž‘μ—…μ΄ λλ‚˜μ•Ό λ‹€μŒ μž‘μ—… 진행 μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— 진행 κ°€λŠ₯
ν™œμš© μ˜ˆμ‹œ forλ¬Έ, 기본적인 μ—°μ‚° λ„€νŠΈμ›Œν¬ μš”μ²­, 파일 읽기, 타이머

React ν™œμš© μ˜ˆμ‹œ

동기 μ½”λ“œ (useEffect λ‚΄λΆ€ μ‹€ν–‰)

useEffect(() => {
  console.log("데이터 λ‘œλ”© μ‹œμž‘");
  const data = fetchDataSync(); // 동기적인 데이터 호좜
  console.log("데이터 λ‘œλ”© μ™„λ£Œ:", data);
}, []);

μ΄λ ‡κ²Œ λ™κΈ°μ μœΌλ‘œ μ²˜λ¦¬ν•˜λ©΄ fetchDataSync()κ°€ 였래 걸릴 경우 UIκ°€ 멈좜 수 있음.

비동기 μ½”λ“œ (useEffect + async/await)

useEffect(() => {
  async function loadData() {
    console.log("데이터 λ‘œλ”© μ‹œμž‘");
    const data = await fetchDataAsync(); // 비동기 데이터 호좜
    console.log("데이터 λ‘œλ”© μ™„λ£Œ:", data);
  }
  
  loadData();
}, []);

λΉ„λ™κΈ°λ‘œ μ²˜λ¦¬ν•˜λ©΄ UIκ°€ λ©ˆμΆ”μ§€ μ•Šκ³  데이터 λ‘œλ”©μ΄ 진행됨.


그럼 μ™œ 비동기 처리λ₯Ό ν•΄μ•Όν• κΉŒ?

  • λ„€νŠΈμ›Œν¬ μš”μ²­κ³Ό 같은 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” μž‘μ—…μ„ λ™κΈ°μ μœΌλ‘œ μ²˜λ¦¬ν•˜λ©΄ κ·Έλ™μ•ˆ λ‹€λ₯Έ μž‘μ—…μ΄ 계속 μ§„ν–‰λ˜μ§€ λͺ»ν•˜λ‹ˆ 비동기 처리λ₯Ό ν•˜μ—¬ λ‹€λ₯Έ μž‘μ—…λ“€(ex. UIκ°€ κ·Έλ €μ§€λŠ” 것 λ“±)이 계속 진행될 수 μžˆλ„λ‘ ν•˜μ—¬ μ•± μ„±λŠ₯κ³Ό μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•œλ‹€.

κ²°λ‘ 

  • λΉ λ₯΄κ²Œ μ‹€ν–‰λ˜λŠ” μž‘μ—…(μ—°μ‚°, λ‹¨μˆœ 둜직)은 동기 처리
  • λ„€νŠΈμ›Œν¬ μš”μ²­, 파일 읽기, 타이머 같은 μž‘μ—…μ€ 비동기 처리
  • 비동기 처리(async/await)λ₯Ό 적극 ν™œμš©ν•˜μ—¬ UIκ°€ λ©ˆμΆ”μ§€ μ•Šλ„λ‘ κ΅¬ν˜„

'D E V E L O P πŸ’» > CS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Promiseλž€?(feat. async-await, Promise.all())  (0) 2025.02.12
DOM 의 κ°œλ…  (0) 2025.02.10
Comments