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

ํ”„๋กœ์ ํŠธ/Airbnb Clone

[๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค ์„ค๊ณ„] ํŠธ๋žœ์žญ์…˜ ์„ค์ • ๋ฐ ์ „ํŒŒ, ๋™๊ธฐ/๋น„๋™๊ธฐ, ๋™์‹œ์„ฑ, Facade ํŒจํ„ด

์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์ค‘, ์ˆ™์†Œ ์˜ˆ์•ฝ์„ ํ•  ๋•Œ์˜ ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌํ˜„์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์•ฝ์„ ํ™•์ •ํ•  ๋•Œ, ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋กœ ๋‚˜๋‰˜์–ด ์ง‘๋‹ˆ๋‹ค. 

๊ฒฐ์ œ ์š”์ฒญ๋ถ€ํ„ฐ ์‘๋‹ต๊นŒ์ง€์˜ ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค

 

์ด ๋•Œ, ์ œ๊ฐ€ ๊ณ ๋ คํ•œ ๊ฒƒ์€ ์ด 5๊ฐ€์ง€์ด๋ฉฐ ์ด์— ๋Œ€ํ•ด ์„ค๋ช…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค์˜ ํŠธ๋žœ์žญ์…˜ ์„ค์ • ๋ฒ”์œ„
  • '๊ฒฐ์ œ ์Šน์ธ์„ ์œ„ํ•œ PG์‚ฌ API ํ˜ธ์ถœ'๊ณผ ํŠธ๋žœ์žญ์…˜์˜ ์ˆœ์„œ
  • '๊ฒฐ์ œ ์Šน์ธ์„ ์œ„ํ•œ PG์‚ฌ API ํ˜ธ์ถœ'์„ ๋™๊ธฐ/๋น„๋™๊ธฐ ์ค‘ ์„ ํƒ 
  • ๋™์‹œ์„ฑ ์ œ์–ด ๋ฐฉ๋ฒ•
  • ์ž”์•ก ๋ถ€์กฑ์œผ๋กœ ์ธํ•œ ๊ฒฐ์ œ ์Šน์ธ ์‹คํŒจ๋‚˜ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€

 

1. ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค์˜ ํŠธ๋žœ์žญ์…˜ ์„ค์ • ๋ฒ”์œ„

'๊ฒฐ์ œ ์Šน์ธ์„ ์œ„ํ•œ PG์‚ฌ API ํ˜ธ์ถœ' ์€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด PG์‚ฌ์—๊ฒŒ POST ์š”์ฒญ์„ ํ†ตํ•ด ๊ฒฐ์ œ๋ฅผ ์Šน์ธ ๋ฐ›๋Š” ๊ณผ์ •์œผ๋กœ ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ๋˜์–ด ํŠธ๋žœ์žญ์…˜์ด ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ๋“ค์ด ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Mysql 8.0 InnoDB ์•„ํ‚คํ…์ฒ˜ ํŠน์„ฑ ์ƒ ํŠธ๋žœ์žญ์…˜์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก ์–ธ๋‘ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜์ง€ ๋ชปํ•˜๊ณ  ์„ฑ๋Šฅ์ด ๋Š๋ ค์ง‘๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์ด ๊ธธ๋ฉด DB์ปค๋„ฅ์…˜์ด ์žฌํ™œ์šฉ๋˜์ง€ ๋ชปํ•˜๊ณ , ๋™์‹œ ์š”์ฒญ์˜ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹œ๊ฐ„์— ์˜ํ•ด DB์ปค๋„ฅ์…˜์ด timeout ๋˜๊ฑฐ๋‚˜, ์ž ๊ธˆ์ด ์ผ์–ด๋‚ฌ์„ ๊ฒฝ์šฐ ์ž ๊ธˆ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ํŠธ๋žœ์žญ์…˜์—์„œ '๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ'์„ ๋ถ„๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

2. '๊ฒฐ์ œ ์Šน์ธ์„ ์œ„ํ•œ PG์‚ฌ API ํ˜ธ์ถœ' ์˜ ์ˆœ์„œ

์ด์ œ '๊ฒฐ์ œ ์Šน์ธ์„ ์œ„ํ•œ PG์‚ฌ API ํ˜ธ์ถœ'(์ดํ•˜ ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ) ์˜ ์ˆœ์„œ๋ฅผ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘๊ณผ ๋ ์ค‘ ์–ด๋””์— ๋†“์„ ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.

 

'๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ' ์ด ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ์ „์ผ ๊ฒฝ์šฐ

  • ์žฅ์ 
    • ๊ฒฐ์ œ ์Šน์ธ์ด ์‹คํŒจ ํ–ˆ์„ ๋•Œ, ๊ณ ๋ คํ•  ๊ฒƒ์ด ์ ์–ด์ง„๋‹ค → DB์ปค๋„ฅ์…˜์„ ์“ฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— DB ๊ด€๋ จ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜์›”ํ•˜๋‹ค.
    • ๊ฒฐ์ œ ์Šน์ธ์ด ์„ฑ๊ณตํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์กŒ์„ ๋•Œ ๋กค๋ฐฑํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค.
  • ๋‹จ์ 
    • ๊ฒฐ์ œ ์Šน์ธ์ด ์„ฑ๊ณตํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์กŒ์„ ๋•Œ, ๋กค๋ฐฑํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ PG์‚ฌ์—๊ฒŒ '๊ฒฐ์ œ ์ทจ์†Œ ์š”์ฒญ' ์„ ์ถ”๊ฐ€๋กœ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.

'๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ'์ด ํŠธ๋žœ์žญ์…˜ ๋๋‚œ ํ›„์ผ ๊ฒฝ์šฐ

  • ์žฅ์ 
    • ์ˆ™์†Œ๊ฐ€ ์˜ˆ์•ฝ์ด ์„ฑ๊ณต์ ์ผ ๋•Œ๋งŒ '๊ฒฐ์ œ ์Šน์ธ' ์ด ์ง„ํ–‰๋œ๋‹ค.
  • ๋‹จ์ 
    • '๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ' ์—์„œ ๊ธˆ์•ก ๋ถ€์กฑ๊ณผ ๊ฐ™์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์Šน์ธ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ปค๋ฐ‹๋œ ํŠธ๋žœ์žญ์…˜์„ ์†์ˆ˜ ๋กค๋ฐฑํ•ด์•ผ ํ•œ๋‹ค. 
    • ์ด ๋•Œ, '๊ฒฐ์ œ ์ทจ์†Œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋น„์šฉ'๋ณด๋‹ค 'ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•˜๊ธฐ ์œ„ํ•ด DELETE ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑ'ํ•˜๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ๋” ํฝ๋‹ˆ๋‹ค.
      • ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝ ํ…Œ์ด๋ธ”์— ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ DELETE ํ•  ๋•Œ๋Š” ๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€์˜ ์“ฐ๊ธฐ ๋ฝ์œผ๋กœ ๊ฑธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ๋“œ๋ฝ ๋นˆ๋„๋ฅผ ๋†’์ด๋Š” ํ–‰์œ„์ž…๋‹ˆ๋‹ค.
      • InnoDB ์•„ํ‚คํ…์ฒ˜์˜ ์ฒด์ธ์ง€ ๋ฒ„ํผ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
        • ์ฒด์ธ์ง€ ๋ฒ„ํผ๋ž€ ์“ฐ๊ธฐ ์ž‘์—… ์‹œ ๋””์Šคํฌ์— ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋Š” ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ˜์˜ํ•จ์œผ๋กœ์จ ๋””์Šคํฌ I/O ๋ฅผ ์ค„์ด๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์œ ๋‹ˆํฌ ์ปฌ๋Ÿผ์€ ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์— ์“ฐ๊ธฐ ์ž‘์—… ์‹œ ๋””์Šคํฌ์— ์ฆ‰์‹œ ๋ฐ˜์˜์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณ ๋ฏผ์„ ๋ฐ”ํƒ•์œผ๋กœ ์•„๋ž˜์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด '๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ' ์„ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ์ „์— ๋†“๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค์˜ ์ง„ํ–‰ ์„ค๊ณ„

 

3. ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์™ธ๋ถ€ API ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์„ ๋™๊ธฐ๋กœ ์„ ํƒ

