You Can Become A
늦게 시작해도 누구든지 노력하면 개발자가 될수 있어요 !
📚 require vs import 문법 비교 (CommonJS vs ES6)
require vs import 문법 자바스크립트 개발을 하다보면 모듈을 불러오는 문법 두가지 ( require / exports ) 와 ( import / export ) 키워드를 접하게 되는데, 이 둘은 비슷하면서도 달라 가끔 자바스크립트 개발하는데 있어 혼동을 준다. 둘다 외부의 파일이나 라이브러리의 코드를 불러온다는 같은 목적을 가지고 있지만, 전혀 다른 문법 구조를 지니고 있다. ( require / exports ) 는 NodeJS에서 사용되고 있는 CommonJS 키워드이고 Ruby 언어 스타일과 비슷하다라고 볼수 있다. ( import / export ) 는 ES6(ES2015)에서 새롭게 도입된 키워드로서 Java나 Python 언어 방식과 비슷하다. 예를 들어, 아래 2줄의 코드는 기본..
[NODE] 📚 express-rate-limit 모듈 - API 사용량 제한하기
API 사용량 제한하기 만일 인증된 사용자가 과도한 API 사용을 하게 되면 API 서버에 무리가 갈 수 있다. 또한 DOS공격에도 대비해야 되는데, DOS란 지속적으로 서버에 요청을 과도하게 해서 서버를 망가뜨리는 걸 의미한다. 예를 들어, api요청을 계속 새로고침해서 마구마구 요청하게 되면 그게 DOS공격인 셈이다. 이를 개인이 하지않고 집단이 단체로 하게되면, 한번 쯤 들어본 디도스 공격이 바로 이걸 의미한다. 따라서 일정 기간 내에 API를 사용할 수 있는 횟수를 제한하여 서버의 트래픽을 줄이는 것이 좋다. 거기다 유료/무료 서비스를 운영한다고 하면, 과금 체계별로 횟수에 차이를 둘 수도 있을 것이다. (무료 회원은 100번만, 유료 회원은 1000번 이용가능하게 설정) 이러한 기능은 expre..
[NODE] 📚 API 서버 버전 관리 하는 방법
API 서버 버젼 관리 보통 API 서버 소스의 라우터 부분을 보면 파일이 V1, V2 이런식으로 되어 있을 것이다. 라우터의 이름인 v1은 버전 1이라는 뜻이다. 라우터 파일 마다 버전을 붙이는 이유는 한 번 버전이 정해진 이후에는 라우터를 함부로 수정하면 안 되기 때문이다. 왜냐하면 다른 사람이나 서비스가 기존 API를 쓰고 있음을 항상 염두에 두어야 하기 때문이다. 따라서 기존의 API 서버의 코드를 바꾸면, 이전 API를 사용 중인 프로그램들이 오작동할 수 있기 때문에, 기존 사용자에게 영향을 미칠 정도로 수정해야 한다면 버전을 올린 라우터를 새로 추가하고, 이전 API를 사용하는 사람들에게 새로운 API가 나왔음을 알리는 것이 좋다. 이를 Deprecated 처리 라고 한다. 또한 이전 API를..
[NODE] 📚 API 서버 통신 이해하기 (JWT 토큰 신청/발급 절차)
API(Application Programming Interface) : 다른 애플리케이션에서 현재 프로그램의 기능을 사용할 수 있게 허용하는 접점 이 장에서는 NodeBird 앱의 REST API 서버를 만든다. API 서버는 프런트엔드와 분리되어 운영되므로 모바일 서버로도 사용할 수 있다. 특히 JWT 토큰은 모바일 앱과 노드 서버 간에 사용자 인증을 구현할 때 자주 사용된다. 웹 API는 다른 웹 서비스의 기능을 사용하거나 자원을 가져올 수 있는 창구. 위와 같은 서버에 API를 올려서 URL을 통해 접근할 수 있게 만든 것을 웹 API 서버라고 한다. 필요 모듈 UUID 모듈 # npm npm install uuid # v4 만 설치 npm install uuid4 [NODE] 📚 UUID 모듈 ..
[NODE] 📚 crypto 모듈 (단방향 / 양방향) 암호화 원리 & 사용법
암호화 종류 암호화를 하는 이유는 해당 정보가 중요하기 때문이다. 암호화에는 여러가지 방법이 있을 수 있다. 대표적으로 단반향과 양방향 암호 방식이 있는데, 단방향은 암호화할 수는 있어도 복호화해서 원래의 비밀번호를 알 수 없고, 양방향은 복호화해서 원래의 비밀번호를 알 수 있다. 또한, 양방향 암호화는 대칭형 암호화와 비대칭형 암호화가 존재한다. 대칭형 암호화와 비대칭형 암호화는 암호화할 때 사용하는 키와 복호화할 때 사용하는 키의 동일성에 대한 기준으로 구분하게 된다. 단방향 암호화 방법 그 중 간단한 해쉬 함수를 이용하는 방법을 보자. 해쉬 함수란 간단히 이야기하여 같은 입력 값에 같은 출력값이 나오는 게 보장되지만, 출력 값으로 입력 값을 유추할 수 없는 것을 의미한다. 아래는 단순한 예시 이다...
[NODE] 📚 노드 환경변수(env) 다루기
환경 변수란? 일반적으로 우리는 코드 베이스는 하나만 관리하고, 개발, 테스트, 운영 등 여러 환경에 애플리케이션을 배포하는데요. 어느 환경에 배포하느냐에 따라서 다르게 설정해야하는 항목은 보통 운영 체제 레벨에서 환경 변수를 통해 관리하게 됩니다. 대표적인 예로, 개발 환경에서는 로컬 DB를 사용해야하는데, 운영 환경에서는 원격 DB를 사용해야하는 경우를 들 수 있습니다. 뿐만 아니라 DB password나 API key와 같은 인증 정보는 공개된 코드 저장소에 올리면 안 되기 때문에 환경 변수로 저장해놓고 사용하는 것이 일반적입니다. 환경 변수 접근 Node.js에서 환경 변수에 접근할 때는 process.env라는 내장 자바스크립트 객체를 사용합니다. process는 전역 객체여서 별도로 임포트해야..
[NODE] 📚 이벤트 루프 🔁 setTimeout / setImmediate / process.nextTick 차이점
Event loop 이벤트 루프는 Node.js의 Main thread로, 내부의 각 Phase를 돌면서 애플리케이션을 실행 합니다. 아래 그림과 같이 각 Phase는 Queue로 이루어져있습니다. Queue에 우리가 등록한 Callback들이 알맞게 담겨서 자신의 실행을 기다리게 되는데요. 각 Phase는 자신 Queue의 모든 Job을 수행하거나, 제한 갯수까지 실행한 후에 다음 Phase로 이동합니다. 이 중에서 우리는 timers, poll, check 단계만 필요합니다. Phase 대상 처리 작업 timer setTimeout(func, delay) setInterval(func, delay) delay가 지났으면, 등록된 Callback 실행 poll I/O 대부분의 Callback 실행 ch..
[NODE] 📚 클러스터(cluster) 모듈 - 멀티 프로세서
Cluster 기본적으로 싱글 스레드인 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈 포트를 공유하는 노드 프로세스를 여러 개 둘 수 있음 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산됨 서버에 무리가 덜 감 코어가 8개인 서버가 있을 때: 보통은 코어 하나만 활용 cluster로 코어 하나당 노드 프로세스 하나를 배정 가능 성능이 8배가 되는 것은 아니지만 개선됨 단점: 컴퓨터 자원(메모리, 세션 등) 공유 못 함. 각각 독립적인 프로세스를 띄우는거라, 서로 공유가 안됨. -> Redis 등 별도 서버로 해결 - 워커 쓰레드는 쓰레드를 여러개 만드는 거라면, (cpu작업을 분담) - 클러스터는 프로세스를 여러개 만드는 것. (서버를 주로 여러개 실행) 마스터 프로세스는 C..
[NODE] 📚 child_process 모듈 (다른 언어환경 이용)
child_process 앞서 배운 워커 스레드는 구현이 힘듭니다. 하지만, 노드에서 다른 언어로 만든 서버를 호출 할 수도 있습니다. 싱글스레드의 한계에 봉착하여, 노드 사용을 주저할때 단비 같은 기능입니다. 즉, 하드한 작업은 다른 언어에서 실행하도록하고 그 결과를 노드 서버가 받아서 다시 브라우저로 전달하면 완벽합니다. const { exec } = require('child_process'); var process = exec('dir'); // 마치 우리가 터미널에서 dir를 치는 거와 같은 역할을 한다. // 결과물 출력은 반드시 우리가 직접 구현해줘야 한다. process.stdout.on('data', function (data) { console.log(data.toString()); }..
[NODE] 📚 Worker_Threads 모듈 (멀티 쓰레드 구현)
Worker Thread 이해하기 Node.js가 시작되면, 다음이 실행됩니다. 하나의 프로세스 : 어디서든 접근 가능한 전역 객체이자 그 순간 실행되고 있는 것들의 정보를 가지고 있는 프로세스 하나의 스레드 : 단일 스레드는 주어진 프로세스에서 오직 한 번에 하나의 명령만이 실행된다는 뜻. 하나의 이벤트 루프 : 노드를 이해하기 위해 가장 중요한 부분 중 하나입니다. 이는 자바스크립트가 단일 스레드라는 사실에도 불구하고, 언제든 가능한 callback, promise, async/await 를 통해 시스템 커널에 작업을 offload 하게 합니다. 이로서 노드가 비동기식, 비차단 I/O 의 특성을 가집니다. 하나의 js 엔진 인스턴스 : js 코드를 실행하는 컴퓨터 프로그램입니다. 하나의 노드js 인스..
[NODE] 📚 예측 불가능한 에러 처리하기 (uncaughtException)
노드 uncaughtException 모든 코드를 try{} catch {} 로 감싸는 것은 귀찮은 일이다. 하지만 정말 어쩌다가 예기치 못한 에러가 나와 싱글 스레드인 노드가 죽어버려 서버가 아예 다운 되는 현상이 생길 수 있다. 이러한 예측하지 못한 에러를 모아 catch로 한방에 처리할수 있는 방법이 있다. 단, 최후의 수단으로 사용해야 한다. 콜백 함수의 동작이 보장되지 않음 따라서 복구 작업용으로 쓰는 것은 부적합 에러 내용 기록 용으로만 쓰는 게 좋음 // uncaughtException 이 모든 에러를 잡아주지는 않음. // 따라서 여기에 복구 코드를 넣는건 비추천함. // 단순히 에러 발생 확인용으로만 사용 process.on('uncaughtException', err => { conso..
[NODE] 📚 https / http2 모듈 (보안 강화 서버)
기존 http 서버 const http = require('http'); http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.write('Hello Node!'); res.end('Hello Server!'); }) .listen(8080, () => { // 서버 연결 console.log('8080번 포트에서 서버 대기 중입니다!'); }); http ssl 서버 const https = require('https'); const fs = require('fs'); https.createServer({ // 인증기관으로부터 발급받은 인증서 cert,key,ca파일들..