개발 이야기 94

모듈 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: -..

쿠버네티스 - 잡과 스케줄러 - 19

작업을 완료한 후에는, 종료되는 서비스가 있을 수 있다. 쿠버네티스는 '잡' 이라는 리소스로 해당 기능을 지원한다. 잡을 통해, 파드 내부 프로세스가 완료되면 해당 파드를 완료 시킬 수 있다. 물론 완료에 실패하면 이후처리를 결정 할 수 있다. 때문에 잡은 제대로 완료되는 것이 중요한 작업에 매우 유용하다. 이러한 작업의 좋은 예는 배치 작업이 있다. apiVersion: batch/v1 kind: Job metadata: name: batch-example spec: template: metadata: labels: app: batch-example spec: restartPolicy: OnFailure containers: - name: main image: 배치를 실행할 이미지 kubectl get..

쿠버네티스 - 레플리카셋 - 18

레플리카셋은 우리가 배웠던 레플리케이션을 대체할 새로운 요소다. 레플리케이션컨트롤러와 레플리카셋의 차이점은 다음과 같다. 1. 레플리카셋은 특정 레이블이 없는 파드를 매칭시킬 수 있다. 2. 레플리카셋은 특정 레이블의 키를 갖는 파드를 매칭시킬 수 있다. (key=*) 3. 두개의 레이블의 조합으로 파드를 매칭시킬 수 있다. apiVersion: apps/v1 kind: ReplicaSet metadata: name: suk9-rc spec: replicas: 3 selector: matchLabels: app: suk9-rc template: metadata: labels: app: suk9-rc spec: containers: - name: suk9-rc image: seokkyulee/suk9 po..