[Spring Framework] ์Šคํ”„๋ง ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

2025. 7. 25. 04:01ยท๐Ÿ› ๏ธBackend/๐ŸŒณSpring

โœ… 1. ๋น„๋™๊ธฐ(Asynchronous) ๋ž€?

1. ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ
2. ์›Œ์ปค ์Šค๋ ˆ๋“œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ฒ˜๋ฆฌ
3. ๋™์ž‘ ์ค‘ ๋น„๋™๊ธฐ ๋กœ์ง ๋ฐœ๊ฒฌ
4. ์›Œ์ปค ์Šค๋ ˆ๋“œ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์ฒ˜๋ฆฌ
5. ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์Šค๋ ˆ๋“œ ๋‘๊ฐœ๊ฐ€ ๋Œ์•„๊ฐ€๊ฒŒ ๋จ.
6. ์Šค์ผ€์ค„๋Ÿฌ์˜ ์˜ํ•ด ๋”ฐ๋กœ ๋™์‹œ์˜ ๋™์ž‘์„ํ•˜๊ฒŒ ๋จ.
  • ์–ด๋–ค ์ž‘์—…์„ ์š”์ฒญํ•œ ํ›„ ๊ทธ ์ž‘์—…์˜ ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ๋ฐ”๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๋ณดํ†ต ๊ตฌํ˜„์€ ์š”์ฒญ ํ•˜๋‚˜ ์Šค๋ ˆ๋“œ์—์„œ ๋ถ„๊ธฐ๋˜์–ด ๋™์‹œ์— ๋‹ค๋ฅธ ์ž‘์—…๋„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ.

โœ… 2. Spring ์—์„œ ๋น„๋™๊ธฐ(Asynchronous) ์ฒ˜๋ฆฌ

โœ… @EnableAsync๊ฐ€ ํ•˜๋Š” ์ผ ์š”์•ฝ ( ์• ๋„ˆํ…Œ์ด์…˜ ์‚ฌ์šฉ์‹œ ๋‚ด๋ถ€ ๋™์ž‘ )

AsyncAnnotationBeanPostProcessor ๋“ฑ๋ก
→ @Async ์• ๋„ˆํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ง€ํ•ด์„œ
→ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ **ํ”„๋ก์‹œ(proxy)**๋กœ ๊ฐ์‹ธ๊ณ , ๋น„๋™๊ธฐ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •

TaskExecutor (์Šค๋ ˆ๋“œ ํ’€) ์„ค์ •
→ @Async ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์‚ฌ์šฉํ•  Executor๋ฅผ ๊ฒฐ์ •ํ•จ
→ TaskExecutor๋ผ๋Š” ๋นˆ์ด ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉ
→ ์—†๋‹ค๋ฉด, ๊ธฐ๋ณธ SimpleAsyncTaskExecutor๋ฅผ ์‚ฌ์šฉ (๋น„์ถ”์ฒœ: ์Šค๋ ˆ๋“œ ์žฌ์‚ฌ์šฉ X)

๋น„๋™๊ธฐ ํ˜ธ์ถœ ํ๋ฆ„ ๊ด€๋ฆฌ
→ ํ”„๋ก์‹œ๊ฐ€ @Async ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ,
→ ํ•ด๋‹น ๋กœ์ง์„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ
  • ์Šคํ”„๋ง์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ณต์„ ํ•ด์ค€๋‹ค.
  • @EnableAsync ์• ๋„ˆํ…Œ์ด์…˜ ์„ค์ •์„ ํ•˜๊ฒŒ ๋˜๋ฉด, ์Šคํ”„๋ง ๋‚ด๋ถ€์ ์œผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ ์ž๋™์œผ๋กœ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ํ™œ์„ฑํ™”๋ฅผ ํ•ด์ค€๋‹ค.
  • ์ •์˜ํ•ด๋‘” @Async ์• ๋„ˆํ…Œ์ด์…˜์ด ํ˜ธ์ถœ์ด ๋  ๋•Œ ๋งˆ๋‹ค ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.
  • ์ฆ‰, ์Šค๋ ˆ๋“œ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
