분류 전체보기 49

NestJS에서 AsyncLocalStorage로 traceId 추적하기

한 요청에서 발생하는 모든 로그에 같은 식별자(traceId)를 주입하여 추적하고 싶다.처음엔 NestJS의 Request Scope로 풀었지만, 왜 결국 AsyncLocalStorage로 바꿨는지에 대해 기록한다.배경: 왜 traceId가 필요한가서버에서 한 번의 HTTP 요청이 처리되는 동안 여러 곳에서 로그가 찍힌다.미들웨어: "요청이 들어왔다"컨트롤러/서비스: "유저를 조회한다"레포지토리: "DB 쿼리를 날렸다"인터셉터: "응답을 보낸다 (XXms 걸림)"운영 중 장애가 났을 때, 우리가 보고 싶은 건 "이 요청 하나가 만들어낸 로그들" 이다. 다른 요청들의 로그와 뒤섞이면 디버깅이 불가능하다.그래서 요청이 들어오는 순간 식별자를 하나 발급하고, 그 요청 안에서 찍히는 모든 로그에 그 식별자를 박..

JavaScript 2026.05.23

Docker를 이용하여 EC2에 Node 서버 배포하기 (2)

이전 글에서는 아래 과정을 직접 수동으로 진행했다.Docker 이미지 빌드 -> ECR Push -> EC2 Pull -> docker run하지만 매번 직접 명령어를 입력하는 것은 번거로운 일이다. 이번 글에서는 GitHub Actions를 사용해서 Node 서버를 자동 배포하는 과정을 정리한다. 지난 글https://geonbbang.tistory.com/74 Docker를 이용하여 EC2에 Node 서버 배포하기 (1)Node 서버를 운영하다 보면 다음과 같은 문제들이 생길 수 있다.배포를 했더니 개발 환경과 운영 환경이 같지 않아서 문제가 발생한다.다른 개발자와의 개발 환경이 달라 충돌이 발생한다.가끔geonbbang.tistory.com 전체 흐름은 아래와 같다.GitHub Actions 실..

DevOps 2026.05.11

Docker를 이용하여 EC2에 Node 서버 배포하기 (1)

Node 서버를 운영하다 보면 다음과 같은 문제들이 생길 수 있다.배포를 했더니 개발 환경과 운영 환경이 같지 않아서 문제가 발생한다.다른 개발자와의 개발 환경이 달라 충돌이 발생한다.가끔 패키지 관련 문제로 인해 서버 실행이 안 된다.이 글에서는 이런 문제를 해결하기 위해Docker → ECR → EC2 흐름으로Node 서버를 배포하는 과정을 진행한다. 전체 흐름은 아래와 같다.Docker 이미지 빌드AWS ECR에 이미지 PushEC2에서 이미지 PullDocker로 컨테이너 실행Docker 이미지 빌드Docker 이미지를 빌드하기 위해서는 Dockerfile이란 이름을 가진 파일이 필요하다. 아래와 같은 Dockerfile을 작성한다. DockerfileFROM node:24-alpineWORK..

DevOps 2026.04.28

NestJS Custom Decorator로 유저 인증 처리하기

Nest는 TypeScript의 데코레이터를 기반으로 한 Custom 데코레이터를 더 쉽게 사용할 수 있도록 기능을 제공한다.이를 활용하면 비즈니스 로직과 관련 없는 부분을 숨기고, 공통 처리를 통해 중복 코드를 줄이며 재사용성을 높일 수 있다. 이번에는 @User() Custom 데코레이터를 생성하여, 필요한 컨트롤러에서 유저 정보를 간편하게 가져올 수 있도록 하겠다.  먼저, Custom decorator에 대한 이해를 돕기 위한 간단한 예제이다.이 예제는 Nest 공식 문서에서 확인할 수 있다.https://docs.nestjs.com/custom-decorators@Get()getProfile(@Req() req) { const user = req.user;}기존에는 사용자 정보를 필요로 하는 각..

JavaScript 2025.02.19

CloudWatch Logs와 Slack 통합: 에러 메시지 실시간 전송 설정

