반응형

분류 전체보기 271

[REST API] 2편. API 서버 아키텍처 설계하기 : 프로젝트 구조, ER 설계, Prisma 모델링

2편. API 서버 아키텍처 설계하기 : 프로젝트 구조, ER 설계, Prisma 모델링 📚 목차1. 공통 개발 환경과 서비스 분리형 모노레포 구조 설계2. 게시판 DB 설계 : ER 모델링3. Prisma 스키마 및 인덱스 설계4. Fastify + Prisma 기반 계층형 모듈 아키텍처 구성5. 초기화 및 운영 명령어 정리 📂 [GitHub 코드 보러가기] : https://github.com/cericube/nodejs-practice-lab/tree/main/fastify-api-rest 1. 공통 개발 환경과 서비스 분리형 모노레포 구조 설계프로젝트를 단일 Node 프로젝트가 아닌, 계층형 구조의 이중 Node 프로젝트로 구성합니다.nodejs-tutorials/ (공통 설정 레..

[REST API] 1편. Fastify 구조 및 요청 생명주기 이해하기

1편. Fastify 구조 및 요청 생명주기 이해하기 📚 목차1. 가장 단순한 Fastify 서버 (Hello World)2. 요청 생명주기 (Lifecycle Hooks)3. 스키마 기반 검증 (Schema-first) : preValidation 단계에서 수행4. 플러그인 시스템과 register의 두 가지 목적5. 실무용 구조: 라우트 분리 및 app/server 관리6. 전역 에러 핸들링 및 파일 로깅 📂 [GitHub 코드 보러가기] : https://github.com/cericube/nodejs-practice-lab/tree/main/fastify-api-rest1. 가장 단순한 Fastify 서버 (Hello World)Fastify는 Node.js를 위한 초고속 웹 프레임워크로, 낮..

[TypeBox] 4편. Fastify에서 null,undefined,optional의 계층별 처리 예시

4편. Fastify에서 null,undefined,optional의 계층별 처리 예시 📚 목차1. null · optional · undefined의 계층별 의미2. 컴파일 타임에서 의도 강제하기3. 입력 설계 (DTO): TypeBox로 의도 표현하기4. 입력 데이터 정제 예시 (Input Mapping)5. Repository 계층의 정밀한 쿼리 설계 예시6. 응답 변환 및 데이터 매핑 예시 (Output Mapping & DTO) 1. null · optional · undefined의 계층별 의미실무에서 가장 자주 발생하는 데이터 오류 중 하나는 ‘값이 없는 상태’를 하나의 개념으로 단순화해 버리는 것에서 시작됩니다.그러나 안정적인 시스템을 설계하려면 null, optional, undefin..

[TypeBox] 3편. Fastify TypeBox(legacy) 스키마 패턴 모음

3편. Fastify TypeBox(legacy) 스키마 패턴 모음 📚 목차1. 기본 CRUD & 유효성 검증 패턴 (Validation)2. 고급 타입 & 재사용 패턴3. 파일 업로드 & 다운로드 (Multipart & Stream)4. 응답 표준화 & 전역 스키마 등록 1. 기본 CRUD & 유효성 검증 패턴 (Validation)🔷회원가입 & 로그인 (보안 및 교차 검증)회원가입 시 비밀번호 확인 필드나, 특정 조건에 따른 필드 필수화는 실무에서 자주 발생합니다.import { Type, Static } from '@sinclair/typebox';/** * 회원가입 스키마: 사용자로부터 입력받는 값들의 형식을 정의합니다. */export const UserRegistrationSchema =..

[TypeBox] 2편. Fastify를 위한 TypeBox(legacy) 기본 문법 이해하기

2편. Fastify를 위한 TypeBox(legacy) 기본 문법 이해하기 📚 목차1. 기본 타입과 Object 스키마2. 선택 필드와 컬렉션 (Optional & Collections) 타입3. 조합 타입 (Union, Literal, Enum, Nullable)4. 스키마 유틸리티 (Partial, Pick, Omit)5. TypeScript 타입 추출 (Static) 1. 기본 타입과 Object 스키마가장 기본이 되는 Primitive 타입과 데이터의 뼈대가 되는 Object 구조를 정의합니다. 🔷 1. 기본 타입 정의 및 제약 조건TypeBox는 JSON Schema의 표준 타입을 제공하며, 두 번째 인자로 상세한 유효성 옵션을 전달할 수 있습니다.이 옵션들은 Fastify의 Ajv 엔진..

