node 20

Elasticsearch node 종류와 기본 설정 옵션

Elasticsearch의 노드 Elasticsearch의 인스턴스를 시작하는 동시에 노드도 같이 시작된다. 노드들을 연결해놓은 것을 클러스터라고 한다. 만약 하나의 엘라스틱 서치 노드만을 실행시킨 경우도 하나의 노드를 가진 클러스터라고 한다. 클러스터안에서 모든 노드는 HTTP와 Transport 트래픽을 기본적으로 다룬다. Transport 레이어는 오로지 노드들과 Java TransportClient와의 통신에만 사용된다. Http 레이어는 오직 외부 Rest Cliente들과 통신할 때 사용된다. 모든 노드는 클러스터 안에서 서로 다른 노드들에 대하여 알고 있고 client에 요청을 적적한 노드로 향하게 조절해준다. 기본적으로 노드는 master-eligible, data, ingest, mach..

ffmpeg로 동영상 정보 추출 및 썸네일 가져오기

ffmpeg로 동영상 정보 추출과 썸네일을 가져올 수 있다. 간단하게 설치하고 cli를 통해 진행해보자. 설치 우선 mac os인경우 brew install ffmpeg로 설치하고 linux인 경우 sudo apt-get install ffmpeg로 설치하면 되다. 동영상 정보 가져오기 (ffprobe) ffmpeg에서 ffprobe를 이용해서 동영상 정보를 추출 할 수 있다. print_format옵션을 사용하여 json 형태로 출력이 가능하다. 만약 프로그램에서 사용 시 node에서는 child_process를 이용해서 실행 수 결과를 받아서 사용하면 된다. ffprobe -v quiet -print_format json -show_format -show_streams wedul.mp4 썸네일 만들기..

web/node.js 2019.05.30

Redis Cluster mode에서 mget, mset, pipeline과 같은 멀티 키 명령어 사용하기.

redis에 만약 200 ~ 300개가 넘는 캐시 정보를 계속 request를 날리면 레이턴시가 발생할 가능성이 크기 때문에 이런경우에 mget, mset, pipeline 등 멀티키 명령어를 사용한다. 하지만 redis가 single mode일 때는 아무 상관이 없지만 cluster mode인경우에는 다음과 같은 오류를 발생 시킨다. "CROSSSLOT Keys in request don't hash to the same slot" 무슨 오류일까?? 처음에 redis가 싱글모드로 돌고 있던 stage에서 테스트를 해서 정상적으로 멀티키 명령어가 잘 되는줄 알고 배포 했다가 라이브에서 위와 같은 오류가 발생했다... 너무 당황해서 바로 수정했다. 무엇이 문제 였을까? 하면서 문서를 찾아보니 redis에는..

node.js에서 multer 사용하여 이미지 업로드 및 텍스트 파일 다루기

Multer는 파일 업로드를 위해서 사용되는 multipart/form-data를 다루기 위한 node.js 미들웨어이다. busyboy를 기반으로 하고 있다. 자세한 내용은 https://github.com/expressjs/multer/blob/master/doc/README-ko.md 이곳에서 참고하면 된다. 그럼 간단하게 multipart/form-data로 올린 이미지 파일과 텍스트파일을 request post로 받아서 처리하는 코드를 만들어보자. 우선 multer를 설치한다. npm i multer 그리고 이미지 파일을 특정 경로에 저장해놓고 사용할 수 있지만 나는 메모리 스토리지를 사용해서 조작하는 방식으로 진행해보겠다. multer 라이브러리를 선언하고 memoryStorage를 사용할 수..

web/node.js 2019.02.18

Nginx, Apache 그리고 node.js 성능 관련 잡다한 정리

