자바스크립트 동시성과 데이터 패턴 인식
목차
동시성 개요
동시성은 프로그램에서 여러 작업이 동시에 실행되는 것을 의미합니다. 자바스크립트는 단일 스레드로 동작하지만, 동시성을 구현하기 위해 비동기 패턴과 데이터 패턴을 사용할 수 있습니다.
비동기 패턴
콜백 함수
콜백 함수는 비동기 작업이 완료되었을 때 실행되는 함수입니다. 예를 들어, 파일을 읽을 때 콜백 함수를 사용하여 파일의 내용을 처리할 수 있습니다.
function readFile(callback) {
// 파일을 읽는 비동기 작업
// 작업이 완료되었을 때 콜백 함수 실행
callback(fileContents);
}
function processFile(contents) {
// 파일 내용을 처리하는 작업
}
readFile(processFile);
프로미스
프로미스는 비동기 작업의 결과를 나타내는 객체입니다. 비동기 작업이 완료되면 프로미스가 이행되고, 실패하면 거부됩니다. 프로미스를 사용하면 콜백 지옥을 피할 수 있습니다.
function readFile() {
return new Promise((resolve, reject) => {
// 파일을 읽는 비동기 작업
if (success) {
resolve(fileContents); // 작업이 완료되면 프로미스 이행
} else {
reject(error); // 작업이 실패하면 프로미스 거부
}
});
}
readFile()
.then((contents) => {
// 파일 내용을 처리하는 작업
})
.catch((error) => {
// 에러 처리
});
비동기 함수
비동기 함수는 async
키워드로 정의되며, 내부에서 await
키워드를 사용하여 비동기 작업의 완료를 기다릴 수 있습니다. 비동기 함수는 프로미스를 반환하므로 비동기 패턴과 함께 사용될 수 있습니다.
async function readFile() {
// 파일을 읽는 비동기 작업
return fileContents;
}
async function processFile() {
try {
const contents = await readFile(); // 비동기 작업 완료 대기
// 파일 내용을 처리하는 작업
} catch (error) {
// 에러 처리
}
}
processFile();
데이터 패턴
싱글톤 패턴
싱글톤 패턴은 어플리케이션이 단 하나의 인스턴스만을 가지도록 하는 패턴입니다. 이를 통해 어플리케이션 전체에서 공유되는 데이터 상태를 관리할 수 있습니다.
class Singleton {
static instance;
static getInstance() {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
constructor() {
this.data = [];
}
addData(item) {
this.data.push(item);
}
getData() {
return this.data;
}
}
const singletonInstance1 = Singleton.getInstance();
singletonInstance1.addData("Data 1");
const singletonInstance2 = Singleton.getInstance();
singletonInstance2.addData("Data 2");
console.log(singletonInstance1.getData()); // ["Data 1", "Data 2"]
console.log(singletonInstance2.getData()); // ["Data 1", "Data 2"]
옵서버 패턴
옵서버 패턴은 객체 사이의 일대다 의존성을 정의하는 패턴입니다. 한 객체의 상태가 변경되면, 그와 관련된 다른 객체들도 알림을 받고 변경된 상태에 따른 처리를 수행합니다.
class Subject {
observers = [];
attach(observer) {
this.observers.push(observer);
}
detach(observer) {
this.observers = this.observers.filter((obs) => obs !== observer);
}
notify() {
this.observers.forEach((ob) => ob.update());
}
}
class Observer {
constructor(name) {
this.name = name;
}
update() {
console.log(`${this.name} received an update.`);
}
}
const subject = new Subject();
const observer1 = new Observer("Observer 1");
const observer2 = new Observer("Observer 2");
subject.attach(observer1);
subject.attach(observer2);
subject.notify(); // Observer 1 received an update. Observer 2 received an update.
마무리
자바스크립트에서 동시성과 데이터 패턴을 이해하는 것은 비동기 작업 및 데이터 관리에 있어서 매우 중요합니다. 적절하게 이러한 패턴을 활용하면 프로그램의 성능을 향상시키고 유지보수성을 높일 수 있습니다. 자세한 내용은 관련 문서를 참조하시기 바랍니다.
참고 자료
- Mozilla Developer Network - Concurrency model and Event Loop
- JavaScript Design Patterns - Singleton
- JavaScript Design Patterns - Observer