typeORM 기본 사용법

🪐 C:on·2022년 1월 4일
0

ORM

목록 보기
2/2
post-custom-banner


🔎 데이터베이스 테이블 만들기

먼저 엔티티를 정의해준다.

엔티티@Entitiy로 데코레이트된 모델을 말한다.

컬럼을 추가하려면 @Column(), @PrimaryColumn(), @PrimaryGeneratedColumn()등을 사용할 수 있으며 컬럼의 타입은 괄호안에 length:100, text, double등을 전달해서 지정해준다.

import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class Photo {

    @PrimaryGeneratedColumn()
    id: number;

    @Column({
        length: 100
    })
    name: string;

    @Column("text")
    description: string;

    @Column()
    filename: string;

    @Column("double")
    views: number;

    @CreateDateColumn()
    createdAt: Date
}

🔎 연결

엔티티가 완성되면 메인 파일에서 연결을 진행해준다.

createConnection() api를 사용해서 연결한다.
메소드의 인자로 데이터베이스 정보를 적어줄 수도 있고, 작성하지 않으면 자동으로 ormconfig.json의 내용을 참조하게 되므로 ormconfig.json에 설정내용을 작성한다..


🔎 Insert data


getRepository()의 타입정의이다.
typeorm모듈의 getRepository()를 사용하면 다음과 같이 Respositry타입의 객체를 반환한다.


Respositry타입의 객체는 saveAPI를 사용해서 엔티티를 전달해주면 실제 DB의 테이블에 저장을 한다. 저장이 완료되면 프로미스를 반환한다.
위 타입 정의를 보면 엔티티는 배열로 여러개를 한번에 전달할 수도 있다.


export class UserService implements authEntityService {
  constructor(private UserRepository: authEntityConstructor) {}

	async createUser(data: userData): Promise<authEntity> {
	    const repository = getRepository(this.UserRepository);
	    const model = new this.UserRepository();
	    const keys = Object.keys(data);
	    keys.forEach((key) => {
	      model[key] = data[key];
	    });
	    return repository.save(model);
	  }
}

엔티티를 구현하고 값을 할당한 뒤 저장소에 전달을 해줌으로써 저장완료한다.


🔎 기초엔티티 만들기

추상클래스로 기본적으로 가지는 컬럼을 설정해주고 필요한 엔티티에서 상속해서 사용한다.

import { CreateDateColumn, PrimaryGeneratedColumn } from "typeorm";
import { ValidationEntity } from "../validation/validation";

export abstract class BasicEntity extends ValidationEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @CreateDateColumn()
  createdAt: Date;
}

🔎 일대다 연결

예를 들어서 SlimePost엔티티와 SlimeOption엔티티가 일대다 연결을 맺고 있다면 각 엔티티의 끝단에 다음코드를 작성하면 된다.

@OneToMany(() => SlimeOption, (slime_option) => slime_option.slime_post)
  slime_options: SlimeOption[];
@ManyToOne(() => SlimePost, (slime_post) => slime_post.slime_options, { onDelete: "CASCADE", nullable: false })
  slime_post: SlimePost;

이때 onDelete 설정을 해주지 않으면 post를 지우고 싶을 때 종속된 postOption데이터가 존재할 경우 Cannot delete or update a parent row 오류가 발생한다.


🔎 일대다 연결 저장

다대일 선언 부분에 joincolumn 데코레이션을 해주고 속성으로 fk를 넣어준다.

그리고 아래에 fk 컬럼을 똑같이 생성해주면 된다.

이때 마이그레이션을 하는 경우라면 'Invalid use of NULL value’ 라는 sql에러 메시지를 받을 수 있다. 이유는 fk는 not null인데 현재 데이터베이스에 저장된 데이터들을 fk를 null로 가지고 있기 때문이다. 테이블 전체를 지워주거나 하나하나 fk를 등록해주면 된다.

또 fk없이 save하는 경우 [fk] doesn’t have default value 라는 에러 메시지를 받을 수 있다.

@ManyToOne(() => User, (user) => user.slime_posts)
@JoinColumn({ name: "userId" })
user: User;

@Column()
userId: number;
post-custom-banner

0개의 댓글