728x90

전체 글 171

Github Actions로 EC2 배포 자동화하기 (feat. NestJS, prisma)

이슈 발생사이드 프로젝트 배포를 수동으로 진행하고 있었다.코드 변경 사항이 발생한다면 EC2 인스턴스에 접속하여 git pull origin main으로 코드를 내려 받아서,npx prisma generate, npm run build를 실행하여 빌드하고, pm2로 restart 시켰다. 어느날 평소와 같이 변경 사항을 pull 받고, build를 실행하는데cpu 사용량이 100%에 도달하여 인스턴스가 먹통이 됐다.인스턴스를 재부팅해야 했다. 사용 중인 인스턴스 유형은 t2.micro인데, 비용 상 인스턴스 유형을 업그레이드 하고 싶지는 않았다. 결국 build는 다른 서버에서 하고,build 산출물을 EC2 인스턴스에 업로드하여 EC2에서는 서버 실행만 하는 것이 옳다고 판단했다.이를 Github Ac..

MySQL 복제(레플리카) 설정하기

복제란?복제는 한 서버에서 다른 서버로 데이터가 동기화되는 것을 말한다.소스(Source) 서버: 원본 데이터를 가진 서버레플리카(Replica) 서버: 복제된 데이터를 가지는 서버소스 서버에서 데이터 및 스키마에 대한 변경이 최초로 발생한다. 레플리카 서버에서는 이러한 변경 내역을 소스 서버로부터 전달 받아 자신이 가지고 있는 데이터에 반영함으로써 소스 서버에 저장된 데이터와 동기화 시킨다. 복제의 목적은 주로 다음 4가지이다.스케일 아웃(Scale-out)데이터 백업레플리카 서버를 데이터 분석용 서버로 사용데이터의 지리적 분산복제 아키텍처복제 아키텍처를 이해하기 위해서두 가지 로그를 알아두어야 한다.바이너리 로그(Binary Log): MySQL 서버에서 발생하는 모든 변경 사항을 순서대로 기록한다...

DataBase/MySQL 2025.07.20

TypeScript enum (VS as const)

개발 중 type을 명확히 하고,코드의 예측 가능성을 높이기 위해 enum을 자주 사용한다. TypeScript enum에 대해 자세히 알아보자. 개념enum(열거형)은 TypeScript가 제공하는 기능(문법) 중 하나다.enum으로 이름이 있는 상수들의 집합을 정의할 수 있다.enum을 사용하면 코드의 의도를 전달하기 용이하고,여러 값들을 하나로 묶어 그 집합의 의미를 전달하기 쉽다. enum에는 숫자 enum과 문자 enum이 있다. 숫자 열거형(Numeric enums)enum은 "enum" 키워를 사용해 정의한다.enum Direction { Up = 1, Down, Left, Right,} 위 코드에서 Up이 1로 초기화됐다.그 외 값은 초기화하지 않아도, 자동으로 1씩 증가된 값을 갖..

Node.js/TypeScript 2025.07.06

MySQL 콜레이션 (feat. 정렬, 비교)

회사 업무 중 MySQL5.7을 사용하던 당시 생성된 테이블과 이후 생성된 테이블의 COLLATION이 일치하지 않아,두 컬럼의 JOIN 시 에러가 발생하는 상황이 있었다. 둘 중 하나의 컬럼의 COLLATION을 명시적으로 변경하여야 JOIN이 가능했다. 이러한 이슈가 다시 발생하지 않도록 콜레이션에 대해 알아보자.콜레이션이란콜레이션은 문자열 컬럼의 값에 대한 비교나 정렬 순서를 위한 규칙을 의미한다.비교나 정렬 작업에서영어 대소문자를 같은 것으로 처리할지더 크거나 작은 것으로 판단할지에 대한 규칙을 정의하는 것이다. 따라서 각 문자열 컬럼의 값을 비교하거나 정렬할 때는문자 집합뿐 아니라 콜레이션의 일치 여부에 따라 결과가 달라지며쿼리의 성능 또한 상당한 영향을 받는다. 콜레이션의 특징하나의 문자 집합..

DataBase/MySQL 2025.06.22

ESLint, Prettier 알아보기

NestJS를 사용하면 eslint, prettier의 설정 파일을 자동으로 생성해주기 때문에깊이 생각하지 않고 사용하곤 했다. 그러나 두 기능의 설정을 조정하여 코드의 퀄리티를 높이고동료들과의 협업을 원할하게 할 수 있다. ESLint, Prettier에 대해 알아보자. PrettierPrettier(프리티어)는 코드 포매터(Code Formatter)로,코드의 스타일(모양)을 자동으로 정리해주는 도구이다.사람이 아닌 도구가 포맷팅을 맡도록 하여 개발자 간 코딩 스타일 충돌을 없애는 데 큰 도움을 준다. Prettier는JS, TS, CSS, HTML, JSON, YAML 등 다양한 언어를 지원한다.VsCode와 같은 코드 에디터와 연동하여 저장 시 자동으로 포맷팅 되게 할 수 있다.주로 ESLint와..

Node.js 2025.06.08

