lottie
Seungjun's blog
blog
issue: 동기적 메서드가 비동기적으로 작동하는 경우
import javax.mail.Transport;

for(int i =0; i<3; i++) {
				try {
					Transport.send(msg);
					responseCode = Constants.CODE_OK;
					break;
				} catch(Exception e) {
					logger.log(i < 2 ? Level.WARNING : Level.SEVERE,String.format("error AccessTokenExpiredException : %s", e.getMessage()),e);
					responseCode = Constants.CODE_INTERNAL_ERROR;
				}
			}

동기적으로 작동하는 자바 메서드에서 계속해서 비동기적으로 작동하는 모습이 발견되었다.


디버깅을 진행해보니 for문, 그리고 try, catch문이 문제였다.

Transport.send(); 메서드는 기본적으로 동기적으로 작동하고 네트워크 상황 또는 외부 서버상황으로 작동이 원활하지 않은 경우 Block 이 발생한다.

문제는 이부분에서 try, catch 를 함께 사용해서 문제가 되었다.

위 코드와 같이 사용하는 경우 Transport.send() 가 동기적으로 작동하면서 Block이 발생하는 경우, exception 으로 분류 되어 catch 문으로 프로세스가 진행되어 마치 메서드가 비동기적으로 작동하는 것 처럼 보였다.


위 판단은 완전히 잘못되었었다. 좀 더 구글링하고 공부를 한 결과

Block된다고 exception으로 빠지지 않는다는것을 알게되었다.

오히려 Blocking이 발생함으로써 더욱 동기적으로 작동한다.

그렇다면 원인은 무엇일까 하고 좀 더 찾아본 결과...

javax.mail api 버그로 판단되었다.

(참고 자료:https://github.com/bbottema/simple-java-mail/issues/198)


버전업 결과 해당 이슈는 해결되었고, 결국 패키지 버그인 걸로 결론났다. 이런 형태의 버그는 원인을 파악하기 힘들어 꽤나 고생했다.

버그의 원인을 찾을때 외부 요인을 철저히 통제하고 로그를 찍어 테스트 해야할 듯 하다.