본문 바로가기

전체 글

(180)
NestJS - 대충 서비스 만들어보기 (18) 이번 내용은 NestJS 라고 하기보단 클린 아키텍처 같은걸로 타이틀을 해야할 것 같긴 합니다만.. 지금까지 만들었던 광고 서버의 구조를 좀 바꿔보려고 합니다. 현재까지 만든 디렉토리 구조는 위와 같습니다. 뭐좀 하다보니 이상한 위치에 있는 것처럼 보이는 것도 있습니다만.. 아무래도 시작할 때 nest-cli 를 통해 하나의 모듈 단위로 컴퍼넌트를 만들었다 보니 광고 관련된 건 ads / 인증 관련된건 auth 그 외에도 config, slack, redis 등으로 나뉘어져 있죠. 가장 메인이라고 할 수 있는 광고쪽을 보면 흔히 알고 있는 layered architecture 라고 할 수 있습니다. - Layered Architecture 각 계층의 이름은 경우에 따라 Presentation, Web, ..
CLI program 주절주절 프롤로그) 팀에서 담당하는 서버 중 이미지 서버가 현재는 요청받은 원본 이미지에 대해 JPEG + WEBP 이미지를 생성해서 업로드하고 있는데 WEBP 가 뒤늦게 추가된 스펙이다보니 옛날 이미지들에 대해선 WEBP 가 생성되어있지 않은 이슈가 있었고, 몇 건 되지 않는 이미지이다보니 JPEG 이미지 주소를 입력받으면 WEBP 로 만들어서 업로드해주는 CLI 가 있으면 쓸 수 있을 것 같다는 요청이 있어 NodeJS 로 작업해본 CLI 프로그램을 간단히 올려봅니다. 개발자에겐 cli 는 아주 익숙하리라 생각되구요. NodeJS 진영에서도 이미 리액트나, NestJS 등을 사용해본 개발자라면 create-react-app 또는 nest-cli 등을 통해 CLI 를 사용해본 경험이 있을겁니다. 이번에..
NestJS - 대충 서비스 만들어보기 (17) 저번 포스팅에서 @nestjs/cqrs 에 관한 내용 중 이벤트 기반 프로그래밍에 대한 부분을 이번 포스팅에서 간략히 보도록 하겠습니다. - EventBus 수동으로 이벤트를 발송하고, 그 이벤트를 구독해 적합한 처리를 하는 것은 @nestjs/cqrs 에서 제공하는 EventBus 를 이용하면 간단하게 구현할 수 있습니다. 여기서 EventBus 를 사용해볼 부분은 광고를 생성한 후 생성 결과 내용을 Slack 으로 알리는 부분입니다. @CommandHandler(CreateAdCommand) export class CreateAdHandler implements ICommandHandler { ... async execute(command: CreateAdCommand): Promise { ... a..
NestJS - 대충 서비스 만들어보기 (16) - CQRS CQRS 는 command query responsibility separation 의 줄임말로써, command 와 query 의 책임을 분리하는 패턴입니다. 여기서 command 는 시스템의 상태를 변경하는 명령을 뜻하고, query 는 상태를 변경하지 않으며 조회만 하는 요청입니다. 흔히 알고 있는 CRUD 로 구분하면 command 는 CUD / query 는 R 에 해당하겠습니다. CQRS 를 도입했을 때 성능, 확장성, 보안성이 향상된다고 합니다. 아무래도 일단 서비스가 고도화되다보면 조회시 필요한 데이터 모델과 상태를 변경할 때 필요한 모델이 차이가 나기 마련인데 command 와 query 가 분리되어 있지 않은 상태에선 이를 같이 가져가야하지만, 이를 분리하면 조회시 훨씬 가..
NestJS - 대충 서비스 만들어보기 (15) - Health Check 서비스를 운영하다보면 현재 서비스 상태가 정상적으로 서빙할 수 있는 상태인지, 그렇지 않은지 체크가 필요합니다. 서비스가 건강한 상태인지를 체크하는 장치를 우리는 일반적으로 헬스체크 라고 부릅니다. 팀에서 운영하는 서버들에도 이 부분은 아직 좀 미흡한 점들이 있습니다. 서비스가 건강한 상태인지를 체크하려면 사용하는 RDB, ElastiCache 와의 커넥션 상태를 비롯해 장비의 인메모리, 디스크 상태등을 확인해야 하지만 어떤 서버들에 대해선 /health path 만 따놓고 그냥 200 OK 응답을 반환하도록 되어있는 경우도 있습니다. 현 팀에선 어디든 그렇겠지만 RDB 와 Redis 의 커넥션 상태가 제일 중요한데, 이러한 DB 들과의 통신이 되지 않는 상황에선 앱이 죽어버릴..
NestJS - 대충 서비스 만들어보기 (14) 이번 포스팅에선 NestJS 의 인터셉터에 대해 보려고 합니다만.. 미들웨어, 가드, 예외 필터, 인터셉터, 파이프 등 뭔가 비슷해 보이는 것들이 참 많네요. Express 로 개발시엔 미들웨어로 대부분 다 처리했던 것 같긴 합니다만, 이것들을 약간 구분하기 위해 NestJS 의 request lifecycle 에 대해 먼저 보도록 하겠습니다 (링크) - Request Lifecycle (요청 생명주기) 요청에 대한 생명주기는 들어온 요청이 처리되고 최종 응답되기까지 어떠한 컴퍼넌트들을 거쳐 처리되는지를 말합니다. 요청이 들어왔을 때 처리되는 컴퍼넌트의 순서를 NestJS 공식 페이지 내용을 참고해 도식화한 것 입니다. 요청 -> 미들웨어 -> 가드 -> 인터셉터(pre-controller) -> 파이프..
NestJS - 대충 서비스 만들어보기 (13) 이번 포스팅에선 NestJS 에서 제공하는 예외 필터 기능을 사용해보겠습니다. - 예외 (Exception) 예외 처리는 무언가를 개발하는 과정에선 필수 사항인 것 같습니다. 개발자는 항상 에러가 발생할 수 있는 상황을 대비해야하고, 그에 따라 빠르게 에러를 전파하던지 또는 아예 무시되도록 하던지 하는 방법을 선택할 수도 있죠. 예전에 Express 로 처음 개발할 땐 에러 처리를 controller 부분에서 필수 파라미터가 undefined 일 땐 res.json(400)... 를, 그 이후 로직에는 전체에 try - catch 를 걸어서 뭔 에러던 다 catch 에서 잡고 500 으로 처리했었습니다. 이러다보니 코드 전체에 try - catch 및 res.json.. 이 난무했고, 보기엔 상당히 지저..
NestJS - 대충 서비스 만들어보기 (12) 이번 포스팅에선 NestJS 에서 제공하는 Guard 기능을 사용해보겠습니다. - 인증 vs 인가 인증은 Authentication, 인가는 Authorization 으로 의미하는 바는 좀 다릅니다. 인증은 유저의 신원을 검증하는 프로세스로, 자신이 누구인지를 증명하는 것입니다. 인가는 인증 이후의 프로세스로 인증된 사용자가 어떤 리소스에 접근할 수 있는지를 확인하는 것을 인가라고 합니다. NestJS 에선 Guard 를 사용해 인가를 구현할 수 있습니다. 좀 희한한건 일반적으로 응답 상태를 나타낼 때 인증이 실패하면 401, 인가가 실패하면 403 인데 401 - Unauthrozied / 403 - Forbidden 으로 되어있습니다. Forbidden 은 이해가 되지만 Authentication 실..