๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

2024/11

(4)
ISO 8601 ๊ธฐ์ค€์œผ๋กœ ํŠน์ • ๋‚ ์งœ์˜ N์›” N์ฃผ์ฐจ๋ฅผ Java 8 ๋‚ ์งœ API๋กœ ๊ตฌํ•˜๊ธฐ ISO 8601 ๋ž€ ?ISO 8601์€ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์— ๊ด€๋ จ๋œ ๊ตญ์ œ ํ‘œ์ค€์œผ๋กœ์จ, ์ •์˜๋œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๋งค์ฃผ์˜ ์‹œ์ž‘์ผ์€ ์›”์š”์ผ์ด ๋ฉ๋‹ˆ๋‹ค.๋˜ํ•œ, ๋งค์›”์˜ ์ฒซ ์ฃผ๋Š” ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ์š”์ผ์ด ํฌํ•จ๋œ ์ฃผ๊ฐ€ ๊ธฐ์ค€์ด ๋ฉ๋‹ˆ๋‹ค.  ISO 8601 ๊ธฐ์ค€์œผ๋กœ ์ฃผ์ฐจ ๊ณ„์‚ฐ ์˜ˆ์‹œ2024๋…„ 12์›” ์˜ˆ์‹œ 2024๋…„ 12์›” 30์ผ, 31์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. 2025๋…„ 1์›” 1~5์ผ(์ด 5์ผ)์€ 7์ผ ์ค‘ ๊ณผ๋ฐ˜์ˆ˜๋ฅผ ๋„˜์œผ๋ฏ€๋กœ 1์›” 1์ฃผ์ฐจ์ž…๋‹ˆ๋‹ค ๋”ฐ๋ผ์„œ, 2024๋…„ 12์›” 30์ผ, 31์ผ์€ 2025๋…„ 1์›” 1์ฃผ์ฐจ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค 12์›” 2์ผ ~ 12์›” 8์ผ -> 12์›” 1์ฃผ์ฐจ12์›” 9์ผ ~ 12์›” 15์ผ -> 12์›” 2์ฃผ์ฐจ12์›” 16์ผ ~ 12์›” 22์ผ -> 12์›” 3์ฃผ์ฐจ12์›” 23์ผ ~ 12์›” 29์ผ -> 12์›” 4์ฃผ์ฐจ12์›” 30์ผ ~ ..
[ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] RestTemplate ๋กœ๊น… ์ค‘ 404 ์‘๋‹ต์— ๋Œ€ํ•œ FileNotFoundException ํ•ด๊ฒฐ ๊ฒฐ์ œ ์Šน์ธ POST ์š”์ฒญ ์‹œ RestTemplate ๋กœ๊ทธ์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜ ๊ฒฐ์ œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ, ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” RestTemplate์— ํƒ€์ž„์•„์›ƒ์„ ์ ์šฉํ•˜๊ณ , ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค.  Baeldung์˜ "RestTemplage Logging" ๊ณผ ๋ง๋‚˜๋‹ˆ ๊ฐœ๋ฐœ์ž๋‹˜์˜ ๋กœ๊น… ์„ ์ฐธ๊ณ ํ•ด์„œ RestTemplate ์— ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ ํ–ˆ์ง€๋งŒ ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ, FileNotFoundException ์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.java.io.FileNotFoundException: https://api.tosspayments.com/v1/payments/confirmjava.base/sun.net.www.protocol.http.HttpURLConnection..
@Async ์ด๋ฉ”์ผ ์ „์†ก ๊ณ ๋„ํ™”: ์žฌ์‹œ๋„, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ํ…Œ์ŠคํŠธ ์ธ์ฆ ์ด๋ฉ”์ผ ์ „์†ก ์‹œ, ๊ฐ„ํ˜น ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฉ”์ผ์ด ์ •์ƒ์ ์œผ๋กœ ์ „์†ก๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฆ‰์‹œ ์˜ค๋ฅ˜๋ฅผ ์•Œ๋ฆฌ๋Š” ๋Œ€์‹ , ์žฌ์‹œ๋„ ๋กœ์ง์„ ํ†ตํ•ด ์ด๋ฉ”์ผ ์ „์†ก ์„ฑ๊ณต ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์žฌ์‹œ๋„ ์ถ”๊ฐ€ ์‹œ ๊ณ ๋ คํ•œ ๊ฒƒ๋“ค์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชฉ์ฐจ๋กœ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.์žฌ์‹œ๋„(@Retryable) ์กฐ๊ฑด ์„ค์ •์žฌ์‹œ๋„ ์˜ˆ์™ธ์™€ ์“ฐ๋ ˆ๋“œ ํ’€ ์˜ˆ์™ธ๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ์žฌ์‹œ๋„ ๋ฐ ๋ณต๊ตฌ๊ฐ€ ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ* ๋น„๋™๊ธฐ์—์„œ ์žฌ์‹œ๋„ ๋กœ์ง ๊ตฌํ˜„์„ ์œ„ํ•ด Baeldung(async-retry)๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์‹œ๋„(@Retryable) ์กฐ๊ฑด ์„ค์ •๋จผ์ €, ์ด๋ฉ”์ผ ์ „์†ก์— ์žฌ์‹œ๋„ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Spring Mail ๊ด€๋ จ ์˜ˆ์™ธ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.MailAuthentic..
@Async๋กœ ์ด๋ฉ”์ผ ์ „์†ก์„ Async-NonBlocking ์ฒ˜๋ฆฌํ•˜๊ธฐ: ์“ฐ๋ ˆ๋“œ ํ’€ ์„ค์ •๊ณผ API ์‘๋‹ต ์†๋„ 99% ๊ฐœ์„  @Async ๋ฅผ ๋„์ž…ํ•˜๋ฉฐ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ๊ณผ ์“ฐ๋ ˆ๋“œ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์“ฐ๋ ˆ๋“œ ํ’€ ์„ค์ •์„ ํ•™์Šตํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ๊ณผ์ •์„ ์†Œ๊ฐœํ•˜๋ฉฐ Jmeter ๋ฅผ ํ†ตํ•ด API ์‘๋‹ต ์†๋„๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชฉ์ฐจ๋กœ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.์ด๋ฉ”์ผ ์ „์†ก์„ ๋น„๋™๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด์œ ์“ฐ๋ ˆ๋“œ ํ’€ ์‚ฌ์šฉ ์—ฌ๋ถ€ ๊ณ ๋ ค์“ฐ๋ ˆ๋“œ ํ’€ ์„ค์ • ๊ณ ๋ ค ์‚ฌํ•ญ์“ฐ๋ ˆ๋“œ ํ’€ ์„ค์ •ThreadPoolTaskExecutor ๋™์ž‘ ๋ฐฉ์‹์“ฐ๋ ˆ๋“œ ํ’€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์„ค์ •Jmeter ๋กœ @Async ๋„์ž… ์ ์šฉ ์ „๊ณผ ํ›„์˜ API ์‘๋‹ต ์‹œ๊ฐ„์„ ๋น„๊ต@Async ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์  ์ด๋ฉ”์ผ ์ „์†ก์„ ๋น„๋™๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด์œ ์—์–ด๋น„์•ค๋น„ ํด๋ก  ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋ฉ”์ผ ์ธ์ฆ ๊ธฐ๋ฐ˜์˜ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.  ์ด๋ฉ”์ผ ์ „์†ก์—๋Š” Spring Mail์˜ JavaMailSender๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ..