예전 포스팅에서 Node.js의 이벤트 루프(event loop)의 개념과 동작 원리에 대해 자세히 알아보았다. https://ilikezzi.tistory.com/68 [Javascript] 비동기의 핵심, 이벤트 루프(Event loop) 파헤치기메리 크리스마스 🎄 크리스마스인데도 포스팅을 하는 이유는 백엔드파트 리더님과 대화중에 JS 이벤트루프를 설명해보라고 하셨는데 어버버대다가 제대로 설명을 못해서 당황했었다.. 리더님ilikezzi.tistory.com 이번 포스팅에서는 그 이벤트 루프를 포함하고 있는 Node.js의 핵심 비동기 처리 라이브러리인 libuv를 중심으로, NestJS를 사용하면서 반드시 이해해야 할 장단점과 부하에 대한 내구성 관리에 대해서 깊이 있게 다뤄보겠다. 많은 개발..
갑자기 프론트엔드 포스팅을 쓰게 되었다.. 어느 날 문득 개발로 부수입을 벌어보고 싶다는 생각이 들었다. 마침 주변에 웹·앱에 애드센스를 붙여 매달 용돈을 벌고 있는 개발자가 적지 않게 보이더라. 문제는 프론트엔드 경험이 전무하다는 사실이었다. 하지만 최근 Cursor AI·GPT 같은 ‘바이브 코딩’ 도구들이 꽤 쓸 만해 보여 직접 React로 도전해 보기로 했다. 개인 일정상 오래 매달릴 수 없었기에, 주말 이틀동안 밤새서 ‘자체 1인 해커톤’으로 삼아 기획부터 배포까지 끝내기로 결심했다. 광고 수익을 노리려면 트래픽이 필수이니, 공유 기능이 있는 단순 모바일 웹을 목표로 삼았다. LuckStargram 그래서 LuckStargram이라는 AI 운세 서비스를 만들기로 했다. - 이름·생년월일·..
NestJS 기반 프로젝트를 개발 중에 곧 배포를 앞두고 있어서 로깅 시스템이 필요했다. 처음에는 Winston을 그대로 사용하려 했지만, 생각보다 부족한 기능이 많았다. 1. Winston 기본 설정이 부족 → NestJS와 TypeORM에서 바로 사용하기 어려움 2. SQL 쿼리 로깅이 비효율적 → 중요한 정보를 가독성 좋게 보기 어려움 3. 모듈 기반 로깅 미지원 → 특정 모듈에서 발생한 로그를 명확하게 구분하기 어려움 4. 파일 로그 관리 부족 → 로그 파일이 커지면 관리가 어려워지고, 파일 회전 기능이 필요함 이러한 문제를 해결하기 위해 일일히 Winston을 커스텀하기 시작했다. 특히 NestJS 및 TypeORM 환경에 최적화하여 HTTP 요청 로깅, SQL 쿼리 하이라이팅, 에러 스택..
NestJS에서 유닛 테스트를 작성할 때, 많은 의존성을 모킹(Mock)해야 하는 상황이 자주 발생한다.Repository, Service, ConfigService, Cache 등 다양한 Provider를 직접 등록하고 jest.fn()을 이용해 일일이 모킹하면 코드가 복잡해지고 관리가 어려워진다. 이 문제를 해결하기 위해 AutoMock을 활용할 수 있다. 이번 포스팅에서는 @automock/jest를 사용해 번거로운 Provider 등록 과정을 자동화하고, NestJS의 DI 흐름을 그대로 모사하여 테스트하는 방법을 살펴보자. 기존의 Mocking 방식과 문제점 NestJS에서 유닛 테스트를 작성할 때, 종속된 서비스나 레포지토리를 직접 `jest.fn()`을 사용하여 일일이 Mocking해야..
운영중인 앱에서 출석체크 이벤트를 도입하게 되었다. 출석체크 이벤트는 사용자들에게 매일 자정에 접속하여 출석체크를 하면 보상을 제공하는 간단한 메커니즘이다. 하지만... 예상했던 것 이상으로 수만 명의 사용자들로부터 동시에 들어오는 출석체크 요청의 폭풍에 직면했다. 동시성 문제 수만 명의 사용자들로부터 동시에 들어오는 요청을 처리하는 것은 결코 간단한 일이 아니었다. 서버의 자원은 한정되어 있고, 동시에 너무 많은 요청이 처리될 경우 데이터베이스 충돌, 성능 저하, 심지어는 서비스 다운에 이르기도 한다. 이는 단순히 기술적인 도전을 넘어, 우리 서비스의 안정성과 사용자의 신뢰성에 대한 문제였다. CloudWatch를 확인해보면 출석체크가 시작되는 밤 12시 (UTC 15:00)에 API 요청이 수만 건으..
회사에 백엔드파트 리더로 전 야놀자 리더분께서 오셨다. 오셔서 코드품질과 성능개선에 대해서 설명해주시는데, 그동안 내가 쓰레기같은 코드들만 빨리 짜고 있었구나 싶었다..🥲 그래서 요새는 기존 코드들을 하나씩 리팩토링에 들어가고있다. TypeOrm을 좀 효율적으로 잘 쓰자고 강조하셨다. 그래서 오늘은 TypeOrm의 loadRelationCountAndMap() 메서드에 대해서 포스팅을 해보려한다. 우선 기존 코드를 먼저 확인해보자. 기존 Code 사진속 코드에 대해서 설명을 하자면 투표 댓글 작성 API 인데, 존재하지 않는 투표거나, 종료된 투표가 내가 참여한 투표가 아니면 댓글을 못달게 에러를 return하는 로직이였다. vote Repository / voting Repository로 두번 DB C..
소셜로그인 1편에 이어서 바로 2편을 포스팅하려 했는데 refresh_token과 JWT 전략에 대해서 이것저것 머리싸매면서 고민하느라 늦어졌다.. 정말 다양한 JWT 전략과 고민할 사항이 많았다. 한 계정으로 여러 디바이스에서 로그인을 할 수도 있고, access_Token 만료시 refresh-API 실행 타이밍을 백엔드에서 만료를 체크해서 할 지, 아니면 프론트엔드에서 access_Token "exp"로 만료 체크해서 API 요청할지 등등... 바로 본론으로 들어가기전에 소설로그인 1편을 꼭 보고오시길 ! https://ilikezzi.tistory.com/64 [Nest.JS] 구글, 네이버, 카카오 소셜로그인 구현 - 1 진행중인 사이드 프로젝트에서 기획이 끝나서 화면기획서가 나오고, 디자인쪽도..
진행중인 사이드 프로젝트에서 기획이 끝나서 화면기획서가 나오고, 디자인쪽도 피그마로 UI/UX 디자인을 시작하고, 개발쪽도 DB ERD 설계, 서버설계, Stg서버 등등.. 기본적인 개발하기 위한 준비를 마치고 온보딩, 메인페이지 부터 드디어 Api 작업에 들어갔다. 막상 개발은 큰 어려움이 없을텐데, 역시나 처음해보는 기획이나 DB/서버 설계에서 시간이 많이 걸리고, 제대로 처음 해보는거라서 어렵더라.. 따로 Local 이메일 로그인은 제외하고 구글 / 카카오 / 네이버 로그인 세가지를 넣기로 했다. NestJS에서 소셜 로그인을 붙히기 위해서는 순서에 대한 이해가 필요하다. 하나씩 차근차근 살펴보자. 소셜 로그인 순서 내가 이해한 순서를 이해하기 쉽게 그림으로 만들어 보았다. (디자인 감각 Zero ..
운영중인 서비스에서 응답시간이 느려진 부분이 있어서, 이를 개선하고 싶었다. 마침 유저 구분이 필요 없고, 수정이 거의 없는 페이지라서 캐싱 전략을 사용하기 적합해 보였다! 해당 페이지에 대해 간략하게 설명하자면, 당일 새벽시간의 뉴스데이터를 전부 분석을 해서 아침 8시에 그날의 뉴스를 한눈에 정리해서 보여주는 페이지다. 따라서 유저별로 개인화가 들어가는 페이지도 아니고, 웬만해서는 수정이 이뤄지지 않는 API 이다. 그럼 바로 캐싱작업을 시작해보자. 설치 해당 프로젝트로 이동해서 필요한 패키지를 몇가지 설치해주자. npm install cache-manager cache-manager: 캐싱을 담당할 라이브러리다. npm install @nestjs/common nestjs의 CACHE_MANAGER:..
회사에서 협업툴로 Slack을 사용하고 있는데, 각종 통계자료 몇 로그데이터를 매일 알림으로 보내주면 좋을 것 같았다. 그래서 무슨데이터를 전송해주면 좋을지 고민하다가 1.전체 유저수 / 2.가입자수 / 3.기사 조회수 / 4.언론사별 기사 발행수 / 5.댓글수 / 6.DAU / 7.WAU 해당 7가지 데이터를 보여주기로 결정했다. Slack bot을 통한 axios와 schedule를 사용해서 자동화를 시켜줄 것이다. 우선 Slack bot을 만들자. https://api.slack.com/apps/ 해당 URL에 접속하여 슬랙봇을 생성을 하고, https://api.slack.com/methods 다음 URL에서 슬랙봇의 chat.postMessage 권한을 추가해 주도록 하자. 그 후 Install..