Record/ํšŒ๊ณ ๋ก

24์‹œ๊ฐ„ ์ž๋™ ์ง€๊ธ‰ ํšŒ๊ณ ๋ก

seung_soos 2025. 1. 16. 21:03

๐Ÿ’ก ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

๐ŸŽฏ ๋ชฉ์ 

  • ์ง€๊ธ‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ์—…๋ฌด ํšจ์œจ์„ฑ๊ณผ ์ •ํ™•์„ฑ์„ ๋™์‹œ์— ํ–ฅ์ƒ

โœ… ๋‹ฌ์„ฑํ•œ ๋ชฉํ‘œ

๐Ÿ•’ 24์‹œ๊ฐ„ ๋ฌด์ค‘๋‹จ ์ง€๊ธ‰ ํ”„๋กœ์„ธ์Šค ๊ตฌ์ถ•

  • ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฐ˜์œผ๋กœ ์•ˆ์ •์ ์ด๊ณ  ์ง€์† ๊ฐ€๋Šฅํ•œ ์ž๋™ ์ง€๊ธ‰ ์‹œ์Šคํ…œ ์šด์˜

๐Ÿ”ง ๊ธฐ์กด ๋กœ์ง ๋ถ„์„ ๋ฐ ๊ตฌ์กฐ ๊ฐœ์„ 

  • ๊ธฐ์กด v1 ์ง€๊ธ‰ ๋กœ์ง์„ ์ „๋ฉด ๋ถ„์„ํ•˜์—ฌ ์ง€๊ธ‰ ํ๋ฆ„์„ ์ƒˆ๋กญ๊ฒŒ ์„ค๊ณ„
  • ์ˆ˜๊ธฐ ์ง€๊ธ‰ ์‹œ ์…€๋Ÿฌ์˜ ์ •์‚ฐ ๊ณ„์ขŒ ๋ฐ ์‹ ์šฉ ์ƒํƒœ๋ฅผ ์‚ฌ๋žŒ์ด ์ง์ ‘ ๊ฒ€ํ† ํ•˜๋˜ ๊ตฌ์กฐ๋ฅผ ์‹œ์Šคํ…œ์ด ์ž๋™ ๊ฒ€์ฆํ•˜๋„๋ก ๊ฐœ์„ 
  • ์ด๋กœ ์ธํ•ด CXํŒ€ ๋ฆฌ์†Œ์Šค ์†Œ์š”๊ฐ€ ์•ฝ 50~70% ๊ฐ์†Œํ•˜๋Š” ํšจ๊ณผ ์ฒด๊ฐ

๐Ÿ”จ ๋ ˆ๊ฑฐ์‹œ ๊ตฌ์กฐ ํ†ตํ•ฉ

  • ์ง€๊ธ‰ ํ”„๋กœ์„ธ์Šค๊ฐ€ PHP, Node.js, Java์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋˜ ๊ตฌ์กฐ๋ฅผ Java ๋‹จ์ผ ์„œ๋ฒ„๋กœ ํ†ตํ•ฉ
  • ๊ธฐ์กด์—๋Š” Transaction ์ฒ˜๋ฆฌ๊ฐ€ ์—†์–ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, ์—„๊ฒฉํ•œ ํŠธ๋žœ์žญ์…˜ ์ œ์–ด๋กœ ์•ˆ์ •์„ฑ ํ™•๋ณด

๐Ÿš€ ์„ฑ๋Šฅ ๊ฐœ์„ 

  • ๋™๊ธฐ ์ฒ˜๋ฆฌ → ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์†๋„ ๊ฐœ์„ 
  • ๊ธฐ์กด์—๋Š” ์‹ ์ฒญ๊ฑด์ด N๊ฐœ์ผ ๊ฒฝ์šฐ, ๊ฑด๋‹น ์•ฝ 1๋ถ„์˜ ํฌ๋กค๋ง ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์–ด ์ „์ฒด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ตฌ์กฐ
  • CompletableFuture๋ฅผ ํ™œ์šฉํ•ด ๋น„๋™๊ธฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ๋กœ ์ „ํ™˜, ๋‹ค์ˆ˜์˜ ์‹ ์ฒญ๊ฑด์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ 