[TypeBox] 1편. Fastify에서 TypeBox를 사용하는 이유와 적용 방법

[TypeBox] 1편. Fastify에서 TypeBox를 사용하는 이유와 적용 방법 📚 목차1. Fastify에서 Schema가 필요한 이유2. TypeBox의 역할과 동작 원리3. Fastify에서 TypeBox 사용을 위한 기본 설정4. 코드 연결하기: TypeBox 적용 예시 1. Fastify에서 Schema가 필요한 이유 🔷 Fastify에서 Schema의 역할Fastify는 Schema 기반 프레임워크입니다.Route를 정의할 때 Request와 Response 구조를 Schema로 명시할 수 있으며, 이 Schema는 다음과 같은 역할을 수행합니다. 스키마를 통해 얻을 수 있는 주요 이점은 다음과 같습니다:▸ 데이터 검증 (Validation):서버로 들어오는 요청 데이터가 올바른 형식..

[Vitest] 8편. Vitest + V8 기반 테스트 커버리지 : @vitest/coverage-v8

8편. Vitest + V8 기반 테스트 커버리지 : @vitest/coverage-v8 📚 목차1. 테스트 커버리지는 왜 중요한가?2. Vitest에서 커버리지 활성화하기: @vitest/coverage-v8 설정3. 커버리지 리포트 실습 및 예제4. 커버리지 리포트 확인 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /vitest 1. 테스트 커버리지는 왜 중요한가?1. 테스트 커버리지란?테스트 커버리지(Test Coverage)는 전체 애플리케이션 코드 중 테스트로 실행된 코드의 비율을 의미합니다.즉, 작성된 테스트 코드가 실제 애플리케이션의 어느 부분까지 영향을 미치고 있는지를 정량적으로 측정하는 지표입니다. 2. 주..

[Vitest] 7편. Vitest Mocking 이해하기 : vi.mock()과 vi.fn()

7편. Vitest Mocking 이해하기 : vi.mock()과 vi.fn() 📚 목차1. Mocking, 왜 필요할까?2. vi.fn(): 스파이와 가짜 함수 (The Spy)3. vi.mock(): 모듈 통째로 갈아끼우기 (The Replacement)4. Mock 초기화와 관리 (Clean up) 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /vitest 1. Mocking, 왜 필요할까?모킹은 실제 객체나 모듈을 '가짜(Mock)'로 대체하여, 테스트하려는 코드만 고립시켜 검증하는 기술입니다. ① 외부 의존성으로부터의 고립 (Isolation)우리가 작성한 함수가 내부적으로 데이터베이스(DB)에 접속하거나, 외부..

CQRS 개념과 Read-Your-Own-Writes 해결 전략

CQRS 개념과 Read-Your-Own-Writes 해결 전략 1. CQRS란 무엇인가 - CRUD와 무엇이 다른가CQRS(Command Query Responsibility Segregation)는 시스템에서 데이터를 변경하는 작업(Command) 과 데이터를 조회하는 작업(Query)의 책임을 분리하는 아키텍처 패턴입니다. 일반적인 CRUD 구조에서는 하나의 모델이 생성(Create), 조회(Read), 수정(Update), 삭제(Delete)를 모두 담당합니다.초기에는 구현이 단순하고 이해하기 쉽지만, 서비스 규모가 커질수록 몇 가지 어려움이 나타날 수 있습니다 예를 들어 다음과 같은 상황을 생각해 볼 수 있습니다.▸ 읽기 요청이 쓰기 요청보다 훨씬 많아집니다.▸ 목록, 통계, 검색 등 조회 요..

[Vitest] 6편. MSW(Mock Service Worker) + Vitest 실무 API 테스트

