포럼

제가 프로그램쪽은 잘 몰라서 지식이 많이 부족합니다.
앞으로 이야기하는 내용에 잘못된 점은 지적해주시고 좋은 방법이 있다면 이야기해주셨으면 합니다.


XE의 core중 core는 sequence설계입니다. XE는 그 sequence를 담을 정수형을 bigint로 설정하였습니다.

bigint

-2^63(-9223372036854775808) ~ 2^63-1(9223372036854775807) 8바이트


최대수인 값을 직접 document_srl에 입력 한 후 돌려보았습니다. 문제없이 조회, 수정 되었습니다. 하지만 저의 고민은 이곳이 아닌 다른곳에서부터 시작되었습니다.


function getNumberingPath($no, $size=3) {
    $mod = pow(10, $size);
    $output = sprintf('%0'.$size.'d/', $no%$mod);
    if($no >= $mod) $output .= getNumberingPath((int)$no/$mod, $size);
    return $output;
}

echo getNumberingPath(9223372036854775807);


결과

-01/000


일반 php로는 수를 담고 출력은 되지만 연산이 들어가게되면 올바른 처리를 하지못하게 됩니다.

9.22337203685E+18


실제 저런 터무니 없는 수까지 도달은 상당히 어려우니 일단 어느자릿수부터 문제가 나왔는지 테스트해보았습니다.

echo getNumberingPath(999999999);

결과

999/999/999


php의 조건상 9자리실제 10자리까지가 한계입니다.

XE는 sequence가 9자리를 넘어가게되면 모든 기능이 전부다 정상적인 동작이 되지 못하며, 첨부파일 등 sequence를 연산하는 곳에 대해서 문제가 발생하고 맙니다. 이 말은 결국 XE가 사용하가능한 데이터의 수는 000000000~999999999 = 1000000000 이라는 결과가 됩니다.

9.22337203685E+18처럼 나오는 수를 숫자모양처럼 나오게는 가능합니다.


function getNumberingPath($no, $size=3) {
    $mod = pow(10, $size);
    $output = sprintf('%0'.$size.'d/', sprintf("%.0f",$no)%$mod);
    if($no >= $mod) $output .= getNumberingPath((int)sprintf("%.0f",$no)/$mod, $size);
    return $output;
}
    
echo getNumberingPath(9223372036854775807);

결과

647/484/147/002/


하지만 이것은 그냥 그럴듯하게 보이게할뿐 결코 올바른 정보가 아닙니다. 입력한 숫자가 10자릿수를 넘는 순간 저 수만 나오게되니까요.


제가 이 문제 때문에 짧은 시간이지만 몇일간 여러 자료를 보고 검색을 해보았지만 결국 일반 php를 이용해서는 극복이 안되는걸로 결론을 냈습니다. 만약 이 부분에 대해서 규칙에 얽매이지 않고 연산처리없이 받은 수 그대로 폴더를 생성해낸다면 XE가 사용가능한 데이터 수는 bigint 자료형 그대로 사용되지 않을까 생각합니다.
연산처리 외에 기본적인 처리에 대해서는 pico님께서 이슈를 이미 남기셨더군요.


XE공홈에 sequence는 현재 8자리이네요. 앞에 설명한대로 10자리부터 이상증상이 나온걸 고려해본다면 9자리의 도달은 지극히 일반적이며 결코 무한이 아니라고 봅니다.


위의 문제점에 대해서 XE개발팀 이하 고수여러분들께서 좋은 방법이나 해결 방향을 고민하고 계시다면 어떠한 방법을 해보고계신지 이야기해주셨으면 합니다.