원문 주소 : http://fiaa.net/aqua/archives/244 

하지만 페이지로 접속이 되지 않아 구글 저장 페이지를 열어 보았습니다.

http://webcache.googleusercontent.com/search?q=cache:YaaoufhV-UYJ:fiaa.net/aqua/archives/244+&cd=1&hl=ko&ct=clnk&gl=kr&lr=lang_ko

자바메일로 IMAP 폴더 사이즈 계산이 느린 이유

메일이 52,630통 정도 되는 INBOX가 있다.
개별 메일의 사이즈는 945bytes 정도 된다.

자바메일로 folder size를 요청하면 대략 1분 정도가 소요된다.
하지만 펄로 folder size를 요청하면 4~5초 정도가 소요된다.

둘의 차이는?
당연히 라이브러리에서 IMAP Query 차이가 자바가 느리게 실행된 이유다.

먼저 에서 날린 쿼리를 보자.

1 LOGIN username password
2 EXAMINE INBOX
3 UID SEARCH ALL
4 UID FETCH 145,147:183,186,190:194,197:244,251:253,256:52785,52806:52810 (RFC822.SIZE)

다음으로 자바에서 날린 쿼리를 보자.

A1 LOGIN username password
A2 CAPABILITY
A3 LIST “” INBOX
A4 EXAMINE INBOX
A5 FETCH 1 (ENVELOPE INTERNALDATE RFC822.SIZE)
A6 FETCH 2 (ENVELOPE INTERNALDATE RFC822.SIZE)
A7 FETCH 3 (ENVELOPE INTERNALDATE RFC822.SIZE)


A52640 FETCH 52810 (ENVELOPE INTERNALDATE RFC822.SIZE)

[차이점 1]
FETCH명령을 사용하는 방법이 다르다.
펄은 연속된 UID는 147:183 이런식으로 쿼리를 사용했지만,
자바는 UID 마다 각각의 쿼리를 날렸다.

[차이점 2]
FETCH 명령을 쓸 때 옵션이 다르다.
펄에서는 RFC822.SIZE만 쓴 반면에 자바에서는 ENVELOPE INTERNALDATE까지 썼다.
사이즈만 계산하는데 굳이 ENVELOPE INTERNALDATE를 붙일 필요가 없다.

[결론]
1. 자체 라이브러리를 만들어야 한다.
2. 자바메일은 잘못된 IMAP Query 방법 때문에 서버의 불필요한 IO만 증가 시켜서 처리 속도를 느리게 했다.

Posted by 오달봉
,