Node.js의 이벤트 루프는 libuv 라이브러리에 의해 관리된다. libuv 를 학습하면서, 솔직히 정말 이해가 되지 않았다. 구체적으로 이벤트 루프가 무슨 동작을 하는 건지, microtask queue는 무엇인지, 이벤트 루프가 어떻게 논블로킹 I/O를 처리할 수 있는지 등 추상적으로만 이해할 뿐 어느 누구에게 제대로 설명하기가 쉽지 않았다. 그래서 node.js 공식 문서부터 여러 포스팅, git에 올라와있는 node.js, libuv 라이브러리 코드를 며칠간 파헤쳐보았다. libuv란? Node.js의 이벤트 루프는 libuv라는 비동기 I/O 라이브러리에 의해 구현된다. libuv는 C++로 작성된 라이브러리로, Node.js가 단일 스레드로 동작하면서도 비동기적으로 I/O 작업을..
JavaScript
async는 await이 없다면 필요하지 않다는 생각에 코드를 아래처럼 수정한 적이 있다. 기존 코드TaskState.js async deleteTask(taskId) { deleteTaskAPI(taskId) .then(() => this.fetchTasks()) } .. deleteCard.jsfunction deleteTask() { if (currentTaskId !== null){ taskStateInstance.deleteTask(currentTaskId) .then(() => { alert(`카드가 삭제되었습니다. cardId: ${currentTaskId}`); closeModal(); }) }}deleteCard.js 에서 Ta..
사용자가 카드를 추가하면, 실시간으로 사용자의 히스토리에 view를 업데이트해야하는 요구 조건이 있었다.목록 1에 카드를 추가하면, 히스토리 판넬에도 동시에 기록이 추가되어야 한다. 이를 위해 옵저버 패턴을 적용했다. 카드라는 상태를 관리할 TaskState 클래스를 정의해준다.import {fetchTasksAPI, addTaskAPI, editTaskAPI, deleteTaskAPI} from '../api/taskAPI.js';export class TaskState { constructor() { this.tasks = []; this._observers = []; } subscribe(observer) { this._observers.push(observer); } ..
지난 주 호눅스님의 강의에서 C10K 문제가 1999년부터 화두에 오르기 시작했고, 그 부분을 해결하기 위한 방법으로 등장한 것이 node.js라는 이야기를 들었다. 노드 js의 비동기 논블로킹이라는 특징이 C10K 문제를 해결하는데에 있어서 무엇이 도움이 되고, 스프링과 비교했을 때의 이점이 무엇인지 정확히 받아들여지지가 않았다. 그래서 이번 포스팅에서는 C10K와 node.js의 싱글 스레드, 논블로킹의 특징이 어떻게 C10K의 문제를 해결하는가에 대해 작성해보겠다. C10K 문제 C10K란 동시 사용자 1만명(Concurrent 10K users)가 접속하는 서버를 어떻게 구현해야할 것인가에 대한 문제이다. C10K라는 문제가 대두되었을 때는 1999년으로, 지금으로부터 약 25년 전이다. ..
자바스크립트에서 비동기 처리와 비동기를 어떻게 처리하는지 정리해보자. 비동기 처리 동기와 비동기는 상반된 개념이다. 동기는 순차적으로 코드가 실행되는 것을 말한다. 동기 처리 방식은 순차적으로 코드가 실행되어서 이해하기가 직관적이지만 한 가지 문제가 있다. 이전 코드가 끝나기 전까지는 아무것도 하지못해서 다음 코드로 넘어갈 수 없다는 것인데, 아주 쉬운 예로는 자장면을 배달하시는 배달부가 짜장면을 배달하고, 손님이 짜장면을 전부 먹을 때까지 다른 일도하지못하고, 계속해서 대기해야하는 것과 비슷하다. 그래서 비동기 처리 방식이 등장한다. 비동기 처리는 꼭 순차적으로 동작하지 않는다. 위의 예시로 보자면, 배달부가 자장면을 배달하고 손님이 식사할 동안 다음 장소로 이동할 수 있는 것이다. 여기서 한 가..
Worker Thread와 의문의 시작 worker thread를 만나고 오늘 하루가 고되기 시작했다. 아래 내용들 때문인데, 자연스럽게 Node의 이벤트 루프와도 연관지어 생각해볼 수 있어서 좋았다. 우선, Worker Thread는 이름 그대로 작업을 진행하는 스레드를 말한다. Worker Thread를 통해 메인 스레드와 분리할 수 있고, 그런 점으로 인해 복잡한 로직을 다른 곳에서 처리할 수 있게 해서 사용성을 증가시킬 수 있다. 자바스크립트는 단일 스레드 아닌가? 그런데 오늘 구현을 하면서도 들었던 의구심이 한 가지 있었는데 자바스크립트는 단일 스레드를 사용하는 것으로 알고 있었다. 그런데 어떻게 스레드를 하나 더 사용할 수 있을까 라는 생각이었다. 이때 간과했던 점이 한 가지가 있었다. 자..