๊ฐ์

ํ์ฌ ์ ํฌ Subport์์๋ ๊ตฌ๋ ๊ฒฐ์ ์ผ์ด ๋ค๊ฐ์ค๋ฉด ์ด๋ฉ์ผ๋ก ์๋ฆผ์ ๋ฐ์กํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ์๋ฆผ ์ค์ ์ ON/OFF๊ฐ ๊ฐ๋ฅํ๊ณ ๊ฒฐ์ 1์ผ ์ ๋๋ 3์ผ ์ ์ ์ ํํ ์ ์์ต๋๋ค.
๋ฉ์ผ ๋ฐ์ก ๋ก์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ค์ผ์ค๋ฌ๋ฅผ ํตํด ๋งค์ผ ์ค์ 6์ 30๋ถ์ ์ค๋์ด ๋ฐ์ก์ผ์ธ ๊ตฌ๋ ์ ๋ณด๋ฅผ ์กฐํํ์ฌ ์ด๋ฉ์ผ ๋ฐ์ก์ฉ ๊ฐ์ฒด ์์ฑ
- ํด๋น ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ 7์์ ์ด๋ฉ์ผ ๋ฐ์ก
@Transactional(readOnly = true)
public void send(LocalDateTime now) {
List<EmailNotification> emailNotifications = getEmailNotifications(now, SendingStatus.PENDING);
log.info("์ด๋ฉ์ผ ๋ฐ์ก ์์ - ๋์ ๊ฑด์: {}", emailNotifications.size());
Map<String, List<EmailNotification>> groupedEmailNotifications = emailNotifications.stream()
.collect(Collectors.groupingBy(EmailNotification::getRecipientEmail));
for (Map.Entry<String, List<EmailNotification>> entry : groupedEmailNotifications.entrySet()) {
emailSender.send(entry.getValue(), false, now); // ๋๊ธฐ ํธ์ถ
}
log.info("์ด๋ฉ์ผ ๋ฐ์ก ์์ฒญ ์๋ฃ - ์์ ์ ์: {}", groupedEmailNotifications.size());
}
๊ทธ๋ฐ๋ฐ ๋ชจ๋ ์ด๋ฉ์ผ ๊ฐ์ฒด๋ฅผ ์กฐํํ ๋ค ๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ค ๋ณด๋ ์ฒ๋ฆฌ ์๊ฐ์ด ๊ฝค ๊ธธ์์ต๋๋ค. ๋ฌผ๋ก ์ค์๊ฐ ์๋ฆผ์ด ์๋ ๋งํผ ์๋น์ค ์ด์์๋ ํฐ ์ํฅ์ด ์์ง๋ง, ๊ทธ๋งํผ ์ค๋ ๋๊ฐ ๋ถํ์ํ๊ฒ ์ค๋ ์ ์ ๋๊ณ ํ๋ฆฌํฐ์ด ์ธ์คํด์ค ํ๊ฒฝ์์๋ ์ด๊ฒ์ด ๋ถ๋ด๋ ์ ์๋ค๊ณ ํ๋จํ์ต๋๋ค.

