2025-08-09 NestJS + TypeORM DB 연동

1. 오늘 한 것 (What I Did)

  • NestJS와 TypeORM을 사용해서 MySQL 데이터베이스 연동
  • User Entity 생성 및 기본 CRUD 준비

1-1. 실제 진행한 작업들

1단계: 환경 설정

npm install typeorm @nestjs/typeorm mysql2
npm install typeorm-naming-strategies

2단계: DB 연결 설정 파일 생성

  • typeorm.config.ts 파일 생성
  • MySQL 연결 정보 설정 (host, port, username, password, database)

3단계: User Entity 생성

  • nest g res users 명령어로 기본 구조 자동 생성
  • src/users/entities/user.entity.ts에 User Entity 구현
  • 데코레이터 사용: @Entity, @PrimaryGeneratedColumn, @Column, @CreateDateColumn, @UpdateDateColumn

4단계: Snake Case 문제 해결

  • typeorm-naming-strategies 라이브러리 설치
  • Entity에서 camelCase 사용, DB에서는 snake_case로 자동 변환되도록 설정

5단계: 모듈 연동

  • app.module.ts에 TypeORM 모듈과 UsersModule 등록
  • users.module.ts에 User Entity 등록

2. 새로 이해한 것 (What I Learned)

2-1. NestJS 모듈 시스템의 역할

app.module.ts = 집의 설계도

  • imports: 사용할 모듈들 등록 (방들을 집에 배치)
  • controllers: API 엔드포인트 처리 (현관문)
  • providers: 서비스들 (기본 인프라)

모듈 시스템의 장점:

  • 역할 분담으로 코드 관리 용이
  • 재사용성과 독립적 테스트 가능

2-2. 데코레이터(Decorator)의 개념

데코레이터 = 클래스나 메서드에 붙이는 "설명서"

@Entity('user')  // "이 클래스는 user 테이블이야!"
export class User {
    @PrimaryGeneratedColumn()  // "자동 증가하는 기본키야!"
    id: number;
    
    @Column()  // "일반 테이블 컬럼이야!"
    email: string;
}

각 데코레이터의 역할:

  • @Entity(): 테이블과 클래스 연결
  • @PrimaryGeneratedColumn(): AUTO_INCREMENT PRIMARY KEY
  • @Column(): 일반 컬럼 매핑
  • @CreateDateColumn(): 생성 시간 자동 기록
  • @UpdateDateColumn(): 수정 시간 자동 갱신

2-3. TypeOrmModule의 역할

TypeOrmModule = NestJS와 TypeORM 사이의 통역사

// app.module.ts - 전체 앱 DB 설정
TypeOrmModule.forRoot(typeORMConfig)

// users.module.ts - 특정 모듈에서 Entity 사용 설정
TypeOrmModule.forFeature([User])

2-4. Snake Case vs CamelCase 변환

문제: DB는 provider_id, JavaScript는 providerId

해결: SnakeNamingStrategy로 자동 변환

  • 코드에서는 camelCase로 편하게 작성
  • DB에는 snake_case로 자동 저장

2-5. Entity와 실제 데이터 생성 시점

중요한 깨달음:

const newUser = new User();  // 메모리에만 객체 생성 (id = undefined)
const saved = await repository.save(newUser);  // DB 저장 시점에 id 생성!

3. 실수했던 부분들 (What I Struggled With)

3-1. 오타와 실수들

패키지명 오타

# 잘못: tyeorm
npm install typeorm @nestjs/tyeorm mysql2

# 올바름: typeorm
npm install typeorm @nestjs/typeorm mysql2

Entity 작성 시 실수들

  • profile_image 필드 중복 작성
  • Date 타입을 date로 소문자 작성
  • nullable 옵션 누락

4. 여전히 잘 모르겠는 부분

NestJS...넌 뭐냐...? 

  • 애플리케이션이 시작될 때 모듈들이 어떤 순서로 동작하는지
  • 데코레이터들이 언제 실행되는지
  • synchronize: true가 언제 동작하는지? - 왜 필요한지는 얼추 이해 했는데...... 

데코레이터 개념이 생소함

  • 처음 보는 @ 문법에 당황
  • 각 데코레이터가 실제로 무엇을 하는지 불분명했음

모듈 시스템 복잡함

  • 왜 이렇게 많은 파일로 나누는지 이해 어려웠음
  • import/export 관계가 복잡하게 느껴짐

파일 위치와 구조

  • 어떤 파일을 어디에 만들어야 하는지 헷갈림
  • 프로젝트 구조 전체가 낯설음

 

'TIL' 카테고리의 다른 글

2025-08-11 NestJS API 테스트 및 문제 해결  (3) 2025.08.11
2025-08-10 NestJS UsersService CRUD 구현 및 DTO 작성  (2) 2025.08.11
2025-08-06  (6) 2025.08.10
2025-08-03  (10) 2025.08.03
2025-07-31  (5) 2025.07.31