카테고리 없음
패스트캠퍼스 환급챌린지 33일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기
Laftel
2025. 4. 6. 23:18
반응형
***본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다
TypeORM은 Node.js와 브라우저에서 사용할 수 있는 객체 관계 매핑(ORM) 라이브러리입니다. TypeScript와 JavaScript(ES5 이상)를 모두 지원하며, 다음과 같은 주요 특징을 가지고 있습니다:
주요 특성
- 객체 지향 프로그래밍 지원
- 데이터베이스 테이블을 클래스 형태로 정의하고 관리할 수 있습니다.
- 엔티티(Entity) 개념을 사용하여 데이터베이스 구조를 객체 지향적으로 설계할 수 있습니다.
- 다양한 데이터베이스 지원
- MySQL, PostgreSQL, MariaDB, SQLite, Oracle, MongoDB 등 여러 데이터베이스 시스템과 호환됩니다.
- 데이터베이스별 쿼리 차이를 추상화하여 제공합니다.
- 디자인 패턴 지원
- Active Record 패턴과 Data Mapper 패턴을 모두 지원합니다.
- 개발자는 프로젝트 요구사항에 맞는 패턴을 선택할 수 있습니다.
- 마이그레이션 기능
- 데이터베이스 스키마 변경을 관리할 수 있는 마이그레이션 도구를 내장하고 있습니다.
- 점진적인 데이터베이스 구조 변경과 버전 관리를 지원합니다.
- 로딩 전략
- Eager 로딩(즉시 로딩)과 Lazy 로딩(지연 로딩)을 모두 지원합니다.
- 관계형 데이터를 효율적으로 로드할 수 있는 전략을 선택할 수 있습니다.
- 추가 기능
- 트랜잭션 관리, 캐싱, 복제본 읽기 등 고급 데이터베이스 기능을 지원합니다.
- CLI(Command Line Interface) 도구를 제공하여 개발 생산성을 높입니다.
TypeORM은 NestJS 프레임워크와 잘 통합되며, 대규모 애플리케이션 개발에 적합한 ORM 솔루션입니다.


TypeORM 컬럼(Column) 옵션 설명
주요 컬럼 옵션
- type: ColumnType
- 데이터베이스 컬럼의 타입을 지정합니다.
- 예: varchar, text, int, bool, date, json 등
- 예시: @Column({ type: 'varchar', length: 255 })
- name: string
- 데이터베이스에 실제 저장될 컬럼 이름을 지정합니다.
- 기본값은 프로퍼티(속성) 이름을 따릅니다.
- 예시: @Column({ name: 'user_name' }) → 데이터베이스에는 'user_name'으로 저장
- nullable: boolean
- NULL 값을 허용할지 여부를 결정합니다.
- 기본값은 false(NULL 허용 안함)입니다.
- 예시: @Column({ nullable: true }) → NULL 값 허용
- update: boolean
- 해당 컬럼을 업데이트할 수 있는지 여부를 결정합니다.
- 기본값은 true(업데이트 허용)입니다.
- false로 설정하면 처음 저장 후 업데이트 불가능합니다.
- 예시: @Column({ update: false }) → 생성 후 수정 불가
- 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;
}
- default: string | (() => string)
- 컬럼의 기본값을 설정합니다.
- 정적 값이나 함수 형태로 제공할 수 있습니다.
- 예시: @Column({ default: 'guest' }) 또는 @Column({ default: () => 'CURRENT_TIMESTAMP' })
- unique: boolean
- 컬럼 값이 고유해야 하는지 여부를 지정합니다.
- 기본값은 false입니다.
- true로 설정하면 동일한 값을 가진 레코드가 존재할 수 없습니다.
- 예시: @Column({ unique: true })
- comment: string
- 컬럼에 설명을 추가합니다 (데이터베이스 스키마 주석).
- 모든 데이터베이스에서 지원되지는 않습니다.
- 예시: @Column({ comment: '사용자 활성 상태 여부' })
- 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 필드는 문자열 배열로 정의되었습니다.
주요 특수 컬럼 데코레이터
- @CreateDateColumn()
- 레코드가 생성된 날짜와 시간을 자동으로 저장합니다.
- 엔티티가 처음 저장될 때 현재 시간이 설정됩니다.
- 예시: createdAt: Date 필드에 사용
- @UpdateDateColumn()
- 레코드가 마지막으로 업데이트된 날짜와 시간을 자동으로 저장합니다.
- 엔티티가 업데이트될 때마다 현재 시간으로 갱신됩니다.
- 예시: updatedAt: Date 필드에 사용
- @DeleteDateColumn()
- 소프트 삭제(Soft Delete)가 발생한 날짜와 시간을 저장합니다.
- 실제 삭제 대신 삭제 시간을 기록하는 방식으로 사용됩니다.
- @DeleteDateColumn()이 있는 엔티티는 기본 조회 시 삭제된 레코드가 필터링됩니다.
- 예시: deletedAt: Date 필드에 사용
- @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
반응형