강사 등록 시 사업자등록번호를 입력하는 폼이 있어 데이터 타입을 int
로 지정했다.
그런데 테스트해보니 일정 크기 이상의 숫자를 작성하면 2147483647로 자동적으로 입력되어 저장되는 것을 발견했다.
(사업자등록번호는 10자리를 가지는데, int 타입으로 지정하면 2147483647 이상의 10자리를 입력할 때 문제가 발생한다.)
문제는 int(정수형) 데이터 타입의 범위에 있었다.
MySQL에서 int 데이터 유형은 최대 4바이트까지 표현할 수 있어서 -2147483648 ~ 2147483647 범위의 정수를 저장할 수 있다.
따라서 정수형인데 int 이상의 값을 입력하도록 하고 싶다면 bigint를 지정해줘야 한다.
@ApiProperty({
example: '1638437489',
description: '사업자 법인번호. `-` 없이 입력해 주세요',
required: false,
})
@Column('bigint', { name: 'business_number', nullable: true })
business_number: number | null;
bigint는 최대 8바이트 범위의 수까지 입력이 가능해서 -9223372036854775808 ~ 9223372036854775807 사이 수를 입력할 수 있다.
부가적으로 int의 범위가 제한되어 있는 이유를 찾아봤다.
int 유형이 32비트 아키텍처를 기반으로 하기 때문인데 32비트 아키텍처에서는 4바이트가 최대 크기라서 이를 넘어가면 처리 속도가 떨어진다고 한다.
bigint는 int보다 메모리 사용량이 더 많아질 수는 있다. 따라서 대량의 데이터를 다루는 시스템에서는 bigint를 사용하면 메모리 사용량이 증가하여 성능 저하를 일으킬 수 있다.
하지만 대부분의 경우 int와 bigint의 처리 속도가 비슷하여 성능 차이가 크게 나지 않는다고 한다. 또한 bigint도 인덱스를 잘 활용하면 성능을 개선할 수 있다.