Project/์‹นํ‹”์›€

[์‹นํ‹”์›€] 11/08 ๊ฐœ๋ฐœ์ผ์ง€ ํšŒ์›๊ฐ€์ž…์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ ๋ฐ›๊ธฐ 3 : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ๊ฐœ์„ 

ํ•œ33 2024. 11. 11. 01:29

๐Ÿ’ก ๋ชฉํ‘œ

 

๊ธฐ์กด์— ์ด๋ฉ”์ผ ๊ฒ€์ฆ ๊ณผ์ •์—์„œ ์ธ์ฆ๋ฒˆํ˜ธ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์œ„ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ํ‰๊ท  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% ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์กŒ๋‹ค!