카테고리 없음

패스트캠퍼스 환급챌린지 33일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기

Laftel 2025. 4. 6. 23:18
반응형

***본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다 
TypeORM은 Node.js와 브라우저에서 사용할 수 있는 객체 관계 매핑(ORM) 라이브러리입니다. TypeScript와 JavaScript(ES5 이상)를 모두 지원하며, 다음과 같은 주요 특징을 가지고 있습니다:

주요 특성

  1. 객체 지향 프로그래밍 지원
    • 데이터베이스 테이블을 클래스 형태로 정의하고 관리할 수 있습니다.
    • 엔티티(Entity) 개념을 사용하여 데이터베이스 구조를 객체 지향적으로 설계할 수 있습니다.
  2. 다양한 데이터베이스 지원
    • MySQL, PostgreSQL, MariaDB, SQLite, Oracle, MongoDB 등 여러 데이터베이스 시스템과 호환됩니다.
    • 데이터베이스별 쿼리 차이를 추상화하여 제공합니다.
  3. 디자인 패턴 지원
    • Active Record 패턴과 Data Mapper 패턴을 모두 지원합니다.
    • 개발자는 프로젝트 요구사항에 맞는 패턴을 선택할 수 있습니다.
  4. 마이그레이션 기능
    • 데이터베이스 스키마 변경을 관리할 수 있는 마이그레이션 도구를 내장하고 있습니다.
    • 점진적인 데이터베이스 구조 변경과 버전 관리를 지원합니다.
  5. 로딩 전략
    • Eager 로딩(즉시 로딩)과 Lazy 로딩(지연 로딩)을 모두 지원합니다.
    • 관계형 데이터를 효율적으로 로드할 수 있는 전략을 선택할 수 있습니다.
  6. 추가 기능
    • 트랜잭션 관리, 캐싱, 복제본 읽기 등 고급 데이터베이스 기능을 지원합니다.
    • CLI(Command Line Interface) 도구를 제공하여 개발 생산성을 높입니다.

TypeORM은 NestJS 프레임워크와 잘 통합되며, 대규모 애플리케이션 개발에 적합한 ORM 솔루션입니다.
 

TypeORM 컬럼(Column) 옵션 설명

주요 컬럼 옵션

  1. type: ColumnType
    • 데이터베이스 컬럼의 타입을 지정합니다.
    • 예: varchar, text, int, bool, date, json 
    • 예시: @Column({ type: 'varchar', length: 255 })
  2. name: string
    • 데이터베이스에 실제 저장될 컬럼 이름을 지정합니다.
    • 기본값은 프로퍼티(속성) 이름을 따릅니다.
    • 예시: @Column({ name: 'user_name' }) → 데이터베이스에는 'user_name'으로 저장
  3. nullable: boolean
    • NULL 값을 허용할지 여부를 결정합니다.
    • 기본값은 false(NULL 허용 안함)입니다.
    • 예시: @Column({ nullable: true }) → NULL 값 허용
  4. update: boolean
    • 해당 컬럼을 업데이트할 수 있는지 여부를 결정합니다.
    • 기본값은 true(업데이트 허용)입니다.
    • false로 설정하면 처음 저장 후 업데이트 불가능합니다.
    • 예시: @Column({ update: false }) → 생성 후 수정 불가
  5. select: boolean
    • 쿼리 실행 시 기본적으로 이 컬럼을 가져올지 여부를 결정합니다.
    • 기본값은 true(가져옴)입니다.
    • false로 설정하면 명시적으로 요청하지 않는 한 조회되지 않습니다.
    • 예시: @Column({ select: false }) → 기본 조회에서 제외
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    type: 'varchar',
    length: 100,
    name: 'full_name',
    nullable: false
  })
  name: string;

  @Column({
    type: 'text',
    select: false,
    update: false
  })
  password: string;
}
  1. default: string | (() => string)
    • 컬럼의 기본값을 설정합니다.
    • 정적 값이나 함수 형태로 제공할 수 있습니다.
    • 예시: @Column({ default: 'guest' }) 또는 @Column({ default: () => 'CURRENT_TIMESTAMP' })
  2. unique: boolean
    • 컬럼 값이 고유해야 하는지 여부를 지정합니다.
    • 기본값은 false입니다.
    • true로 설정하면 동일한 값을 가진 레코드가 존재할 수 없습니다.
    • 예시: @Column({ unique: true })
  3. comment: string
    • 컬럼에 설명을 추가합니다 (데이터베이스 스키마 주석).
    • 모든 데이터베이스에서 지원되지는 않습니다.
    • 예시: @Column({ comment: '사용자 활성 상태 여부' })
  4. enum: string[] | AnyEnum
    • 컬럼에 입력 가능한 값들을 열거형(enum)으로 제한합니다.
    • 문자열 배열이나 TypeScript enum을 사용할 수 있습니다.
