목록전체 글 (338)
민프
NestJS에서 스케줄링이 필요한 이유? 백엔드를 개발하다 보면 “주기적으로 실행되어야 하는 작업”이 필요할 때가 많습니다. 예를 들어매 5분마다 결제되지 않은 주문 자동 취소매일 새벽 3시에 통계 집계매주 월요일 오전 9시에 이메일 발송정기적으로 캐시 정리이런 스케줄 작업을 Node.js에서 처리하려면 일반적으로 cron, setInterval, node-cron, bull, Agenda.js 등을 사용해 직접 구현해야 했습니다. 하지만 NestJS는 이런 개발자들의 니즈를 해결하기 위해, @nestjs/schedule이라는 공식 모듈을 제공합니다.NestJS Schedule이란? NestJS Schedule은 NestJS 기반 프로젝트에서 간편하게 크론(Cron) 작업과 반복 작업을 처리할 수 있게 ..

1. 왜 override 파일이 필요한가?보통 운영 환경(production)과 개발 환경(development)은 설정이 다릅니다.구분개발(dev)운영(prod)로그console.log 출력파일 저장DBlocal MySQL클라우드 RDSNODE_ENVdevelopmentproduction리빌드자주거의 없음docker-compose.override.yml는 docker-compose.yml의 설정을 자동으로 덮어씌우기 위한 개발자 전용 확장 설정입니다. 2. 작동 방식// 이렇게 하셔도 되지만docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d// 기본적으로 docker-compose.override.yml만 사용중이시라면 아..

1. 왜 docker-compose가 필요한가?단일 컨테이너 (예: Node.js 앱만 실행)는 docker run으로 충분합니다.하지만 실무에서는 보통 이런 구조입니다[Node.js 백엔드] ↔ [MySQL DB] ↔ [Redis] ↔ [Nginx]각각 다른 설정, 네트워크, 환경변수를 다 개별로 설정하려면 복잡하겠죠?docker-compose는 이런 복잡한 환경을 한 YAML 파일로 정의해서 한 번에 띄우고 관리할 수 있도록 해줍니다. 2. docker-compose가 해결하는 것기능설명여러 컨테이너를 하나로 묶음예: backend, db, redis 를 하나의 services: 아래 정의네트워크 자동 설정같은 프로젝트 내부 컨테이너끼리는 컨테이너 이름으로 접근 가능환경 변수 관리.env 파일로 쉽게..

1. LightGBM이란?LightGBM은 마이크로소프트에서 개발한 Gradient Boosting Decision Tree(GBDT) 기반의 머신러닝 프레임워크입니다.기존 GBDT의 단점인 느린 학습 속도와 높은 메모리 사용량을 극복하기 위해 만들어졌고, 대표적인 GBDT 구현체 중 하나인 XGBoost보다도 훨씬 빠르고 효율적입니다. 아래는 LightGBM의 공식 깃헙입니다.https://github.com/microsoft/LightGBM GitHub - microsoft/LightGBM: A fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework baA fast, distributed..

1. GBDT란? GBDT는 Gradient Boosting Decision Tree의 약자로, 여러 개의 결정 트리(Decision Tree)를 순차적으로 학습하여 예측 성능을 향상시키는 앙상블 기법입니다. 약한 학습기(weak learner)인 결정 트리를 하나씩 추가하면서, 이전 모델의 오차를 줄이기 위해 점점 더 나은 모델을 만드는 방식입니다. 2. GBDT는 언제 필요한가? 왜 필요한가?단일 Decision Tree의 한계는 아래와 같이 분명합니다.(Decision Tree 포스팅을 확인해주세요.)과적합 또는 과소적합일반화 성능 부족따라서 이 문제를 해결해주는 부스팅 Boosting 이라는 알고리즘을 사용합니다.여러 트리를 순차적으로 학습이전 모델이 틀린 부분을 다음 모델이 집중해서 학습최종적으..
요즘 프로젝트를 진행하면서 한 가지 중요한 DB 설계 포인트를 마주했다. 바로 “결제(Payments)와 주문(Orders)의 관계를 어떻게 정의할 것인가?” 였다. 처음엔 단순했다. 결제는 주문을 하나 처리하면 되겠지 싶었다. 하지만, 실제 비즈니스 요구사항이 점점 늘어나면서 단일 필드로 연결하는 방식의 한계를 절실히 느꼈다. 그래서 도입하게 된 게 바로 중간 테이블(Bridge Table, Mapping Table) 이다. 오늘은 그 이유와 실전 적용 과정을 실제 테이블 설계 예시를 통해 소개한다. 문제 정의 - 하나의 결제에 여러 주문?예시payments (table)- payment_id (PK)- order_id (FK) payments 테이블에서 order_id를 외래키로 직접 참조하는 방..

