λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Project/싹틔움

[싹틔움] 11/08 κ°œλ°œμΌμ§€ νšŒμ›κ°€μž…μ‹œ 이메일 인증 λ°›κΈ° 3 : 비동기 처리λ₯Ό ν†΅ν•œ μ„±λŠ₯κ°œμ„ 

by ν•œ33 2024. 11. 11.

πŸ’‘ λͺ©ν‘œ

 

기쑴에 이메일 검증 κ³Όμ •μ—μ„œ 인증번호 μš”μ²­μ„ 보내면 μœ„ 이미지와 같이 평균 4.18 초의 μš”μ²­μ‹œκ°„μ΄ κ±Έλ Έλ‹€.

 

1. μ‹€μ œ μ„œλΉ„μŠ€λ₯Ό μš΄μ˜ν•˜λŠ” μž…μž₯μ—μ„œλŠ” μ‚¬μš©μžκ°€ νšŒμ›κ°€μž… μ ˆμ°¨κΉŒμ§€ λ“€μ–΄μ™”λ‹€λ©΄ λΉ λ₯΄κ²Œ νšŒμ›κ°€μž… 절차λ₯Ό 갖도둝 ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€. λ§Œμ•½ 이메일 인증 λ²„νŠΌμ„ λˆŒλ €λŠ”λ° 4.2 μ΄ˆλ‚˜ μ„œλ²„μ˜ 응닡을 기닀리고 μžˆλ‹€λ©΄ μ‚¬μš©μžκ°€ νšŒμ›κ°€μž…μ„ μ‹œλ„ν•œ 것을 ν›„νšŒν•΄λ²„λ¦΄ 지도 λͺ¨λ₯Έλ‹€.

 

2. 이메일 λ°œμ†‘μ€ μƒλŒ€μ μœΌλ‘œ μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ΄κΈ° λ•Œλ¬Έμ—, 이λ₯Ό λΉ„λ™κΈ°λ‘œ μ²˜λ¦¬ν•˜λ©΄ 이메일 λ°œμ†‘ λŒ€κΈ° 쀑에도 λ‹€λ₯Έ μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆμ–΄μ„œ μ„œλ²„ λ¦¬μ†ŒμŠ€λ₯Ό 효율적으둜 μ‚¬μš©ν•  수 μžˆμ–΄ μš”μ²­ λŒ€κΈ°μ‹œκ°„μ΄ 많이 쀄 κ²ƒμœΌλ‘œ μ˜ˆμƒλœλ‹€.

 

3. 이메일 λ°œμ†‘ μž‘μ—… 쀑 λ„€νŠΈμ›Œν¬ μ§€μ—°μ΄λ‚˜ 이메일 μ„œλ²„μ˜ 응닡 지연이 λ°œμƒν•˜λ”λΌλ„, μ„œλ²„μ˜ νšŒμ›κ°€μž… μ‘λ‹΅μ‹œκ°„μ—λŠ” 영ν–₯이 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ ν•΄μ•Όν•œλ‹€.

 

μ΄λŸ¬ν•œ μ΄μœ λ“€λ‘œ λ‚˜λŠ” 이메일 전솑 λ‘œμ§μ„ λΉ„λ™κΈ°λ‘œ μ²˜λ¦¬ν•˜κΈ°λ‘œ ν–ˆλ‹€.


AsyncConfig

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    @Bean(name = "emailTaskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10); // κΈ°λ³Έ μŠ€λ ˆλ“œ 수
        executor.setMaxPoolSize(20); // μ΅œλŒ€ μŠ€λ ˆλ“œ 수
        executor.setQueueCapacity(100); // λŒ€κΈ° 큐의 크기
        executor.setThreadNamePrefix("EmailThread-");
        executor.initialize();

        // μŠ€λ ˆλ“œ ν’€μ˜ μƒνƒœλ₯Ό 둜그둜 좜λ ₯
        logThreadPoolStatus(executor);

        return executor;
    }

    private void logThreadPoolStatus(ThreadPoolTaskExecutor executor) {
        System.out.println("Active Threads: " + executor.getActiveCount());
        System.out.println("Total Tasks: " + executor.getThreadPoolExecutor().getTaskCount());
        System.out.println("Completed Tasks: " + executor.getThreadPoolExecutor().getCompletedTaskCount());
    }
}

 

μ“°λ ˆλ“œ 수 λ“± μ“°λ ˆλ“œ κ΄€λ ¨ μ˜΅μ…˜ 값듀을 λͺ…μ‹œν•΄μ£Όκ³ , ThreadPoolTaskExecutor λ₯Ό μ΄μš©ν•΄μ„œ 기쑴에 μ‚¬μš©λœ μ“°λ ˆλ“œλ₯Ό μž¬μ‚¬μš©ν•˜λ„λ‘ μ„€μ •ν–ˆλ‹€.


EmailConfig

@Async("emailTaskExecutor")
public CompletableFuture<Boolean> sendCertificationEmail(String email, String certificationNumber) {

 

비동기 μ²˜λ¦¬ν•˜κ³ μž ν•˜λŠ” λ©”μ„œλ“œ μœ„μ— @Async("emailTaskExecutor") 을 걸어쀬닀.


SsakTiumApplication

@SpringBootApplication
@EnableJpaAuditing
@EnableAsync
@EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO)
public class SSakTiumApplication {

    public static void main(String[] args) {
        SpringApplication.run(SSakTiumApplication.class, args);
    }

}

 

main application 에 κ°€μ„œ μœ„μ— @EnableAsync μ–΄λ…Έν…Œμ΄μ…˜μ„ 달아쀬닀.

 

πŸ’‘ 비동기 처리λ₯Ό 톡해 평균 4.18μ΄ˆμ—μ„œ 평균 μ•½ 1.04초둜 75.2% μ„±λŠ₯ κ°œμ„ μ΄ μ΄λ£¨μ–΄μ‘Œλ‹€!