6편. MSW(Mock Service Worker) + Vitest 실무 API 테스트 📚 목차1. 테스트에서 네트워크 흐름을 제어하는 MSW의 역할2. Vitest 환경에 MSW 설치 및 설정3. 핸들러 설계: 외부 API 응답 코드 구현 예시4. Fastify 서버와 함께하는 End-to-End 통합 테스트 예시 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /vitest 1. 테스트에서 네트워크 흐름을 제어하는 MSW의 역할MSW(Mock Service Worker)는 이름 때문에 흔히 "가짜 API 서버를 띄워주는 도구"로 오해받곤 합니다.하지만 MSW의 본질은 서버 구현이 아니라, 네트워크 요청을 가로채(Interc..

[Vitest] 5편. Vitest로 외부 API 테스트하기: axios, undici

5편. Vitest로 외부 API 테스트하기: axios, undici 📚 목차1. 외부 API 테스트 실습 준비2. Axios vs Undici3. Axios를 이용한 테스트 (생산성 중심)4. Undici를 이용한 테스트 (성능 및 표준 중심) 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /vitest 1. 외부 API 테스트 실습 준비1. Fasticy 실습용 서버 구현하기import Fastify from 'fastify';import { testRoutes } from './routes/test.routes';const app = Fastify({ logger: true,});app.register(testRo..

[Prisma7] 10편. 쿼리 실패 후 Pool에서 Connection이 제거되는 이유

10편. Prisma 쿼리 실패 후 Pool에서 Connection이 제거되는 이유 📚 목차1. 문제 맥락: 왜 CREATE 실패 시 Connection 이 바로 제거될까?2. pg Pool 내부: _release() 로 보는 Connection 생명주기3. Prisma 7 + PostgreSQL Adapter에서 Pool 사용 구조4. Prisma · Pool · pg-adapter 로깅 코드 예시 1. 문제 맥락: 왜 CREATE 실패 시 Connection 이 바로 제거될까?실제 서비스를 구현하고 테스트하는 과정에서 다음과 같은 패턴을 관찰할 수 있습니다. 일반적으로 connection pool을 사용하는 경우, 쿼리 실행이 완료되면 사용하던 connection은 pool로 반환되어 재사용된다고 ..

[Prisma7] 9편. Node.js + Prisma 에러 종류 및 처리 방법

9편. Node.js + Prisma 에러 종류 및 처리 방법 📚 목차1. Prisma 에러 분류 체계2. 실무에서 가장 많이 발생하는 Prisma 에러 코드 이해하기3. Prisma 에러를 HTTP 에러로 변환하는 예시4. Fastify 레이어별 에러 처리 예시 1. Prisma 에러 분류 체계Prisma는 단순한 ORM이 아니라 DB 접근을 추상화한 클라이언트 레이어입니다.따라서 Prisma에서 발생하는 에러는 대부분 DB 레벨의 문제를 개발자에게 전달한 것에 가깝습니다.즉, Prisma 에러는 그대로 사용자에게 전달할 대상이 아니라, 애플리케이션 레벨의 에러로 변환되어야 하는 신호(signal)라고 이해하는 것이 중요합니다. Prisma에서 발생하는 에러는 크게 네 가지로 분류됩니다분류클래스설명..

[Vitest] 4편. Vitest로 Web API 테스트하기: Fastify inject() 활용법

4편. Vitest로 Web API 테스트하기: Fastify inject() 활용법 📚 목차1. Fastify(5.6) + Vitest 기본 구조 이해하기2. 다양한 입력 유형 테스트 예시: Query, Path, Body, Header3. 인증/인가 API 테스트 예시4. 에러 응답 및 예외 상황 테스트 예시 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /vitest 1. Fastify(5.6) + Vitest 기본 구조 이해하기 1. Fastify 설치# 1. 경로 이동cd /nodejs-tutorials/vitest# 2. fastify 설치npm install fastify# 3. 설치 확인/nodejs-tuto..

[Vitest] 3편. Vitest의 Lifecycle · Async · Execution Control API

3편. Vitest의 Lifecycle · Async · Execution Control API 📚 목차1. Lifecycle Hook API2. 비동기 테스트 패턴(async/await)3. 테스트 실행 제어 API4. 테스트 컨텍스트(Test Context) API 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /vitest 1. Lifecycle Hook APILifecycle Hook은 테스트 실행 전후에 특정 작업을 수행하기 위한 API입니다.서버 기동, DB 초기화, Mock 초기화 등 실무에서 매우 자주 사용됩니다. 1. 라이프사이클 실행 순서 시각화🔸 beforeAll / afterAll - 테스트 파..

[Vitest] 2편. Vitest 테스트 구조 설계와 Assertion, Matcher 이해하기

2편. Vitest 테스트 구조 설계와 Assertion, Matcher 이해하기 📚 목차1. 테스트 선언 API : 테스트 구조 설계 이해하기2. Assertion 진입점 API - expect() 이해하기3. 주요 Matcher API 이해하기 - 값, 구조, 행위 검증 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /vitest 1. 테스트 선언 API : 테스트 구조 설계 이해하기 🔷 테스트 계층 구조 : describe와 it(test)테스트는 크게 그룹(Context)과 사례(Case)로 나뉩니다. 1) describe관련된 테스트 케이스들을 하나의 논리적 그룹으로 묶습니다.테스트 대상의 범위(Context)를..

[Vitest] 1편. Vitest 4로 Node.js 테스트 환경 구축하기

1편. Vitest 4로 Node.js 테스트 환경 구축하기 📚 목차1. Vitest 개요와 실습 환경 이해2. 프로젝트 기본 환경 구성3. Vitest 설치 및 기본 설정4. 첫 테스트 작성 및 실행 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /vitest 1. Vitest 개요와 실습 환경 이해Vitest는 Vite 생태계를 중심으로 탄생한 차세대 테스트 러너입니다.Vite는 Native ES Module(ESM)을 기반으로 매우 빠른 개발 경험을 제공하며, 초기에는 프론트엔드 중심 도구로 출발했지만 현재는 Node.js 백엔드 영역까지 빠르게 확장되고 있습니다. 🔷 Vitest의 핵심 특징1. 빠른 실행 속도Vi..

[Prisma7] 8편. Prisma 데이터베이스 동기화(Migration & Sync)실습 : 개발 → 운영

8편. Prisma 데이터베이스 동기화(Migration & Sync) 실습 : 개발 → 운영 📚 목차1. Prisma에서 DB 동기화의 핵심 개념2. 개발용 초기 DB 구축 (migrate dev)3. 개발 DB 스키마 변경 관리 방법4. 환경 변수 기반의 안전한 연결 관리와 자동 배포 프로세스 1. Prisma에서 DB 동기화의 핵심 개념Prisma에서 데이터베이스 동기화를 올바르게 이해하려면,“명령어별 역할 분리”와 함께 “schema → migration → DB → Client”의 흐름을 정확히 구분해야 합니다. 🔷 Prisma DB 동기화 명령어 역할 정리명령어환경역할migrate dev개발schema.prisma 변경 사항을 기반으로 마이그레이션 생성 → 개발 DB 반영※ Prisma ..

[Prisma7] 7편. Prisma 트랜잭션과 데이터 정합성: 실무 설계와 구현

7편. Prisma 트랜잭션과 데이터 정합성: 실무 설계와 구현 📚 목차1. 트랜잭션의 역할과 데이터 정합성 전략2. Prisma 트랜잭션의 종류와 사용 시점3. 트랜잭션 고급 제어 옵션과 성능 최적화 전략4. 트랜잭션 기반 다중 CRUD 처리 실습 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /Prisma 1. 트랜잭션의 역할과 데이터 정합성 전략트랜잭션(Transaction)은 여러 개의 데이터베이스 작업을 하나의 논리적 작업 단위로 묶어 처리하는 메커니즘입니다.즉, 다음 조건을 보장합니다.▸ 모두 성공하면 전부 반영(Commit)▸ 하나라도 실패하면 전부 취소(Rollback) 관계형 데이터베이스(PostgreSQL..

[Prisma7] 6편. Prisma로 해결되지 않는 쿼리 다루기: Raw SQL 실전 활용

6편. Prisma로 해결되지 않는 쿼리 다루기: Raw SQL 실전 활용 📚 목차1. $queryRaw: 조회 전용 Raw SQL 다루기2. $executeRaw: 데이터 변경 및 DDL 쿼리 실행하기3. Prisma Raw SQL 보안 : SQL Injection 방지 원리4. Prisma.sql: 유연하고 안전한 동적 쿼리 조립 📂 [GitHub 예시 코드 보러가기] (https://github.com/cericube/nodejs-tutorials) /Prisma 1. $queryRaw: 조회 전용 Raw SQL 다루기Prisma Client는 훌륭한 쿼리 빌더를 제공하지만, 때로는 복잡한 통계, Window Function, 혹은 DB 전용 기능을 사용하기 위해 생생한 SQL(Raw SQL)..

반응형