Nginx과 Apache 비교 Nginx Apache 특징 - Nginx는 싱글 스레드 Event driven 방식- 미리 설정된 worker 프로세스 안에서 요청이 들어올 때 마다 요청을 분배하여 worker에게 역할을 분배- 기존에 정해놓은 리소스를 사용하기 때문에 CPU, Memory 등의 자원 사용률이 낮음 - 요청이 올 때마다 쓰레드를 생성하여 할당한다. 작업이 많아질 경우 많은 쓰레드할당이 필요하다. 그리고 쓰레드들이 작업을 진행 할 때마다 CPU를 사용하려 하기 때문에 문맥교환이 자주 발생된다. 차이점 - Apache에 경우 Blocking 방식으로 Network, DB 등 별도의 동작이 진행 될 때 Block되지만 Nginx는 Non-blocking 방식을 지원함 Non-blocking, ..

web/node.js 2019.02.07

sequelize에서 상황에 따라 조인 테이블을 변경하는 방법 - alias

sequelize를 사용하다 보면 하나의 필드를 어떤 상황에서는 User테이블과 조인하고 다른 상황에서는 Dept 테이블과 조인을 하고 싶을 때가 있다.예를 들면 만약 로그를 기록 한다 하였을 때 모든 행위마다 로그를 기록할 수는 없기때문에 로그 테이블에 필드에 type을 나누고 발생한 object의 index만을 기록해서 진행하고 싶을 때 그럴 수있다. 그럴경우 targetIndex의 경우 동작 타입에 따라 User테이블과 조인할 수도 있고 Dept 테이블과 조인하는 등 유동적인 조치가 필요하다. 우선 Model을 define 하는 부분을 확인해보자.12345678910111213141516const Pub = Sequelize.define('pub', { name: { type: Sequelize.S..

web/node.js 2018.12.19

sequelize 사용시 테이블 이름 변동없이 고정 Alias 사용방법

sequelize는 마찬가지로 ORM을 사용하다보니 직접적으로 쿼리를 사용하는 것보다 정확하게 알지못하면 역시 개발속도도 늦어지고 문제가 많아지는 단점이 있다. 이번에는 sequelize를 사용하는데 조인할 때 테이블 이름이 갑자기 User에서 Users로 바뀌는 이슈가 발생했다. 이 이슈를 해결하기 위해서 sequelize Document를 검색했고 거기서 freeTableName 옵션을 발견했다.1234567891011121314151617181920212223242526const Bar = sequelize.define('bar', { /* bla */ }, { // don't add the timestamp attributes (updatedAt, createdAt) timestamps: fals..

web/node.js 2018.12.19

node.js oauth2 server 만들기

스프링 프로젝트에서는 자주 oauth2를 사용했었는데 node.js는 해본적이 없어서 공부할 겸 node-oauth2-server 라이브러리를 사용하여 진행해보고 있다. 확실히 힘든 부분이 있고 설명이 어려워서 외국에서 예로 인터넷에 올려논 부분을 실제로 돌려보면서 수정하여 진행하고 있다. 설명과 소스는 git repository에 계속 수정해서 올릴 예정이다.현재는 Authorization_code와 password 방식만 올려놓았다. implict와 refresh_token 하는 기능도 수정해서 올려야겠다. Git Repository 주소https://github.com/weduls/node-aouth2-server-example

web/node.js 2018.11.25 (1)

node js에서 stream pipe 사용시 에러 처리 방법

node js에서 데이터를 stream을 사용하여 처리하고 pipe를 사용해서 계속해서 stream을 가지고 작업을 이어나갈 수 있다. 그런데 pipe를 통해서 작업을 진행하다 보니까 중간에 오류가 발생했을 때 try / catch 로는 정상적으로 처리하지 못하는 경우가 발생했다. 나에 경우에는 에러가 발생했을 때 try / catch에서 잡히지 않아서 프로그램이 Unhandled Promise Rejections를 출력 하며 죽어버렸다. 그 예는 다음과 같이 request를 통해서 받은 이미지를 sharp 라이브러리를 통해서 이미지 크기를 변경하려고 할 때 발생했다.1try { await request('https://image.toast.com/aaaaab/ticketlink/TKL_3/ion_mai..

web/node.js 2018.11.09