๋น„๋™๊ธฐ์˜ ์žฅ๋‹จ์ 

  • ์žฅ์ 
    • ์™ธ๋ถ€ API ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„ ๋˜๋‹ˆ ์ œ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์ด ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.
  • ๋‹จ์ 
    • ์ž”์•ก ๋ถ€์กฑ ๊ฐ™์€ ์ด์œ ๋กœ ๊ฒฐ์ œ ์Šน์ธ์ด ์‹คํŒจํ•  ๊ฒฝ์šฐ, ์˜ˆ์•ฝ ํ…Œ์ด๋ธ”๊ณผ ๊ฒฐ์ œ ํ…Œ์ด๋ธ”์— INSERT ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ DELETE ํ•ด์•ผ ํ•œ๋‹ค.
    • ์ด ๊ณผ์ •์—์„œ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์ด ๋ฐ๋“œ๋ฝ์ด ๋˜์–ด DELETE ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์žฌ์‹œ๋„ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์˜ˆ์™ธ๋ฅผ ์žก๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ ํ›„์ฒ˜๋ฆฌ ๋กœ์ง์ด ๋Š˜์–ด๋‚œ๋‹ค.

๋™๊ธฐ์˜ ์žฅ๋‹จ์ 

  • ์žฅ์ 
    • ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ ์‹คํŒจํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋˜์ง€ ์•Š์œผ๋‹ˆ ๋น„๋™๊ธฐ์˜ ๋‹จ์ ์— ํ•ด๋‹นํ•˜๋Š” ๋กœ์ง์ด ํ•„์š” ์—†๋‹ค.
  • ๋‹จ์ 
    • ์™ธ๋ถ€ API ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋‹ˆ ์™ธ๋ถ€ API ์‘๋‹ต์ด ๋Š๋ฆด ๊ฒฝ์šฐ, ์„œ๋ฒ„ ์ „์ฒด์˜ ์„ฑ๋Šฅ์ด ๋Š๋ ค์ง„๋‹ค.

์ €๋Š” ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์™ธ๋ถ€ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ์˜ ๋‹จ์  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋™๊ธฐ์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

HTTP ์“ฐ๋ ˆ๋“œ ํ’€์˜ ์—ฐ๊ฒฐ ์‹œ๊ฐ„ ํƒ€์ž„ ์•„์›ƒ๊ณผ ์‘๋‹ต ์‹œ๊ฐ„ ํƒ€์ž„ ์•„์›ƒ์„ ์„ค์ •ํ•ด์„œ ๊ทน๋ณตํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ API ์žฅ์• ์— ์˜ํ–ฅ์„ ๋œ ๋ฐ›์œผ๋ฉฐ, ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

4. ๋™์‹œ์„ฑ ์ œ์–ด ๋ฐฉ๋ฒ•

์ €๋Š” ์˜ˆ์•ฝ ๋‚ ์งœ์— ๋Œ€ํ•ด ์ˆ™์†ŒID ์™€ ๋‚ ์งœ์— ๋Œ€ํ•ด ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์œ 

  • ์ตœ์ดˆ INSERT ์‹œ์—๋Š” ๋‚™๊ด€์ /๋น„๊ด€์  ๋ฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • '์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€' ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ˆ™์†ŒID์™€ ๋‚ ์งœ๋ฅผ ์กฐํšŒํ•ด์•ผ ํ•˜๋ฉฐ, ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด ๋•Œ, ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. 

ํ•œ๊ณ„

  • ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์€ ์ฒด์ธ์ง€ ๋ฒ„ํผ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์“ฐ๊ธฐ ์ž‘์—…์ด ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์˜ˆ์•ฝ ํ…Œ์ด๋ธ”์— INSERT ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ๋Š๋ ค์ง„๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

5. ์ž”์•ก ๋ถ€์กฑ์œผ๋กœ ์ธํ•œ ๊ฒฐ์ œ ์Šน์ธ ์‹คํŒจ๋‚˜ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

์ž”์•ก ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ๊ฒฐ์ œ ์Šน์ธ์ด ์‹คํŒจํ•œ๋‹ค๋ฉด DB ์กฐ์ž‘์ด ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ ์‹œ, ๊ฒฐ์ œ ์ทจ์†Œ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ์™€ Facade ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋จผ์ €, ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ์˜ ๊ธฐ๋ณธ ์„ค์ •์ธ REQUIRED๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

class ๊ฒฐ์ œ์„œ๋น„์Šค {
    
    private final ์˜ˆ์•ฝ์„œ๋น„์Šค;
    
