본문 바로가기
쿤즈 Server/MariaDB | Mysql

[MariaDB / Mysql] IP 값을 DB 저장시 숫자 형태로 저장하는 방법

by :)Koon 2021. 9. 3.

웹 프로그래밍을 하다 보면 데이터베이스(이하 'DB')를 사용해서 데이터를 CRUD (Create, Read, Update, Delete) 하는 작업을 많이 하게 됩니다. 그리고 데이터를 가져올 때 검색해서 비교하는 조건들이 많이 따라다니게 되죠.

 

 

저의 경우 IP를 비교해야 할 경우가 빈번히 발생합니다. 현재 IP가 조건에 들어온 IP와 비교하여 범위에 속하는지 여부를 판단해야 하는 경우가 발생하죠.

 

이번 포스팅에서는 DB에 IP를 저장하는 것에 대해서 알아볼게요.


IP 저장은 문자열? 숫자?

IP를 저장하는 방법들 중 많이 사용하는 두 가지는 문자열로 저장하는 방법과 숫자 형태로 저장하는 방법이 있습니다.

문자열을 말 그대로 우리가 읽을 수 있고 판단할 수 있는 글자의 형태입니다. 숫자 형태는 우리가 읽을 수는 있지만 정확한 값을 알아내려면 계산을 해야만 알 수 있는 형태입니다. 아래 값을 볼게요.

 

IP 문자열 : 1.1.1.1
IP 정수 : 16843009

 

IP 주소가 1.1.1.1 인 값이 있습니다. 그리고 이 값을 정수의 형태로 변경하면 16843009입니다. 만약 이 두 값이 DB에 저장된다면 어떤 값으로 저장하는것이 좋을까요? 좋고 나쁘다 보다는 어떤 형태로 저장했을 때 DB에서 가져오는 쿼리가 빨라지는가, 혹은 데이터 비교가 편한가를 생각하면 좋을 것 같습니다.


IP 문자열을 숫자로, 숫자를 문자열로 바꿔주는 함수

MariaDB 혹은 Mysql에서는 편리한 함수가 있습니다. 바로 문자열로 들어온 IP를 정수로 변경하거나 정수로 변경된 IP를 문자열로 다시 바꿔주는 함수입니다. 다음 두 함수를 보시죠.

INET_ATON('문자열 IP')
INET_NTOA('정수 IP')

INET_ATON 함수는 xxx.xxx.xxx.xxx 형태로 표현된 IPv4 문자열 주소를 숫자 값(Numeric value)으로 변경해 주는 함수를 의미합니다.

INET_NTOA 함수는 숫자 값으로 된 주소를 IPv4 문자열 주소 형태로 변경해 주는 함수입니다.

 

예를 들어볼게요.

SELECT INET_ATON('192.168.100.1');

숫자로 변환해서 3232261121 이라는 값이 나왔습니다. 그렇다면 반대로 이 정수 값을 다시 IP 문자열로 변경해볼게요.

SELECT INET_NTOA('3232261121')

정상적으로 IP가 변경된 것을 볼 수 있습니다.


정수형 IP값의 활용

정수형 IP를 저장해서 활용하는 방법에는 무엇이 있을까요?

우선은 값의 크고 작음을 비교할 수 있습니다. 예를 들어서 192.168.100.1 ~ 192.168.100.10 범위에 있는 값을 DB에서 가져오고 싶을 때, 검색조건으로 들어올 수 있죠. 그렇다면 이와 같이 숫자로 변환해서 비교할 수 있습니다.

 

또 문자열이 아닌 숫자로 되어 있기 때문에 인덱싱이나 정렬을 할 때에도 속도적인 면에서는 더 빠르다고 할 수 있죠. 물론 데이터가 적으면 그 속도는 차이가 없지만 말이죠.

 

위 예제는 IPv4의 예제입니다. 만약 IPv6를 이용하고 싶다면 아래 두 함수를 사용할 수 있습니다.

INET6_ATON()
INET6_NTOA()

이번 포스팅에서는 IP 주소를 숫자로, 숫자인 주소를 IP 문자열로 변경하는 방법에 대해서 알아보았습니다. 간단한 방법으로 사용이 가능한 함수입니다. 검색조건과 같은 곳에서 사용하면 좋을 함수인것 같습니다. 도움이 되셨으면 합니다. 이상입니다.

댓글