목록Backend (22)
민프

서비스 이전이나 클라우드 통합 환경에서 데이터베이스 이전은 꼭 필요한 작업입니다. 이번 글에서는 NCP의 Cloud DB for MySQL에서 AWS RDS(MySQL)로 데이터를 안전하게 옮기는 방법을 mysqldump를 통해 정리해보겠습니다. 1. mysqldump란?mysqldump는 MySQL에서 제공하는 백업 도구입니다.DB의 구조(DDL) + 데이터(INSERT 쿼리) 를 .sql 텍스트 파일로 내보냅니다.다양한 옵션으로 데이터 필터링 및 설정 가능. 2. 데이터 이전 시 유의사항데이터 용량 확인 (수 GB 이상은 mydumper 등 고려)외래 키, 트리거, 사용자 권한 등은 별도 백업 필요대상 DB 버전이 호환되는지 확인 (NCP는 MySQL 8.0.40, RDS도 동일 버전 권장)인코딩/컬..

결론부터...결론부터 말씀드리자면 Redis는 “단순 캐시”가 아닙니다.복잡한 데이터를 빠르게 처리할 수 있는 실시간 인메모리 데이터베이스입니다.Salvatore가 겪은 문제는 오늘날 수많은 서비스들이 마주하는 문제이기도 하고, Redis는 그 해결책이 되어 왔습니다.1. Redis란?Redis는 빠른 오픈 소스 인 메모리 키 값 데이터 구조 스토어입니다. Redis는 다양한 인 메모리 데이터 구조 집합을 제공하므로 다양한 사용자 정의 애플리케이션을 손쉽게 생성할 수 있습니다. 주요 Redis 사용 사례로는 캐싱, 세션 관리, pub/sub 및 순위표를 들 수 있습니다. Redis는 현재 가장 인기 있는 키 값 스토어로서, BSD 라이선스가 있고, 최적화된 C 코드로 작성되었으며, 다양한 개발 언어를 지..

이번에 TIPS 2차 발표를 성공적으로 마치면서 결제 안정성에 대해 고민을 해보게 되었다. 이번 글에서는 실제 대규모 트래픽을 경험한 세 기업, 카카오페이, 토스와 마켓컬리가 어떻게 TPS 문제를 해결했는지를 살펴보고, 우리 시스템에 어떻게 적용할 수 있을지 정리해보자.1. TPS란 무엇일까?TPS (Transaction Per Second).'초당 처리할 수 있는 트랜잭션'서비스가 커질수록 이 숫자는 단순한 숫자를 넘어 비즈니스 신뢰성과 확장성의 기준이 된다.“우리 서비스 TPS는 얼마나 나오고 있을까?”“갑자기 몰려드는 사용자 요청에도 견딜 수 있을까?” 결론 - 핵심 비교 표구분Toss카카오페이마켓컬리주요 병목DB 조회 부하, 캐시 무결성DB CPU, 긴 트랜잭션, APM 누락데드락, I/O 병목,..

왜 트랜잭션 제어가 필요할까?NestJS로 서비스를 개발하다 보면, 여러 테이블에 걸친 데이터 변경을 수행해야 할 때가 많습니다. 이런 경우 트랜잭션(Transaction)은 데이터의 정합성과 무결성을 지키기 위한 필수 도구입니다.NestJS는 `TypeORM`을 기반으로 `queryRunner`를 통해 트랜잭션을 정교하게 제어할 수 있게 해줍니다.이 글에서는 `queryRunner`의 사용법과 함께, 실무에서 겪을 수 있는 문제와 최적의 활용 전략까지 자세히 다뤄보겠습니다.트랜잭션이 필요한 순간들트랜잭션이 필요한 순간들을 알아보기 전에간단하게 트랜잭션이란 무엇인지 알아보겠습니다.트랜잭션(Transaction)은 데이터베이스에서 하나의 작업 단위를 의미하는 개념입니다. 여러 개의 데이터 처리 작업이 하나..
처음 상품을 등록하는데, 등록되기 전까지는 product_id가 없다면?옵션이나 재료 등 연관 데이터가 product_id를 기준으로 저장돼야 하는 구조라면, 이 문제를 어떻게 풀어야 할까? 1. 문제 상황 요즘 SaaS 플랫폼이나 커머스 어드민 시스템을 만들다 보면, 상품을 등록하는 과정에서 아래와 같은 화면 구조를 자주 만나게 된다.상품 기본 정보 입력 (이름, 가격, 카테고리 등)옵션 그룹 추가재료 등록이미지 업로드그런데 문제는 이거다옵션, 재료, 이미지 등은 product_id가 있어야 DB에 저장할 수 있다.하지만 상품 등록은 마지막에 한 번만 한다. 이게 무슨 말이냐면, 아직 상품을 등록하지 않았기 때문에 product_id가 없고, 그렇다고 옵션/재료를 임시로 메모리에만 들고 있을 수도 없다..
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 파일로 쉽게..
요즘 프로젝트를 진행하면서 한 가지 중요한 DB 설계 포인트를 마주했다. 바로 “결제(Payments)와 주문(Orders)의 관계를 어떻게 정의할 것인가?” 였다. 처음엔 단순했다. 결제는 주문을 하나 처리하면 되겠지 싶었다. 하지만, 실제 비즈니스 요구사항이 점점 늘어나면서 단일 필드로 연결하는 방식의 한계를 절실히 느꼈다. 그래서 도입하게 된 게 바로 중간 테이블(Bridge Table, Mapping Table) 이다. 오늘은 그 이유와 실전 적용 과정을 실제 테이블 설계 예시를 통해 소개한다. 문제 정의 - 하나의 결제에 여러 주문?예시payments (table)- payment_id (PK)- order_id (FK) payments 테이블에서 order_id를 외래키로 직접 참조하는 방..

이번 포스팅에서는 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. 발신번..