전체 글 99

이벤트 구독 패턴 EventEmitter - 4

콜백 패턴 자바스크립트를 사용하다보면 콜백 패턴을 이용하게 된다. async/await 구문의 등장으로 과거보다 콜백 사용이 많이 줄었지만 여전히 콜백은 즐겨 사용되고 있다. 우리가 콜백을 사용할 때의 상황을 단순화 하면 다음과 같다. 특정 시점에, 콜백이 실행되기를 기대한다. 이것이 콜백의 핵심이자 전부다. 이벤트 구독 패턴 이벤트 구독 패턴은 콜백 패턴과는 다른 방식으로 콜백과 같은 핵심에 접근한다. 1. 특정 시점에 실행 되길 바라는 함수들은 이벤트를 구독한다. 2. 특정 시점이 되면 이벤트를 발생시킨다. 이렇게 두가지 레이어가 이벤트 구독 패턴에서는 명확하게 구분된다. Node에서는 기본적으로 이벤트 구독 패턴을 쉽게 사용할 수 있도록 EventEmitter 클래스를 제공한다. let em = n..

버퍼 Buffer - 3

자바스크립트는 문자열 처리에는 효과적이지만 바이너리 데이터는 잘 처리하지 못합니다. 하지만 문자열만 가지고 다양한 데이터를 처리하기란 매우 어렵습니다. 물론 일반적인 상황에서 Buffer 를 사용하는 일은 흔치 않을 것 입니다. 하지만 파일 업로드, 이미지 조작 등의 작업에 Node를 사용한다면 Buffer가 필요합니다. 개발자가 원하는 만큼의 메모리 할당이 필요한 경우에도 필요합니다. 버퍼 클래스의 경우 메모리가 자바스크립트 VM의 외부 힙에 지정되게 됩니다. 따라서 해당 데이터는 가비지 컬렉션으로 인해, 위치가 이동되지 않습니다. 이는 CPU 사용에 보다 효율적입니다. let x = new Buffer.from('Hello') console.log(x.toString()) // Hello let y ..

모듈 Module - 2

Node에서는 CommonJS 모듈 시스템을 사용했었다. 물론 13.2 버전부터는 특별한 옵션 없이도 ES6의 모듈 시스템을 사용할 수 있다. 하지만 여전히 많은 모듈들이 CommonJS의 형태로 이루어져 있으므로 사용 예시를 통해 가볍게 살펴보기로 하자. function Calc() { function add(a, b) { return a+b } return { add } } module.exports = Calc const calc = require('./calc') 모듈을 로딩하는 종류에는 몇 가지 경우가 있다. 코어 모듈 로드 const http = require('http') 노드가 미리 준비해둔 모듈을 코어 모듈이라 하며, 우선적으로 로드 된다. 파일 모듈 로드 const myModule = ..

노드 NodeJS - 1

개인적으로, 업무적으로 Node를 활용하는 일이 잦아지고 있다. 때문에 이번 기회에 NodeJS에 관해 깊이 있는 학습과 정리를 하고자 한다. 아주 오래전에 나온 책이지만, 프로페셔널 NodeJS를 활용할 계획이다. (절판된걸로 보인다.) I/O 블로킹 전통적인 프로그래밍은 I/O 작업을 블로킹 모델로 처리한다. 블로킹 모델은 각각의 사용자를 완벽하게 분리할 수 있지만, 너무 느리고 부담스럽다. 멀티스레딩은 이런 블로킹 모델의 대안 중 하나다. 스레드는 경량 프로세스로서 같은 프로세스 내의 다른 스레드와 메모리를 공유한다. 동시 스레드 실행을 통해, 하나의 스레드가 I/O 작업을 기다리는 동안 다른 스레드가 CPU를 사용할 수 있게 되었다. 늘 그렇듯 완벽한 대안은 없고, 멀티 스레딩도 마찬가지다. 특정..

Docker + Nginx + NextJS + MongoDB + Mongoose

FE와 BE를 나누는 것이 타당하지만, 혼자서 개발을 하다보면 하나의 흐름안에서 모두 개발을 하고 싶어집니다. 오래전에는 JSP, Spring, 혹은 Express등 통합된 환경 안에서 FE 개발을 하기도 했습니다. 서버안의 FE 영역이라고 할까요 ㅎㅎ 하지만 지금은 반대의 입장이 되었습니다. FE의 관점에서 서버가 필요해서 사용하는 느낌으로 NextJS를 이용할 수 있습니다. SSR과 CSR 각각의 장점을 모두 이용하면서, API 서버도 함께 구축할 수 있습니다. 물론 복잡도는 올라가죠. 하지만 한번 설정해 놓으면 꽤나 편리합니다. 오늘 Docker를 이용해 가장 앞단의 Nginx 설정과 MongoDB 설정, 그리고 NextJS를 띄워 보겠습니다. 그리고 Mongoose를 이용해 실제 연결까지 실습해 ..

웹 워커와 서비스 워커

브라우저는 자바스크립트를 실행하기 위해 싱글 스레드를 사용한다. 때문에, 자바스크립트는 한 번에 한 가지의 일만 수행할 수 있다. 비동기 처리를 통해 기다리는 시간을 줄이더라도, 결국 메시지 큐에 쌓인 업무들은 Run to Completion 원칙에 따라 동작합니다. "Run-to-completion" 각 메시지는 다른 메시지가 처리되기 전에 완전히 처리됩니다. 이것은 함수가 실행될 때마다 미리 비워질 수 없고 다른 코드가 실행되기 전에 완전히 실행되며 함t수가 조작하는 데이터를 수정할 수 있다는 사실을 포함하여 프로그램에 대한 추론을 할 때 좋은 속성을 제공합니다. 이것은 C와는 다릅니다. 예를 들어 함수가 쓰레드에서 실행된다면 런타임 시스템이 다른 쓰레드에서 다른 코드를 실행하기 위해 어느 시점에서 ..

오라클 무료 VM 설정

5년정도 AWS를 사용했는데, 오라클 클라우드로 이전을 준비하고 있다. 유료 서비스를 사용하더라도 오라클의 조건이 나쁘지 않다. 그래봐야 AWS 요금이 한달에 1~2만원 남짓이지만... 장점은 아래와 같다. 기간 없이 무료다. 고정 IP 준다. 볼륨도 넉넉하게 준다. 유료/무료 정확하게 알려준다. 유료 서비스를 이용하더라도, 상대적으로 착한 가격 VM을 생성해보자! 오라클 클라우드 가입 VM 생성 네트워크에서 고정 IP 생성 고정 IP와 VM 연결 볼륨 생성 (100기가 용량과 함께 고성능 옵션을 선택하자.) 볼륨 마운트 하기 마운트 된 볼륨 사용하기. 6번과 7번에서 주의해야 하는데, 6번은 인스턴스 상세 메뉴에서 "블록 볼륨 연결" > "iSCSI 명령 및 정보" 항목을 복붙하면 된다. 7번은 아래 ..

Docker + Nginx + NextJS

도커를 이용해 Nginx와 MongoDB는 컨테이너 환경으로 띄우고, NextJS는 호스트 환경에서 실행하고 싶었다. Nginx 설정과 로그는 볼륨 연결을 하고, MongoDB는 alias로 연결했다. NextJS는 호스트에 떠있기 때문에, host.docker.internal을 통해 연결 했다. docker compose 설정은 다음과 같다. version: '2' services: proxy: image: nginx:latest ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/logs:/var/log/nginx environment: - TZ=Asia/Seoul extra_hosts: -..