예전 포스팅에서 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해야..
개발을 하다 페이지네이션 관련 테스트를 진행해야 하는 상황이 생겼다. 관계형 데이터를 하나하나 매핑해서 적재하는 작업이 번거로워, 보다 간편한 방법을 찾던 중 이 방식을 활용해봤는데, 매우 유용해서 포스팅하게 되었다. 이번 포스팅에서는 Postman 환경변수와 Script를 활용해 랜덤 데이터부터 관계형 데이터(FK)까지 한 번에 생성해보고, 이후에 Collection Runner로 대량 데이터를 만들어 보는 과정을 정리해보려 한다. 특히 TypeORM 관계 설정(@ManyToOne, @ManyToMany 등)을 해둔 DB에 손쉽게 데이터를 넣을 수 있는 방법이라, 대규모 테스트에도 편리하게 활용할 수 있다. 일일히 넣기 귀찮은 Token 자동화부터, 랜덤한 데이터 생성, Runner로 대규모 데이터..
그동안 NestJS로 개발을 하면서, class-validator 같은 라이브러리를 사용하는 건 너무나 당연한 일이였다. 별다른 고민 없이 데이터 유효성 검사를 자동으로 처리하는 데 class-validator를 사용해 왔지만, 실제로 내부에서 어떻게 작동하는지에 대한 깊은 이해 없이 그저 편리함에 의존해왔다. 하지만 이제는 그 원리를 제대로 이해하고, 더 창의적으로 Custom Decorator를 생성해서 활용해 보고자 한다. 이번 포스팅에서는 Reflect Metadata를 활용하여 런타임에도 타입 정보를 유지하고 검증하는 방법과 Custom Decorator를 만드는 법을 알아보겠다. Reflect Metadata란?TypeScript는 컴파일 시점에 타입 정보를 가지고 있지만, 컴파일 후 Ja..
얼마 전, 약 2년간 다녔던 회사를 퇴사했다. 퇴사 후 한두 달 정도는 아예 코드를 쳐다보지 않고 푹 쉬었다. 이직을 바로 할까 고민하다가, 실업급여를 받을 수 있는 기회도 생겨서 이번 기회에 부족한 부분을 채우기로 했다. 무작정 코드를 작성하기보다는, 내 코드의 구조를 고민하다가 객체지향에 대해 좀 더 깊이 있게 알고, 코드에 적용해보고 싶어졌다. 그러던 중 조영호 저자의 "객체지향의 사실과 오해" 와 "오브젝트" 라는 책을 알게 되었다. 찾아보니 둘다 객체지향 관련 책이지만 "오브젝트"는 실질적인 구현에 관한 코드 위주의 책이고, "객체지향의 사실과 오해"는 제목 그대로 객체지향의 개념과, 사람들이 오해하는 포인트를 잡아서 설명하는 설명해주는 책이다. 나는 CS지식이 탄탄하지 않아서 평소 코딩을..
운영중인 앱에서 출석체크 이벤트를 도입하게 되었다. 출석체크 이벤트는 사용자들에게 매일 자정에 접속하여 출석체크를 하면 보상을 제공하는 간단한 메커니즘이다. 하지만... 예상했던 것 이상으로 수만 명의 사용자들로부터 동시에 들어오는 출석체크 요청의 폭풍에 직면했다. 동시성 문제 수만 명의 사용자들로부터 동시에 들어오는 요청을 처리하는 것은 결코 간단한 일이 아니었다. 서버의 자원은 한정되어 있고, 동시에 너무 많은 요청이 처리될 경우 데이터베이스 충돌, 성능 저하, 심지어는 서비스 다운에 이르기도 한다. 이는 단순히 기술적인 도전을 넘어, 우리 서비스의 안정성과 사용자의 신뢰성에 대한 문제였다. CloudWatch를 확인해보면 출석체크가 시작되는 밤 12시 (UTC 15:00)에 API 요청이 수만 건으..
간만에 해커톤 멘토링을 다녀오게 되어서 포스팅을 해보려 한다. 24.03.09 - 24.03.10 연대 X 숙대 ABC LIVING LAB HACKATHON 이번 해커톤은 리빙랩 해커톤이라서 메인 주제는 AI/Cloud/Bigdata를 이용해 지역사회의 문제를 해결하는 서비스를 개발해보는 것이다. 참여한 학생들은 AWS Cloud과정을 사전 교육으로 받았으며, 특히 이전 해커톤과 다르게 AWS Bedrock 이라는 서비스 활용을 권장했다. 나도 이번 기회에 처음 접해보게 되었다.. 간략하게 AWS Bedrock 이란 ? 다양한 고성능 파운데이션 모델을 단일 API를 통해 제공하는 완전관리형 서비스이다. 이 서비스를 활용하면, 사용자들은 AI 기반의 생성형 AI 애플리케이션을 쉽게 개발하고 확장할 수 있으..
AWS에서 서비스를 운영하다 보면, 서버의 상태를 실시간으로 파악하는 것이 얼마나 중요한지 잘 알게 될 것이다. 특히 웹 서버인 NGINX에서 발생하는 액세스 로그를 분석하고 모니터링하는 것은, 서비스의 성능을 유지하고 사용자 경험을 개선하는 데 필수적이다. 그런데 많은 사람들이 이런 중요한 데이터를 어떻게 효과적으로 수집하고 분석할 수 있는지에 대해 궁금해 하는데 여기서 AWS의 CloudWatch Logs가 빛을 발한다. CloudWatch Logs는 로그 데이터를 실시간으로 수집하고, 저장하며, 접근할 수 있게 해주는 서비스이다. 내가 서비스중인 앱에 최근에 유저가 5배 가량 확 증가하면서 사용자 경험을 개선하고, 서비스를 더욱 최적화하기 위해서 구축하기로 했다. 이제 AWS의 NGINX 액세스 로..