티스토리 뷰

728x90
반응형

AWS RDS 타임존 바꾸기

아래 글 작성하신분 짱짱짱 정말 감사합니다.

해결책)

 

[AWS] RDS timezone 변경

RDS : AWS Aurora현재 시간 : 2022-01-21 오후 4시10분DB연결 > 현재 DB시간 확인 대한민국 시간대는 UTC +9:00이므로 현재 한국 시간의 9시간 전 시간으로 뜸RDS > 클러스터 선택 > 구성 탭 > DB 클러스트 파라미

velog.io


상황

typeorm group by 로직을 짜다가 에러가 발생했다.

  • 내가 생각한 MySQL 쿼리문
    • 의미: 금일에 방문한 유저들의 나이(age)를 집계
select date_format(histories.connectTime, '%Y-%m-%d') as date, age, count(*)
from histories
    join users on histories.connectorUserId = users.userId
where date_format(histories.connectTime, '%Y-%m-%d') = date_format(now(), '%Y-%m-%d')
group by age, date
;

참고블로그

 

오늘 사이트에 접속한 방문자의 나이를 집계한 것이다.

오늘이 2022-10-29 라고 한다면 다음과 같이 나타낸거다.

날짜 나이(age) age 카운트
2022-10-29 25 1
2022-10-29 26 2
2022-10-29 30 5

 

 

  • 서비스 로직에 작성한 typeorm 쿼리문
async getNowDateStatisticsFromUserAges() {
    const ageRecords = await this.historiesRepository
      .createQueryBuilder('histories')
      .select(["DATE_FORMAT(histories.connectTime, '%Y-%m-%d') AS connectDate"])
      .addSelect('users.age')
      .addSelect('count(*) AS ageCount')
      .where(
        "DATE_FORMAT(histories.connectTime, '%Y-%m-%d') = DATE_FORMAT(now())",
      )
      .leftJoin('histories.Connector', 'users')
      .groupBy('age, connectDate');

    return ageRecords;
}

 

- 삽질하면서 느낀점

typeorm에서는 group by는 지원해도, roll-up은 지원해주지 않은거같다. 아무리 검색해도 없음 ㅠㅠ

(혹시 알고있는분은 공유부탁드립니다 !!)

 

 

  • 발생한 에러문: TypeError: Converting circular structure to JSON
TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'EntityMetadata'
    |     property 'ownColumns' -> object with constructor 'Array'
    |     index 0 -> object with constructor 'ColumnMetadata'
    --- property 'entityMetadata' closes the circle

 

 

이에러가 뭐지?

circular(?) 이라고하길래 순환구조? 계속 루프가 되는건가... 이런생각 이들었다.

뭔가 생소해서 찾아봤더니, '선회하는 구조를 JSON으로 바꾸려고 해서 나는 에러' 라고 한다.

 

 

[JavaScript] Converting circular structure to JSON(json 형태의 배열 로그 찍기)

해석하자면, 선회하는 구조를 JSON으로 바꾸려고 해서 나는 에러. 모르는 객체가 어떤 값을 담고있나 찍어보려고 하다가 이런 에러를 발견했다. JSON.stringify로 해봤는데 위의 에러가 나와서 선회

zorba91.tistory.com

 

(해결방안)

몇개를 고를 건지를 나타내는 .getOne() , .getMany() 를 빼먹었다.


해결했는데 또 다른 에러가 나왔다...

 

ERROR [ExceptionsHandler] ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT: Incorrect parameter count in the call to native function 'DATE_FORMAT'
QueryFailedError: ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT: Incorrect parameter count in the call to native function 'DATE_FORMAT'

 

해결방안 date_format 끼리의 비교구문중,  now()에서 포맷팅 적용하는 부분에서 놓쳤다. 그래서 위와 같은 에러가 떴다.

`DATE_FORMAT(histories.connectTime, '%Y-%m-%d') = DATE_FORMAT(now())`

등잔밑이 어두운 셀프에러를 낸거였다 ...


 

팀원으로 부터 코드리뷰를 받았다. 리턴타입을 명시함으로써 객체로 변환하는 불필요한 작업을 줄일 수 있다.

아래 코드는 팀원의 리뷰를 받고 리팩토링한 코드이다.

async getNowDateStatisticsFromUserAges(): Promise<ResultStatisticsByAgeDto[]> {
    const ageRecords = await this.historiesRepository
      .createQueryBuilder('histories')
      .leftJoin('histories.Connector', 'users')
      .select([
        `DATE_FORMAT(histories.connectTime, '%Y-%m-%d') AS connectDate`,
        'users.age AS age',
        'COUNT(*) AS ageCount',
      ])
      .where(
        `DATE_FORMAT(histories.connectTime, '%Y-%m-%d') = DATE_FORMAT(now(), '%Y-%m-%d')`,
      )
      .groupBy('users.age')
      .addGroupBy("DATE_FORMAT(histories.connectTime, '%Y-%m-%d')")
      .getRawMany();

    return ageRecords;
  }

 

확인해보니 굳이 Promise.all() 에서 map()함수를 쓸필요가 없다는걸 처음알았다.

협업을 해보니 배울점이 많다는 것이다.

다른사람이 내 코드를 봐줘서 더 효율적인 코드나 불필요한 코드를 제거하여 개선시킬 수 있다는 점이고

그리고 여러사람의 코드스타일을 보면서, 내가 놓치고 있는 부분을 보완할 수 있다는 점이다.

 

처음으로 PR로 코드로 소통하고 같이 문제를 고민하는 과정이 너무 좋았다.

나는 이전부터 이런 경험을 해보고 싶었다!!

728x90
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함