Spring Transaction ๊ฐ„๋‹จํ•œ ํ‹ฐ์ผ“ ๊ตฌ๋งค ์„œ๋น„์Šค ์˜ˆ์ œ

2021. 12. 1. 17:23ใ†Spring

728x90

 

1. Transaction

https://hyejin.tistory.com/119?category=975063 

 

[Database] Transaction๊ณผ Trigger

1. Transaction ํŠธ๋žœ์žญ์…˜์ด๋ž€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ๋ฅผ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์˜ ๋‹จ์œ„ ๋˜๋Š” ํ•œ๊บผ๋ฒˆ์— ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•  ์ผ๋ จ์˜ ์—ฐ์‚ฐ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด

hyejin.tistory.com

 

ํŠธ๋žœ์žญ์…˜์ด๋ž€ ๋…ผ๋ฆฌ์  ์ž‘์—… ๋‹จ์œ„๋กœ, 

ํŠธ๋žœ์žญ์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—… ์ค‘ ์–ด๋–ค ํ•œ ๋ถ€๋ถ„์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, 

๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ „์ฒด ํŠธ๋žœ์žญ์…˜์€ ์ทจ์†Œ๋˜์–ด์•ผ ํ•œ๋‹ค. 

 

commit : ํŠธ๋žœ์žญ์…˜์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ 

rollback : ํŠธ๋žœ์žญ์…˜์„  ์ทจ์†Œํ•˜๋Š” ๊ฒƒ 

 

 

2. Transaction์„ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ ํ‹ฐ์ผ“ ๊ตฌ๋งค ์„œ๋น„์Šค 

์‚ฌ์šฉ์ž๊ฐ€ ํ‹ฐ์ผ“ ๊ตฌ๋งค๋ฅผ ํ•˜๋ฉด ํ‹ฐ์ผ“ ํŒ๋งค์ž๋Š” ํ‹ฐ์ผ“์„ ๊ทธ์— ๋งž๊ฒŒ ๋ฐœํ–‰ํ•ด์ค˜์•ผํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ํ‹ฐ์ผ“ ๊ตฌ๋งค์— ์ž‘์—… ์ค‘ ํ•œ ๋ถ€๋ถ„๋งŒ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํ•ด๋„ ๋‹ค๋ฅธ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ํŠธ๋žœ์žญ์…˜์€ ์ทจ์†Œํ•ด์•ผํ•œ๋‹ค.

 

1๏ธโƒฃ Table ์ƒ์„ฑํ•˜๊ธฐ 

test_card : ๊ณ ๊ฐ ํ‹ฐ์ผ“ ๊ตฌ๋งค ํ…Œ์ด๋ธ” 

SQL> create table test_card
(
  user_id varchar(20) not null,
  buy_amount number default 1 
);

test_ticket : ํ‹ฐ์ผ“ ์ œ๊ณต์‚ฌ ํ‹ฐ์ผ“ ๋ฐœํ–‰ ํ…Œ์ด๋ธ” 

create table test_ticket 
( user_id varchar(20) not null, 
  ticket_count number not null, 
   constraint ticket_buy_limit 
   check (ticket_count between 1 and 5) 
);

์ด๋•Œ ํ‹ฐ์ผ“ ์ œ๊ณต์‚ฌ์—์„œ๋Š” ํ•œ ์œ ์ € id๋‹น ํ‹ฐ์ผ“์„ 1๊ฐœ์—์„œ 5๊ฐœ๊นŒ์ง€๋งŒ ๊ตฌ๋งค ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ œ์•ฝ์‚ฌํ•ญ์„ ๊ฑธ์—ˆ๋‹ค. 

๋”ฐ๋ผ์„œ ํ•œ ์œ ์ €๊ฐ€ 6๊ฐœ ์ด์ƒ์„ ๊ตฌ๋งคํ•œ๋‹ค ํ•˜๋ฉด test_card ํ…Œ์ด๋ธ”, test_ticket ํ…Œ์ด๋ธ” ๋ชจ๋‘ ํŠธ๋žœ์žญ์…˜์„ ์ทจ์†Œํ•ด์•ผํ•œ๋‹ค. 

 

 

