본문 바로가기

문제 해결 경험

Thread를 활용한 비동기 처리

회사에서 신규 고객센터를 개발하는 일을 담당하게 되었습니다.

어느 정도 고객센터 개발이 완료되는 시점에서 고객들의 상담 접수 및 상담원들의 상담 완료 처리가 되면 고객들에게 이메일 알림을 보내는 기능을 추가하게 되었고, 실제로 JavaMail 라이브러리만 다운받으면 쉽게 기능 구현을 할 수 있었습니다.

기능 구현을 완료한 시점에 테스트를 해 본 결과 상담 접수 시간이 3초 ~ 5초 정도 늘어난 것을 발견하였고, 원인은 이메일 전송 때문이라는 것을 알게 되었습니다.

고객센터 상담 건 접수 기본 로직

먼저, 간단하게 고객센터의 기본 로직은 4가지 단계로 이루어져 있습니다.

1. 고객들의 문의 접수

2. AWS S3에 이미지 저장

3. 상담원들에게 상담 건 자동 배분

4. 이메일 전송(알림용)

상담 건 접수 기본 로직

이메일 전송 부분이 추가 되면서 3~5초 정도의 응답 대기 시간 발생!!

Thread를 활용하여 비동기 처리

생각을 해보면, 상담 건 접수 로직에서 에러가 발생하지 않고 정상적으로 처리 되었을 경우 클라이언트(회원)가 굳이 이메일 전송을 위해 대기할 필요가 없다고 생각하였습니다. 마찬가지로 상담원 분들도 내부 admin에서 상담건 완료 처리가 되었을 경우 문의를 주신 고객에게 이메일이 전송되게 되는데, 굳이 3~5초의 시간을 대기할 필요가 없다고 생각하였습니다.

그래서 아래와 같이 이메일 전송 부분을 Thread를 생성하여 비동기로 처리를 하게 되었습니다.

// 문의등록
@Transactional
public boolean insertConsult(ConsultDto dto) throws Exception {
    //===========================================
    // 1.상담문의 저장
    //===========================================
    try {
    	~~ 코드 내용 ~~
    } catch (Exception e) {
        logger.error("~~");
        throw e;
    }

    //===========================================
    // 2.파일저장
    //===========================================
    try {
        ~~ 코드 내용 ~~
    } catch (Exception e) {
    	logger.error("~~");
        throw e;
    }

    //===========================================
    //3. 상담원에게 자동배분
    //===========================================
    try {
    	~~ 코드 내용 ~~
    } catch (Exception e) {
    	logger.error("~~");
        throw e;
    }
    
    //===========================================
    //4. 이메일 전송(예시)
    //===========================================
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            ~~ 메일 전송 로직 ~~
        }
    };
    Thread thread = new Thread(runnable);
    thread.start();
    return true;
}

 

물론 상담원 분들이 처리하시는 내부 admin에서도 Thread를 활용하여 이메일 전송 로직을 비동기처리하였습니다.

'문제 해결 경험' 카테고리의 다른 글

@Transactional 격리 수준 - 오류 발생 경험  (0) 2023.01.08