Node.js로 간단한 WAS를 구현하면서 직접 HTTP 메시지 파싱 기능을 만들어보았다. 처음에는 HTTP 요청을 받아 파싱하는 과정이 단순할 것이라 생각했지만, 실제 구현 과정에서는 다양한 예외 케이스를 마주했다. 특히, 요청이 예상과 다르게 분할되거나 헤더와 바디의 경계를 처리하는 과정에서 난관이 많았다. 같은 문제로 고생하는 다른 캠퍼들도 많았고, 문득 스프링에서는 HTTP 메시지를 어떻게 파싱하고 있는지가 궁금해졌다. 직접 라이브러리 코드를 분석해보니, 예상과는 다르게 동작하는 부분이 많았다. 스프링에서의 HTTP 메시지 파싱 방식 스프링이 내부적으로 HTTP 요청을 처리하는 방식을 살펴보면, 기본적인 흐름은 다음과 같다. 1. 포인터 방식으로 HTTP 메시지를 한 글자씩 읽어 나간다.2...
분류 전체보기
문제https://www.acmicpc.net/problem/11559 풀이bfs가 포함된 빡 구현 문제이다. 제거할 뿌요를 bfs로 찾고, 삭제하고, 중력을 통해 재 정렬을 해야한다. 여러 그룹의 삭제될 뿌요가 한 텀에 있어도 연쇄는 한 번이라는 것을 잊으면 안된다. 여기서 연속된 4개 이상이 연결된 뿌요를 찾아 제거해야하는데, 그냥 BFS를 사용해 탐색하면, ㅓ ㅏ ㅗ ㅜ 모양의 탐색은 visited에 걸려 탐색을 할 수가 없다. 이것은 단순하게 해결 가능한데, 최대 2번까지 방문을 허용하기만 하면 ㅓ ㅏ ㅗ ㅜ 탐색이 가능하게 된다. 중력에 의한 재정렬은 stack을 이용해 구현했다. 제거할 뿌요를 제외한 값을 stack에 push하고, 다시 map[][]의 아래부터 stack에서 pop을 하며 값..
문제https://www.acmicpc.net/problem/1461풀이정렬을 포함한 구현 문제이다. 처음에는 방문 배열을 적용해 탐색을 해야하나 싶었지만, 다시금 아이디어를 떠올려보니 단순 구현으로 해결될 것 같았다. "세준이가 한 번에 들 수 있는 책"을 보고, 가지고 있는 책의 매개변수를 관리해야하나 싶었는데, 여기서 책의 숫자는 배열상 인덱스 거리와 같기 때문에 단순 배열에서의 거리 이동으로 구현했다. 아이디어는 우선 center를 구한다. center는 세준이가 돌아오는 기점이면서 책을 충전하는 곳이다. 그러기 위해 배열을 입력받을 때 0 인덱스 위치를 포함시켰다. 배열을 정렬하고 값이 0인 인덱스 위치를 저장한다. 그리고 책을 놓으러 다닌다. 여기서 핵심 아이디어는 0에서 가장 멀리 떨어진..
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년 전이다. ..