더북(TheBook)

코드가 좀 복잡하지만 성공적으로 실행되었다. 지금까지 설명한 MIME에 대한 추가된 내용과 파일처리에 대해 설명한 내용을 이해했다면 이번 예제코드를 이해할 때 큰 무리는 없을 것이다. 따라서 이번 예제코드 중 앞 부분에서 다루지 않은 내용에 대해서만 추가로 알아 보자.

vf_file_buff := fn_get_raw_file (vv_directory, vv_filename);
UTL_FILE 패키지를 이용한 fn_get_raw_file 함수를 통해 파일 내용을 RAW 타입으로 반환해 vf_file_buff 변수에 넣고 있다.

vn_file_len := DBMS_LOB.GETLENGTH(vf_file_buff);
DBMS_LOB 시스템 패키지의 GETLENGTH 함수를 사용해 vf_file_buff 변수의 크기를 알아냈다.

WHILE vn_pos < vn_file_len LOOP ~ END LOOP;
이진 데이터인 파일을 메일로 보내려면 문자형으로 변환해서 보내야 한다. 이를 위해 BASE64 인코딩을 해야 하는데 이는 UTL_ENCODE.BASE64_ENCODE 함수를 사용해 처리한다. 문제는 한 줄에 넣을 수 있는 최댓값이 76 바이트다. 따라서 76 바이트씩 끊어 입력하기 위해 WHILE문을 사용한 것이다. 그런데 이를 위해 사용한 vn_base64_max_len 변수 값을 54로 설정한 이유는 뭘까? 실제로 데이터를 끊는 부분의 코드는 vf_temp_buff := UTL_RAW.SUBSTR ( vf_file_buff, vn_pos, vn_divide); 이다. UTL_RAW 시스템 패키지의 SUBSTR 함수를 사용하고 있는데, vf_file_buff를 vn_pos부터 vn_divide 까지 잘라내 반환하라는 의미다. vn_divide는 vn_base64_max_len 값과 같이 54이며 결국 데이터를 76이 아닌 54 바이트씩 끊고 있다. 이렇게 하는 이유는 보통 BASE64 인코딩을 하면 인코딩된 데이터는 대략 원본 데이터의 (¾)만큼 커진다. 따라서 76 * (¾) = 54 바이트씩 끊어 이 결과를 BASE64 인코딩한 뒤 입력한 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.