sequelize + typescript 사용시 발생한 문제점들

이윤성·2021년 11월 10일
0

sequelize associate 문제

  • m to n 일 때 belongstomany가 안되어서 hasmany와 belongsto, 즉 1:n 관계를 두번 사용하여 m to n을 만들었다

query type 문제

  const query = {
    attributes: [["uid", "id"], "image", "location", "sex", "age"],"info"],
    where: { uid },
  };
  return await Users.findOne(query as object);
  • 타입스크립트에서 위와 같이 사용시 query에서 type 문제가 발생하였다.
    • 평소에는 발생하지 않았으나 attributes처럼 alias를 위한 이중 배열을 사용 시 발생하였다.
  • type assertion을 사용하여 해결
  • type assertion은 런타임에 동작을 예상하는 형변환(casting)과는 다르게 순수하게 컴파일 시간에 코드가 어떻게 분석될지 말해주는 방법
  • 남발하여 사용하면 해롭지만 정확히 알고 사용하면 사용자에게 명확한 타입을 제시해줄 수 있다.
const query = {
    attributes: [["uid", "id"], "image", "location", "sex", "age"],
    where: { gid },
  };
  const memberData = await Users.findAll(query as object);
const memberData = await Users.findAll({
    attributes: [["uid", "id"], "image", "location", "sex", "age"],
    where: { gid },
  });

sequelize query로 꺼내온 값들

  • sequelize의 findOne 이나 findAll로 가져온 데이터는 객체 형태가 아니라 여러 프로퍼티로 이루어져 있다
  • 그 중 대부분은 dataValues라는 프로퍼티의 값을 사용한다.
  • dataValues라는 값은 아래와 같이 사용할 수 없다.
const teamInfo = await Team.findOne(query);
const gid = teamInfo.dataValues.id;
teamInfo["dataValues"]

sequelize alias

  • associate할때 as를 사용하여 alias를 지정하면 직접 쿼리를 사용할 때, 해당 이름으로 쿼리를 작성할 수 있다.
  • 이렇게 변경된 이름은 API로 JSON 형식으로 보낼 때 유용하게 사용할 수 있다.

Sequelize include 사용시 타입 문제

  • model에서 정의할 때 associations를 사용해 미리 include시 생기는 타입을 정의할 수 있음

0개의 댓글