Spring

Spring Transaction κ°„λ‹¨ν•œ ν‹°μΌ“ ꡬ맀 μ„œλΉ„μŠ€ 예제

초보보 ν˜œμ§„ 2021. 12. 1. 17:23
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