์ฐธ๊ณ )
์ค์ ๋ก ์๋ฐฑ, ์์ฒ ๊ฑด์ ๋ฉ์ผ์ ๋ฐ์กํ๋ ๊ฒ์ OCI์ ์ 3,000๊ฑด ์ ํ๊ณผ ์คํธ ์ฒ๋ฆฌ ์ํ์ด ์์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค. ๊ทธ๋์ 10์ฌ ๊ฑด์ ๋ฐ์ก์ผ๋ก ํ๊ท ์์ ์๊ฐ์ ์ธก์ ํ ๋ค, ํด๋น ๊ฐ์ ๊ณ ์ ํ์ฌ ์๋ฎฌ๋ ์ด์ ๋ฐฉ์์ผ๋ก ํ ์คํธ๋ฅผ ์งํํ์ต๋๋ค.
๋น๋๊ธฐ ์ ์ฉ
์ฐ์ ๋ฉ์ผ ๋ฐ์ก ๋ก์ง์ ๋๊ธฐ์์ ๋น๋๊ธฐ๋ก ์ ํํ์ต๋๋ค. ๋ฉ์ผ ๋ฐ์ก ๋ฉ์๋๋ฅผ ๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌํ๊ณ @Async ์ด๋ ธํ ์ด์ ์ ์ ์ฉํ์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ ์๊ฐ์ด ํฌ๊ฒ ๋จ์ถ๋์์ผ๋ฉฐ, 1,000๊ฑด ๊ธฐ์ค์ผ๋ก ๋ฐ์ก ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์ฝ 1๋ถ ์ ๋ ๋ง์ ์๋ฃ๋์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ํ์ธํด์ผ ํ ๋ถ๋ถ์ด ์์ต๋๋ค.
๋น๋๊ธฐ ์ค๋ ๋ ํ ๊ธฐ๋ณธ ์ค์ ์ ์ด๋ป๊ฒ ๋ผ ์์๊น?
'@Async๋ฅผ ์ฌ์ฉํ ๋ ๋ณ๋์ ์ค๋ ๋ ํ ์ค์ ์ ํ์ง ์์ผ๋ฉด SimpleAsyncTaskExecutor๋ฅผ ์ฌ์ฉํ๋ค.'๋ผ๋ ์ ๋ณด๋ฅผ ํํ ์ ํ ์ ์๊ณ ์ ์ญ์ ๊ทธ๋ ๊ฒ ์๊ณ ์์์ต๋๋ค. ํ์ง๋ง ์คํ๋ง ๋ถํธ์์ ์ด๋ ์ ํํ์ง ์์ ์ค๋ช
์
๋๋ค.
์คํ๋ง ๋ถํธ์์๋ TaskExecutionAutoConfiguration ํด๋์ค๋ฅผ ํตํด ์ค๋ ๋ ํ์ด ์๋์ผ๋ก ์ค์ ๋ฉ๋๋ค.

TaskExecutorConfigurations ํด๋์ค ๋ด๋ถ๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

์ฆ, ํ๋ซํผ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ThreadPoolTaskExecutor, ๊ฐ์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ SimpleAsyncTaskExecutor๊ฐ ๊ธฐ๋ณธ Executor๋ก ๋ฑ๋ก๋ฉ๋๋ค.
๊ทธ๋์ ๋ณ๋์ ์ค์ ์ ํ์ง ์์๋ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํ๋ซํผ ์ค๋ ๋ ํ๊ฒฝ์ผ ๊ฒ์ด๊ณ , ์ด ๊ฒฝ์ฐ ๊ธฐ๋ณธ Executor๋ก ThreadPoolTaskExecutor๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํ๋ซํผ ์ค๋ ๋์ ๊ฐ์ ์ค๋ ๋ (+ ์บ๋ฆฌ์ด ์ค๋ ๋)
ํ๋ซํผ ์ค๋ ๋๋ OS๊ฐ ๊ด๋ฆฌํ๋ ์ ํต์ ์ธ ์๋ฐ ์ค๋ ๋๋ก, Java๊ฐ OS์ ๊ธฐ๋ฅ์ ํ์ฉํด ์์ฑํฉ๋๋ค. ์๋์ ์ผ๋ก ๋ง์ ๋ฆฌ์์ค๋ฅผ ์๋นํ๋ฉฐ ์ค๋ ๋ ์๋ ์์คํ ๋ฆฌ์์ค์ ์ํด ์ ํ๋ฉ๋๋ค.
๊ฐ์ ์ค๋ ๋๋ Java 21์์ ์ ์ ๋์ ๋ ๊ฒฝ๋ ์ค๋ ๋๋ก, JVM ์์์ ์์ฑ ๋ฐ ์คํ๋ฉ๋๋ค. ํ๋ซํผ ์ค๋ ๋๋ณด๋ค ํจ์ฌ ๊ฐ๋ณ๊ณ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ณ ์ ๋ ์คํ ํฌ๊ธฐ ์์ด ์ฌ์ฉ๋์ ๋ฐ๋ผ ์ ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ฉ๋๋ค. ๊ฐ์ ์ค๋ ๋๋ ์บ๋ฆฌ์ด ์ค๋ ๋ ์์์ ์คํ๋๋๋ฐ, ์บ๋ฆฌ์ด ์ค๋ ๋๋ ์ค์ CPU ์คํ ์๊ฐ์ ์ ๊ณตํ๋ ํ๋ซํผ ์ค๋ ๋๋ก, ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ฅผ ์๋ถํ ๋ฐฉ์์ผ๋ก ์ค์ผ์ค๋งํฉ๋๋ค. ๋๋ถ์ OS ์ค๋ ๋ ์์ ์ ํ ์์ด ๋๋์ ๋์ ์์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ํ @Conditional(OnExecutorCondition.class)์ด ์ ์ฉ๋์ด ์์ด ์กฐ๊ฑด๋ถ๋ก ๋์ํฉ๋๋ค.
OnExecutorCondition์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

