node.js 13

[Nest.js] 헬스 체크

서비스를 운영하다 보면 트래픽이 늘어나거나 DB에 부하가 생기기도 하고 기간 통신망이 끊기게 되는 경우도 발생합니다. 장애는 어느 레이어에서든 발생할 수 있고 사용자의 불편을 줄이기 위해 신속하게 장애에 대응하는 게 필요합니다. 그러려면 현재 서비스가 건강한 상태인지 항상 체크하고 있어야 할 장치가 필요합니다. 이를 헬스 체크라고 부릅니다. 서버는 HTTP, DB, 메모리, 디스크 상태 등을 체크하는 헬스 체크 장치가 있어야 합니다. 만약 서버가 건강하지 않은 상태가된다면 즉시 이를 사내 메신저 등을 통해 담당자에게 알려야 합니다. 헬스 체크와 함께 쌓아둔 에러 로그를 기반으로 종합적으로 모니터링 전략을 세워야 합니다. Nest는 Terminus(@nestjs/terminus) 헬스 체크 라이브러리를 제..

BackEnd/Nest.js 2023.06.01

[Nest.js] 태스크 스케줄링

@nestjs/schedule 패키지 서비스를 개발하다 보면 주기적으로 동일한 작업을 처리해야 하는 경우가 생깁니다. 이런 주기적 반복 작업을 태스크 또는 배치라고 부릅니다. 태스크 스케줄링을 잘 활용하면 특정 기간마다 수행해야 하는 귀찮은 작업을 신경쓰지 않아도 됩니다. 태스크 스케줄링을 반드시 반복적인 작업에만 적용해야 하는 것은 아닙니다. 1회성 태스크를 만들 수도 있습니다. 리눅스에는 태스크 스케줄링을 담당하는 크론이라는 기능이 있습니다. Node.js에는 cron과 같은 기능을 하는 여러 라이브러리가 있습니다. Nest는 인기 패키지인 node-cron을 통합한 @nestjs/schedule 패키지를 제공합니다. $ npm i @nestjs/schedule @types/cron 태스크 스케줄링은..

BackEnd/Nest.js 2023.05.31

[Nest.js] 인터셉터

인터셉터 인터셉터는 요청과 응답을 가로채서 변형을 가할 수 있는 컴포넌트입니다. 인터셉터는 관점 지향 프로그래밍에서 영향을 많이 받았습니다. 인터셉터를 이용하면 다음과 같은 기능을 수행할 수 있습니다. 메서드 실행 전/후 추가 로직을 바인딩 함수에서 반환된 결과를 변환 함수에서 던져진 예외를 변환 기본 기능의 동작을 확장 특정 조건에 따라 기능을 완전히 재정의(예: 캐싱) 인터셉터는 미들웨어와 수행하는 일이 비슷하지만, 수행 시점에 차이가 있습니다. 미들웨어는 요청이 라우트 핸들러로 전달되기 전에 동작하며, 인터셉터는 요청에 대한 여러 개의 미들웨어를 조합하여 각기 다른 목적을 가진 미들웨어 로직을 수행할 수 있습니다. 어떤 미들웨어가 다음 미들웨어에 제어권을 넘기지 않고 요청/응답 주기를 끝내는 일도 ..

BackEnd/Nest.js 2023.05.31

[Nest.js] 예외 필터

소프트웨어를 개발하면서 예외 처리는 필수 사항입니다. 어떤 상황에서든 에러는 발생할 수 있고 개발자는 이 에러에 대응책을 마련해둬야 합니다. 예외가 발생할 만한 모든 곳에 예외 처리 코드를 삽입하는 것은 중복 코드를 양산할 뿐 아니라 기능 구현과 관련 없는 코드가 삽입되므로 핵심 기능 구현에 집중하지 못하게 됩니다. 예외가 발생했을 때 에러 로그와 콜 스택을 남겨 디버깅에 사용할 수 있는 별도의 모듈을 작성했다면, 예외 처리기 역시 따로 만들어 한곳에서 공통으로 처리하도록 해야 합니다. 예외 처리 Nest는 프레임워크 내에 예외 레이어를 두고 있습니다. 애플리케이션을 통틀어 제대로 처리하지 못한 예외를 처리하는 역할을 합니다. 아무런 작업을 하지 않아도 기본 예외 처리기가 예외를 잡아서 유저가 이해하기 ..

BackEnd/Nest.js 2023.05.30

[Nest.js] 로깅

서비스에 기능이 늘어나고 사이즈가 커지게 되면 동작 과정을 남기고 추적하는 일이 중요하게 됩니다. 이슈가 발생했을 경우 이슈 증상만으로 원인을 파악하는 데에는 시간과 노력이 많이 들고 코드를 다시 역추적하면서 이해하는 데에 어려움이 따릅니다 .이슈가 발생한 지점과 콜 스택이 함께 제공된다면 빨리 해결이 가능할 것입니다. 또 어떤 기능이 많이 사용되는지와 같이 유저의 사용 패턴을 분석하는 데에도 로그를 활용할 수 있습니다. 서비스를 실행하면 서버 콘솔에는 로그가 출력됩니다. 이미 각 컴포넌트에서는 내장 로거를 이용하여 로그를 출력하고 있습니다. 내장 Logger 클래스 @nest/common 패키지로 제공됩니다. 로깅 옵션을 조절하면 다음과 같이 로깅 시스템의 동작을 제어할 수 있습니다. 로깅 비활성화 로..