@Configuration
@EnableAsync
public class AsyncConfig {
    @Bean
    public Executor taskExecutor() { // ์Šค๋ ˆ๋“œ ํ’€ ์ง์ ‘ ์ •์˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
        // ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ์Šค๋ ˆ๋“œ ํ’€ ๊ตฌํ˜„์ฒด
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // ํ•ญ์ƒ ์œ ์ง€๋˜๋Š” ์ตœ์†Œ ์Šค๋ ˆ๋“œ ์ˆ˜
        executor.setMaxPoolSize(10); // ์ตœ๋Œ€ ์Šค๋ ˆ๋“œ ์ˆ˜ ์ œํ•œ
        executor.setQueueCapacity(100); // ๋น„๋™๊ธฐ ์ž‘์—… ์š”์ฒญ ๋Œ€๊ธฐ ํ ํฌ๊ธฐ
        executor.setThreadNamePrefix("AsyncExecutor-"); // ์Šค๋ ˆ๋“œ ์ด๋ฆ„ prefix ์ง€์ •
        executor.initialize(); // ์Šค๋ ˆ๋“œ ํ’€ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ
        return executor;
    }
}
  • Async ์„ค์ • ํŒŒ์ผ์€ ๋ณดํ†ต ์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์„ค์ •์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ํ•ด๋‹น ์„ค์ • Bean ์€ @Async ์—์„œ ์‚ฌ์šฉํ•  ์Šค๋ ˆ๋“œ ํ’€(TaskExecutor) ์„ ์ง์ ‘ ์ •์˜ํ•˜๋Š” ๊ณณ์ด๋‹ค.
  • setXorePoolSize(5) ๋ฉ”์„œ๋“œ๋Š” ํ•ญ์ƒ ์œ ์ง€๋˜๋Š” ์ตœ์†Œ ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ set ํ•  ์ˆ˜ ์žˆ๋Š” setter ์ด๋‹ค. ์‰ฝ๊ฒŒ๋งํ•ด, ๋น„๋™๊ธฐ ์ž‘์—…์ด ์—†์–ด๋„ 5๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ์ฒ˜์Œ์—” ์—ฌ๊ธฐ๊นŒ์ง€์˜ ์Šค๋ ˆ๋“œ ์ˆ˜๋งŒํผ๋งŒ ์ƒ์„ฑ์ด ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • setMaxPoolSize(10) ๋ฉ”์„œ๋“œ๋Š” ์ตœ๋Œ€ ์Šค๋ ˆ๋“œ ์ˆ˜ ์ œํ•œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ํ๊ฐ€ ๊ฐ€๋“ ์ฐจ๊ณ  ๋” ๋งŽ์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด, corePoolSize ์ด์ƒ์œผ๋กœ๋„ ์Šค๋ ˆ๋“œ๋ฅผ ํ™•์žฅํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋„ ์ตœ๋Œ€๋Š” ๊ธฐ์žฌํ•ด๋‘” ๊ฒƒ ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • setQueueCapaciry(100) ๋ฉ”์„œ๋“œ๋Š” ๋น„๋™๊ธฐ ์ž‘์—… ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ๋Œ€๊ธฐ ํ•  ์ˆ˜ ์žˆ๋Š” ํ์˜ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. corePoolSize ๋งŒํผ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค ์ฐผ์„ ๋•Œ๋Š” ์ด ํ์— ์ž‘์—…์„ ๋„ฃ์–ด์„œ ๋Œ€๊ธฐ๋ฅผ ์‹œํ‚จ๋‹ค. ์‰ฝ๊ฒŒ๋งํ•ด, ๊ธฐ์กด ์Šค๋ ˆ๋“œ์˜ ์‚ฌ์šฉ์ด ๋‹ค ๋˜๊ณ  ๋ฐ˜๋‚ฉ์ด ๋˜๋ฉด ์—ฌ๊ธฐ์„œ ๊บผ๋‚ด๋‹ค๊ฐ€ ์“ด๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋งŒ์•ฝ ํ๊ฐ€ ๊ฝ‰์ฐจ์„œ ํ•œ๊ณ„์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด ์ดํ›„์˜ ์ €์žฅ์€ RejectedExecutionException ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ์š”์ฒญ์„ ๋ณด๋ƒฟ์ง€๋งŒ, ์•„๋ฌด ์ผ๋„ ์•ˆ ์ผ์–ด๋‚˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ์Œ. ์ฆ‰, ์š”์ฒญ์ด ์ฆ๋ฐœ ํ•  ์ˆ˜ ์žˆ์Œ.
  • initialize() ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์Šค๋ ˆ๋“œ ํ’€์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœํ•ด์•ผ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

