๋ถํ์ํ @Transaction ์ ๊ฑฐ
์๋น์ค ๊ณ์ธต์์ ๋จ์ผ SELECT ์ฟผ๋ฆฌ์ ๊ฐ์ ์กฐํ ์์ ์์ ๋ถํ์ํ ํธ๋์ญ์ ์ค๋ฒํค๋ ์ ๊ฑฐ
GlobalExceptionHandler ์์ธ ์ฒ๋ฆฌ
๊ฐ ์ํฉ์ ๋ง๋ ์ค๋ฅ ์ฝ๋์ ๋ช ํํ ๋ฉ์์ง๋ฅผ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ์ฌ ํด๋ผ์ด์ธํธ ํ์ฒ๋ฆฌ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ
์์ฑ์ ์ฃผ์
(@RequiredArgsConstructor)๊ณผ final ํ๋๋ฅผ ํ์ฉํ ์ฑ๊ธํค ๋น ์์ฑ
Spring Bean ๊ฐ ์์กด์ฑ์ ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๊ณ ํ๋์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅ
.yml ๋ด๋ถ ๋ณ์๊ฐ๋ค์ TypeSafeProperties ๊ฐ์ฒด๋ก์ ๊ด๋ฆฌ
์ฌ๋ฌ ๊ฐ์ฒด์์ ๋ณ์๋ฅผ ์ผ๊ด๋๊ฒ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํ๋ ํ์ ์ง์ ์ ํตํด ํ์ ์์ ์ฑ์ ํ๋ณด
ํ์ฌ ์ฒ๋ฆฌ ๋ฐ์ดํฐ๋ 500๊ฑด ๋ฏธ๋ง์ ์๊ท๋ชจ์ง๋ง, ํฅํ ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋์ ์ด๋ ์ฝ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ฌ Reader/Processor/Writer ์ญํ ๋ช ํํ ๋ฐ ์ต์ ํ ๋ฑ ํ์ฅ์ฑ ์ค์ฌ์ ๊ฐ์ ์ ์ํํ๊ณ ์ ํ์๋ค.
ํ์ฌ Writer ๊ฐ์ฒด์์๋ Reader ๊ฐ์ฒด๊ฐ ๊ฐ์ ธ์จ API ๋ฐ์ดํฐ์ DB ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ์ฌ ์ค์ ๋ก ์ ๋ฐ์ดํธ๊ฐ ํ์ํ Row๋ง ์ ๋ณํ์ง๋ง, ์ฌ๊ธฐ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํ๊ณ ์งํํ๋ค.
StrString xmlResponse = webClient
.get()
.uri(uriBuilder -> uriBuilder.scheme("https")
// ํธ์คํธ ๊ฒฝ๋ก
.host(typeSafeProperties.getApiHost())
// ์๋ํฌ์ธํธ ๊ฒฝ๋ก
.path(typeSafeProperties.getApiRltmPath())
// API ์๋น์คํค ์ ๋ฌ
.queryParam("serviceKey", typeSafeProperties.getApiNormalEncoding())
.queryParam("pageNo", currPage)
// 100 -> 500
.queryParam("numOfRows", 500)
.build()
)
// API๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
.retrieve()
// API๋ก๋ถํฐ ์ค๋ฅ๊ฐ ์์๋ ์ค๋ฅ ๋ฐํ
.onStatus(status -> status.isError(), clientResponse -> Mono.error(new Exception()))
// XML ์๋ต์ String์ผ๋ก ๋ฐ์
.bodyToMono(String.class)
.retryWhen(Retry.fixedDelay(3, Duration.ofSeconds(2)))
// ๋น๋๊ธฐ ์์ฒญ์ ๋๊ธฐ์ ์ผ๋ก ๊ธฐ๋ค๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ (Mono์ ๋จ์ผ ๊ฐ ์ฒ๋ฆฌ)
.block();
๋ฌธ์ ์ธ์ :
Reader ๊ฐ์ฒด์์ API๋ฅผ ํธ์ถํ ๋ PageSize๊ฐ ๋๋ฌด ์์ผ๋ฉด HTTP ์์ฒญ ํ์๊ฐ ์ฆ๊ฐํ์ฌ ๋คํธ์ํฌ ์ค๋ฒํค๋๊ฐ ์ปค์ง๊ณ , ์ ์ฒด ๋ฐฐ์น ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
๋ณ๊ฒฝ์ :
ํด๋น API๋ ์ด 413๊ฑด ๊ฐ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ๊ธฐ์กด PageSize 100์ ๋ฐฐ์น ์ฌ์ดํด ๋น ์ฒ๋ฆฌ ๊ฑด์๊ฐ ์ ์ง๋ง HTTP ์์ฒญ์ด 5ํ ๋ฐ์ํ๊ฒ ๋๋ฉฐ ๋คํธ์ํฌ ์ค๋ฒํค๋๋ฅผ ์ฆ๊ฐ์์ผฐ๋ค.
๋ฐ๋ผ์ PageSize๋ฅผ 500์ผ๋ก ๋๋ ค ํ ๋ฒ์ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ์์ ํ์๋ค.