백엔드/ORM

[TypeORM] bigint가 string으로 변환될 때

eess 2024. 10. 25. 17:39

 

문제 상황

TypeORM으로 만든 엔티티 일부

 

TypeORM 공식문서 : https://typeorm.io/entities#column-types

 

  • TypeORM 공식 문서에서도 나와있듯이, 엔티티를 만들 때 bigint로 컬럼 타입을 지정하면 엔티티로 변환할 때는 string으로 변환됩니다. (PostgreSQL 기준)
  • 하지만 이 값을 사용할 때마다 변환하는 로직을 넣기는 귀찮으니, 엔티티로 변환한 시점에 이미 number 라면 사용하기 편할 것 같습니다.
  • Javascript에서 표현할 수 있는 "안전한" 정수의 범위는 -9,007,199,254,740,991 ~ 9,007,199,254,740,991 입니다.
  • 하지만 PostgreSQL bigint의 범위는 -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807로 더 크기 때문에 string으로 변환하는 것으로 보입니다.
  • totalAmount 값이 Javascript의 "안전한" 정수의 범위를 넘어가지 않는다는 가정하에 아래와 같이 해결했습니다.

 

해결 방법

  • TypeORM 공식문서를 살펴보면 transformer를 지정하는 방법이 있습니다.
  • from, to 두 개의 메서드를 가진 객체 타입이고 엔티티 타입을 데이터베이스 타입으로(또는 그 반대로) 마샬링 할 수 있습니다.

 

 

  • Transformer 클래스를 생성하고 to, from 두 개의 메서드를 작성합니다.
    • to : 엔티티 타입의 값을 매개변수로 받아서 변환 후 반환합니다.
    • from : 데이터베이스 값을 매개변수로 받아서 변환 후 반환합니다.
  • 저는 from에서 string 타입의 데이터베이스 값을 parseInt를 사용해 number로 변환했습니다.

 

참고

https://stackoverflow.com/questions/59927625/how-to-store-big-int-in-nest-js-using-typeorm

https://www.postgresql.org/docs/current/datatype-numeric.html

https://developer.mozilla.org/ko/docs/Web/JavaScript/Data_structures

https://jojoldu.tistory.com/600