Executor ํ์ ์ ๋น์ด ๋ฑ๋ก๋์ด ์์ง ์๋ค๋ฉด ๊ธฐ๋ณธ ์ค๋ ๋ ํ ์์ฑ์ ์งํํฉ๋๋ค.
ThreadPoolTaskExecutor์ ์ ์ฉ๋๋ ์ค์ ๊ฐ์ TaskExecutionProperties ํด๋์ค์์ ํ์ธํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ ํ ์ฌ์ด์ฆ๊ฐ Integer.MAX_VALUE๋ก ์ค์ ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ThreadPoolTaskExecutor๋ ํ๊ฐ ๊ฐ๋ ์ฐผ์ ๋ ๋น๋ก์ maxSize๊น์ง ์ค๋ ๋๋ฅผ ๋๋ฆฌ๋๋ฐ, ์ฌ์ค์ ํ๊ฐ ๊ฐ๋ ์ฐฐ ์ผ์ด ์์ผ๋ฏ๋ก ์ค๋ ๋ ์๋ coreSize์ธ 8์ ๋์ง ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด SimpleAsyncTaskExecutor๋ ์ธ์ ์ฌ์ฉ๋๋ ๊ฑธ๊น?
AsyncExecutionInterceptor ํด๋์ค์ getDefaultExecutor()์์ ํ์ธํ ์ ์์ต๋๋ค.

super.getDefaultExecutor(), ์ฆ ๋ถ๋ชจ ํด๋์ค์ธ AsyncExecutionAspectSupport์ getDefaultExecutor()๊ฐ null์ ๋ฐํํ ๋ SimpleAsyncTaskExecutor๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
"๊ทธ๋ผ ์ธ์ null์ด ๋ฐํ๋ ๊น?"
์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด AsyncExecutionAspectSupport ํด๋์ค์ getDefaultExecutor()๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.

- TaskExecutor.class ํ์ ์ ๋น์ ์กฐํํฉ๋๋ค.
- ๋์ผ ํ์ ์ ๋น์ด 2๊ฐ ์ด์์ด๋ฉด NoUniqueBeanDefinitionException์ด ๋ฐ์ํ๊ณ , taskExecutor๋ผ๋ ์ด๋ฆ์ ๋น์ ์ถ๊ฐ๋ก ์กฐํํฉ๋๋ค.
- ๋น์ด ์์ ์์ผ๋ฉด NoSuchBeanDefinitionException์ด ๋ฐ์ํ๊ณ , ๋ง์ฐฌ๊ฐ์ง๋ก taskExecutor๋ผ๋ ์ด๋ฆ์ ๋น์ ์ถ๊ฐ๋ก ์กฐํํฉ๋๋ค.
- ์ด ๋ ๋ฒ์งธ ์กฐํ์์๋ ๋น์ ์ฐพ์ง ๋ชปํ๋ฉด null์ ๋ฐํํฉ๋๋ค.
๊ฒฐ๊ตญ SimpleAsyncTaskExecutor๊ฐ ์ฌ์ฉ๋๋ ์ผ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- TaskExecutor ํ์ ์ ๋น์ด 2๊ฐ ์ด์ ๋ฑ๋ก๋์ด ์๊ณ
- ๊ทธ์ค ์ด๋ฆ์ด taskExecutor์ธ ๋น๋ ์์ผ๋ฉฐ
- @Primary๋ก ์ง์ ๋ ๋น๋ ์๊ณ
- @Async์์ ์ฌ์ฉํ ๋น์ ๋ช ์ํ์ง ์์ ๊ฒฝ์ฐ
"์ด์ ์ ์ฒด ํ๋ฆ์ ์ ๋ฆฌํด ๋ณด์"
1๏ธโฃ AsyncExecutionInterceptor์ invoke() ํธ์ถ

