1. 입력된 IP 값을 계산 가능한 수치로 변환하여 반환하는 로직입니다.

※ 정해진 규칙

 public static Long ipToInt(String ipAddr) {
        String[] ipAddrArray = ipAddr.split("\\.");

        long num = 0;
        for (int i=0;i<ipAddrArray.length;i++) {
            int power = 3-i;
            /*
             * i의 값으 범위는 0~255 사이이며, 그 값을 256으로 나눈 나머지 값에  
             * 256을 power의 값인
             * 1~9 사이는 2,
             * 10~99 사이는 1,
             * 100 이상은 0 의 값에 누승하여 num 값에 더함
             */
            num += ((Integer.parseInt(ipAddrArray[i])%256 * Math.pow(256,power)));
        }
        return num;
    }

  1. Long 값을 IP 로 변환하는 로직입니다. 기본이 Int 형이나, int 형의 범위가 -2147483648 ~ 2147483647 입니다. 그런데 IP 를 수치로 변환하게 되면 2147483647 를 넘는 경우가 생깁니다. 그래서 Long 형으로 처리해야합니다. ^^

※ 정해진 규칙

 public static String intToIp(long num) {
        return ((num >> 24 ) & 0xFF) + "." +
               ((num >> 16 ) & 0xFF) + "." +
               ((num >>  8 ) & 0xFF) + "." +
               ( num        & 0xFF);
    }

결국 이것은 약속이므로 임의대로 바꾸면 안됩니다.

부연설명을 드리자면,

※ DB Call 1. Maxmind 에서 나오는 DB Query

SELECT MOD(ROUND(1044455424 / 16777216), 256) AS X
,MOD(ROUND(1044455424 / 65536), 256) AS Y
,MOD(ROUND(1044455424 / 256), 256) AS A
,MOD(1044455424, 256) AS Z FROM DUAL;
Maxmind(http://www.maxmind.com/) 사이트에서 찾을  있는 DB Query 지만, 실은 이것과 위의 자바 상의 로직은 결과값이 틀립니다.

예를 들자면, 1357611007 로 확인했을때, 자바소스는 80.235.127.255 , DB Query 는 81 235 128 255 가 나옵니다.

※ DB Call 2.

SELECT MOD(TRUNC(1357611007 / 16777216), 256)
,MOD(TRUNC(1357611007 / 65536), 256)
,MOD(TRUNC(1357611007 / 256), 256)
,MOD(1357611007, 256) FROM DUAL;

만약 DB Call 로 검색할려고 한다면, 해당 방식으로 진행해야합니다. 비트 단위로 쉬프트 한 다음에 8자리 비트만 확인하여 각 자리 수를 확인하는 로직이므로 DB 도 마찬가지로 진행해야합니다.