2๏ธโƒฃ Servlet-context.xml ์Šคํ”„๋ง ๋นˆ ์„ค์ •ํŒŒ์ผ 

 

โ— TransactionTemplate 

์Šคํ”„๋ง์—์„œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ œ๊ณตํ•œ๋‹ค. 

๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ , TicketDAO ๊ตฌํ˜„ ํด๋ž˜์Šค์—์„œ TransactionTemplate setter ๋ฉ”์„œ๋“œ์— ์ž๋™์ฃผ์ž…ํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋ฐ˜ํ™˜๊ฐ’ ์–ป๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด TransactionCallbackWithoutResult() ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

 

3๏ธโƒฃ TicketVO, TicketService, TicketDAO ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ๊ตฌํ˜„ ํด๋ž˜์Šค ์ž‘์„ฑ 

- TicketVO

 

- TicketService ์ธํ„ฐํŽ˜์ด์Šค 

- TicketServiceImpl

 

- TicketDAO ์ธํ„ฐํŽ˜์ด์Šค 

 

- TicketDAOImpl 

 

 

4๏ธโƒฃ TicketController.java

buyPage.do๋Š” ํ‹ฐ์ผ“ ๊ตฌ๋งค๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€์ด๊ณ , 

buyTicket.do๋Š” ํ‹ฐ์ผ“ ๊ตฌ๋งค ํŽ˜์ด์ง€ ํผ์—์„œ ๊ฐ’ ์ž…๋ ฅ ํ›„ ๊ตฌ๋งค ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋™์ž‘ํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ์ด๋‹ค. 

์ด๋•Œ ํ‹ฐ์ผ“ ๊ฐœ์ˆ˜๊ฐ€ 5๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ticketSetvice์˜ buyTicket() ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ticket/buyDone.jsp ๋ทฐ ์ด๋ฆ„์„ ๋ฆฌํ„ดํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด  ticket/buyFail.jsp ๋ทฐ ์ด๋ฆ„์„ ๋ฆฌํ„ดํ•˜๋ฉฐ ticketService์˜ buyTicket() ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„ ํŠธ๋žœ์žญ์…˜ ์ž‘์—…์„ ์ทจ์†Œํ•œ๋‹ค. 

 

5๏ธโƒฃ buyPage.jsp, buyDone.jsp, buyFail.jsp

- buyPage.jsp

 

- buyDone.jsp

 

- buyFail.jsp

 

 

 

6๏ธโƒฃ ์‹คํ–‰ ๊ฒฐ๊ณผ 

ํ‹ฐ์ผ“ ๊ตฌ๋งค ํŽ˜์ด์ง€ 

 

๋งŒ์•ฝ 10๊ฐœ์˜ ํ‹ฐ์ผ“์„ ๊ตฌ๋งคํ•˜๋ ค ํ•œ๋‹ค๋ฉด 

 

์ด๋Ÿฐ ์•Œ๋ฆผ์ฐฝ์„ ๋ฐ›๊ฒŒ ๋˜๋ฉฐ ๋‹ค์‹œ ๊ตฌ๋งค ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ„๋‹ค.

 

10๊ฐœ์—์„œ 4๊ฐœ๋กœ ๊ณ ์ณ ๊ตฌ๋งค ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด 

 

์ •์ƒ์ ์œผ๋กœ ํ‹ฐ์ผ“ ๊ตฌ๋งค๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋‹ค.

 

db์—๋„ 10๊ฐœ ํ‹ฐ์ผ“ ๊ตฌ๋งค์— ๋Œ€ํ•œ ๊ฐ’์€ ํŠธ๋žœ์žญ์…˜ ์ทจ์†Œ๋œ๊ฑธ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

 

 

 

728x90