๋ด๋ถ์์ determineAsyncExecutor()๋ฅผ ํตํด ์ค์ ๋ก ์ฌ์ฉํ AsyncTaskExecutor๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
2๏ธโฃ AsyncExecutionAspectSupport์ determineAsyncExecutor() ๋์

qualifier ์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด @Async("emailExecutor")์ ๊ฐ์ด ์ด๋ฆ์ด ๋ช ์๋ผ ์์ผ๋ฉด ํด๋น ์ด๋ฆ์ผ๋ก ๋น์ ์กฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด defaultExecutor๋ฅผ ์ฌ์ฉํฉ๋๋ค.
3๏ธโฃ defaultExecutor ๊ฒฐ์

AsyncExecutionAspectSupport์ ์์ฑ์์์ SingletonSupplier๋ฅผ ํตํด getDefaultExecutor()๋ฅผ ๋ฑ๋กํด ๋ก๋๋ค. (SingletonSupplier๋ @Async ๋ฉ์๋๊ฐ ์ต์ด๋ก ํธ์ถ๋๋ ์์ ์ ์ง์ฐ ํธ์ถ์ ํ์ฌ getDefaultExecutor()๋ฅผ ์คํํฉ๋๋ค.)
getDefaultExecutor()๋ AsyncExecutionInterceptor์์ ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ฒ์ ์ด ๋์ํฉ๋๋ค.
์ต์ข ์์ฝ
- @Async ๋ฉ์๋ ํธ์ถ
- AsyncExecutionInterceptor.invoke()
- determineAsyncExecutor()
- qualifier ์ง์ ์ฌ๋ถ ํ์ธ
- ์ง์ ๋ ๊ฒฝ์ฐ โก ํด๋น ์ด๋ฆ์ผ๋ก ๋น ์กฐํ
- ๋ฏธ์ง์ ์ธ ๊ฒฝ์ฐ โก defaultExecutor ์ฌ์ฉ
- getDefaultExecutor() ํธ์ถ (์ต์ด ํธ์ถ ์ SingletonSupplier๊ฐ ์ง์ฐ ์คํ)
- TaskExecutor ๋น์ด ํ๋ โก ํด๋น ๋น ์ฌ์ฉ
- 2๊ฐ ์ด์ & taskExecutor ์ด๋ฆ ์์ โก ํด๋น ๋น ์ฌ์ฉ
- 2๊ฐ ์ด์ & taskExecutor ์ด๋ฆ ์์ โก null
- new SimpleAsyncTaskExecutor() ์ฌ์ฉ
์ค๋ ๋ ํ ํฌ๊ธฐ ์ค์
๊ธฐ๋ณธ ์ค๋ ๋ ํ ์ค์ ๋ง์ผ๋ก๋ ์ฒ๋ฆฌ ์๊ฐ์ด ์ฝ 10๋ถ์์ 1๋ถ์ผ๋ก 90% ์ ๋ ๊ฐ์ ๋์์ต๋๋ค.
ํ์ง๋ง ์ค๋ ๋ ์๋ฅผ ๋๋ฆฌ๋ฉด ์ฒ๋ฆฌ ์๋๋ฅผ ๋ ๊ฐ์ ํ ์ ์์ต๋๋ค.
"ํ๋ฆฌํฐ์ด ์ธ์คํด์ค ํ๊ฒฝ์ด๋ฉด ์ฝ์ด๊ฐ 1~2๊ฐ์ด์ง ์๋? ์ค๋ ๋ ์๋ฅผ ๋๋ ค๋ ์๋ฏธ๊ฐ ์๋? ๊ดํ ์ปจํ
์คํธ ์ค์์นญ ์ค๋ฒํค๋๋ง ์๊ธฐ๋ ๊ฑฐ ์๋๊ฐ?"
๋ผ๊ณ ์๊ฐํ์ค ์๋ ์์ง๋ง, ์ด๋ฉ์ผ ๋ฐ์ก ์์ฒญ์ I/O ๋ฐ์ด๋ ์์
์
๋๋ค. CPU๊ฐ ์ง์ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ SMTP ์๋ฒ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ด ๋๋ถ๋ถ์ ์ฐจ์งํ๋ฏ๋ก, ์ค๋ ๋ ์๋ฅผ ๋๋ ค ์ ์ฒด ์ฒ๋ฆฌ๋์ ๋์ผ ์ ์์ต๋๋ค.
๋ฌผ๋ก ์ค๋ ๋ ์๋ฅผ ๋ฌด์์ ๋๋ฆฌ๋ ๊ฒ์ด ์ ๋ต์ ์๋๋๋ค. ์ค๋ ๋ ์๊ฐ ๊ณผํ๋ฉด ์ปจํ ์คํธ ์ค์์นญ ๋น์ฉ๊ณผ ์ค๋ ๋๋น ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ๋์ 1,000๊ฑด ๋ฐ์ก์ ๊ธฐ์ค์ผ๋ก ์ค๋ ๋ ์๋ฅผ ๋ณํ์ํค๋ฉฐ ์ฒ๋ฆฌ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ธก์ ํ์ต๋๋ค.

