목록nestjs (9)
복's
데이터를 조회할 때 많은 데이터를 한 번에 많이 가져오면서 혹은 정적 리소스도 같이 받아 오면서 화면을 렌더링 하는데 시간이 오래 걸리는 상황이 발생했고, 제일 먼저 생각난 방법은 페이징 처리를 하는 것이였다. 과거에도 몇 번 페이징 처리를 해본 경험은 있었지만 Nest JS는 한 번도 다뤄본적 없기 때문에 어떻게 처리할지에 대한 고민을 했었다. 밑에서 하는 페이징 처리는 내가 임의로 한 페이징 처리이기 때문에 다른 사람이 어떻게 하는지는 모르겠다. 다만 스프링에서 myBatis를 사용해서 페이징 하던 기억을 더듬어서 만들었기 때문에 페이징 처리에 대한 정석은 아니고 그저 주니어 개발자의 기록일 뿐이다. [ 📌 PagingOption.ts ] 먼저 여러 조회 API에서 공통적으로 사용할 수 있는 페이징 ..

DB를 공부하다가 보면은 한 번은 마주하는 단어 Deadlock... 하지만 일 & 공부 하면서 한 번도 마주한적 없어서 적잖게 당황했다. 사실 Deadlock 자체의 문제라기 보다는 저번 주에 포스팅했던 메모리 누수로부터 파생된 오류였다. [ 📌 Deadlock Error Tracing ] 먼저 Get 방식으로 요청이 들어왔고 실행된 DML은 select 문이였다. 첫 번째 의문은 왜 select 에서 데드락이 발생되었는가 였다. 나는 Dirty Read가 허용된 상황에서만 작업을 해와서 당연하게도 항상 허용되는줄 알았다. 두 번째 의문은 어디서 트랜잭션상에 해당 테이블을 올리고 커밋하거나 롤백하지 않는가였다. (나중에서 알았지만 DB에서 실행중인 세션 및 쿼리 확인하는 테이블이 있어서 확인할 수 있었..

어느 시점 이 후 계속해서 서버가 터지는 현상이 일어났다...정확히는 서버거 죽는게 아니라 Request만 받고 Response를 뱉지 않는 상황이 생겼다. 그럴 때 마다 서버를 재 부팅 했는데 너무 잦아서 문제를 식별하기 위해서 로그를 뒤져봤다.Http Method 종류 상관 없이 혹은 파라미터, agent도 변경해서 보내봤지만 특정한 에러가 발생하는게 아니라서 문제를 몰랐다.정상적인 플로우대로 흘렀다면 핸들러를 통해서 DB Access까지 이루어져 작성 해두었던 DML 실행 후 결과를 요청한 클라이언트에 반환 해줘야 하는데 Request에서 서버가 응답을 하지 않았다.도대체 문제가 무얼까 생각 하다가... 정확히 어디까지 도달하는지 확인 해보았지만 DB Access할 시점부터 코드가 아래처럼 멈춰버렸..

DB 데이터 조작(DML)시 유효하지 않은 ID를 가지고 하게 되면 HTTP Status code로 200 OK를 받게 되었다.근데 우리는 이게 DB에 대한 조작이 없으니 에러를 발생 시키고, 사용자에게 혹은 우리가 알 수 있도록 제어할 수 있어야 한다고 생각 했다. 그래서 조작이 없을 경우 Wrapping해서 예외 처리 하도록 했다.[ 📌 목표 ]Inteceptor를 만들어서 Response되기 전에 조작할 수 있도록 세팅DB조작이 없는 경우 HTTP Method에 따라서 다르게 동작 하도록 세팅[ 📌 Interceptor 세팅하기 ]Docs & GPT (GPT의 도움이 컸지만..)의 힘으로 세팅했다.근데 사실 세팅 자체는 Docs만 봐도 할 수 있을 정도로 어렵지 않다. 1) NestInterce..

이미지 파일들을 서버로 업로드할 일이 생겼다.당장은 큰 용량의 이미지들이 올라가지 않기 때문에 S3 같은 스토리지 사용 대신에 서버 폴더에 업로드 하기로 했다.[ 📌 목표 ]이미지 업로드를 한 곳에서만 하지 않기 때문에 공통적으로 사용할 수 있도록 모듈화 하기이미지 압축하기이미지 관련한 예외 케이스 처리하기파일 사이즈 제한하기[ 📌 파일 업로드 하기 & 모듈화 ]다행히도 좋은 자료가 많았지만 맨 처음으로 접한건 역시 Docs다.기본적인 예시는 제공되기 때문에 먼저 파일을 전송 했을 때 파일이 받아지는지 확인 해본다.$ npm i -D @types/multerMulter를 사용하기 때문에 라이브러리 다운로드를 받고 시작한다. @UseInterceptors(FileInterceptor('file')) ..

이전에 필터를 만들고 예외 클래스를 구현하고 받을 생각을 하고 있었다가 이제 예외 객체를 만들게 되었다. 물론 예외 처리가 실무에서 이렇게 되는지는 모르지만 나는 내가 원하는데로 진행했다. 1) Exception 클래스 ... export class DoWithException extends Error { name: string; errorCode: number; statusCode: number; constructor(message, errorCode, statusCode){ super(message); this.name = 'DoWithException'; this.errorCode = errorCode; this.statusCode = statusCode; } getStatus(){ return t..

1) 예외 처리하기nestJS는 프레임워크 내부에 예외 레이어가 있어서 유저가 어플리케이션단에서 처리하지 못한 예외들(Unhandled exceptions)을 캐치해서 처리해준다.이 때 적절하게 유저가 알아보기 쉬운(user-friendly) 형태로 응답해 주는데 json 타입을 말하는 것 같다.{ "statusCode": 500, "message": "Internal server error"}500대 코드로 서버에서 요청 처리하는 과정에서 발생하는 에러로 변환되어서 반환된다.예외가 인식 불가능한 경우(Unrecognized) - HttpException이 아니면서 HttpException을 상속 받는 에러도 아닌경우 InternalServerErrorException로 변환한다.InternalSer..

[ 📌 .env 파일 환경별 나눠서 세팅하기 ]로깅 프레임워크를 nestJS에 설정하고 싶은데 .env 파일에 환경 변수를 세팅해 놓고 싶어졌다. ex) port번호근데 환경별로 다르게 설정하고 싶은데 ex)개발, 운영... 그 방법을 몰라서 알아보게 되었다. npm install @nestjs/config.env 파일을 이용하기 위해서 npm install 다운 받는다.import { Module } from '@nestjs/common';import { ConfigModule } from '@nestjs/config';import { MoviesModule } from './movies/movies.module';import { AppController } from './app.controller'..

두 번째 nest JS 프로젝트 생성하는데 같은 문제를 또 겪었지만 어떻게 해결했는지 기억이 나지 않아서 적는 중이다. (ㅠㅡㅠ) 에러 메세지 그래도 검색 했을 때 가장 많이 나왔던말은 23년 초부터 생긴 kt의 통신망 문제라고 한다.(다른 통신사로 연결해서 시도해보지 않았지만 사례를 보면 다른 통신망 사용했을때는 다운 받아진다는 글을 봤었다.) 마침 내 핸드폰도 kt를 사용중이고, 맥북에서 개인용 핫스팟 연결해서 쓰고 있으니까... 검색해서 가장 많이 나왔던 해결책은 npm 미러 사이트를 바라보게 한 후에 다운로드 받고 다시 공식 registry로 돌아오는 것인데 이상하게 나는 그것만으로 해결이 되지 않았다. 1) 미러 사이트로 변경 npm config set registry https://regist..