Docker ECR buildspec.yml 태그의 중요성

최근 ECR Docker 이미지를 사용해, code pipeline으로 배포 자동화해둔 서버에서상용 인스턴스 추가 시 테스트 도커 이미지를 사용될 수 있는 이슈가 발견됐다. 아래가 이슈가 있던 buildspec.yml 이다.( 참고로 이 buildspec은 아래와 같은 조건 하에서 사용된다. )코드파이프라인, 코드빌드, ECR, 빈스톡을 사용하여 배포할 때 사용ECR 리전과 코드빌드 리전이 동일해야 함코드빌드 환경변수에 DATABASE_URL 설정 필요Dockerfile 별도 작성 필요version: 0.2phases: pre_build: commands: - export AWS_ACCOUNT=$(aws sts get-caller-identity --query Account --outpu..

환경 2025.05.25

서버에 도메인을 연결하는 방법(2) (feat. AWS Route53)

서버에 도메인을 연결하는 방법(1)에서 도메인을 구매했다면,도메인이 어떻게 서버에 연결되는지 살펴보자. 레코드 유형나는 AWS Route53을 통해 도메인을 구매하고, 레코드를 생성했으므로,Route53을 예시로 들어 설명하겠다. 도메인을 구매하고 나면구매한 도메인 이름으로 호스팅 영역이 생성되고,해당 호스팅 영역으로 들어가면아래와 같이 NS, SOA 유형의 레코드가 생성되어 있다.NS (Name Server Record)NS 레코드 유형은 도메인을 관리하는 네임서버의 주소를 지정하는 것이다.값/트래픽 라우팅 대상에는 'ns-123.awsdns-45.net' 등의 값이 들어간다.Route 53은 도메인을 위해 전 세계에 분산된 수천 개의 네임서버 인프라를 운영 중이고,그 중에 내 도메인에 대해 담당 역할..

서버에 도메인을 부여하는 방법 (1)

도메인의 필요성사이드 프로젝트를 진행하며 앱 출시를 앞두게 되었다.처음 앱 출시 당시에는 사용자가 많지 않을 것으로 예상해 서버는 ec2 인스턴스 1대로 운영하기로 했다.테스트 과정에서는 aws에서 자동 생성해주는 ec2 도메인을 사용하여 통신했다. 그런데 앱 출시 후 트래픽이 늘어나면 인스턴스를 바꾸거나 늘리는 등의 스케일 조정이 필요할 것이고,그렇게 되면 ec2 자동 생성 도메인이 교체되어 이미 출시된 앱과의 통신이 어려워 진다. 추후 서버 스케일링을 위해 로드 밸런서 사용하기도메인 구매하기두 가지 방안을 고민했는데, 당장은 도메인을 구매하는 것이 더 비용적으로 저렴하고로드 밸런서를 사용하더라도 aws 자동 생성 도메인을 사용하면로드 밸런서를 교체할 때 인스턴스 교체와 마찬가지로 곤란하게 되므로도메인..

AWS SQS와 DLQ 사용법 - SQS에서 실패한 메시지를 다시 소비하는 방법

회사에서 운영하던 서비스의 리워드 지급 과정에서 대량으로 오류가 발생했다.리워드 지급 건들을 메시지 큐에 쌓고워커가 이를 처리하는 방식이었는데, 워커에서 지속적으로 메시지들이 처리 실패되어 결국 23만 건의 메시지가 DLQ에 쌓이게 되었다. 결국 데이터베이스 배치 작업으로 실패 건들을 처리했지만,SQS와 DLQ에 대해 잘 알고 있었다면 더 잘 대응할 수 있었을 것 같다. 메시지큐, SQS, DLQ에 대해 알아보자.메시지큐란?메시지 큐(Message Queue)란 서버, 마이크로 서비스 간에 비동기 방식으로데이터를 주고 받을 수 있도록 도와주는 시스템이다. 메시지 생성자 (프로듀서, Producer)와 메시지 소비자(컨슈머, Consumer)가 있을 때,메시지 생성자가 메시지를 큐에 쌓아 두면, 메시지 소..

환경 2025.03.17

Redis Pub/Sub 기능 사용하기 (feat. NestJS)

Publish-Subscribe 패턴Redis의 pub/sub을 살펴보기 전에 pub/sub이 어떤 기능인지부터 살펴보자. publish-subscribe (pub/sub)은메시지 발행자(publisher)는 특정 채널에 메시지를 보내고,해당 채널을 구독한 모든 구독자(subscriber)들은 그 메시지를 수신하는 방식이다.이는, 발행자가 구독자에게 직접 메시지를 보내는 일반적인 메시징 패턴과 구분된다.구독자가 없다면 메시지는 사라지고 복구되지 않는다. 이러한 구조는 발행자와 구독자가 서로를 알 필요 없이 독립적으로 동작할 수 있게 하여(decoupling),시스템의 확장성과 유연성을 높인다. Redis Pub/Sub"channel11" 과 "ch:00" 채널을 구독하려는 클라이언트는 아래와 같이 입력한..

DataBase/Redis 2025.03.02
728x90