โš ๏ธ ์˜ˆ์™ธ ์ƒํ™ฉ ๋Œ€์‘

  • ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์—ฐ๋™ ์ค‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ์— ์ฒ ์ €ํžˆ ๋Œ€์‘
  • PaymentWaitException, PaymentFailureException ๋“ฑ์˜ Custom Exception์„ ๋„์ž…ํ•ด ์˜ˆ์™ธ ์ƒํ™ฉ ๋ช…ํ™•ํ™”
  • ์ง€๊ธ‰ ๋‹จ๊ณ„๋ณ„ STEP์„ ๋„์ž…ํ•ด ๋ฌธ์ œ ์ง€์ ์„ ์ถ”์  ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ€๋Šฅ

๐Ÿ›‘ ๊ธด๊ธ‰ ์ค‘๋‹จ ์ œ์–ด ๊ธฐ๋Šฅ

  • ์ง€๊ธ‰ ์ค‘๋‹จ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์— ๋Œ€๋น„ํ•ด Redis์— ์ƒํƒœ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ”„๋กœ์„ธ์Šค์˜ ํ๋ฆ„์„ ๋™์ ์œผ๋กœ ์ œ์–ด

๐Ÿง  ์–ด๋ ค์›€๊ณผ ํ•ด๊ฒฐ ๊ณผ์ •

1. CompletableFuture์™€ JPA์˜ ์˜์†์„ฑ ๊ด€๋ฆฌ

  • ๋ฌธ์ œ:
    • JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ThreadLocal ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— CompletableFuture.runAsync() ๋‚ด์—์„œ EntityManager ์ ‘๊ทผ ๋ถˆ๊ฐ€
    • ์ด๋กœ ์ธํ•ด ๋น„๋™๊ธฐ ๋กœ์ง ๋‚ด์—์„œ JPA ๊ด€๋ จ ์ž‘์—…(save(), findById() ๋“ฑ)์„ ํ˜ธ์ถœํ•˜๋ฉด LazyInitializationException
      ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ.
  • ํ•ด๊ฒฐ:
    • JPA ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ(์กฐํšŒ, ์ €์žฅ ๋“ฑ)๋Š” ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜ ๋‚ด์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌ
    • ์ดํ›„ ํฌ๋กค๋ง ์ž‘์—…๋งŒ CompletableFuture๋กœ ๋น„๋™๊ธฐ ๋ถ„๋ฆฌ

2. ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์—ฐ๋™ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

  • ๋ฌธ์ œ: ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›€
  • ํ•ด๊ฒฐ:
    • Custom Exception์— ์ง€๊ธ‰ ๋‹จ๊ณ„ ๋ฐ ์›์ธ ์ •๋ณด๋ฅผ ํฌํ•จ
    • ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ์—๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋กค๋ฐฑ ์—ฌ๋ถ€ ์„ค์ •
      (@Transactional(noRollbackFor = { PaymentWaitException.class }) ๋“ฑ)

3. ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ ๊ด€๋ฆฌ

  • ๋ฌธ์ œ: ํŠธ๋žœ์žญ์…˜์˜ ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ฒฝํ—˜ ๋ถ€์กฑ์œผ๋กœ Rollback ์—ฌ๋ถ€ ํŒ๋‹จ์ด ์–ด๋ ค์› ์Œ
  • ํ•ด๊ฒฐ: ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์„ ๊ฒช์œผ๋ฉฐ ํŠธ๋žœ์žญ์…˜์˜ ํŠน์„ฑ๊ณผ ๋™์ž‘ ์‹œ์ ์„ ํ•™์Šตํ•˜๊ณ  ์ ์šฉ
  • ์ฐธ๊ณ ๋งํฌ: https://techblog.woowahan.com/2606/

๐Ÿงช ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

  • ์™ธ๋ถ€ ์—ฐ๋™์„ ์ œ์™ธํ•œ ๋‚ด๋ถ€ ๋กœ์ง์€ Testcontainer๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹ค์ œ ์ธํ”„๋ผ์™€ ์œ ์‚ฌํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ
  • ๋กœ์ปฌ์—์„œ๋„ Redis, DB, ๋“ฑ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„

๊ด€๋ จ๊ธฐ์‚ฌ : https://wowtale.net/2025/01/31/236617/