추가 수정(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.comspring.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 비동기 방식이 사용자 경험에 있어서 더 긍정적이라고 생각한다
'개인프로젝트 > I'm' 카테고리의 다른 글
Spring 회원가입 후 로그인/로그아웃 HttpSession 적용 (0) | 2024.12.27 |
---|---|
Spring JPA 회원가입 + 비밀번호 암호화 Spring security(+회원 UUID 고유코드 생성)(241229 서버 2차 조건 검증 기능 추가) (0) | 2024.12.24 |
Spring 회원가입 시 인증번호 일치 여부 확인 / redis 사용 (2) | 2024.12.21 |
spring+jpa (회원가입시 아이디 중복검사 활용사례) (0) | 2024.12.15 |
I'm 프로젝트 시작 (0) | 2024.12.15 |