JavaScript 7

NestJS에서 AsyncLocalStorage로 traceId 추적하기

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

JavaScript 2026.05.23

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

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

프로토타입

자바스크립트는 프로토타입 기반 언어이다. 프로토타입이란?자바스크립트에서는 모든 객체가 프로토타입을 가지고 있다. 프로토타입은 객체의 숨겨진 속성으로, 다른 객체로부터 상속받은 속성과 메서드를 포함하고 있다.  자바스크립트에서 생성자 함수를 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

자바스크립트의 실행 컨텍스트

실행 컨텍스트실행 컨텍스트는 자바스크립트가 코드를 실행할 때 제공하는 환경 정보를 모아놓은 객체이다. 함수를 호출할 때마다 새로운 실행 컨텍스트가 생성된다. 실행 컨텍스트의 구성 요소VariableEnvironment: 현재 컨텍스트 내의 식별자들에 대한 정보와 외부 환경 정보를 담고 있다LexicalEnvironment: VariableEnvironment와 같지만 변경 사항이 실시간으로 반영된다environmentRecord: 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장된다.outerEnvironmentReference: 외부 환경 정보를 참조한다ThisBinding: this 키워드가 참조하는 값을 담고 있다environmentRecord에는 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저..

JavaScript 2024.05.19

자바스크립트의 데이터 타입 이해

데이터 타입자바스크립트의 데이터 타입은 크게 두 가지로 나눌 수 있다. 기본형(Primitive)과 참조형(Reference)이다. 데이터 할당 원리자바스크립트에서는 변수 영역과 데이터 영역을 분리하여 저장한다. 변수 영역에는 변수의 이름과 해당 변수가 가리키는 데이터의 메모리 주소가 저장되고, 데이터 영역에는 실제 데이터가 저장된다. 이를 통해 데이터의 변환을 효율적으로 처리하고 중복된 데이터의 처리 효율을 높일 수 있다. var a = 'abcd'; 변수 영역주소1000...데이터a                      @2000             데이터 영역주소2000...데이터'abcd'   불변값과 가변값변수와 상수를 구분 짓는 변경 가능성의 대상은 변수 영역 메모리이다. 한 번 데이터 할당..

JavaScript 2024.05.17