nodejs 23

[NodeJS] nodemailer로 이메일 보내기

옛날에 개발을 시작한지 얼마 안 됐을 때, 회사 내부에 자바로 만들어진 이메일 관련된 기능을 수정을 해본 적이 있었는데 참 어려웠었다. 최근 npm 이것저것을 둘러보다가 문득 그때 생각이 나서 노드로 이메일을 보낼 수 있는 npm이 있지 않을까 하고 찾아봤는데 역시나 있었다. 사용법도 매우 간단하다. 작업할 프로젝트 생성(생략해도 됨) npm init CommonJS 모듈 방식이 아니라 ECMAScript 모듈 방식으로 작업하고 싶어서 프로젝트를 생성 후 작업했습니다. 꼭 이렇게 할 필요는 없습니다. package.json에 "type": "module" 추가 패키지 설치 npm install nodemailer dotenv dotenv는 코드 작성 내용 중에 커밋하면 안 되는 항목이 있어서 설치 .en..

Node.js 2023.04.19

[NodeJS] 빌더 패턴(Builder Pattern)

빌더 패턴이란? 복잡한 객체의 생성을 단순화하는 생성 디자인 패턴으로, 단계별로 객체를 만들 수 있다. 복잡한 객체를 만들 때 가독성과 일반적인 개발자 사용성이 크게 향상된다. 어떨 때 사용하면 좋은가? 빌더 패턴의 장점을 살릴 수 있는 가장 명확한 상황은 인자의 목록이 길거나, 많은 복잡한 매개변수를 입력으로 사용하는 생성자가 있는 클래스이다. 일반적으로 이러한 종류의 클래스들은 모두 완전하고 일관된 상태의 인스턴스를 만들기 위해, 너무 많은 매개변수들을 필요로 하기 때문에 고려해볼 필요가 있다. 문제의 클래스 예시 class Boat { constructor( hasMotor, motorCount, motorBrand, motorModel, hasSails, sailsCount, sailsMateri..

Node.js 2022.11.01

[NodeJS] process.nextTick()과 setImmediate(), setTimeout()

process.nextTick() 현재 진행 중인 작업의 완료 시점 뒤로 함수의 실행을 지연시킨다. 콜백을 인수로 취하여 대기 중인 I/O 이벤트 대기열의 앞으로 밀어 넣고 즉시 반환한다. 현재 진행중인 작업이 제어를 이벤트 루프로 넘기는 즉시 콜백이 실행된다. process.nextTick()으로 지연된 콜백은 마이크로태스크라 불리며, 현재의 작업이 완료된 후에 바로 실행되며 다른 I/O 이벤트가 발생하기 전에 실행된다. 이미 예정된 I/O 보다 먼저 실행되기 때문에 재귀 호출과 같은 특정 상황에서 I/O 기아(starvation)을 발생시킬 수 있다. setImmediate()와 setTimeout() process.nextTick()과 목적은 유사하지만 그 의미는 다르다. 이미 큐에 있는 I/O 이..

Node.js 2022.09.02

[NodeJS] 이벤트 디멀티플렉싱과 리액터패턴

이벤트 디멀티플렉싱 대부분의 운영체제는 논 블로킹 리소스를 효율적인 방법으로 처리하기 위한 기본적인 메커니즘인 동기 이벤트 디멀티플렉서, 이벤트 통지 인터페이스를 제공한다. 멀티플렉싱은 전기통신 용어로 여러 신호들을 하나로 합성하여 제한된 수용범위 내에서 매개체를 통하여 쉽게 전달하는 방법을 나타낸다. 디멀티플렉싱은 신호가 원래의 구성요소로 다시 분할되는 작업이다. 동기 이벤트 디멀티플렉서는 여러 리소스를 관찰하고 이 리소스들 중에 읽기 또는 쓰기 연산의 실행이 완료되었을 때 새로운 이벤트를 반환한다. 그리고 이점은 동기 이벤트 디멀티플렉서가 처리하기 위한 새로운 이벤트가 있을 때까지 블로킹된다는 점이다. watchedList.add(docketA, FOR_READ); // (1) watchedList...

Node.js 2022.08.15

[NodeJS] Error : Cannot overwrite users model once compiled

이미 정의된 모델이 있는 상태에서 다시 또 모델을 정의하려는 경우 발생하는 에러다. 처음 이 에러 문구를 보고 내 로직상에서 이 상황 자체가 좀 이해가 안 됐었는 데 먼저 해결 방법부터 말하면 import mongoose from "mongoose"; const { Schema } = mongoose; const userSchema = new Schema({ email: { type: String, required: true, unique: true, }, password: { type: String, required: true, }, name: { type: String, required: true, }, nickName: { type: String, required: true, }, image: St..

Node.js 2022.06.24

[NodeJS] express+mysql2+transaction 데이터 처리

맥북에 mysql 5.7 설치 후 진행했습니다. connection pool 생성 후 트랜잭션을 이용해 정상 처리시 commit을 에러시 rollback을.. 커넥션풀 생성 const mysql = require('mysql2/promise'); const { MYSQL_HOST, MYSQL_USER, MYSQL_PW, MYSQL_DB, } = process.env; module.exports = mysql.createPool({ host: MYSQL_HOST, user: MYSQL_USER, password: MYSQL_PW, database: MYSQL_DB, connectTimeout: 5000, connectionLimit: 30 //default 10 }) 먼저 데이터 insert router...

Node.js 2022.03.15

[NodeJS] express에서 mysql2 사용하기

이전 글(https://minu0807.tistory.com/125)에서 mysql npm을 사용해봤고, async/await을 사용하기 위해선 mysql2를 설치해야 한다고 해서 설치해봤다. 콜백 방식은 보기도 싫고, 작성하는 나도 싫기 때문에... 기존꺼에 작성한 건 바로 수정해봤다. 우선은 mysql2 설치 npm install mysql2 이후 지난번에 작성했던 mysql.js을 수정 const mysql = require('mysql2/promise'); const { MYSQL_HOST, MYSQL_USER, MYSQL_PW, MYSQL_DB, } = process.env; module.exports = mysql.createPool({ host: MYSQL_HOST, user: MYSQL_U..

Node.js 2022.03.10

[NodeJS] express에서 mysql 사용하기

뭐든 처음 베이스 세팅 과정이 어려운 것 같다. 회사에서 mysql을 버리고 elasticsearch를 사용한 지 몇 년 된 것 같은데 엘라스틱 쿼리에 익숙해지면서 mysql을 완전 잊어버린 것 같고, node로 mysql을 다뤄본 적이 없어 한 번 해보고 싶어서 해봤다. mysql은 맥북에 셋팅 했다. 참고 블로그 : https://twinparadox.tistory.com/619, https://tlo-developer.tistory.com/293) 그리고 connection pool 방식으로 진행하기로 했다. 먼저 mysql.js 라는 모듈용 파일을 생성 const mysql = require('mysql'); const { MYSQL_HOST, MYSQL_USER, MYSQL_PW, MYSQL_D..

Node.js 2022.03.09

[NodeJS] Error: Unable to load PFX certificate 에러

노드를 이용해 엘라스틱서치 클라이언트 연결 중 발생했던 에러 const es_client = new elasticsearch.Client({ hosts: process.env.ES_HOST }) 이런 식으로 사용했었고 기존에 문제 없이 잘 쓰던거라, 맥북 세팅 끝나서 프로젝트를 받아서 사용했는데 다음과 같은 에러가 발생했다. 찾아보니 노드 버전 16 이상부터는 추가 옵션을 넣어줘야했다. 맥북 세팅할 때 노드를 최신버전으로 설치해서 16으로 됐고, 문제 없이 쓰던 PC는 14버전이었다. 아래처럼 해주면 문제없이 된다. const es_client = new elasticsearch.Client({ hosts: process.env.ES_HOST, ssl:{ rejectUnauthorized: false, ..

Node.js 2022.02.23

[NodeJS] node-schedule을 이용한 elasticsearch 인덱스 생성

지금 작성하는 글은 https://minu0807.tistory.com/117 [NodeJS] ElasticSearch API getTemplate(index_template) 인덱스 템플릿(index_template)? 인덱스를 생성할 때 맵핑 정보를 입력해서 생성해야 한다. 맵핑 정보 입력 없이 그냥 생성하고 데이터를 넣으면 필드 맵핑이 이상하게 만들어져서 데이터 조회나, 어 minu0807.tistory.com 이 글과 연관된 글이기도 하다. 위 글에 언급한 연도 단위로 인덱스를 사용하면서 발생한 문제를 해결하고자 node-schedule을 이용했다. 로직 구조는 간단하다. 1. 매일 00시00분01초에 moment를 이용해 다음날 날짜를 뽑는다. (2021-01-03일에서 2021-01-04일이 ..

Node.js 2022.01.06