์ค๋ ๋ ์๋ฅผ ๋๋ฆด์๋ก ์ฒ๋ฆฌ ์๊ฐ์ด ๊ณ์ํด์ ์ค์์ง๋ง, 50๊ฐ๋ฅผ ๋์ด์๋ฉด์๋ถํฐ๋ ์ฑ๋ฅ ๊ฐ์ ํจ์จ์ด ๊ธ๊ฐํ๋๋ฐ, ์ฒ๋ฆฌ ์๊ฐ ๊ฐ์ ํจ์จ์ด ์ค๊ณ , (ํ์๋ ์ ์ง ์์์ง๋ง) ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ ํญ๋ ์ปค์ก์ต๋๋ค. ๊ทธ๋์ ์ฑ๋ฅ ๊ฐ์ ํจ์จ์ด ๊ฐ์ฅ ์ข์ 50๊ฐ๊ฐ ๊ท ํ์ ์ด๋ผ๊ณ ํ๋จํ์ฌ ์ค์ ๊ฐ์ผ๋ก ์ฌ์ฉํ์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก 1,000๊ฑด ๋ฐ์ก ๊ธฐ์ค ์ฒ๋ฆฌ ์๊ฐ์ด 598.2์ด โก 14.5์ด๋ก, ์ฝ 97.6% ๊ฐ์ ๋์์ต๋๋ค.
๋ชจ๋ ๋ถ๋ฆฌ
๊ธฐ์กด์๋ API ์๋ฒ์ ์ค์ผ์ค๋ง ์ฒ๋ฆฌ๊ฐ ํ๋์ ์ปจํ ์ด๋์์ ๋์ํ์ต๋๋ค. ์ค์ผ์ค๋ง ์์ ์๊ฐ์ ํผํด ๋ฐฐํฌ๋ฅผ ์งํํ๋ค๋ฉด ๋ฌธ์ ์๊ฒ ์ง๋ง, ์๋์น ์๊ฒ ์ค์ผ์ค๋ง ์คํ ์ค์ ๋ฐฐํฌ๊ฐ ๊ฒน์ณ ์์ ์ด ์ค๋จ๋๋ ์ํฉ์ด ์๊ธธ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ ๋ชจ๋์ ๋ถ๋ฆฌํ์ต๋๋ค.
๋ฐฉ๋ฒ์ ๊ฐ๋จํ์ต๋๋ค. ๊ณตํต ์ค์ ๊ณผ ์์กด์ฑ์ ๋ฃจํธ์ build.gradle์ ๋๊ณ , api์ batch ๋ชจ๋ ๊ฐ๊ฐ์ ๋ณ๋์ build.gradle์ ๋์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ์ต๋๋ค. Dockerfile๊ณผ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ๋ ๊ฐ๊ฐ ๋ถ๋ฆฌํ์ฌ, ์๋ก์ ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ๋ฐ์ง ์๊ณ ๊ฐ ๋ชจ๋์ ๋ณ๊ฒฝ ์ฌํญ์๋ง ๋ฐฐํฌ๊ฐ ํธ๋ฆฌ๊ฑฐ ๋๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
์ธ์คํด์ค ์์ฒด๋ฅผ ๋ถ๋ฆฌํ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์์ ์ด์ ์ ์์ง๋ง, ๋ฐฐํฌ ํ์ด๋ฐ์ผ๋ก ์ธํ ์ค์ผ์ค๋ง ์ค์๋์ ๋ฐฉ์งํ ์ ์๊ฒ ๋์์ต๋๋ค.
ํ์ฌ๋ DB ์ธ์คํด์ค๋ฅผ MySQL HeatWave๋ก ์ด์ ํ๋ฉด์ ์ฌ์ ์ธ์คํด์ค๊ฐ ์๊ฒผ๊ธฐ์ batch ์ปจํ ์ด๋๋ฅผ ํด๋น ์ธ์คํด์ค๋ก ์ด์ ํ ๊ณํ์ ํ๊ณ ์์ต๋๋ค. API ์์ฒญ ์์ด ์์ ์ค์ผ์ค๋ง ์ฉ๋๋ก๋ง ์ฌ์ฉ๋๋ ๋งํผ ์ ์ ํ ๋ถ๋ฆฌ๊ฐ ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
์ด๋ฉ์ผ ๋ฐ์ก ๋ก์ง์ ๋๊ธฐ ์ฒ๋ฆฌ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก ๊ฐ์ ํ๊ณ , api ๋ชจ๋๊ณผ batch ๋ชจ๋์ ๋ณ๋ ์ปจํ ์ด๋๋ก ๋ถ๋ฆฌํด ๋ณด์์ต๋๋ค.
์ฌ์ค ๊ตฌ๋ ์ ์์ญ ๊ฑด์ฉ ๋ฑ๋กํ๋ ์ฌ๋์ ๋ง์ง ์์ ๊ฒ์ด๊ธฐ์, ์ ์ ์๊ฐ ์ด๋ ์ ๋ ๋์ด๋ ๋ฉ์ผ ๋ฐ์ก ๊ฑด์๋ ๋ง์ง ์์ ๊ฒ์ผ๋ก ์์ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ์ด๋ฒ ์์ ์ด ์ค๋ฒ์์ง๋์ด๋ง์ด๋ผ๊ณ ์๊ฐํ์ง๋ ์์ต๋๋ค. ์ฒ๋ฆฌ ์๊ฐ ๋จ์ถ์ผ๋ก ์ธํ ๋ฆฌ์์ค ์ ์ฝ, ๋ชจ๋ ๋ถ๋ฆฌ๋ฅผ ํตํ ๋ฐฐํฌ ์์ ์ฑ ํ๋ณด๋ก ๋น์ฉ ๋๋น ์ป๋ ๊ฒ์ด ์ถฉ๋ถํ๋ค๊ณ ํ๋จํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฉ์ผ ๋ฐ์ก์ด I/O ๋ฐ์ด๋ ์์ ์ธ ๋งํผ Java ๋ฒ์ ์ ์ฌ๋ ค(17 -> 21) ๊ฐ์ ์ค๋ ๋๋ฅผ ๋์ ํด ๋ณผ๊น๋ ์๊ฐ ์ค์ ๋๋ค. ๋ค๋ง ๋ณ๋ ์ธ์คํด์ค๋ก์ ์ด์ ์ด ์๋ฃ๋ ์ดํ์๋ ์ถ๊ฐ์ ์ด์ ์ด ์ผ๋ง๋ ์์์ง ๊ณ ๋ฏผํด ๋ด์ผ ํ ๊ฑฐ ๊ฐ์ต๋๋ค๐ค