전체 글 썸네일형 리스트형 NestJS에서 build와 start는 각각 뭘 하는 걸까 pnpm run build를 치면 뭔가 돌아가고, pnpm run start를 하면 서버가 뜬다.매일 치는 명령어인데, 이 두 단계에서 정확히 뭐가 일어나는 건지 궁금해졌다. "컴파일타임 에러"랑 "런타임 에러"라는 말도 자주 듣는데 이것도 명확하게 하기 위해 함께 정리해본다.1. 컴파일타임 vs 런타임가장 기본적인 구분코드가 실행되기까지는 두 단계가 있다.컴파일타임(Compile-time) 은 코드가 "변환"되는 시점이다. 아직 프로그램이 실행되는 게 아니다. 소스 코드를 분석하고, 문법 오류를 체크하고, 다른 형태의 코드로 바꾸는 단계다.런타임(Runtime) 은 코드가 "실행"되는 시점이다. 실제로 메모리에 올라가서 동작한다. 변수에 값이 할당되고, 함수가 호출되고, API 요청이 날아간다.Nest.. 더보기 문자 발송API를 활용한 전화번호 인증 시스템 구현, 보안에 대한 고민 이번엔 알리고API(문자 발송 API)를 사용한 문자 인증 기능을 직접 구현하게 되었다. 1. 무엇을 인증하는가?기획적 관점: 전화번호 인증기술적 관점: 해당 사용자가 지금 그 전화번호를 가지고 있는지 확인2. 어떻게 인증하는가?사용자가 주장하는 휴대전화에 6자리 코드 발송한다.정해진 시간 내에 안에 코드(code 예시: 랜덤숫자6자리)를 입력하면 인증 완료그리고...- 어떤 API가 필요한가?- 데이터는 어떻게 저장할까?- 보안은 어떻게 처리할까?초기 생각: 굳이 DB 엔티티가 필요할까?const verificationMap = new Map();이러한 생각을 한 이유는인증 코드는 3분 후 사라지는 임시 데이터임.굳이 DB에 저장할 필요 있나?메모리가 더 빠르고 간단하지 않나?결론: DB 엔티티를 쓰자.. 더보기 [PK] uuid 와 auto increment중에 무엇을 선택할 것인가. 데이터베이스 설계를 하다 보면 누구나 한 번쯤은 마주하는 질문이 있다. "PK를 뭘로 할까?"PK를 뭘로 할까?" 단순해 보이는 이 선택이 실은 보안, 성능, 확장성, 개발 편의성 등 여러 측면에서 프로젝트 전체에 영향을 미치는 중요한 결정이었다. 이 글은 실제 프로젝트를 진행하며 겪은 시행착오와 그 과정에서 얻은 깨달음을 공유하고자 한다.PK(Primary Key, 기본) | 데이터베이스에서 테이블의 각 행(row)을 고유하게 식별하는 하나 이상의 컬럼을 의미한다.1. 고유성(Uniqueness): 중복 불가2. NOT NULL: 반드시 값 존재 3. 불변성: 한번 설정되면 변경 지양4. 인덱스 자동 생성: 검색 성능 향상@Entity('test_table') // 테이블명export class S.. 더보기 [Mac] MySQL Workbench CSV Import 한글 깨짐 안녕하세요 여러분 오래만간입니다. 개발하다 보면 데이터를 복사해서 그대로 옮겨야 하는 경우가 종종 있죠. 오늘은 dev 서버에 있는 테이블을 워크벤치로 쉽게 export 해볼게요. 문제 발생MySQL Workbench에서 한글이 포함된 CSV 파일을 export 했고, 로컬 DB에 import하려는데 이런 에러가 발생했습니다. Unhandled exception: 'ascii' codec can't decode byte 0xec in position 197: ordinal not in range(128)UTF-8로 저장했는데도 계속 같은 에러... 몇 시간을 삽질하다가 찾은 해결책은 놀랍게도 이거였습니다.해결 방법 bashopen /Applications/MySQLWorkbench.app네? 그냥 터미.. 더보기 데이터베이스에서 인덱스가 중요한 이유, NestJS에서의 활용 오늘은 데이터베이스 성능 최적화의 핵심인 '인덱스'에 대해 알아보고, NestJS 프로젝트에서 어떻게 활용할 수 있는지 함께 살펴보려고 합니다.인덱스란 무엇인가요?인덱스는 책의 색인과 정확히 같은 개념입니다. 두꺼운 책에서 특정 주제를 찾으려고 할 때, 처음부터 끝까지 모든 페이지를 넘기면서 찾나요? 아니죠! 책 뒤쪽의 색인 페이지를 보고 바로 원하는 페이지로 이동합니다. 데이터베이스 인덱스도 똑같은 역할을 합니다.인덱스가 없으면 어떻게 될까요? -- 인덱스 없이 사용자 찾기SELECT * FROM users WHERE email = 'user@example.com';만약 인덱스가 없다면, 데이터베이스는 테이블에 있는 모든 행을 하나씩 확인해야 합니다. 사용자가 10,000명이라면? 최악의 경우 10,0.. 더보기 세트별 점수 관리 API 구현과 리팩토링: 내 사고 과정과 결과 들어가며이번 글에서는 토너먼트 관리 시스템의 점수 처리 API를 개선한 과정에서 제가 어떻게 생각하고 결정을 내렸는지, 그리고 어떤 결과물을 만들었는지 솔직하게 공유합니다.초기 상황: 분리된 기능과 반복되는 API 호출처음 시스템을 만들 때는 "단순한 기능"에 초점을 맞춰 API를 설계했습니다.PUT /~/:matchId/score (점수 증가)DELETE /~/:matchId/score (점수 감소)이 설계의 기저에는 단순한 생각이 있었습니다:"점수를 올린다" → PUT 메서드"점수를 내린다" → DELETE 메서드코드는 다음과 같았습니다:export class UpdateScoreDto { @IsEnum(Team) team: Team;// A팀인지 B팀인지}@Put(':matchId/sco.. 더보기 MySQL autocommit 설정으로 인한 데이터베이스 문제 해결하기 MySQL autocommit 설정으로 인한 데이터베이스 문제 해결하기 autocommit이란?MySQL에서 autocommit은 SQL 문을 실행할 때 변경사항을 자동으로 데이터베이스에 영구적으로 저장(커밋)할지 여부를 결정하는 설정입니다. 쉽게 말해서:autocommit = 1 (활성화): 각 SQL 쿼리가 성공적으로 실행되면 즉시 데이터베이스에 반영됩니다. 별도의 COMMIT 명령어 없이도 변경사항이 바로 저장됩니다.autocommit = 0 (비활성화): 모든 변경사항은 명시적으로 COMMIT 명령을 실행할 때까지 임시 상태로 유지됩니다. COMMIT을 하기 전까지는 해당 세션에서만 변경사항이 보이고, 다른 세션에서는 변경 전 데이터가 보입니다.MySQL은 기본적으로 autocommit = 1로 .. 더보기 큐(Queue) 구현하기 class Queue { constructor() { this.queue = []; this.head = 0; this.tail = 0; } push(x) { this.queue[this.tail++] = x; } pop() { if (this.empty()) return -1; return this.queue[this.head++]; } size() { return this.tail - this.head; } empty() { return this.size() === 0 ? 1 : 0; } front() { return this.empty() ? -1 : this.queue[this.head]; } back() { return.. 더보기 이전 1 2 다음