📌 들어가며
프로그래밍에서 **동기(Synchronous)**와 **비동기(Asynchronous)**는 단순한 개념 같지만, 실제로 개발에 적용해보면 복잡하고 헷갈리는 경우가 많습니다. 특히 Node.js는 비동기 프로그래밍의 대표 주자이기에, 이를 정확히 이해하지 못하면 성능 저하, 버그, 비효율적인 코드로 이어질 수 있습니다.
이번 포스팅에서는 Node.js의 동기와 비동기 방식 차이를 실제 코드 예제와 함께 상세하게 설명드리며, 이 개념을 프로젝트에 어떻게 적용해야 할지에 대한 인사이트까지 함께 나눠보겠습니다.
🧠 동기(Synchronous)와 비동기(Asynchronous)란?
✅ 동기(Synchronous)란?
동기 방식이란, 작업을 순차적으로 하나씩 처리하는 방식입니다. 앞선 작업이 끝나기 전까지 다음 작업을 실행하지 않기 때문에 예측 가능한 실행 흐름을 가집니다.
쉽게 말해, **"지금 하고 있는 일이 끝날 때까지 기다린다"**는 개념입니다.
💡 일상 속 동기 예시
- 밥을 다 먹은 후에 영화를 본다.
- 세탁이 끝난 후에 옷을 널어 말린다.
즉, 모든 작업을 차례차례 처리하는 흐름입니다.
💻 동기 방식 코드 예제
function b() {
console.log("b");
}
console.log("a");
b();
console.log("c");
🧾 결과
a
b
c
위 코드를 보면, console.log("a") → b() → console.log("c") 순서대로 실행되는 것을 볼 수 있습니다. 이처럼 코드의 작성 순서와 실행 순서가 일치하는 것이 동기의 특징입니다.
🗂 Node.js에서의 동기 파일 읽기
Node.js에서 동기식으로 파일을 읽을 때는 fs.readFileSync() 메소드를 사용합니다.
const fs = require('fs');
const data = fs.readFileSync('test.txt', 'utf-8');
console.log('a');
console.log(data);
console.log('c');
🧾 결과 (test.txt 내용이 'b'일 경우)
a
b
c
이 코드의 실행 흐름을 살펴보면, 파일을 읽는 작업이 끝나기 전에는 다음 코드인 console.log('c')가 실행되지 않습니다. 즉, 파일 입출력 작업이 끝날 때까지 프로그램이 대기합니다.
❗️동기 방식의 단점
- 성능 저하 가능: 하나의 작업이 오래 걸리면 전체 애플리케이션의 흐름이 멈춤
- 병목 발생: I/O 작업(파일, 네트워크 등)이 많은 시스템에서는 비효율적
- 에러 전파 문제: 에러 발생 시 이후 코드 실행이 중단될 수 있음
// 파일이 존재하지 않을 경우
const data = fs.readFileSync('notExist.txt', 'utf-8');
// → 오류 발생 시 다음 코드 실행 X
⚡️ 비동기(Asynchronous)란?
비동기 방식이란, 작업이 완료되지 않았더라도 다음 작업을 바로 실행하는 방식입니다. 요청과 결과가 동시에 이루어지지 않으며, 나중에 완료될 작업을 미리 위임하고 넘어갑니다.
즉, **"일단 요청하고, 끝나면 알려줘"**의 개념입니다.
💡 일상 속 비동기 예시
- 세탁기를 돌려놓고 그 사이에 요리를 한다.
- 배달 음식을 시켜놓고 TV를 본다.
💻 비동기 방식 코드 예제 (setTimeout)
console.log("Start");
setTimeout(() => {
console.log("Timeout");
}, 3000);
console.log("End");
🧾 결과
Start
End
Timeout
3초 동안 기다리지 않고 setTimeout 함수는 백그라운드에서 실행되고, 바로 다음 줄인 console.log("End")가 실행됩니다. 3초 후에야 "Timeout"이 출력됩니다.
이것이 바로 비동기 처리의 핵심 원리입니다.
📁 Node.js에서의 비동기 파일 읽기
Node.js의 fs.readFile()은 대표적인 비동기 함수입니다. 콜백 함수 형태로 사용되며, 파일을 읽는 동안 다른 작업이 가능합니다.
const fs = require('fs');
console.log('a');
fs.readFile('test.txt', 'utf-8', (err, data) => {
if (err) return console.log(err);
console.log(data);
});
console.log('c');
🧾 결과 (test.txt 내용이 'b'일 경우)
a
c
b
위 코드에서는 readFile()이 완료되기 전 console.log("c")가 먼저 실행되며, 파일 읽기가 끝난 후에 콜백 내부의 console.log(data)가 실행됩니다.
🔍 Node.js의 이벤트 루프와 비동기 처리
Node.js는 단일 스레드 기반의 언어입니다. 즉, 한 번에 하나의 작업만 처리합니다. 하지만 **이벤트 루프(Event Loop)**와 **백그라운드 스레드(Thread Pool)**를 활용해 비동기 작업을 효율적으로 처리할 수 있습니다.
🌐 처리 과정 요약
- 비동기 함수 호출 (예: fs.readFile)
- 백그라운드 스레드에서 작업 수행
- 완료되면 이벤트 큐에 콜백 등록
- 이벤트 루프가 콜백을 실행
이 덕분에 Node.js는 고성능 I/O 처리에 매우 적합한 구조를 가집니다.
🧭 언제 동기, 언제 비동기를 써야 할까?
상황 추천 방식
| 빠르고 단순한 연산 | 동기 |
| 대용량 파일 읽기 | 비동기 |
| 네트워크 요청 처리 | 비동기 |
| 초기 설정, 로딩 중 에러 시 중단이 필요한 경우 | 동기 |
✔️ 중요한 기준은 프로그램이 얼마나 다른 작업을 동시에 처리해야 하느냐입니다.
대부분의 서버 개발에서는 비동기 방식이 훨씬 효율적이며, 사용자 경험 향상에도 긍정적인 영향을 미칩니다.
🧑💻 실무 팁: 비동기 방식의 주의점
- **콜백 지옥(callback hell)**에 빠지지 않도록 주의!
- → Promise, async/await로 개선 가능
- 에러 처리를 철저히 해야 함
- → try/catch, catch() 체인 활용
- 순서 보장이 필요한 경우 Promise.all() 또는 async/await을 사용
✅ 마치며
Node.js의 동기/비동기 개념은 단순한 실행 방식의 차이를 넘어, 서비스의 성능과 안정성에 직접적인 영향을 주는 핵심 요소입니다.
이번 포스팅을 통해 여러분이 다음 내용을 명확히 이해하시길 바랍니다:
- 동기/비동기의 개념과 차이
- Node.js에서의 파일 입출력 예제
- 언제 어떤 방식을 선택해야 할지에 대한 기준
- 실무에서 주의할 점
Node.js를 제대로 활용하기 위해 반드시 숙지해야 할 기초이자 핵심 개념!
꼭 복습하시고, 직접 코드를 작성해보며 체득하시길 추천드립니다.
'정책' 카테고리의 다른 글
| 비 오는 밤, 몰입감 끝판왕! 넷플릭스 국내 서스펜스 영화 추천 TOP 5 (3) | 2025.07.26 |
|---|---|
| 티빙에서 볼 수 있는 심리 공포 명작 5선 (2) | 2025.07.26 |
| 왓챠 영화 추천 🎬 여름의 열기처럼 치열한 성장 무비 5편 (6) | 2025.07.26 |
| Node.js로 웹 스크래핑 시작하기! 자바스크립트로 원하는 데이터 뽑아오기 (3) | 2025.07.25 |
| 자바스크립트 배열 합치기 3가지 방법: concat, spread, push 완전 정복 (2) | 2025.07.25 |