(1) ์ดํ›„์˜ ํ๋ฆ„ ์š”์•ฝ 

1 ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ์š”์ฒญ
2 Controller → Service ๊ณ„์ธต์—์„œ @Async ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
3 Spring์ด taskExecutor()๋กœ ์ •์˜๋œ ์Šค๋ ˆ๋“œ ํ’€์—์„œ ์›Œ์ปค ์Šค๋ ˆ๋“œ ๊บผ๋ƒ„
4 ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ์ด ์›Œ์ปค ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋จ
5 ๊ธฐ์กด ์š”์ฒญ ์Šค๋ ˆ๋“œ๋Š” ๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต

 

(2) Async ์‹คํ–‰ ์ˆœ์„œ

๐Ÿ” @Async์˜ ์‹คํ–‰ ์ˆœ์„œ (์š”์•ฝ)
1. ์‚ฌ์šฉ์ž๊ฐ€ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
2. corePoolSize ๋งŒํผ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰ (์ฆ‰์‹œ ์ฒ˜๋ฆฌ)
3. ๊ทธ ์ด์ƒ์€ queueCapacity๋งŒํผ ํ์— ์ €์žฅ (๋Œ€๊ธฐ ์ƒํƒœ)
4. ํ๋„ ๊ฝ‰ ์ฐจ๋ฉด → maxPoolSize๋งŒํผ ์Šค๋ ˆ๋“œ๋ฅผ ์ถ”๊ฐ€ ์ƒ์„ฑ
5. ๋ชจ๋“  ํ•œ๊ณ„ ๋‹ค ์ฐผ์„ ๋•Œ → RejectedExecutionException ๋ฐœ์ƒ

โœ… 3. Async ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ Queue์˜ ํœ˜๋ฐœ์„ฑ ๋ฐ ์ž‘์—… ๋ˆ„๋ฝ ๋ฌธ์ œ

  • @Async ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ThreadPoolTaskExecutor ๋‚ด๋ถ€์—๋Š” ์ž‘์—…์„ ๋ณด๊ด€ํ•˜๋Š” ํ(Queue) ๊ฐ€ ์กด์žฌํ•จ.
  • ์ด ํ๋Š” ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์—์„œ๋งŒ ์œ ์ง€๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค ๋ณด๋‹ˆ, JVM ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์žฌ์‹œ์ž‘ ๋˜๋ฉด ํ ์•ˆ์— ์žˆ๋˜ ์ž‘์—… ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ, ์„œ๋ฒ„ ์žฅ์• , ์žฌ๋ฐฐํฌ ์‹œ์— ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋‚ ์•„๊ฐˆ ์œ„ํ—˜์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์ค‘์š”ํ•œ ์š”์ฒญ์ด ๋‚ ๋ผ๊ฐ€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

(1) ์ด๊ฒŒ ๋ฌธ์ œ์ธ ์ด์œ 

  • ๋น„๋™๊ธฐ ์ž‘์—…์—๋Š” ์ฃผ๋กœ ์ค‘์š”ํ•œ ์ž‘์—…์ธ ์ด๋ฉ”์ผ ์ „์†ก, ์•Œ๋ฆผ, ๊ฒฐ์ œ ํ›„์ฒ˜๋ฆฌ ๋“ฑ์„ ์ฒ˜๋ฆฌ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ์„ ํ•˜๋Š”๋ฐ, ์ด ์ž‘์—…์ด ๋ˆ„๋ฝ๋˜๋ฉด ์„œ๋น„์Šค ์‹ ๋ขฐ์„ฑ์— ์ง์ ‘์ ์ธ ์•…์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โœ… 4. Queue์˜ ํœ˜๋ฐœ์„ฑ ๋ฐ ์ž‘์—… ๋ˆ„๋ฝ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

