본문 바로가기

분류 전체보기6

Nestjs 커스텀 로그 decorator Nestjs 리팩토링 진행 중에 로그를 어노테이션으로 처리하고 싶어서 구현한 내용을 적어보았다 먼저 Nestjs의 LoggerService interface를 구현해서 커스텀 로거 서비스를 만든다. 간단히 앞에 로그레벨을 붙여서 메시지를 출력하는 로거를 만들었다. import { Injectable, LoggerService } from '@nestjs/common'; @Injectable() export class MyLogger implements LoggerService { log(message: any, ...optionalParams: any[]) { console.log(`[log] ${message}`); } error(message: any, ...optionalParams: any[]) .. 2022. 9. 15.
채팅 서비스 만들기#2 - channel로 채팅방 구현 같은 채팅방에 참여한 사람들끼리만 서로의 메시지가 전달되도록 하는 기능이 필요하다. 서버에서 채팅방을 구현하는 로직을 생각해봤다. 유저가 채팅방에 입장하면 서버 중 한 곳에 소켓연결이 된다. 서버는 유저가 접속한 채널을 저장한다. 연결된 서버는 채팅방 아이디가 서버의 채널목록에 있는 지 확인하고 없으면 redis client가 채널을 subscribe 한다. 유저가 전송하는 메시지는 유저가 접속한 채팅방에 해당하는 채널에 publish한다. 유저가 퇴장하면 서버와 연결이 해제된다. 서버는 이 유저가 접속한 채널에 접속한 사람이 아직 있는 지 확인하고 없으면 unsubscribe 한다. 채팅방 성능?? subscribe와 unsubscribe는 비교적 적게 발생하므로 상관없지만 publish 성능은 따져봐.. 2022. 9. 1.
채팅 서비스 만들기#1 socket.io, redis로 간단한 채팅 구현 기존 개발용으로 간단히 구현했던 채팅 서비스를 이번에 redis로 scale-out 가능하게 수정할 일이 생겼다. 이 참에 구현했던 과정을 기록해놔야겠다 생각해서 정리해봤다. 웹소켓을 이용해 클라이언트와 서버 사이에서 채팅 메시지 송수신 메시지를 전송할 수 있는 API 채팅 메시지를 db에 저장 사용량에 따라 스케일 아웃 가능 위 기능들이 필요한데 express와 socket.io, redis 채팅 서비스를 만들고 Terraform으로 aws ecs에 배포까지 할 예정이다. websocket 서버의 scale-out 채팅 서비스는 웹 소켓으로 클라이언트와 통신하고, socket-io로 구현되어있다. Client A, B가 웹소켓 서버를 통해 데이터를 주고 받으면서 서로에게 메시지를 전달할 수 있다. ht.. 2022. 8. 31.
Graphql의 n+1문제 graphql에서의 n+1문제 예전에 jpa로 orm을 처음 접했을 때 n+1문제에 대해 처음 알게되었는데 graphql을 사용하다 보니 같은 문제가 있다는 걸 알게되었다. 중첩된 형태로 객체를 요청해서 응답 받는 구조가 비슷하게 느껴지는데, 그래서 같은 문제가 발생하는 것 같다. query{ getPhotos{ photoId author{ nickname } } } 예를 들어 위 처럼 작가의 닉네임이 포함된 사진정보 리스트를 요청하는 쿼리가 있고, Photo author 리졸버는 db에 접근해서 해당 photo의 author 정보를 가져온다고 했을 때, 10장의 사진을 요청한다면 photo list를 쿼리하는 db요청 1번에 각 photo에 대한 author 정보를 쿼리하는 db요청 10번이 발생할 것.. 2022. 8. 25.