작성
·
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;
}
}