(1) ์Šค๋ ˆ๋“œํ’€ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ํ ์‚ฌ์ด์ฆˆ๋ฅผ ๋„ˆ๋ฌด ์ž‘๊ฒŒ ํ•˜๋ฉด ์š”์ฒญ ํ•œ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ RejectedExecutionException ๋ฐœ์ƒ
  • ํ ์‚ฌ์ด์ฆˆ๋ฅผ ๋„ˆ๋ฌด ํฌ๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€, ์ž‘์—… ์ง€์—ฐ ๊ฐ€๋Šฅ์„ฑ์ด ์ฆ๊ฐ€ํ•จ.
  • ThreadPoolWaskExecutor ์˜ ํ ํฌ๊ธฐ, ํ™œ์„ฑ ์Šค๋ ˆ๋“œ ์ˆ˜, ์™„๋ฃŒ ์ž‘์—… ์ˆ˜ ๋“ฑ ํ˜„์žฌ ์ƒํƒœ๋ฅผ Spring ์˜ Actuator ๋‚˜ JMX, Prometheus + Grafana ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ†ตํ•ด ํ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ฆ๊ฐ€๋กœ ์ธํ•ด ํ๊ฐ€ ๊ฐ€๋“์ฐจ๋Š” ํ˜„์ƒ์„ ๋ฐœ๊ฒฌ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์„œ๋ฒ„ ์ž์›์„ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ํ•ด๊ฒฐ์„ ์œ„ํ•ด์„œ๋Š” ๋กœ๊ทธ๋‚˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ†ตํ•ด ํ ํฌ๊ธฐ๋ฅผ ์ ์ ˆํ•œ ์ˆ˜์ค€์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ.

(2) ๊ฑฐ์ ˆ ์ •์ฑ…(RejectedExecutionHandler) ์„ค์ •

  • ์ž‘์—… ์š”์ฒญ์ด ๋„ˆ๋ฌด ๋งŽ์•„ ํ์™€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค ์ฐผ์„ ๋•Œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ๋ฒ„๋ฆฌ๋Š” ์ •์ฑ… ๋“ฑ ์ ์ ˆํ•œ ๋ฐฉ์–ด ๋กœ์ง์„ ๋‘๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ํ•˜์ง€๋งŒ, ์ด ๋ฐฉ์‹์€ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ์ด๋ผ๊ธฐ ๋ณด๋‹จ ์ฆ์ƒ ์™„ํ™”๋‚˜ ์ž„์‹œ ๋Œ€์‘์— ๊ฐ€๊นŒ์šด ๋ฐฉ์‹์ด๋‹ค.

(3) MQ(Message Queue) ์‚ฌ์šฉ

  • MQ ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์ƒ์„ฑ์ด ๋˜๋ฉด ํ•ด๋‹น ์ž‘์—…์„ ๋ฉ”์‹œ์ง€๋กœ ๋ณด๊ณ , Queue ์— ์ €์žฅ์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ํ•ด๋‹น MQ ์˜ ์ข…๋ฅ˜๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ RabbitMQ, Kafka ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
  • ๋‘ MQ ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ํ์— ์ €์žฅ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด ์ธ๋ฉ”๋ชจ๋ฆฌ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹ค.
  • ๋ฉ”์‹œ์ง€๊ฐ€ ๋””์Šคํฌ์— ์ €์žฅ๋˜์–ด ์„œ๋ฒ„ ์žฅ์• ์—๋„ ์ž‘์—… ์†์‹ค์ด ์—†๋Š” ๋‚ด๊ตฌ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
  • ์†Œ๋น„์ž ์ˆ˜ ์กฐ์ ˆ๋กœ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐ ์Šค์ผ€์ผ ์•„์›ƒ์ด ๊ฐ€๋Šฅ ์ฆ‰, ์ฒ˜๋ฆฌ๋Ÿ‰ ์กฐ์ ˆ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • ์™ธ๋ถ€์— ๋ถ„๋ฆฌ๋œ ํ ์‹œ์Šคํ…œ์œผ๋กœ ์•ˆ์ •์ ์ด๊ณ  ์œ ์—ฐํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋„์™€์คŒ.
  • ์‹คํŒจํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ„๋„ ํ๋กœ ๋ณด๋‚ด ์žฌ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋„์™€์คŒ.
  • ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚˜๋ˆ  ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ. ์ฆ‰, ๋ถ„์‚ฐ ํ™˜๊ฒฝ์„ ์ง€์›ํ•ด์ค€๋‹ค๋Š” ์˜๋ฏธ์ž„. ๋งค์šฐ ์ข‹์€ ์žฅ์ ์ธ๋“ฏ..