알람이 자주 울리면 처음에는 신경을 쓰다가도 점점 무뎌지기 마련이다. 중요하지 않은 알람이나 즉시 처리할 필요가 없는 알람이 계속 오면, 어느 순간 '또 알람이네' 하고 무심코 넘겨버리게 된다. 문제는 이 과정에서 정말 중요한 알람까지 놓칠 수 있다는 점이다. 이런 거짓 알람을 원천적으로 차단하는 것이 가장 좋은 해결책이지만, 현실적으로 모든 알람을 완벽하게 정리하기는 어렵다. 따라서, 알람이 왔을 때 내용을 바로 파악할 수 있도록 구성하는 것이 도움이 될 수 있다. 이를 위해 CloudWatch 구독 필터를 설정하고 Lambda를 활용해 Slack으로 오류 메시지를 전송하는 방식을 적용할 수 있다. 이를 통해 오류를 신속하게 파악하고, 즉각 대응이 필요한 크리티컬한 문제인지 빠르게 판단할 수 있다.  ..

DevOps 2024.12.25

TypeORM의 save() 사용 시 데이터 변경 감지 원리 이해하기

TypeORM의 Repository API를 사용하여 데이터를 변경하는 방법에는 update()와 save()등이 있다. update()update - Partially updates entity by a given update options or entity id.await repository.update({ age: 18 }, { category: "ADULT" })// executes UPDATE user SET category = ADULT WHERE age = 18await repository.update(1, { firstName: "Rizzrak" })// executes UPDATE user SET firstName = Rizzrak WHERE id = 1 save()save - Saves..

JavaScript 2024.12.15

Nest 프로젝트에 Pinpoint 적용

목록Java 설치HBase 설치Pinpoint Collector 설치Pinpoint Web 설치Pinpoint Node Agent 설치실행 및 Pinpoint Web 확인준비. EC2 설치1.Java 설치Java 8 설치sudo yum install java-1.8.0-openjdk -yJava 버전 확인java -versionJAVA_HOME 경로 설정echo 'export JAVA_HOME={Java 경로 입력}' >> ~/.bashrcecho 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc자바 경로는 sudo update-alternatives --config java 를 통해 확인할 수 있다. bin/java를 제외한 나머지가 경..

DevOps 2024.12.05

비관적 락 vs 낙관적 락

비행기 예약 서비스에서 두 사람이 동시에 같은 좌석을 예약한다거나, 온라인 쇼핑몰에서 수량이 1개 남은 상품을 두 사람이 동시에 결제하게 된다면 어떻게 될까? 이처럼 우리가 사용하는 서비스에서 빈번하게 마주할 수 있는 문제를 '동시성 문제'라고 한다. 이러한 상황이 발생하지 않도록 사전에 처리가 필요하다.동시성 제어를 위한 두 가지 접근법으로 비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock)이 있다. 비관적 락(Pessimistic Lock)비관적 락은 '충돌이 자주 발생할 것이다'라는 비관적인 가정에 기반한 제어 방식이다. 데이터에 잠금을 설정해서 다른 사용자가 같은 데이터에 접근할 수 없도록 차단하는 것이다. 원리1. 데이터를 읽거나 수정하기 전에 데이터에 락(Lo..

Database 2024.11.19

프로토타입

자바스크립트는 프로토타입 기반 언어이다. 프로토타입이란?자바스크립트에서는 모든 객체가 프로토타입을 가지고 있다. 프로토타입은 객체의 숨겨진 속성으로, 다른 객체로부터 상속받은 속성과 메서드를 포함하고 있다.  자바스크립트에서 생성자 함수를 new 연산자와 함께 호출하면 새로운 인스턴스가 생성된다. 이 때 인스턴스에는 __proto__라는 속성이 자동으로 부여되는데, 이 속성은 constructor의 prototype이라는 프로퍼티를 참조한다.function Person(name) { this.name = name;}Person.prototype.greet = function() { console.log(`Hello, my name is ${this.name}`);};const alice = n..

JavaScript 2024.05.22

this / 콜백 함수 / 클로저

this자바스크립트에서 상황별로 this가 어떻게 달라지는지 알아보자. 원칙 - this는 함수를 호출할 때(실행 컨텍스트가 생성될 때) 결정된다. - 전역 공간에서의 this전역 공간에서 this는 전역 객체를 가리킨다. 브라우저 환경에서는 window, Node 환경에서는 global이 전역 객체이다.  - 메서드로서 호출할 때 그 메서드 내부에서의 this어떤 함수를 호출할 때 그 함수 이름 앞에 객체가 명시돼 있는 경우에는 메서드로 호출한 것이고, 그렇지 않은 모든 경우는 함수로 호출한 것호출한 주체에 대한 정보가 this에 담긴다. 메서드로서 호출하는 경우 this는 함수명 앞의 객체이다.const obj = { name: 'Alice', greet: function() { ..

JavaScript 2024.05.20