전체 글265 monorepo프로젝트 docker build하기 사내에서 택배사 개발을 하면서 여러 개선 사항이 보였고 업무 + 개인 프로젝트의 연장선으로 택배 repo에 모노레포로 전환과 docker image로 build한 경험을 공유하고자 합니다. 사실 해왔던 것처럼 계속 개발 할 수가 있지만 택배사 구조를 한번 잡고 갈 필요가 있다고 생각하여 전환작업을 진행했습니다.도입 배경제가 입사했을 때의 택배사는 monorepo를 시도하려다 멈춘 느낌의 폴더 구조였습니다. pacakge/ 폴더 아래 cj, lotte, ..등의 택배사가 존재하였고 그 아래 서비스 코드와 node_modules, Dockerfile이 있었습니다. 사실상 package/ 폴더 아래의 택배사 폴더를 하나의 repo로 구분해도 전혀 이상하지 않은 구조였습니다. 이 구조에서 새로운 택배사가 추가해.. 2025. 2. 27. graphql subscsription 어떻게 굴러가는지 알아보기 저희 서비스의 "미발행 송장 카운트"에 graphql subscription을 적용하면서, 전반적인 subscription이 어떻게 동작하는지 흐름을 정리한 글입니다. 저희 회사는 graphql server를 apollo server + nexus 조합을 사용하고 있습니다. graphql spec문서에 보면 operation을 3개로 정의하고 있으며 주로 사용하는 query, mutation 이외에도 subscription가 존재합니다. subscription은 클라이언트와 서버 간에 장기적인 연결을 유지하며, 서버가 특정 이벤트나 데이터 변경을 감지할 때 클라이언트에 데이터를 푸시하는 방법입니다. 이 글에는 저희 회사 스펙인 apollo server와 nexus를 사용하여 구현해보도록 하겠습니다. .. 2025. 2. 16. git action에서 Cloud SQL 인증 프록시로 db migration 하기 저희 팀에서는 prisma orm migration을 사용하기 때문에 예시에 사용되는 코드는 prisma 기반으로 작성 됩니다. 기존 저희 서버의 CI/CD과정에서 docker image를 만들어 배포하고, db migration 하는 과정은 아래와 같았습니다. - develop/staging/production push- git action 실행- git action에서 gcp compute engine에 접속- develop/staging/production 브랜치에서 git pull- docker build(Dockerfile 내부에 db migration 코드 존재)- docker container 저희 팀에서는 prisma orm을 사용하고 있었고, prisma 자체적으로 migration하는.. 2025. 2. 13. [Redis] 레디스 기본타입(Sorted Sets) redis 공식문서를 보고 정리한 글입니다. redis sorted set은 score로 정렬된 중복되지 않은 문자열의 집합입니다. 같은 score를 가지는 문자열이 존재하는 경우 사전순으로 정렬 됩니다. sorted sets은 온라인 게임의 랭킹 시스템이나, api rate limiters에 사용할 수 있습니다. ZMPOP O(K) + O(M*log(N)), K는 keys의 개수, N은 set의 element 개수, M은 pop하려는 데이터 개수 ZMPOP numkeys key [key ...] [COUNT count] keys로 입력받은 sorted sets들에서 MIN/MAX 데이터를 count개수만큼(default 1)삭제 후 반환함. 입력받은 key(sorted set) 중에서 데이터가 없으면 .. 2024. 3. 30. [Redis] 레디스 기본타입(Sets) redis 공식문서를 보고 정리한 글입니다. redis set은 순서가 없고 고유한 문자열의 집합 입니다. key에 중복되지 않은 값들을 넣을 수 있으며 아래의 용도로 사용할 수 있습니다. - 게시글을 읽은 IP 모음 - 모든 유저에 대한 역할(role) - 교집합, 합집합 및 차집합과 같은 일반적인 집합 연산 member:users라는 key에 user1, user2, user3를 2번 삽입합니다. set은 중복이 없이 때문에 member:users의 값을 확인하면 하나만 존재하는 것을 확인 할 수 있습니다. > SADD member:users user1 user2 user3 (integer) 3 > SADD member:users user1 user2 user3 (integer) 0 > SMEMBER.. 2024. 2. 12. [Redis] 레디스 기본타입(Lists) redis 공식문서를 보고 정리한 글입니다. redis lists는 문자열 값의 linked lists 이며, 주로 아래의 경우 사용됩니다. - stack, queue 구현 - background worker의 큐 관리 리스트라는 개념은 종종 부적절하게 사용되는데, 예를 들어 파이썬의 리스트는 연결 리스트가 아닌 배열이며, Ruby에서는 동일한 데이터 유형이 배열(Array)로 불립니다. 매우 일반적인 관점에서 리스트는 순서가 있는 요소의 sequence 일 뿐입니다. 그러나 배열을 사용하여 구현된 리스트의 특정은 linked list로 구현된 리스트의 특성과 매우 다릅니다. redis lists는 linked list로 구현됩니다. 이는 리스트 안에 수백만 개의 요소가 있더라도, 맨앞/뒤에 새로운 요.. 2024. 1. 31. [Redis] 레디스 기본타입(String) redis string은 가장 기본적인 redis 데이터 타입으로 binary arrays, serialized objects, text, 연속된 bytes를 저장합니다. redis의 키는 string이기 때문에 값으로 사용할 때, 문자열을 문자열로 매핑하고 있습니다(key:value -> 문자열:문자열). 이런 특징 때문에 HTML page를 캐싱하는데 redis를 사용할 수 있습니다. > SET fruit banana OK > GET fruit banana SET, GET 명령어로 key에 데이터를 할당, 검색할 수 있으며, SET명령어는 key에 값이 존재하더라도 기존 값을 덮어 씁니다. 값은 binary data를 포함한 모든 종류의 문자열이 될 수 있으며, 심지어 jpeg 이미지를 value에 .. 2024. 1. 18. redis-semaphore 사용해서 mutex 해결하기 CJ 택배사 API연동하는 과정에서 semaphore를 사용하여 mutex를 해결한 경험을 공유하고자 글을 작성합니다. 전체적인 흐름은 A 서버에서 B서버로 주문 등록 요청을 하면 B서버는 redis에서 토큰을 조회 후, 토큰과 함께 CJ API를 호출하게 됩니다. A서버에서 B서버로 요청을 하면 B서버는 validation 이후, 토큰을 조회하는 함수를 실행합니다. getToken 함수에서는 토큰키를 사용하여 redis에서 토큰을 조회하고 존재하면 사용하고, 존재하지 않으면 CJ측에 토큰 재발급 요청 후, redis에 저장합니다. token의 ttl은 하루 입니다.const getToken = () => { try { const token = await redis.get('토큰 키'); .. 2024. 1. 12. 기본키를 in 조건에 넣었을 때 full scan 되는 현상(range_optimizer_max_mem_size) mysql version : 8.0.31 사내에서 prisma interactive transaction의 타임아웃을 60초로 설정하여 사용하고 있다. 하지만 트랜잭션에서 수행되는 로직이 60초를 넘어 time out이 발생하는 일이 간헐적으로 발생했다. 단순히 트랜잭션의 time out 시간을 늘려도 되지만, 어떤 쿼리가 왜 오래 걸리는지 확인해 보았다. prisma query log 옵션을 줘서 쿼리 실행시간을 측정했을 때 아래의 쿼리가 오래 걸리는 것을 확인할 수 있었다. 해당 테이블에 있는 row수는 5571220개 이다. explain SELECT * FROM CourierInvoice WHERE id IN (....) in에 들어가는 변수 10302개 기준으로 16s가 소요되었다. innodb.. 2023. 12. 6. 이전 1 2 3 4 ··· 30 다음