본문 바로가기

Dev Dialry/PickMovie

Make ORM entity

서버 설정을 모두 마친 상태이며 이제 필요한건 실제 서비스 구상에 필요한 데이터베이스 설계인 것 같다.

TypeORM 을 사용하였기 때문에 sql문의 사용을 최소화 시켜서 서버 개발을 할 수 있었으며,

편한점도 있었지만 한편으로는 불편한점도 적잖게 있었다.

쿼리를 직접 사용하던 기존 방식에서 ORM을 이용하여 데이터를 가져는 방식은 나에겐 아직 적응이 필요한 것 같다. 하지만 ORM을 사용해서 데이터를 가져옴으로 인해서 GraphQL을 이용한 개발에는 강점이 존재하고 편하다는 것은 누구나 인정할 것 같은 부분이다. 또한 쿼리 빌더의 사용법이 익숙해진다면 쿼리를 작성하면서 발생할 수 있는 실수들도 최소화 될것으로 예상이 된다.

여기서 작성할 entities들은 Graphql Server 구동 글(Run Graphql Server with graphql-yoga ) 에서 사용된 connectionOptions에서 사용된 entities들이다.

정리하는 차원에서 ORM config 데이터는 아래와 같다.

import { ConnectionOptions } from "typeorm";

const connectionOptions: ConnectionOptions = {
type: process.env.DB_TYPE || 'mysql',
synchronize: false,
logging: false,
entities: ["entities/**/*.*"],
host: process.env.DB_ENDPOINT,
port: process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
};

export default connectionOptions;

여러 entity중 영화와 관련된 entity는 다음과 같다.

import {
Column,
Entity,
BaseEntity,
PrimaryGeneratedColumn,
Index,
OneToMany,
CreateDateColumn,
UpdateDateColumn,
} from "typeorm";
import MovieRank from "./MovieRank";
import MovieGenres from "./MovieGenres";
import MovieActor from "./MovieActor";

@Entity()
class Movie extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;

@Index()
@Column({ comment: "영화 고유 코드"})
movieCode: string;

@Index()
@Column({ comment: "영화이름"})
movieName: string;

@Column({ comment: "포스터이미지"})
image: string;

@Column({ comment: "네이버 주소"})
naverLink: string;

@Index()
@Column({ comment: "개봉일"})
openDate: string;

@Index()
@Column({ type: "float", comment: "사용자 평점", default: 0 })
userRate: number;

@Column({ type: "bigint", comment: "누적매출액", default: 0 })
salesAcc: number;

@Column({ comment: "누적관객수", default: 0 })
audiAcc: number;

@OneToMany(type => MovieRank, rank => rank.movie)
rank: MovieRank[];

@OneToMany(type => MovieGenres, genres => genres.movie)
genres: MovieGenres[];

@OneToMany(type => MovieActor, actor => actor.movie)
actor: MovieActor[];

@CreateDateColumn()
createdAt: string;

@UpdateDateColumn()
updateAt: string;
}

export default Movie;

위와 같이 작성해주고 MovieGenres, MovieRank, MovieActor entity들도 작성을 해주어야 한다.

그렇게 해주면 TypeORM이 해당 객체간의 연관 관계를 생성해주게 되고, 필드 옵션에서 eager 옵션을 통해 상시 데이터를 가져올수 있지만, 데이터 쿼리시에 relations 를 이용해서 가져올 수도 있음.

위와 같이 entity들을 쭉 생성해주게 되면 서버 구동시에 해당 entity들에 맞춰서 디비 동기화가 일어나게 된다. 물론 해당 기능을 켜고 끄는건 별도의 설정을 해주어야 할 부분이다. 해당 부분 놓치게 되면 의도치 않게 마이그레이션이 일어나게 되고, 그로인데 의도치 않게 서비스에 문제가 생길 수 있는 부분으로 보인다.

위의 entity를 이용해서 추후에 graphql definition을 해줄 예정이다.

필드들만 복사해서 붙여넣어주면 되기 때문에 작성이 그렇게 어렵거나 하진 않지만, 스키마가 바뀔때마다 업데이트를 해주는건 여전히 귀찮은 문제로 남을 것 같다.

동기화 부분만 잘 신경써주게 되면 Typeorm 과 graphql 은 서버 개발을 정말 편하게 만들어 주는 도구인건 확실한것 같다. 추후 개인 프로젝트는 무조건 이렇게 진행할 것이다.

'Dev Dialry > PickMovie' 카테고리의 다른 글

Graphql Schema and Definition  (0) 2019.01.21
Run Graphql Server with graphql-yoga  (0) 2018.12.12
Package Setup  (0) 2018.12.10
Spec  (0) 2018.12.10