관리 메뉴

FU11M00N

createAt 데이터 가공 db에서 처리하기 본문

카테고리 없음

createAt 데이터 가공 db에서 처리하기

호IT 2023. 4. 9. 03:18

포스트 기능 개발 중 프런트에게

id, title, content, hit, createdAt, writer. 데이터를 보내줘야 하는 일이 생겼다.

이 중 createdAt 데이터를 보낼 땐 포스트의 생 성일이 오늘 날짜라면 시간 : 분 (12:30) 데이터를 보내야 하고,

생성일이 오늘이 아니라면 년-월-일 (2023-04-09) 데이터를 보내야 한다.

 

해당 작업을 메모리에서 작업(node.js 에서 처리) 하려던 찰나 포스트 데이터가 많아질수록 메모리 자원이 많이 사용될 것 같은 느낌이 들어
db에서 한꺼번에 작업하려고 노선을 변경했다.

 

쿼리문으론, 아래와 같이 case 문을 사용하여 처리가 가능하다.

      select
         case substring(NOW(),'6','6')
         when substring(createdAt,'6','6')
         then substring(createdAt, '12', '5')
         else substring(createdAt, '1', '10')
      END as 'createdAt'
      from posts;

 

시퀄라이즈는 아래와 같이 Sequelize 객체의 literal를 사용하여 쿼리문을 사용한다.

         attributes: [
            'id',
            'title',
            'hit',
            'UserId',
            [
               Sequelize.literal(
                  ` CASE substring(NOW(), '6', '6') WHEN substring(Post.createdAt, '6','6') THEN substring(Post.createdAt, '12', '5') else substring(Post.createdAt, '1', '10') END`,
               ),
               'createdAt',
            ],
         ],

 

 

주의) 시퀄라이즈의 표준 시간이 "UTC"로 되어있기에 "+09:00"을 하여 한국시간으로 맞추는 설정을 한다.

const sequelize = new Sequelize(config.database, config.username, config.password, {
   host: config.host,
   dialect: config.dialect,
   timezone: '+09:00',
   dialectOptions: {
      charset: 'utf8mb4',
      dateStrings: true,
      typeCast: true,
   },
   define: {
      timestamps: true,
   },
});

 

 

Comments