전체 글
[Nodejs] Express Typescript SocketIo
여러 챗봇과 실시간 채팅을 만들어야 했다. 기획이 굉장히 납득가지 않았지만, 기획자는 기획자의 일이 있는거니까 일단 이해하고 만들었다.. socket.model.ts const socketConnect = (httpServer: any) => { const ioConnect = new socketIo.Server(httpServer, { cors: { origin: '*', methods: ['GET', 'POST'], credentials: true, }, }); const io = ioConnect.of('/socket/chat'); return io; }; export = socketConnect; 소켓을 여는 함수를 만든다. app.ts import express from 'express'; im..
[Ubuntu] firebase-admin - error:25066067:DSO support routines:dlfcn_load:could not load the shared library
이번에 채팅 서버를 새로 파면서 처음 보는 문제가 생겼다. 파이어 베이스를 활용해 푸시 알람을 보냈는데, 특정 알람은 푸시가 가고, 또 어떤건 안되고, 확인해보니 이런 로그가 떴다. Error: error:25066067:DSO support routines:dlfcn_load:could not load the shared library at Sign.sign (node:internal/crypto/sig:131:29) at ServiceAccountSigner.sign (/node_modules/firebase-admin/lib/utils/crypto-signer.js:65:37) at /node_modules/firebase-admin/lib/auth/token-generator.js:135:44 a..
[Node.js] Express-typescript 전환
8개 서버에서 2개는 js, 6개는 ts를 사용했는데, 유지보수가 하기가 굉장히 불편하다. 그래서 시간이 좀 남을 떄 조금씩 바꾸기 시작했다. 천천히.. 다치지않게 소중히.. 구조도 바꿨는데, 바꾸면서 느끼는게 굉장히 많았다. 간단하게나마 기록을 해보려한다. battle라우터를 예로 들면 현재 구조는 이렇다. router.ts const router: Router = Router(); router.post( '/', memberAuthMiddleWare, createBattleContractInterceptor, createBattleContractController, responseSuccessInterceptor, ); 일반적인 라우터. 들어오면, 멤버검증하는 미들웨어 -> 타입 및 예외처리만 하는 ..
[ReactNative] Android Webview KaKaoLink 안드로이드 웹뷰 카카오 공유하기
RN 작업을 할 때마다 느끼는데 정말 좋다 행복해^^ 너무 행복해 ^^ 성격 좋아지는 것 같다 ^^ Android 4.4부터 Webview가 Chrom에서 Chromium 기반으로 변경되었는데,이건 IntentURL을 지원안한다. 고로 행복하게 작업을 해야한다. 공식 문서 그대로 따라했다간 현재 구현이 안되고, 어느 부분들은 잘못 적혀있어서 블로그에 다시 쓴다. react-native-send-intent 설치 intent를 지원해주는 npm을 깐다. npm i react-native-send-intent yarn add react-native-send-intent react-native-send-intent는 다른 어플들도 쉽게 열 수 있다. 안드로이드 셋팅 android/settings.grad..
[ReactNative] Problems reading data from Binary store in
화나 거지같아 하하 구글, 스택오버플로, gradlew깃헙, 알엔깃헙등 존재하는 진짜 진짜 진짜아 모든 레퍼런스를 참고하고, 안드로이드 스튜디오부터, gradlew에서 제공하는 디버깅까지 다해서 별난리를 다 했는데, 레퍼런스별 원인도 너무 다르고, 걍 어이가 없는건 코드는 아무도 건든적이 없는데 갑자기 저주를 받았다. 우아아아아 Problems reading data from Binary store in /private/var/folders/6n/5bjtch856nj5rkch9t2dnqzc0000gn/T/gradle1030692378674898310.bin offset 45585202 exists? true ㅎㅎ ./gradlew clean ./gradlew build --refresh-dependenc..
[MySQL, Redis, Node.js] Cache를 활용한 Update query 속도 개선
그지같은 Update 속도 때문에, 여러 곳에서 병목 현상이 났다. 프로덕트 성격상, update, Insert, delete가 활발한 table이 있는데, 이 곳에서 데드락도 잘 걸리고, 고통스러웠다. 매번 투매니커넥션 뜰 때마다, 프로세스 리스트에서 병목 현상을 일으키는 쿼리를 보고, 놀러갈 때도, 노트북을 들고다니며, 눈물의 스크립트를 날리는 고통을 받았다... 이번에 시간이 좀 나서, 어떻게든 개선해보려했다. 전체를 다 고치는건, 공수가 너무 들어서 힘들었고, 일단 임시조치를 취했다. 처음엔 서브쿼리, 임시테이블을 활용했으나, 이것도 여의치 않아서, 그냥 캐시를 활용하기로 했다. Redis를 활용해서, Pk를 캐시로 만들었다. redis.commend는 미리 모듈화해 둔 redis 명령어 함수다..
[Node.js] FCM Notification 알람 자동화 작업
앱에서 각종 알람들을 자동화해야했다ㅠ 나는 회사에서 사용하는 서비스를 AWS에서 작은 용량의 ec2를 여러개 놓고, 용도와 필요에 맞게 나눠서 쓰는 식으로 설계했는데, 알람도 자동화를 돌릴 알람들을 용도와 연결된 것들에 맞게끔 나눴다. 그래야 유지보수가 편할 것 같아서인데, 이건 나중에 지켜봐야겠지.. 일단 간단한 예제 파일을 만들었다. 실제 프로덕트에 적용할 땐 인터페이스와 모듈화를 잘 해놓아야한다. app.controller.ts const customNotiCron = cron.schedule('* * * * *', async () => { try { const day: number = dayjs().tz('Asia/Seoul').day(); const notiTime: string = dayjs..
[Node.js, Redis] Nodejs AWS Elasticache Redis
점점 규격이 커지다 보니, 반복 요청 하는 구간이나, 계산이 많은 곳에서 부하가 조금씩 생겼다. 디비랑 서버에서 짱구를 아무리 굴려봐도 어쩔 수 없는 부분이 있었다. 그렇다. 이젠 캐시처리가 필요했다... 여러가지를 알아보다가, 엘라스틱캐시-레디스를 선택했다. EC2에 레디스를 직접 배포해서 할 수도 있었지만, 증설, 로그 등 관리에 용이했기 때문이다. elasticcache는 아마존에서 Redis로 만들면 된다. 셋팅은 생략한다. Nodejs에 연결하려 한다. 리더 엔드포인트는 읽기만 하는 용도고, 기본 엔드 포인트로 연결을 일단 해보자. 해당 사진은 ElasticCache 대시보드에 Redis에 있다. 여러 Npm이있는데, redis를 사용했다. 사람들의 인기도나, 속도, 쓰이는 함수, 업데이트 주기..