관리 메뉴

나의 개발일지(김지헌)

항해 99 63일차 11/20일 본문

카테고리 없음

항해 99 63일차 11/20일

코딩이좋아요 2022. 11. 20. 23:55

WIL

타입스크립트 ORM

이번 실전 프로젝트는 타입 스크립트와 mysql을 사용하기로 했었다. ORM 중에서는 TypeORM과 sequelize 중에 하나로 하기로 했다.

한 번도 안 써본 TypeORM을 사용하려고 했는데 첫 주차 때 크롤링에 시간을 많이 뺏기고 타입 스크립트도 공부를 해서 사용해야 하기 때문에

시퀄 라이즈를 사용하기로 했다.

처음 시퀄라이즈를 사용하려고 했을 때 강의에서  자바스크립트 상태로 데이터베이스를 생성하고 타입 스크립트로 바꿔서 사용을 하길래 

데이터베이스를 바꾼다면? 또 바꿔줘야 한다는 번거로움이 있었기 때문에 구글링을 하니깐 데이터베이스를 생성하는 코드를 찾을 수 있었다.

const createDBOptions = new options();
createDBOptions.username = process.env.DB_USER || 'root';
createDBOptions.password = process.env.DB_PASSWORD || 'your password';
createDBOptions.dialect = 'mysql';
//DB_NAME 없을시 new DateBase 생성
let db_name = process.env.DB_NAME || 'new DataBase';
//시퀄라이즈 생성 메서드
const dbCreateSequelize = new Sequelize(createDBOptions);

console.log(`======Create DataBase : ${db_name}======`);
//데이터베이스 생성 메서드
dbCreateSequelize
  .getQueryInterface() //인스턴스 반환
  .createDatabase(db_name)
  .then(() => {
    console.log('✅db create success!');
  })
  .catch((e) => {
    console.log('❗️error in create db : ', e);
  });

시퀄 라이즈에서 제공하는 데이터베이스 만드는 함수를 사용한 코드였다. 데이터베이스를 만드는 데는 성공했고 모델 파일을 작성하고 mysql을 연동해줘야 하는데 npx sequelize model:generate --name User --attributes nickname:string 명령어를 사용해서 js파일을 ts 파일로 바꾸는 건 너무 비효율 적이기 때문에 직접 찾아서 만들어서 사용하기로 했다.  모델을 직접 작성하고 migrate 해주는 함수 사용하는 코드를 찾아서  직접 실행시켜서 연동시켜주고 확인을 해봤다.

async function migrate() {
  for (let i = 0; i < createTable.length; i++) {
    await createTable[i]
      //sync <=데이터베이스 연동와 자동 연동하기
      .sync({ force: true }) //true : 삭제후 migrate , false : 삭제 안하고 migrate
      .then(() => {
        console.log(`✅Success Create ${createTable[i]} Table`);
      })
      .catch((err) => {
        console.log(`❗️Error in Create ${createTable[i]} Table : `, err);
      });
  }
}

(async () => {
  await migrate();
})();

문제없이 작동하는 거는 확인했고 다음은 관계 설정을 해야 하는데 js에서는 두모델을 각각 hasMany와 belongsTo로 연결시켜줬지만

지금은 그렇게 하면 중복 참조를 하게 돼서 테이블을 조인해서 가져올 때 문제가 생겼다. 그래서 참조하는 모델 파일에서  hasMany와 belongsTo를 같이 작성해주니 문제가 없었다. 그러고 나니 migrate 할 때 지우는 순서에 문제가 생겼다. 그래서 생성하는 코드와 삭제하는 코드를 분리시켜 반복문으로 각각 돌려주었다.

 

const dropTable = [Review, Trip, Pick, Camp, User, Weather];
const createTable = [Camp, User, Review, Trip, Pick, Weather];
console.log(`======Drop & Create Table======`);
//배열을 반복문을 돌려서 넣어줌
async function migrate() {
  for (let i = 0; i < dropTable.length; i++) {
    await dropTable[i]
      .drop()
      .then(() => {
        console.log(`✅Success drop ${dropTable[i]} Table`);
      })
      .catch((err) => {
        console.log(`❗️Error in drop ${dropTable[i]} Table : `, err);
      });
  }
  for (let i = 0; i < createTable.length; i++) {
    await createTable[i]
      //sync <=데이터베이스 연동와 자동 연동하기
      .sync({ force: false }) //true : 삭제후 migrate , false : 삭제 안하고 migrate
      .then(() => {
        console.log(`✅Success Create ${createTable[i]} Table`);
      })
      .catch((err) => {
        console.log(`❗️Error in Create ${createTable[i]} Table : `, err);
      });
  }
}

이것저것 해보다가 나온 코드였다.

이번 주는 시간이 너무 빨리 갔었다.