[ 프로젝트 ] typeORM에 Seed 추가하기

김민석·2021년 6월 29일
1

WORKOUT!

목록 보기
6/18

프론트를 개발할 때 dummyData를 이용하여 '마치' backend가 존재하는 것'처럼' 개발할 수 있다. 그러나 이 프로젝트는 혼자 진행하고 있는 것이기 때문에 굳이 그럴 필요가 없다.

front를 개발할 때는 airbnbtypescript 스타일을 따르려고 한다. 그 전에 서버로 typoscript를 공부하며 typescript에 좀 더 친근해지기 위해 준비하고 있는 단계다.

그런데 기왕 서버를 작성하는 김에, dummy data를 쭉 넣어서 활용하는 게 좋을 것이라는 생각이 들었다.
추후 front를 개발할 때에 서버에 있는 데이터를 활용하면 좀 더 편할 것 같았다.
따라서 오늘은 DB에 seed 데이터들을 넣었다.

추후 찾아보니까 이런 방법도 있더라.


typeorm-seeding 모듈을 사용하였다. 사이트

사용하면서 문제가 되었던 것은, 이유는 모르겠으나 공식 웹페이지에 실제 사용할 수 없는 예시가 있다...👻

define(Pet, (faker: typeof Faker) => {
  const gender = faker.random.number(1)
  const name = faker.name.firstName(gender)
 
  const pet = new Pet()
  pet.name = name
  pet.age = faker.random.number()
  pet.user = factory(User)() as any // <-- 이 부분이 이상하다. 
  return pet
})

예를 들어, 이런 식으로 factory를 사용하는 것은 불가능해보이고

await factory(User)()
  .map(async (user: User) => {
    const pets: Pet[] = await factory(Pet)().createMany(2)
    const petIds = pets.map((pet: Pet) => pet.Id)
    await user.pets().attach(petIds) // <-- attach라는 함수가존재하지 않는다.
  })
  .createMany(5)

코드를 까보면 attach method는 존재하지도 않는다.

처음에는 나의 문제인 것으로 알고 해결하려 해보았다.하하.

따라서 위의 예시와 다른 방식으로 코드를 짰다.

post.factory.ts

create-post.seed.ts

예시는 항상 가~장 복잡한 걸 갖고오는 게 좋은 것 같다. 그래야 모든 것을 다 담을 수 있다.

  1. 우선 factory 파일에서 에서 함수가 특정 Entity가 factory 함수에 들어왔을 때, 데이터를 어떻게 만들지 정의 해줄 수 있다.
    이때, faker 라이브러리를 이용하면 좀 더 편하게 dummy 들을 작성할 수 있다.
  1. create-post.seed에서 seed를 넣을 동작을 정의한다.
    위의 예시는 공식 사이트의 예시에 비해 매우 지저분해보인다.
    그 이유는 1:N 혹은 N:N 관계를 설정해주기 위해서 이런 방식을 채택하였다.

맨 위에 다른 방식으로 링크를 달아놓은 부분이 있다.
내가 생각했을 때, 저 방식의 문제는 JoinTable에 어떤 데이터가 들어갈지조차 일일히 설정해야한다.
(TypeORM이 이러한 관계들을 JoinTable까지 알아서 만들어주며 매우 간편하게 처리하는데도, 이것을 이용하지 못하고 JoinTable을 만들고 연결이 필요할 때는 직접 연결해주어야 할 것이다.)

이 부분을 작성하면서 이런 생각이 든다. 혹시 jointable의 이름과 똑같이 entity를 생성해주면 직접 처리도 가능하지 않을까....? -> 안된다

우여곡절 끝에 오늘 하루를 전부 사용해서 seed를 넣는데에 성공했다.

완벽한 seed는 아니다.
꼭 필요한 관계임에도 불구하고 typeORM의 association 기능을 활용하다보니 기입할 수 없는 부분들이 있었다.

그러나 추후 개발을 진행할 때, 이 데이터들을 잘 걸러내서 활용하기만 한다면 문제가 없을 것이라는 생각이 든다. (제발!)


ts-node의 필요성을 오늘 발견하였다.
지금까지 tsc -w 기능으로 실시간으로 ts -> js 컴파일을 진행하고, js 파일을 nodemon으로 실행시키는 것으로 진행했는데, 문제는 파일의 이름을 바꾸면, 이전 파일과 이후 파일 두 개가 생겨있는 문제가 있다.
ts-node는 새로운 js파일을 생성하는 것이 아니라 ts 파일 자체를 실행시키는 것처럼 작동하기 때문에 이런 작동은 없을 것으로 보인다. 그러나 아직 크게 불편한 점은 없으므로, 현재는 그냥 진행하도록 해야겠다.
다음 프로젝트에는 ts-node를 사용하는 것으로 ...

0개의 댓글