BackEnd/Nest.js 2023.05.30

[Nest.js] JWT 인증/인가

가드 인증은 미들웨어로 구현하는 것이 좋은 사례입니다. 애플리케이션은 사용자의 권한을 확인하기 위해 인증과 인가를 수행해야 합니다. 인증은 요청자가 자신이 누구인지 증명하는 과정입니다. 최근에는 매 요청마다 헤더에 JWT 토큰을 실어 보내고 이 토큰을 통해 요청자가 라우터에 접근 가능한지 확인하는 방식을 많이 사용합니다. 이해 비해 인가는 인증을 통과한 유저가 요청한 기능을 사용할 권한이 있는지를 판별하는 것을 말합니다. 퍼미션, 롤, 접근 제어 목록 같은 개념을 사용하여 유저가 가지고 있는 속성으로 리소스 사용을 허용할지 판별합니다. 인가는 가드를 이용하여 구현할 수 있는 좋은 사례입니다. 보통 인증과 인가에 실패할 경우 응답에 대한 HTTP 상태 코드는 각각 401 Unauthorized와 403 F..

BackEnd/Nest.js 2023.05.26

[Nest.js] 백엔드 개발 기본 지식

Node.js Nest는 Node.js를 기반으로 동작합니다. 정확히는 Nest로 작성한 소스 코드를 Node.js 기반 프레임워크인 Express나 Fastify에서 실행 가능한 자바스크립트 소스 코드로 컴파일 하는 역할을 합니다. 따라서 Node.js의 동작 원리를 이해하면 개발할 때 도움이 됩니다. Node.js의 등장으로 자바스크립트를 이용하여 서버를 구동할 수 있게 되었습니다. 프론트엔드와 백엔드에서 같은 언어를 사용한다는 것은 큰 장점입니다. 구글은 크롬 브라우저를 출시하면서 자체 개발한 자바스크립트 엔진인 v8 엔진을 크롬에 내장했고 v8의 뛰어난 성능은 자바스크립트는 느리다는 인식을 바꾸어주었습니다. 단일 스레드에서 구동되는 논블로킹 I/O 이벤트 기반 비동기 방식 여러 작업 요청이 한꺼번..

BackEnd/Nest.js 2023.04.27

[Node.js] cluster

cluster 모듈은 기본적으로 싱글 프로세스로 동작하는 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈입니다. 포트를 공유하는 노드 프로세스를 여러 개 둘 수도 있어, 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산되게 할 수 있습니다. 서버에 무리가 덜 가게 되는 셈입니다. 예를 들어 코어가 여덟 개인 서버가 있을 때 노드는 보통 코어를 하나만 활용합니다. 하지만 cluster 모듈을 설정해 코어 하나당 노드 프로세스 하나가 돌아가게 할 수 있습니다. 성능이 꼭 여덟 배가 되는 것은 아니지만, 코어를 하나만 사용할 때에 비해 성능이 개선됩니다. 하지만 장점만 있는 것은 아니며, 메모리를 공유하지 못하는 등의 단점도 있습니다. 따라서 세션을 메모리에 저장하는 경우 문제가 될 ..

BackEnd/Node.js 2023.04.25

[Express] req, res 객체

익스프레스의 req, res 객체는 http 모듈의 req, res 객체를 확장한 것입니다. 기존 http 모듈의 메서드를 사용할 수 있고, 익스프레스가 추가한 메서드나 속성을 사용할 수도 있습니다. 예를 들어 res.writeHead, res.write, res.end 메서드를 그대로 사용할 수 있으면서 res.send나 res.sendFile 같은 메서드도 쓸 수 있습니다. 다만, 익스프레스의 메서드가 워낙 편리하므로 기존 http 모듈의 메서드는 잘 쓰이지 않습니다. req req.app: req 객체를 통해 app 객체에 접근할 수 있습니다. req.app.get('port')와 같은 식으로 사용할 수 있습니다. req.body: body-parser 미들웨어가 만드는 요청의 본문을 해석한 객체입..

BackEnd/Express 2023.04.19

[Express] Error Handling

다른 미들웨어 함수와 동일한 방법으로 오류 처리 미들웨어 함수를 정의할 수 있지만, 오류 처리 함수는 3개가 아닌 4개의 인수 (err, req, res, next)를 갖습니다. app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something broke!'); }); 오류 처리 미들웨어는 다른 app.use() 및 라우트 호출을 정의한 후에 마지막으로 정의해야 합니다. const bodyParser = require('body-parser') const methodOverride = require('method-override') app.use(bodyParser()) app.use(methodOverr..

BackEnd/Express 2023.04.19