โ 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 |