sequelize config 파일과 raw 옵션

eunji hwang·2020년 9월 8일
1
const dotenv = require('dotenv');

dotenv.config();

// 모든 모델(테이블)에 적용할 옵션 작성
// 모든 모델(테이블)에 공통 반영된다
const common = {
  charset: 'utf8mb4', // utf8 + 이모티콘 
  collate: 'utf8mb4_general_ci',  // utf8 + 이모티콘 getneral 또는 unicode 적용
  logging: true,
  // query: {
  //   raw: true, // ! 이 옵션 넣으면 result.get에러 발생! 넣지말기^^
  // },
  underscored: true,
  dialectOptions: {
    useUTC: true, //for reading from database
    dateStrings: true, // ! 데이터 로드시 문자열로 가저옴
    typeCast: true, // ! 타임존을 역으로 계산하지 않음
  },
  timezone: '+09:00', //for writing to database
};
module.exports = {
  development: {
    username: process.env.DB_USER,
    password: process.env.DB_PW,
    database: process.env.DB_NAME,
    host: 'localhost',
    dialect: 'mysql',
    ...common,
  },
  test: {
    username: process.env.DB_USER,
    password: process.env.DB_PW,
    database: process.env.DB_NAME,
    host: 'localhost',
    dialect: 'mysql',
    ...common,
  },
  production: {
    username: process.env.DB_USER,
    password: process.env.DB_PW,
    database: process.env.DB_NAME,
    host: 'localhost',
    dialect: 'mysql',
    ...common,
  },
};

시퀄라이즈 설정

공통 설정 코드예제

const common = {
  charset: 'utf8mb4', // utf8 + 이모티콘 
  collate: 'utf8mb4_general_ci',  // utf8 + 이모티콘 getneral 또는 unicode 적용
  logging: true,
  // query: {
  //   raw: true, // ! 이 옵션 넣으면 result.get에러 발생! 넣지말기^^
  // },
  underscored: true,
  dialectOptions: {
    useUTC: true, // for reading from database
    dateStrings: true, // ! 데이터 로드시 문자열로 가저옴
    typeCast: true, // ! 타임존을 역으로 계산하지 않음
  },
  timezone: '+09:00', //for writing to database
};

1. 타임존 설정하기

참고 사이트 : 시퀄라이즈 타임존 설정하기

  • 위 설정에서 dialectOptions, timezone를 보면 된다.
  • 타임존 설정 전 : 2018-10-18T06 : 45 : 38.000Z 요런 형태에서
  • 타임존 설정 후 : 2018-10-19 01:08:50 요런 형태로
  • 한국 시간 설정을위해 : timezone 옵션에 +9 설정
  • 참고 : 타임존 설정 이후 gnoring invalid configuration option passed to Connection: useUTC. This is currently a warning, but in future versions of MySQL2, an error will be thrown if you pass an invalid configuration option to a Connection 라고 콘솔에 출력된다.

2. 한글+이모지를 위한 charset 설정

내가 사용한 데이터베이스 MySQL을 기준으로, DB에 한글을 담기 위해서는 utf8 설정이 필요하다. 사용자 이름을 담는 필드라면 utf8 만으로 충분하지만, 본문을 담은 필드라면 이모지를 담을수 있는 utf8mb4 설정을 해주어야 한다.
callate옵션 또한 동일한 옵션을 적용하며 general or unicode 중 선택하여 적용한다. unicode 옵션이 더 넓은 범위라고하니 너의 선택!

참고 사이트 : general_ci & unicode_ci의 차이점

3. Query : { raw : true }...

처음 타임존을 설정하면서 포스팅쓴 엉아가 설정한 옵션을 cmd +C & cmd +V 로 고스란히 옴겨서 사용했다. 하하하! 모델링 다 하고 api 만들다 보니 Include에서 문제가 발생한다.

  • 문제 1 : result.get is not a function..
    • 문제 1을 해결하기 위해 미친 듯 구글 검색
    • 해결 : 파인더(findAll())옵션에 raw:true, nest:true 추가로 가까스로 해결
    • 하지만 문제 2등장🤧
  • 문제 2 : hasMany(1:다 중 다 일때)관계의, 즉 Feed.hasMany(Image) 일 때, Image배열에 담겨 반환되야 하는데, raw:true 옵션 덕분에 단일 객체가 되고, 여러장 이미지 결과로 나온다면, 각각 1개씩 여러게에 나뉘어 중복 출력되버림!
    • 문제 해결을 위해 또 미친 듯 구글 검색 : raw:true를 제거해야 한다, id 필드를 새로 만들어라 뭐라.. 말이 많음
    • 해결과정 1 : raw:true 를 제거해라 -> 처음 문제 1로 되 돌아감
    • 해결과정 2 : id 필드를 새로 만들어라 -> 별반응 없음
    • 해결과정 3 : 글로벌설정에 query: {raw:ture} 설정을 추가해라 -> 이미 추가되어 있는데?
    • 울며 겨자 먹기로 모든 설정 다 지우고 시도해봄...
    • 해결 : query: {raw:ture} 글로벌 설정 까지 제거하고 시도했더니 정상 출력되었다.
    • 꺅🤧

느낀 점 : 모르는 코드는 넣는 것이 아니다..!
query: {raw:ture} 이 한줄이 하는 기능도 모른체 일딴 넣고 본 내 잘못으로.. 몇 일 날렸네..

파인더 옵션 잠깐 살피기 🤓

findAll, findOne같은 파인더를 사용할 때 반환값 설정을 할 수 있다. 다음과 같은 옵션이 있으니 참고하자! (이번에 내가 사용해보고 문제가 있었던 것들만 정리!)

  • plain: true : 결과값의 배열을 단순화 하여 리턴 ex : images : [object,object] => images : Array
  • raw: true : 시퀄라이즈 설정에서 query:{raw:true} 했을 경우 이 옵션을 꼭 넣어줘야 result.get 에러가 안난다. 이 옵션은 리턴 값을 단일 객체로 변형하여 보여준다. 문제는 hasMany의 배열값도 객체로 단일화 해버린다는 것!
  • nest : true : 객체를 계층화 하여 보여준다. raw 옵션과는 항상 쌍으로 다닌다. 설정안하면... 'Images.Feed.id' : 값이런식으로 문자열로 키가 보여줌.
profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!

0개의 댓글