전체 글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. Opensearch와 Azure vision으로 비슷한 사진 찾기 유사사진 추천 기능을 구현해야해서 몇 주 전에 여러가지 방법을 찾았었다. 결국 생각해낸 방법 중 채택 된 것이 사진을 자동으로 태깅해서 Opensearch에 인덱싱 해놓고 태그를 기준으로 검색해서 비슷한 사진을 찾는 것이었다. 얼마전 PoC 진행했던 것을 간단히 기록으로 남기는 게 좋겠다 생각했다. Azure vision으로 사진 태깅하기 azure computer vision은 사진과 동영상으로부터 여러가지 정보를 추출해주는 AI 서비스이다. 이 서비스를 이용하여 사진에 자동으로 태그를 달고, 설명을 달아줄 수 있다. azure 클라우드 콘솔에서 Computer Vision 인스턴스를 아래와 같이 생성한다. 생성된 인스턴스의 상세 정보에서 '키 및 엔드포인트'를 선택하면 api access 키를 확인할.. 2022. 8. 17. AWS lambda로 Opensearch index 생성하기 오늘은 Opensearch 데이터 인덱싱을 하는 람다 패키지를 만들어 배포했다. 기존에는 gcp kubernetes 환경에서 logstash를 이용하여 인덱싱을 했었다. 초기 개발비용 감소와 관리 포인트 감소의 장점이 있다 생각해서 lambda에서 인덱싱이 이루어지도록 헸다. 파이썬으로 postgresql에서 데이터 조회한 결과를 처리해서 Opensearch 도큐먼트로 만들어 인덱싱 하는 기능을 구현했다. 두가지 기능이 필요하다. 하나는 데이터가 db에 추가될 때 실시간으로 Opensearch에 인덱싱 해주는 기능. 또 하나는 전체 데이터를 조회하여 대량의 데이터를 인덱싱 하는 기능이다. 두번째 기능은 개발환경이나 테스트 환경을 구성할 때 필요하다. pychopg2를 이용해 도큐먼트 생성에 필요한 데이터.. 2022. 8. 16. 이전 1 다음