추가 수정(241221): @Async 활용에 의한 사용자 경험 개선

회원가입 및 아이디/비밀번호 찾기 과정에서 이메일 발송 기능의 서버 응답 시간 단축 (3.2s -> 0.1s)

실제로 이메일 발송 속도가 빨라진 것은 아니지만, 이메일 인증 발송 버튼을 눌렀을 때 3초의 대기 시간이 발생하면 사용자는 불편을 느낄 수 있다. 이를 해결하기 위해 @Async를 활용하여 비동기 처리를 구현하였다.

 

 

 

 

이 글의 내용은 spring 구글계정 연동후 이메일 보내는 방법과 더불어 비동기 방식으로 응답시간 단축 및 사용자 경험 개선을 다루고 있다

 

 

 

우선 spring에 연동할 구글 계정에 대해서 설정해야된다

 

 

 

google 계정 설정법

 

 

spring 연동할 계정 로그인 후 gmail로 들어간다

 

 

우측 상단 톱니바퀴를 누르고 See all settings 클릭

 

 

 

 

 

상단 중앙쪽에 위치한 Forwarding and POP/IMAP 클릭

 

 

 

 

Enable IMAP 체크 후 적용한다

 

 

 

다시 처음과 같이 계정을 누른 후

 

 

 

보안으로 들어가 2단계 인증을 해준다(저는 핸드폰 인증으로 했습니다)

 

 

 

 

다음으로 상단 검색창에 앱 비밀번호를 치고 앱 비밀번호에 들어가준다

 

 

 

앱 비밀번호를 만들어서 16자리를 메모장에 복사해둔다

이 비밀번호가 spring에서 쓰일 비밀번호라 필요하다

 

 

Spring

pom.xml

<!--email-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-mail</artifactId>

</dependency>

 

 

pom.xml에 의존성 추가해준다

 

 

 

application.properties

spring.mail.host=smtp.gmail.com

spring.mail.port=587

spring.mail.username=아이디입력 ex) korea@gamil.com

spring.mail.password= 앱 비밀번호 입력 16자리

spring.mail.properties.mail.smtp.auth=true

spring.mail.properties.mail.smtp.starttls.enable=true

 

메일 설정이다

아이디와 아까 발급받은 앱 비밀번호를 입력해주면된다

 

 

 

 

메일보내는 서비스 클래스

@Service

@RequiredArgsConstructor

public class ImSignUpEmailService {

 

private final JavaMailSender javaMailSender;

 

 

//이메일 발송

public void sendEmail(String userEmail) {

 

SimpleMailMessage message = new SimpleMailMessage();

message.setTo(userEmail);

message.setSubject("Im 회원가입 인증번호");

message.setText("인증번호 : "+verification(userEmail));

javaMailSender.send(message);

 

}

}

 

이메일을 발송하는 메소드이다

 

JavaMailSender  > spring에서 이메일을 전송하는 데 사용되는 인터페이스이다. 이 객체를 이용해 이메일을 발송할수있다

 

sendEmail 메소드는 String userEmail 값을 받는데, 이 메소드를 호출할때 userEmail(회원가입시 입력한 유저의 아이디)를 받아서 

.setTo > 보내려고 하는 이메일(여기에 userEmail을 사용함)

.setSubject > 제목

.setText > 내용

 

이렇게 설정후에 send로 보내준다.

 

이 프로젝트에서 이메일이 사용될건 인증번호뿐이니 Im 회원가입 인증번호로 적어놓았고,

내용에는 다른 메소드에 인증번호를 만드는 기능을 구현하여 결과값을 넣어줬다

 

 

 

결과

 

 

 

 

이메일을 입력 후 인증 버튼을 누르니 성공적으로 메일이 보내졌다

 

 

기능은 완성됐지만 직접 사용해봤을 때 개선해야 될 점이 보였다

 

 

문제

 

 

 

이메일 연동 후 메일을 보내는 기능은 되지만 인증버튼을 눌럿을 때 인증번호가 발송됐다는 안내창이 늦게 나타나 순간 뭐지 렉인가? 버그인가 싶었엇다.(결국 완료는 됏지만 안내창이 뜨기까지 실제로 3.2초정도가 걸렸다....)

만약 실제 운영중인 사이트라면 사용자 입장에서는 불편함을 느낄수 있어

방법을 찾아보니 @Async 어노테이션으로 하는 방법이 있었다

 

 

@Async 어노테이션이란

메소드를 비동기적으로 실행되도록 한다. 즉 이 메소드를 호출하게되면 별도의 스레드에서 이메일을 발송하는 작업이 이루어진다. 즉, 이 작업이 끝날때까지 기다리지 않고 다른 작업이 계속 진행 될 수 있다는 것이다 

 

 

개선과정

 

config 클래스

@Configuration

@EnableAsync

public class AsyncConfig {

 

}

 

 

 

따로 비동기 관련 설정을 해주기 위한 config 클래스를 만들어주고 @EnableAsync 를 선언해주었다

이 어노테이션은 비동기 프로그래밍을 활성화하기 위함이고 @Async를 사용하기 위해 필요하다

 

보통 이 클래스 안에서 비동기 쓰레드 세부 설정등이 이루어진다.

 

 

메일보내는 서비스 class (수정)

@Service

@RequiredArgsConstructor

public class ImSignUpEmailService {

 

private final JavaMailSender javaMailSender;

 

//이메일 발송

@Async

public void sendEmail(String userEmail) {

 

SimpleMailMessage message = new SimpleMailMessage();

message.setTo(userEmail);

message.setSubject("Im 회원가입 인증번호");

message.setText("인증번호 : "+verification(userEmail));

javaMailSender.send(message);

 

}

 

메일을 보내는 메소드이다 아까와 다른점이 @Async 어노테이션이 붙었다.

 

이제 이 메소드를 호출하게되면 호출한 메소드에서는 남은 일들이 계속 진행되고  이 메소드의 역할인 이메일 발송도 이루어지게된다

 

 

개선결과

 

 

비동기 방식으로 진행하니 응답시간이 현저히 줄었다

 

인증 버튼을 눌렀을 때 "인증번호가 발송됐습니다" 안내창이 거의 바로 나오니 유저의 입장으로 생각하면 아무 불편함이 없었으며, 메일함에도 잘 보내진것을 확인했다

 

 

그렇다고 인증버튼을 누르고 안내창이 바로 나왔다 하더라도 메일이 바로 오는것은 아니다

(+인증버튼을 누르고 이메일을 확인하는데 새로고침을해도 나오지 않다가 약 3초정도 후에 오는것을 확인)  

 

 

즉, 비동기란

코드 내부에서 유저에게 안내창을 내주는 과정과 이메일 발송 과정의 작업을 서로독립적으로 처리해주는 것이며,

실질적으로 @Async 어노테이션을 설정하고 안하고 메일이 도착하는 시간은 비슷하다

 

그래도.. 유저의 회원가입 과정 중 이메일 인증을 한단계 한단계 생각해보면

인증버튼을 누르고 이메일을 확인하기 위해 로그인하고 받은메일함까지

가는 과정은 적어도 3초 이상의 시간이 걸릴테니,

@Async 비동기 방식이 사용자 경험에 있어서 더 긍정적이라고 생각한다

 

 

 

 

 

 

+ Recent posts