    @Transactional
    public void ์ˆ™์†Œ_์˜ˆ์•ฝ์—_๋Œ€ํ•œ_๊ฒฐ์ œ์ถ”๊ฐ€() {
    	
        1. ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ(์™ธ๋ถ€ API ํ˜ธ์ถœ)
        2. @Transactional
           ์˜ˆ์•ฝ ์„œ๋น„์Šค ํ˜ธ์ถœ()  -> ์˜ˆ์•ฝ ์ค‘๋ณตํ™•์ธ, ์˜ˆ์•ฝ ํ…Œ์ด๋ธ” INSERT
        3. ๊ฒฐ์ œ ํ…Œ์ด๋ธ” INSERT
    }
}

 

์ด์ œ, ๋„คํŠธ์›Œํฌ๋ฅผ ํƒ€๋Š” ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ์„ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ถ„๋ฆฌํ•˜๊ณ ์ž Facade ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ์ œ Facade๋Š” ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ(์™ธ๋ถ€ API ํ˜ธ์ถœ)์„ ํ•˜๋Š” TossClient ์™€ @Transactional์ด ๊ฑธ๋ฆฐ ๊ฒฐ์ œ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

๊ฒฐ์ œ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งŒ @Transactional ์„ ๊ฑธ์Œ์œผ๋กœ์จ ํŠธ๋žœ์žญ์…˜์—์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ถ„๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค ๊ตฌํ˜„ ์„ธ๋ถ€ ๋‚ด์šฉ

 

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ์ œ ์„œ๋น„์Šค์˜ ํŠธ๋žœ์žญ์…˜์„ ์˜ˆ์•ฝ ์„œ๋น„์Šค๊นŒ์ง€ ์ „ํŒŒ์‹œ์ผœ ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ INSERT, ์˜ˆ์•ฝ ํ™•์ • UPDATE, ์˜ˆ์•ฝ ๋‚ ์งœ INSERT ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋กค๋ฐฑ์ด ๋˜์–ด ๋ฌผ๋ฆฌ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ๋กค๋ฐฑ ๋  ๋•Œ Spring์ด ์ œ๊ณตํ•˜๋Š” DB ์ตœ๊ณ  ์ƒ์œ„ ์˜ˆ์™ธ์ธ DataAccessException ์„ try-catch ๋กœ ์žก๊ฒŒ ๋˜๋ฉด TossClient ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ, ๊ฒฐ์ œ ์ทจ์†Œ ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

public ๊ฒฐ์ œ์‘๋‹ต๋ฐ์ดํ„ฐ ์˜ˆ์•ฝํ™•์ธํ•˜๊ธฐ(PaymentConfirmServiceRequest request) {

        // ์ž„์‹œ ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ ์กด์žฌ & ์š”์ฒญ์ž์™€ ๊ฒฐ์ œ์ž๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธ
        paymentService.validateExistingPaymentTemporary(request);

        // ๊ฒฐ์ œ ์Šน์ธ ์š”์ฒญ(์™ธ๋ถ€ API ํ˜ธ์ถœ)
        TossPaymentConfirm tossPaymentConfirm = tossClient.confirmPayment(request.paymentKey(), request.orderId(),
                request.amount());

        try {
            
            // ๊ฒฐ์ œ ๋ฐ ์˜ˆ์•ฝ INSERT ์— ๋Œ€ํ•œ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
            return paymentService.confirmReservation(tossPaymentConfirm, request.reservationId(), request.memberId());
        
        } catch (DataIntegrityViolationException | BusinessException e) {
            log.warn("์˜ˆ์•ฝ ์‹คํŒจ", e);

            // ๊ฒฐ์ œ ์ทจ์†Œ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ
            tossClient.cancelPayment(request.paymentKey());
            throw new BusinessException(ErrorCode.NOT_CONFIRM_RESERVATION);
        }
    }

 

 

 

๊ธ€์„ ๋งˆ๋ฌด๋ฆฌ ํ•˜๋ฉฐ..

 

์ €๋Š” ๊ธฐ๋Šฅ์˜ ์•ˆ์ •์„ฑ์„ ์šฐ์„ ์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ, ๊ธ€์„ ์ฝ๊ณ  ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ๋ณด์ธ๋‹ค๋ฉด ์ฃผ์ €์—†์ด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๊ณต๋ถ€ํ•ด์„œ ๋ณด์™„ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ™‡‍โ™‚๏ธ