동시성(concurrency)은 프로그래밍에서 중요한 개념입니다. 동시성이란 여러 작업을 동시에 실행하는 것을 의미합니다. 자바스크립트는 단일 쓰레드로 실행되기 때문에 기본적으로 동시성을 제공하지 않지만, 비동기(asynchronous) 프로그래밍을 이용하여 동시성과 데이터 동기화를 구현할 수 있습니다.
비동기 프로그래밍과 콜백 함수
자바스크립트에서 비동기 프로그래밍을 구현하는 가장 일반적인 방법은 콜백 함수(callback function)를 사용하는 것입니다. 콜백 함수는 비동기적으로 실행되는 작업이 완료되었을 때 호출되는 함수입니다. 예를 들어, 파일을 읽는 작업을 비동기적으로 실행할 때, 파일 읽기 작업이 완료되면 콜백 함수가 실행됩니다.
fs.readFile('파일경로', 'utf8', function(err, data) {
if (err) {
console.log('파일을 읽을 수 없습니다.');
} else {
console.log(data);
}
});
위의 예제에서는 fs.readFile
함수를 호출하여 파일을 비동기적으로 읽은 후, 콜백 함수가 실행됩니다. 이를 통해 비동기적으로 실행되면서 동시에 다른 작업을 수행할 수 있게 됩니다.
Promise와 async/await
자바스크립트에서 비동기 프로그래밍을 더 편리하게 다루기 위해 ES6부터 Promise와 async/await라는 새로운 기능이 도입되었습니다. Promise는 비동기 작업의 결과를 나타내는 객체입니다. Promise는 성공할 경우 resolve
콜백을 호출하고, 실패할 경우 reject
콜백을 호출하여 결과를 알려줍니다. Promise는 비동기 작업을 더 직관적으로 다룰 수 있게 해줍니다.
function readFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
readFile('파일경로')
.then(data => {
console.log(data);
})
.catch(err => {
console.log('파일을 읽을 수 없습니다.');
});
async/await는 Promise를 더 간편하게 사용할 수 있게 해주는 문법입니다. async 함수 내부에서 await 키워드를 사용하면 Promise가 완료될 때까지 기다리고, 결과를 받아올 수 있습니다.
async function readFileAsync(path) {
try {
const data = await readFile(path);
console.log(data);
} catch (err) {
console.log('파일을 읽을 수 없습니다.');
}
}
readFileAsync('파일경로');
위의 예제에서는 async 함수인 readFileAsync
를 정의하여 파일을 읽은 후 결과를 출력하는 예제입니다. await readFile(path)
에서 readFile 함수의 결과가 반환될 때까지 기다리고, 그 결과를 data
변수에 할당하여 출력합니다.
결론
자바스크립트에서는 비동기 프로그래밍을 통해 동시성과 데이터 동기화를 구현할 수 있습니다. 콜백 함수, Promise, async/await를 사용하여 편리하게 비동기 작업을 처리할 수 있습니다. 동시성과 데이터 동기화를 구현할 때는 적절한 방법을 선택하여 코드를 작성해야 합니다.
#javascript #동시성