@Column({ enum: ['admin', 'user', 'guest'] })
role: string;

// 또는
enum UserRole { ADMIN = 'admin', USER = 'user' }
@Column({ enum: UserRole })
role: UserRole;

array: boolean

  • 컬럼을 배열 타입으로 생성합니다 (PostgreSQL 등에서 지원).
  • 기본값은 false입니다.
  • 예시: @Column('int', { array: true }) → int[] 타입으로 생성
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

enum UserStatus {
  ACTIVE = 'active',
  INACTIVE = 'inactive',
  BANNED = 'banned'
}

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    unique: true,
    comment: '사용자 이메일 (로그인 ID)'
  })
  email: string;

  @Column({
    type: 'enum',
    enum: UserStatus,
    default: UserStatus.ACTIVE
  })
  status: UserStatus;

  @Column('text', { array: true, default: [] })
  tags: string[];
}

이 예제에서:

  • email 필드는 고유해야 하며 주석이 추가되었습니다.
  • status 필드는 미리 정의된 enum 값만 허용하며 기본값이 설정되었습니다.
  • tags 필드는 문자열 배열로 정의되었습니다.

주요 특수 컬럼 데코레이터

  1. @CreateDateColumn()
    • 레코드가 생성된 날짜와 시간을 자동으로 저장합니다.
    • 엔티티가 처음 저장될 때 현재 시간이 설정됩니다.
    • 예시: createdAt: Date 필드에 사용
  2. @UpdateDateColumn()
    • 레코드가 마지막으로 업데이트된 날짜와 시간을 자동으로 저장합니다.
    • 엔티티가 업데이트될 때마다 현재 시간으로 갱신됩니다.
    • 예시: updatedAt: Date 필드에 사용
  3. @DeleteDateColumn()
    • 소프트 삭제(Soft Delete)가 발생한 날짜와 시간을 저장합니다.
    • 실제 삭제 대신 삭제 시간을 기록하는 방식으로 사용됩니다.
    • @DeleteDateColumn()이 있는 엔티티는 기본 조회 시 삭제된 레코드가 필터링됩니다.
    • 예시: deletedAt: Date 필드에 사용
  4. @VersionColumn()
    • 레코드의 버전 번호를 자동으로 관리합니다.
    • 엔티티가 업데이트될 때마다 값이 1씩 증가합니다.
    • 낙관적 잠금(Optimistic Locking) 구현에 사용됩니다.
    • 예시: version: number 필드에 사용

사용 예제

typescript
Copy
import { 
  Entity, 
  PrimaryGeneratedColumn, 
  CreateDateColumn, 
  UpdateDateColumn,
  DeleteDateColumn,
  VersionColumn 
} from 'typeorm';

@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @CreateDateColumn()
    createdAt: Date;  // 생성일자 (자동 설정)

    @UpdateDateColumn()
    updatedAt: Date;  // 수정일자 (자동 갱신)

    @DeleteDateColumn()
    deletedAt: Date;  // 삭제일자 (소프트 삭제 시 설정)

    @VersionColumn()
    version: number;  // 버전 정보 (업데이트 시 자동 증가)
}

주요 특징

  • 자동 관리: 이 데코레이터들이 적용된 필드는 TypeORM이 자동으로 관리하므로 개발자가 수동으로 값을 설정할 필요가 없습니다.
  • 소프트 삭제: @DeleteDateColumn()을 사용하면 실제 데이터 삭제 대신 삭제 시간을 기록함으로써 데이터 복구가 가능합니다.
  • 충돌 방지: @VersionColumn()은 동시성 제어를 위해 사용되며, 동시 수정 시 충돌을 감지할 수 있습니다.
  • 타임스탬프: 생성/수정 시간은 일반적으로 데이터 감사(audit) 목적으로 활용됩니다.

이러한 특수 컬럼들은 실제 애플리케이션 개발에서 매우 유용하게 사용되며, 특히 생성일자/수정일자 추적은 거의 모든 엔티티에 적용되는 경우가 많습니다.


#패스트캠퍼스 #직장인자기계발 #직장인공부 #환급챌린지 #패스트캠퍼스후기 #오공완https://bit.ly/4hTSJNB

반응형