โœ… 5. ์ •๋ฆฌ

  • @Async๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œํ’€(ThreadPoolTaskExecutor) ์„ ์ด์šฉํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•œ๋‹ค.
  • ๊ฐ„๋‹จํ•˜๊ณ  ์ž‘์€ ๊ทœ๋ชจ ๋‚ด๋ถ€ ๋น„๋™๊ธฐ ์ž‘์—…์ด๋ผ๋ฉด @Async ๊ฐ€ ๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•˜์ง€๋งŒ ์•ˆ์ •์„ฑ, ํ™•์žฅ์„ฑ, ๋ถ„์‚ฐ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์žฅ์•  ์‹œ์—๋„ ๋ฉ”์‹œ์ง€ ์œ ์‹ค์„ ๋ง‰์•„์•ผ ํ•œ๋‹ค๋ฉด MQ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ๋‚ซ๋‹ค๊ณ  ํŒ๋‹จ์ด ๋จ.

'๐Ÿ› ๏ธBackend > ๐ŸŒณSpring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring WebSocket] ์Šคํ”„๋ง์—์„œ ์›น ์†Œ์ผ“ ๋™์ž‘  (0) 2025.07.19
[Spring Framework] Servlet API, HttpServlet, DispatcherServlet, Tomcat ์•Œ์•„๋ณด๊ธฐ  (0) 2025.06.28
[Spring Framework] HttpServletRequest - HTTP ๋ฉ”์‹œ์ง€ ๊ฐ’ ๋‹ด๊ธฐ๋Š” ๊ณผ์ • (์š”์ฒญ)  (1) 2025.06.27
[Spring Framework] @RestController & @Controller ์ฐจ์ด  (0) 2025.05.12
[Spring Framework] DispatcherServle  (0) 2025.05.12
'๐Ÿ› ๏ธBackend/๐ŸŒณSpring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring WebSocket] ์Šคํ”„๋ง์—์„œ ์›น ์†Œ์ผ“ ๋™์ž‘
  • [Spring Framework] Servlet API, HttpServlet, DispatcherServlet, Tomcat ์•Œ์•„๋ณด๊ธฐ
  • [Spring Framework] HttpServletRequest - HTTP ๋ฉ”์‹œ์ง€ ๊ฐ’ ๋‹ด๊ธฐ๋Š” ๊ณผ์ • (์š”์ฒญ)
  • [Spring Framework] @RestController & @Controller ์ฐจ์ด
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด๋ณด๊ธฐ (159)
      • ๐ŸŽ“๋ฐฉ์†กํ†ต์‹ ๋Œ€ํ•™๊ต (26)
        • ๐Ÿ–ฅ๏ธ์ปดํ“จํ„ฐ๊ณผํ•™๊ณผ (1)
        • ๐ŸŒ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ… (11)
        • โš™๏ธ์ปดํ“จํ„ฐ์˜ ์ดํ•ด (11)
        • ๐Ÿ›๏ธ์„ธ๊ณ„์˜์ •์น˜์™€๊ฒฝ์ œ (3)
      • ๐Ÿ› ๏ธBackend (56)
        • ๐Ÿ“š๋ฐฑ์—”๋“œ ๊ณต๋ถ€ (4)
        • โ˜•Java (23)
        • ๐ŸŒณSpring (13)
        • โšกPython (13)
        • JavaScript (1)
        • ๐Ÿ›ข๏ธDatabase (0)
        • Algorithm Problem Solving (2)
      • ๐ŸŒ Network (7)
        • ๐Ÿ“œHTTP (7)
      • ๐Ÿš€DevOps (1)
      • Data Structure (1)
      • โ›บ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ (65)
      • ์ •๋ณด (1)
      • ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ธ€ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • GitHub
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ฐฉ์†ก๋Œ€
    ํด๋ผ์šฐ๋“œ
    ์ž๋ฐ”
    Java
    ์„ธ๊ณ„ํ™”
    ๋ฐฉํ†ต๋Œ€
    spring
    ์Šคํ”„๋ง
    Spring Framework
    ์ปดํ“จํ„ฐ์˜ ์ดํ•ด
    ํด๋ž˜์Šค
    ๋‹คํ˜•์„ฑ
    ๋ฐฉ์†กํ†ต์‹ ๋Œ€ํ•™๊ต
    ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ…๊ฐœ๋ก 
    ํŒŒ์ด์ฌ
    ์ปดํŒŒ์ผ๋Ÿฌ
    Python
    ์ž…์ถœ๋ ฅ
    ์œ ๋น„์ฟผํ„ฐ์Šค ์ปดํ“จํŒ…
    ์œ ๋น„์ฟผํ„ฐ์Šค
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.1
junbin2
[Spring Framework] ์Šคํ”„๋ง ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”