인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

abcwockd95님의 프로필 이미지
abcwockd95

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

OneToOne Option OnDelete 작동

작성

·

9

0

안녕하세요 코드팩토리님 NestJS에 관심이 생겨 최근 강의를 듣고 있습니다.

OneToOne 에서 onDelete 설정을 했을 때 계속 profile이 null 값으로만 변경되는데 제 코드에 문제가 있는지 궁금합니다. 검토 한 번 부탁드려요. 감사합니다!!

// user.entity.ts
export class UserModel {
  // 자동으로 ID 생성
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  @Column({
    type: 'enum',
    enum: Role,
    default: Role.USER,
  })
  role: Role;

  // 데이터가 생성되는 날짜와 시간이 자동으로 찍힌다.
  @CreateDateColumn()
  createdAt: Date;

  // 데이터가 업데이트되는 날짜와 시간이 자동으로 찍힌다.
  @UpdateDateColumn()
  updatedAt: Date;

  // 데이터가 업데이트 될 때마다 1씩 올라간다.
  // 처음 생성되면 값은 1이다.
  // save() 함수가 몇번 불렸는지 기억한다.
  @VersionColumn()
  version: number;

  @Column()
  @Generated('uuid')
  additionalId: string;

////////////// 이 부분 /////////////
  @OneToOne(() => ProfileModel, (profile) => profile.user, {
    // find() 실행 할 때마다 항상 같이 가져올 relation을 정할 수 있다.
    eager: true,
    // 저장할 때 relation을 한번에 같이 저장 가능하게 한다.
    cascade: true,
    // null 값이 가능하게 한다.
    nullable: true,
    // on: ~했을 때
    // 관계가 삭제 됐을 때
    // no action => 아무것도 안함
    // cascade => 참조하는 Row도 같이 삭제
    // set null => 참조하는 Row에서 참조 id를 null로 변경
    // set default => 기본 세팅으로 설정 (테이블의 기본 세팅)
    // restrict => 참조하고 있는 Row가 있는 경우 참조 당하는 Row 삭제 불가
    onDelete: 'RESTRICT',
  })
  profile: ProfileModel;
////////////// 이 부분 /////////////

  @OneToMany(() => PostModel, (post) => post.author)
  posts: PostModel[];
}

// app.controller.ts
import { Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Role, UserModel } from './entity/user.entity';
import { Repository } from 'typeorm';
import { ProfileModel } from './entity/profile.entity';
import { PostModel } from './entity/post.entity';
import { TagModel } from './entity/tag.entity';

@Controller()
export class AppController {
  constructor(
    @InjectRepository(UserModel)
    private readonly userRepository: Repository<UserModel>,
    @InjectRepository(ProfileModel)
    private readonly ProfileRepository: Repository<ProfileModel>,
    @InjectRepository(PostModel)
    private readonly PostRepository: Repository<PostModel>,
    @InjectRepository(TagModel)
    private readonly TagRepository: Repository<TagModel>,
  ) {}

  @Get('users')
  getUsers() {
    // OntToOne에 eager: true 설정을 하면 relations 옵션을 여기에서 넣어주지 않아도 된다.
    return this.userRepository.find({});
  }

  @Delete('user/profile/:id')
  async deleteProfile(@Param('id') id: string) {
    await this.ProfileRepository.delete(+id);
  }

  @Post('user/profile')
  async createUserAndProfile() {
    const user = await this.userRepository.save({
      email: 'asdf@naver.com',
      profile: {
        profileImg: 'asdf.jpg',
      },
    });

    // cascade: true 설정을 하면 relation을 한번에 같이 저장하게 되서 더 이상 두번 save 할 필요가 없음
    // const profile = await this.ProfileRepository.save({
    //   profileImg: 'asdf.jpg',
    //   user,
    // });

    return user;
  }
}

답변 1

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

데이터베이스 한번 삭제하고 다시 실행 해보시겠어요?

그래도 문제가 생기면 다시 말씀 부탁드립니다.

감사합니다!

abcwockd95님의 프로필 이미지
abcwockd95

작성한 질문수

질문하기