์น์ธ ๋์ฌ๋ PG์ฌ์ ์น์ธ ๋ฐ ์ทจ์๋ ๋ฐ์ดํฐ์ ๋น์ฌ์์ ๊ด๋ฆฌ๋๋ ๋ฐ์ดํฐ์ ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์์ ์ด์์.
PG๋ Payment Gateway์ ์ฝ์๋ก ์จ๋ผ์ธ ๊ฒฐ์ ๋ํ์ฌ๋ฅผ ๋ปํด์.
์ด๋ฒ ์น์ธ ๋์ฌ ๊ฐ์ ๊ฑด์ ํน์ ๊ฒฐ์ ์๋จ์ ์น์ธ ๋์ฌ์์ ์ ๋ ์๋๊ฐ ์ง์ฐ๋๊ณ ์์ด ๊ฐ์ ํ๊ณ ์ ํ์ด์.
๊ธฐ์กด์ ๊ฒฝ์ฐ ์น์ธ ๋์ฌ ๋ฐฐ์น ์๋๋ ์ต๋ 23390ms, ์ต์ 29ms, ํ๊ท 3442.143ms๋ฅผ ๊ธฐ๋กํ๊ณ ์์ด์. ์์ ํต๊ณ ๋ฐ์ดํฐ๋ ์ด๋ฒ์ ๊ฐ์ ํ๊ณ ์ํ ์น์ธ ๋์ฌ ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ๊ฒฐ์ ์๋จ์ ๋ํ ํต๊ณ ์์น์์. ์ ํฌ ์๋น์ค์์๋ ํ๋์ API๋ก ๋ค์ํ ๊ฒฐ์ ์๋จ ์น์ธ ๋์ฌ๊ฐ ๋ฐฐ์น๋ก ์ด๋ฃจ์ด์ง๊ณ ์์ด์. ํ๋์ API๋ก ์ด๋ฃจ์ด์ง๊ณ ์์ง๋ง, ์ ํฌ ์์คํ ์์๋ L์ฌ ๋ชจ๋ํฐ๋ง ์๋ฃจ์ ์ ํตํด ํน์ ์น์ธ๋์ฌ์ ๋ชจ๋ํฐ๋ง์ด ๊ฐ๋ฅํด์.
์ฌ๊ธฐ์ 24์ด์ ๊ทผ์ ํ ํฌ์ธํธ๊ฐ ๋ฐ๋ก ์ด๋ฒ์ ๊ฐ์ ํ๋ ค๋ ๊ฒฐ์ ์๋จ์ด์์. ๋ค๋ฅธ ๊ฒฐ์ ์๋จ์ ์น์ธ ๋์ฌ์ ๋นํด ์๋ฑํ ๋์ ์์น๋ฅผ ๊ธฐ๋กํ๊ณ ์์ด์.
ํด๋น ๊ฒฐ์ ์๋จ์ ์น์ธ ๋์ฌ๋ ๋ฒํฌ(bulk)๋ก ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ํ์ด์ง๋ค์ด์ API๋ฅผ ํตํ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ๋ฐ๋ณต๋ฌธ์ ํตํด API๋ฅผ ํธ์ถํ๊ณ ์์ด์(์ฐ์ธก ํ๋จ ๋ถ๋ถ์ ๋นจ๊ฐ ๋ค๋ชจ ์์๋ค์ด API ํธ์ถ์ ์๋ฏธํด์). ์ด๋ก ์ธํด ์ ์ฒ ๊ฑด ์ด์์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋, ์ ์ฒ ๊ฑด์์ ํ์ด์ง๋ค์ด์ ๋ ๊ฐ์๋งํผ ํ ํ์ด์ง, ํ ํ์ด์ง ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์งํด ์ง์ฐ(delay) ๋๋ ์๊ฐ์ด ๊ธธ์ด ๋ฐ์๋ ์ด์ ์์ด์.
์ฐ์ ํด๋น ๊ฒฐ์ ์๋จ์ ์น์ธ ๋์ฌ API๊ฐ ๋ฒํฌ API๋ฅผ ์ ๊ณตํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ์ด์. ๋ฒํฌ API๋ฅผ ์ ๊ณตํ๋ค๋ฉด ํ์ด์ง๋ง๋ค ๋ฐ๋ณต๋ฌธ์ ํตํด API๋ฅผ ํธ์ถํ์ง ์์ ์๋น์ค ์๋ ํฅ์์ ๊ธฐ๋ํ ์ ์์๊ธฐ ๋๋ฌธ์ด์์. ํ์ง๋ง ๋ฒํฌ API๋ฅผ ์ ๊ณตํ์ง ์์ ํด๋น์์ผ๋ก๋ ์งํํ ์ ์์์ด์.
๋ค์ ์์ผ๋ก๋ ๋น๋๊ธฐ APIํธ์ถ์ด์์ด์. ํ ํ์ด์ง๋ง๋ค API Response๋ฅผ ๋๊ธฐํ์ง ์๊ณ ๋น๋๊ธฐ๋ก ํธ์ถํ๋ค๋ฉด ๋ฒํฌ API์ ๋น์ทํ ์ฑ๋ฅ์ ๊ธฐ๋ํ ์ ์์์ด์. ๋ฐ๋ผ์ ๋น๋๊ธฐ API๋ฅผ ํธ์ถํ์ฌ ๋ชจ๋ ํ์ด์ง์ Response๊ฐ ์ฌ ๋ ๊น์ง ๋๊ธฐ ์ดํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉํฅ์ผ๋ก ์งํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ด์.
๊ธฐ์กด์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๋๊ณ ์์์ด์.
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import static org.assertj.core.api.Assertions.assertThat;
public class AsyncCallTest {
private static class Response {}
private static class ApiResponse {
int totalPage;
int currentPage;
public ApiResponse(int currentPage, int totalPage) {
this.currentPage = currentPage;
this.totalPage = totalPage;
}
}
private static final Random RANDOM = new Random();
@Test
void asIs() {
List<Response> result = new ArrayList<>();
List<ApiResponse> apiResponses = new ArrayList<>();
final int START_PAGE = 1;
// ์ต์ด 1ํ API ํธ์ถํ์ฌ ์ ์ฒด ํ์ด์ง ์ ํ๋
ApiResponse firtApiResponse = this.apiCall(START_PAGE);
apiResponses.add(firtApiResponse);
// ์ ์ฒด ํ์ด์ง ์ ๋งํผ API ํธ์ถ
for (int i = START_PAGE + 1; i <= firtApiResponse.totalPage; i++) {
apiResponses.add(this.apiCall(i));
}
// ์น์ธ ๋์ฌ ์งํ
for (ApiResponse apiResponse : apiResponses) {
result.add(this.logic(apiResponse));
}
assertThat(result).hasSize(10);
}
private ApiResponse apiCall(int page) {
try {
Thread.sleep(RANDOM.nextInt(1000, 3000));
final int TOTAL_PAGE = 10;
return new ApiResponse(page, TOTAL_PAGE);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
private Response logic(ApiResponse apiResponse) {
// ์น์ธ ๋์ฌ ์งํ DB ์์
(Insert, Update)
return new Response();
}
}
โ
Tests passed: 1 of 1 test - 20 sec 59 ms
[API ํธ์ถ] Current Page: 1 Thread: Test worker
[API ํธ์ถ] Current Page: 2 Thread: Test worker
[API ํธ์ถ] Current Page: 3 Thread: Test worker
[API ํธ์ถ] Current Page: 4 Thread: Test worker
[API ํธ์ถ] Current Page: 5 Thread: Test worker
[API ํธ์ถ] Current Page: 6 Thread: Test worker
[API ํธ์ถ] Current Page: 7 Thread: Test worker
[API ํธ์ถ] Current Page: 8 Thread: Test worker
[API ํธ์ถ] Current Page: 9 Thread: Test worker
[API ํธ์ถ] Current Page: 10 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 1 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 2 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 3 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 4 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 5 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 6 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 7 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 8 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 9 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 10 Thread: Test worker
์ค์ ๋ก์ง์ ์น์ธ ๋์ฌ ๋ฐ์ดํฐ ๊ธฐ๊ฐ์ ์ค์ ํ๊ณ API ํธ์ถ์ ํ์ํ Header๋ฅผ ์ ํ ํ๋ ๋ฑ ๋ ๋ณต์กํ์ง๋ง, ๊ฐ๋ตํ๊ฒ ํต์ฌ ๋ด์ฉ๋ง ์ถ๋ฆฌ๊ธฐ ์ํด ์์ฑํด๋ณด์์ด์.
apiCall
์ ํตํด ์น์ธ๋์ฌ API๋ฅผ ํธ์ถํ๋ฉด, 1~3์ด ์ ๋ ๊ฑธ๋ฆฐ๋ค๋ ๊ฐ์ ํ์ ์์ฑํ์์ผ๋ฉฐ, ApiResponse
๋ฅผ ํตํด ์ ์ฒด ํ์ด์ง ์๊ฐ ์ผ๋ง์ธ์ง ํ๊ธฐํด์ฃผ์ด์. ํ์ฌ ์ฝ๋์์๋ 10ํ์ด์ง๋ฅผ ๊ฐ์ ํ์ฌ ์์ฑํ์ด์.
์ต์ด 1ํ API ํธ์ถ์ ํตํด ์ ์ฒด ํ์ด์ง ์๋ฅผ ์ป๊ณ , ๋ฐ๋ณต๋ฌธ์ ํตํด API๋ฅผ ํธ์ถํด์. ์ด ๊ฒฝ์ฐ ์ต์ ์ ๊ฒฝ์ฐ์ ๋ชจ๋ API๊ฐ 3์ด์ ์์์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ฉด ์๋น์ค ์๊ฐ์ API ํธ์ถ 30์ด + ์น์ธ๋์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ฐ์ผ๋ก 30์ด ์ด์ ๊ฑธ๋ฆด ์ ์์ด์.
๋ฐ๋ผ์ ๋ฐ๋ณต๋ฌธ์ ํตํด ์น์ธ ๋์ฌ๋ฅผ ์งํํ๋ ๋ถ๋ถ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก ๊ฐ์ ํ๊ณ ์ ํ์์ด์.
@Test
void toBe() {
List<Response> result = this.asyncApiCall() // ๋น๋๊ธฐ API ํธ์ถ
.stream()
.map(this::logic) // ์น์ธ ๋์ฌ ์งํ
.collect(Collectors.toList());;
assertThat(result).hasSize(10);
}
private List<ApiResponse> asyncApiCall() {
final int START_PAGE = 1;
final int SECOND_PAGE = START_PAGE + 1;
// ์ต์ด 1ํ API ํธ์ถํ์ฌ ์ ์ฒด ํ์ด์ง ์ ํ๋
ApiResponse firtApiResponse = this.apiCall(START_PAGE);
// ์ ์ฒด ํ์ด์ง ์ ๋งํผ API ํธ์ถ
List<ApiResponse> apiResponses = IntStream
.rangeClosed(SECOND_PAGE, firtApiResponse.totalPage)
.boxed()
.parallel()
.map(this::apiCall)
.collect(Collectors.toList());
apiResponses.add(firtApiResponse);
return apiResponses;
}
โ
Tests passed: 1 of 1 test - 6 sec 102 ms
[API ํธ์ถ] Current Page: 1 Thread: Test worker
[API ํธ์ถ] Current Page: 7 Thread: Test worker
[API ํธ์ถ] Current Page: 2 Thread: ForkJoinPool.commonPool-worker-8
[API ํธ์ถ] Current Page: 4 Thread: ForkJoinPool.commonPool-worker-1
[API ํธ์ถ] Current Page: 5 Thread: ForkJoinPool.commonPool-worker-3
[API ํธ์ถ] Current Page: 9 Thread: ForkJoinPool.commonPool-worker-4
[API ํธ์ถ] Current Page: 10 Thread: ForkJoinPool.commonPool-worker-6
[API ํธ์ถ] Current Page: 6 Thread: ForkJoinPool.commonPool-worker-7
[API ํธ์ถ] Current Page: 8 Thread: ForkJoinPool.commonPool-worker-5
[API ํธ์ถ] Current Page: 3 Thread: ForkJoinPool.commonPool-worker-2
[์น์ธ ๋์ฌ ์งํ] Current Page: 2 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 3 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 4 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 5 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 6 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 7 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 8 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 9 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 10 Thread: Test worker
[์น์ธ ๋์ฌ ์งํ] Current Page: 1 Thread: Test worker
Parallel Stream
์ ์ด์ฉํ์ฌ ๋น๋๊ธฐ๋ก API๋ฅผ ํธ์ถํ์ด์. Java์ Parallel Stream์ ๋ด๋ถ์ ์ผ๋ก ForkJoinPool
์ commonPool
์ ์ฌ์ฉํด์. ForkJoinPool์ ExecutorService
์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ณ ์์ด์. ๋ด๋ถ์ ์ผ๋ก Task์ ๊ฐ์(ํฌ๊ธฐ, ์ฌ์ด์ฆ)์ ๋ฐ๋ผ ๋ถํ (fork)ํ์ฌ Task์ ์ฒ๋ฆฌํ๊ณ ๋ชจ๋ Task๊ฐ ์ฒ๋ฆฌ๋์์ ๊ฒฝ์ฐ์๋ Join์ ํตํด ์ทจํฉํด์. ForkJoinPool์ ๋ ๋ค๋ฅธ ํน์ง์ผ๋ก๋ ์ ํด(๋๊ณ ์๋) Thread๊ฐ ์์ ๊ฒฝ์ฐ ์ ํด Thread๊ฐ ๋ค๋ฅธ Thread ์ก๋ค์ ๊ฐ์ ธ์ ์ํํ์ฌ ์ต๋ํ ์ ํด Thread๊ฐ ์์ด ๋ชจ๋ ์ผ๊ด๋ ๊ฐ์์ Task๋ฅผ ์ฒ๋ฆฌํด์.
ForkJoinPool์ ์ํ๋์ผํ๋ Task๊ฐ ๋ง์์ง ์๋ก Worker Thread
๊ฐ ์ถ๊ฐ๋์ด์. ๋ฐ๋ผ์ ๋ง์ฝ ForkJoinPool์ Thread ๊ฐ์๋ฅผ ์ ํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ง์ ForkJoinPool์ ์์ฑํ์ฌ ์ฌ์ฉํ ์๋ ์์ด์.
private static final ForkJoinPool EXECUTOR = new ForkJoinPool(10);
ForkJoinPool์ parallelism
ํ๋ผ๋ฏธํฐ์ int๊ฐ์ผ๋ก ์ํ๋ Thread ์ ๊ฐ์๋ฅผ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ฉด ํด๋น ๊ฐ์ ๋งํผ์ Thread๋ง ์์ฑ์ด๋์ด์.
public class ForkJoinPoolTest {
private static final ForkJoinPool EXECUTOR = new ForkJoinPool(10);
@Test
void test() {
EXECUTOR.submit(() -> IntStream.rangeClosed(1, 30)
.boxed()
.parallel()
.peek(i -> {
try {
Thread.sleep(new Random().nextInt(1000, 3000));
System.out.println("[NUMBER: " + i + "] Thread: " + Thread.currentThread().getName());
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList())
).join();
}
}
[NUMBER: 30] Thread: ForkJoinPool-1-worker-7
[NUMBER: 25] Thread: ForkJoinPool-1-worker-6
[NUMBER: 22] Thread: ForkJoinPool-1-worker-9
[NUMBER: 27] Thread: ForkJoinPool-1-worker-10
[NUMBER: 28] Thread: ForkJoinPool-1-worker-3
[NUMBER: 20] Thread: ForkJoinPool-1-worker-1
[NUMBER: 17] Thread: ForkJoinPool-1-worker-4
[NUMBER: 16] Thread: ForkJoinPool-1-worker-5
[NUMBER: 10] Thread: ForkJoinPool-1-worker-2
[NUMBER: 5] Thread: ForkJoinPool-1-worker-8
[NUMBER: 29] Thread: ForkJoinPool-1-worker-7
[NUMBER: 21] Thread: ForkJoinPool-1-worker-9
[NUMBER: 19] Thread: ForkJoinPool-1-worker-10
[NUMBER: 26] Thread: ForkJoinPool-1-worker-6
[NUMBER: 2] Thread: ForkJoinPool-1-worker-1
[NUMBER: 24] Thread: ForkJoinPool-1-worker-5
[NUMBER: 4] Thread: ForkJoinPool-1-worker-8
[NUMBER: 1] Thread: ForkJoinPool-1-worker-4
[NUMBER: 18] Thread: ForkJoinPool-1-worker-3
[NUMBER: 11] Thread: ForkJoinPool-1-worker-2
[NUMBER: 6] Thread: ForkJoinPool-1-worker-6
[NUMBER: 7] Thread: ForkJoinPool-1-worker-10
[NUMBER: 3] Thread: ForkJoinPool-1-worker-9
[NUMBER: 23] Thread: ForkJoinPool-1-worker-7
[NUMBER: 15] Thread: ForkJoinPool-1-worker-4
[NUMBER: 13] Thread: ForkJoinPool-1-worker-5
[NUMBER: 14] Thread: ForkJoinPool-1-worker-1
[NUMBER: 9] Thread: ForkJoinPool-1-worker-8
[NUMBER: 8] Thread: ForkJoinPool-1-worker-2
[NUMBER: 12] Thread: ForkJoinPool-1-worker-3
Worker Thread๊ฐ 10๊ฐ ์ด์ ๋์ด๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ด ์ฒ๋ผ ์ด๋ฒ ๊ฐ์ ์์๋ ForkJoinPool์ Thread ์๋ฅผ ์ ํํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ํ ์ ์์์ด์.
๊ฒฉ๋ฆฌ๋ ThreadPool ํ๊ฒฝ์์ ์คํ๋์ด ๋ค๋ฅธ ๋ก์ง๋ค์ ์ํ ์ํฅ์ ๋ฐ์ง ์๊ธฐ ์ํจ.
Customํ Executor๋ฅผ ์ฌ์ฉํ ์๋ ์์์ง๋ง, ์น์ธ ๋์ฌ ๋ก์ง์ด ๋ค๋ฅธ ๋ก์ง์์ ๋ชจ๋ ์ฌ์ฉ๋๋ ๊ณตํต๋ Executor์์ ์ฌ์ฉ๋๊ธฐ๋ณด๋ค ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ์คํ๋์ด ๋ค๋ฅธ ๋ก์ง์ ์ํฅ์ ๋ฐ์ง ์๊ธฐ ์ํจ์ด ์์์ด์. ๊ณตํต๋ Executor๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ํน์ ํ ๋ก์ง์์ Thread๋ฅผ ์ก๊ณ ๋์์ฃผ์ง ์๊ฑฐ๋, ํน์ Exeption์ด ๋ฐ์ํ๋ค๋ฉด ๋ค๋ฅธ ๋ก์ง์๋ ์ํฅ์ด ๊ฐ ๊ฒ์ผ๋ก ํ๋จ๋์์ด์(๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๊ณตํต๋ Executor ์ฌ์ฉ ๋์ค ์ ์ ํ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ง ๋ชปํ์๊ฑฐ๋, ์์์น ๋ชปํ ์์ ์ ์ด ๋ฐ์๋ ๊ฒฝ์ฐ). Thread ์์ ์๊ฐ์ ํ์ ์ง๊ณ ํด๋น ์์ ์๊ฐ์ ์ด๊ณผํ๋ฉด ๋ฐํํ๋๋ก ๊ตฌํํ๊ณ Exception์ Handling ํ์ฌ ๊ตฌํํ ์๋ ์์์ง๋ง, ๊ฐ์ฅ ํฐ ์ด์ ๋ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ์น์ธ ๋์ฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ์ํ์ด์.
์น์ธ ๋์ฌ ์๋ฒ์์ ๋น๋๊ธฐ ์์ ์ด ํ์ํ ๋ก์ง์ ์์ ํน์ ํ ์น์ธ ๋์ฌ์ ๊ฑฐ์ ํ์ ๋จ.
์น์ธ ๋์ฌ ์๋ฒ์์ ๋น๋๊ธฐ ์์
์ด ํ์ํ ๋ก์ง์ ๋ง์ง ์์์ด์. ๋ฐ๋ผ์ Customํ Executor๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฐํธํ๊ฒ ForkJoinPool์ ์ด์ฉํ๋ ๋ฐฉ์์ ์ฑํํ๊ฒ ๋์์ด์. ๋ง์ฝ ๋น๋๊ธฐ ์์
์ด ๋ง์ด ํ์๋กํ๋ ์๋น์ค์๋ค๋ฉด, Spring MVC
๊ฐ ์๋๋ผ Spring WebFlux
๋ฅผ ์ฑํํ๋ ๋ฐฉ์์ด๋ CustomExecutor๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ๊ฑฐ์์. ํ์ง๋ง ์ด๋ ๋ชจ๋ ๊ฐ๋ฐ Cost๋ก ์ด์ด์ง์ฃ . ์ด๋ฌํ ๋ค์ํ ๋น์ฉ์ ์๊ฐํด๋ณด๊ณ ForkJoinPool์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ด์.
๋์ผ ์๊ฐ ๋ Matrics - ๊ฐ์ ๊ฒฐ์ ์๋จ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๊ฒฐ์ ์๋จ์ ์น์ธ ๋์ฌ๋ ํฌํจ๋ ์์น
๋น๊ต ์๊ฐ ๋
AS-IS Time: 2023-10-11 09:08:00 ~ 2023-10-12 09:08:00
TO-BE Time: 2023-10-18 09:08:00 ~ 2023-10-19 09:08:00
AS-IS
TO-BE
AS-IS ์๋น์ค ์๊ฐ: 22838ms
TO-BE ์๋น์ค ์๊ฐ: 5354s
As-Is
To-Be
๋ง์ ์๊ฐ์ ์๋นํ๊ณ ์๋ ํน์ ๊ฒฐ์ ์ ์น์ธ ๋์ฌ๋ฅผ ๊ฐ์ ํด ๋ณด์์ด์. ์ด๋ฒ ๊ฐ์ ์ ํตํด ๋จ ํ๋์ ์น์ธ ๋์ฌ๋ง ๊ฐ์ ํ์์๋ ๋ถ๊ตฌํ๊ณ , CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํฌ๊ฒ ๊ฐ์ ์ํฌ ์ ์์์ผ๋ฉฐ, Nํ์ด ์น์ธ ๋์ฌ ์๋์ ๊ฒฝ์ฐ์๋ ์ฝ 77%์ ์ฑ๋ฅ ํฅ์์ ์ด๋ฃฐ ์ ์์์ด์.
๊ฐ์ฅ ๋๋ผ์ด ์ ์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๋ ํฌ๊ฒ ๊ฐ์๋์๋ค๋ ๊ฒ์ด์์ด์. ์ด๋ ๊ณง ์๋น์ค ๋น์ฉ ์ ๊ฐ์๋ ์ด์ ์ ์ทจํ ์ ์๋ ๋ถ๋ถ์ด๋ผ ๋งค์ฐ ๊ธฐ์๊ฒ ์ฌ๊ฒจ์ ธ์.
์ด๋ฒ ๊ฐ์ ์ ํตํด ํ๋์ ์๋น์ค๊ฐ ์ ์ฒด ์๋น์ค์ ๋ฏธ์น๋ ์ํฅ์ด ์ด๋ ๊ฒ ํด ์ ์๊ตฌ๋ ๋ชธ์ ๊นจ๋ฌ์ ์ ์์์ด์. ๋ฐ๋ผ์ ํ๋์ ์๋น์ค, ๋ก์ง์ ์์ฑํ๋๋ผ๋ ๋จ์ํ๊ฒ ๊ธฐ๋ฅ์ด ๋์ํ๊ฒ ๋ง๋๋ ๊ฒ์ด ์ ๋ถ๊ฐ ์๋ ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ก ์ธํ ์๋น์ค ์ํฅ๋ ํ์ ๋ํ ์ค์ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ด์.
์ฑ๋ฅ ๊ฐ์ ์ ๋ต์ด ํญ์ ๋น๋๊ธฐ๋ผ๊ณ ์๊ฐํ์ง๋ ์์์. ํ์ง๋ง ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ ๊ฒฝ์ฐ ํฐ ์ด์ ์ ์ป์ ์ ์๋ค๊ณ ์๊ฐํด์. ๋น๋๊ธฐ์ ์ธ ์ ๊ทผ๋ฒ ์ด์ธ์๋ ์ฝ๋ ์ต์ ํ, ์บ์ฑ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ํ๋ ๋ฑ ๋ค์ํ ๊ธฐ๋ฒ์ด ์กด์ฌํ๋ ์ํฉ์ ๋ง๊ฒ ์ ์ฉํ๋ ๊ฒ์ด ์ค์ํ ๊ฑฐ ๊ฐ์์.
์์ผ๋ก๋ ๋ชจ๋ํฐ๋งํ๊ณ ๋ถ์ํ์ฌ ์ฑ๋ฅ ๊ฐ์ ์ด ํ์ํ ๋ถ๋ถ์ ์ฐพ์ ๊ฐ์ ํ๊ธฐ ์ํด ๊พธ์คํ ๋ ธ๋ ฅํ๊ณ ํ์ตํ ์์ ์ด์์๐.