역할

기본 구조

  1. app.module.ts에서 연결 설정

    import { TypeOrmModule } from '@nestjs/typeorm';
    
    @Module({
      imports: [
        TypeOrmModule.forRoot({
          type: 'mysql',
          host: 'localhost', // url 수정
          port: 3306,
          username: 'test',
          password: 'password',
          database: 'testdb',
          entities: [__dirname + '/**/*.entity{.ts,.js}'],
          synchronize: true, // 개발 시만 true, 배포 시엔 false
        }),
      ],
    })
    export class AppModule {}
    
  2. user.entity.ts에서 Entiry 정의 (데이터 모델 정의)

    1. DB 테이블 구조 정의
    2. 실제 DB 테이블과 1:1 매핑되는 클래스 작업
    3. 각 필드는 DB 컬럼을 의미함
    import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
    
    @Entity() // DB 테이블을 나타냄
    export class User {
      @PrimaryGeneratedColumn() // PK(Primary Key), 자동 증가되는 ID
      id: number; 
    
      @Column() // 일반 필드
      name: string;
    
      @Column()
      email: string;
    }
    
  3. user.service.ts에서 Repository 사용 (비즈니스 로직 처리)

    1. Entity를 이용해 비즈니스 로직 구현
    2. DB 작업(조회, 생성, 수정, 삭제 등등)을 처리
    3. Controller와 Repository(Entity) 사이 중간 계층 역할
    import { Injectable } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { Repository } from 'typeorm';
    import { User } from './user.entity';
    
    @Injectable() // DI(Dependency Injection, 의존성 주입) 대상임을 선언
    export class UserService {
      constructor(
        @InjectRepository(User)
        private userRepository: Repository<User>, // 해당 Entity의 DB 접근을 위한 Repository 주입
      ) {}
    
    	// 실제 동작을 수행하는 함수들(서비스 로직 / 등록, 전체 조회 등등)
      async create(name: string, email: string): Promise<User> {
        const user = this.userRepository.create({ name, email }); // 객체 생성
        return this.userRepository.save(user); // DB 저장
      }
    
      async findAll(): Promise<User[]> {
        return this.userRepository.find(); // 전체 유저 조회
      }
    }