문제 상황
- 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
'백엔드 > ORM' 카테고리의 다른 글
[TypeORM] 왜 엔티티 클래스 프로퍼티를 private으로 할 수 없을까? (1) | 2024.09.09 |
---|---|
[TypeORM] TypeORM에서 트랜잭션 다루는 방법 (0) | 2024.08.05 |