1. 사전 준비NCP - Server, VPC2. 공인 IP 설정Server에 적용 할 공인 IP를 생성합니다. 3. ACG 설정Server에 적용되어있는 ACG를 설정합니다.(각 포트 등..)4. Root 비밀번호 받기서버를 생성하면서 받은 pem키로 비밀번호를 받으면 됩니다.(서버 선택 -> 서버 관리 및 설정 변경 -> 관리자 비밀번호 확인) 5. VScode에서 서버 접근 (Remote-SSH)Host {서버 별명} HostName {포트포워딩에서 확인한 서버 접속용 공인 IP} Port {포트포워딩에서 확인한 서버 접속용 외부 포트} 접근 성공 6. Container Reistry 생성 방법6-1. Object Storage 이용 신청 및 버킷 생성6-2 Container Regi..

1. 서버 인스턴스 생성 (NCP 콘솔) 1-1. 서버 설정- Network interface는 추가만 눌러주면 된다. 1-2. Pubilc Subnet 생성- IP 주소 범위는 VPC IP 범위 안에서 사용해주면 된다.예를 들어서) VPC가 10.0.0.0/16이면 → 10.0.2.0/24 같이 지정(이미 DB에 10.0.1.0/24 같은 걸 썼다면 중복되지 않게!)- internet Gateway는 Public이니깐 Y 1-3. 스토리지 설정KVM의 mi1-g3(micro)서버의 기본스토리지는 CB타입으로 10GB까지 무료 제공됩니다. (10GB이상은 스토리지 비용이 발생합니다)이라고 나와있으니 여기에 맞게 설정해주겠습니다. 1-4. 인증키새롭게 인증키를 발급해서 잘 저장해둡시다.1-5. 네..

이번 포스팅에서는 Nestjs에서 NCP - Simple & Easy Notification Service 을 이용해서 SMS을 보내보도록 하겠습니다. 사전 준비 목록NAVER CLOUD Plaform 계정 생성결제 수단 등록 (마이페이지 -> 결제관리 -> 결제수단 -> 결제 수단 등록)인증키 관리 메뉴로 이동 후 신규 API 인증키 생성 버튼을 눌러 키를 발급 받는다. 1. VPC - Simple & Easy Notification Service - 프로젝트 생성https://console.ncloud.com/sens/project 위 링크에 접근하여 프로젝트 생성을 눌러서 프로젝트 생성을 해줍니다.저는 SMS, Biz Message둘 다 사용할 예정이라서 둘 다 체크하고 만들겠습니다. 2. 발신번..
1. 에러 메세지ERROR [ExceptionsHandler] Error: secretOrPrivateKey must have a value 2. 문제 정의JWT 토큰을 서명(sign)하려고 할 때, 필요한 secretOrPrivateKey가 존재하지 않아서 발생하는 오류이다. 3. 원인 분석env 파일에 JWT_SECRET 값이 정상적으로 불러오지 않았거나,JwtModule.registerAsync(...)에서 secret 값을 설정하지 않았거나,설정했지만 해당 모듈에서 제대로 로딩되지 않아서 발생한 문제이다.결정적으로 사용하는 곳(auth)에서 JwtModule.registerAsync를 등록해줘야하는데 app.module.ts에다 설정을 해놓고 auth.module.ts에는 설정해주지 않아서 문제가..