# Spring์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Transaction ํ•ด๊ฒฐ
Study Repository

Spring์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Transaction ํ•ด๊ฒฐ

by rlaehddnd0422

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์— ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•ด ์ปค๋„ฅ์…˜์„ ์–ป๋Š”๋‹ค๊ณ  ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋Š” ์‚ฌ์‹ค ๋‚ด๋ถ€์— ์„ธ์…˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ปค๋„ฅ์…˜์„ ์ด์šฉํ•œ ๋ชจ๋“  ์š”์ฒญ์€ ๊ฐ ์ปค๋„ฅ์…˜์˜ ์„ธ์…˜์„ ํ†ตํ•ด์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ปค๋„ฅ์…˜ ํ’€์„ ์ด์šฉํ•œ๋‹ค๋ฉด ์ปค๋„ฅ์…˜ ํ’€์ด 10๊ฐœ์˜ ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•˜๋ฉด ์„ธ์…˜๋„ 10๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒ ์ฃ ?

 

ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ๋ฒ•

  • ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ set autocommit false๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์„ธ์…˜์—์„œ ๋ช…๋ น์–ด ์ˆ˜ํ–‰ ํ›„ ์ž๋™์œผ๋กœ commit๋˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. set autocommit false ์„ค์ •์„ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ‘œํ˜„
  • ์ฐธ๊ณ ๋กœ ํ•œ๋ฒˆ ์„ค์ •ํ•ด๋‘๋ฉด ํ•ด๋‹น ์„ธ์…˜์—์„œ๋Š” ์„ค์ •๊ฐ’์ด ๊ณ„์† ์œ ์ง€ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜์˜ํ•˜๋ ค๋ฉด commit์„ ํ˜ธ์ถœํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜์˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉด rollback์„ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ณ„์ขŒ์ด์ฒด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ž๋ฐ”์—์„œ ์–ด๋–ป๊ฒŒ ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๊ณ„์ขŒ์ด์ฒด ๋ฌธ์ œ 

1. ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ 

set autocommit true;
delete from member;
insert into member(member_id, money) values ('memberA',10000);
insert into member(member_id, money) values ('memberB',10000);

2. ๊ณ„์ขŒ์ด์ฒด ์‹คํ–‰ ( memberA -> memberB๋กœ 2000์› ์†ก๊ธˆ) ๋„์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

 

์„ธ์…˜ 1๋ฒˆ ํŠธ๋žœ์žญ์…˜ 
set autocommit false; // ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
update member set money=10000 - 2000 where member_id = 'memberA'; //์„ฑ๊ณต 
update member set money=10000 + 2000 where member_iddd = 'memberB'; //์ฟผ๋ฆฌ ์˜ˆ์™ธ ๋ฐœ์ƒ

 

  • ํ•œ ๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ commit์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด memberA์˜ money๋งŒ 2000์›์ด ์ค„์–ด๋“œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์ค‘๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋Š” commit์„ ํ˜ธ์ถœํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ rollback์„ ํ˜ธ์ถœํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ์‹œ์ ์œผ๋กœ ์›์ƒ๋ณต๊ตฌ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. rollback์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‹ค์‹œ 1๋ฒˆ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์„ธ์…˜1์ด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ ์•„์ง ์ปค๋ฐ‹์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ, ์„ธ์…˜ 2์—์„œ ๋™์‹œ์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ฒŒ๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์˜ ์›์ž์„ฑ์ด ๊นจ์ง€๊ฒŒ ๋˜๊ณ  ๋งŒ์•ฝ ์„ธ์…˜1์ด ์ค‘๊ฐ„์— rollback์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์„ธ์…˜2๋Š” ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜์ด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์„ธ์…˜์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” lock์„ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


DB ๋ฝ - update ์ˆ˜์ • case

๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ์—์„œ 

 

์„ธ์…˜1 / ์„ธ์…˜2

์„ธ์…˜ 1์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  memberA money๋ฅผ 500์›์œผ๋กœ ์—…๋ฐ์ดํŠธ. (์•„์ง commit์€ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ)

์ด ๋•Œ memberA row์— ๋Œ€ํ•œ ๋ฝ์€ ์„ธ์…˜1์ด ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

์„ธ์…˜์ด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  DB ์ˆ˜์ •์˜ ๊ฒฝ์šฐ commitํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋ฝ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

 

์„ธ์…˜ 2๋Š” ์„ธ์…˜1์ด ๋ฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ 1์ด ์ปค๋ฐ‹ํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 

(commit์ด๋‚˜ rollback์„ ์ˆ˜ํ–‰ํ•ด์•ผ ๋ฝ์„ ๋ฐ˜๋‚ฉํ•ฉ๋‹ˆ๋‹ค.)

  • SET LOCK_TIMEOUT = 60000 : 60์ดˆ ๋‚ด์— ๋ฝ์„ ์–ป์ง€ ๋ชปํ•˜๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ (์ฆ‰ , ์„ธ์…˜ 1์—์„œ 60์ดˆ ๋‚ด์— ์ปค๋ฐ‹์ด๋‚˜ ๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ)

DB ๋ฝ - select ์กฐํšŒ case

DB Update๊ฐ€ ์•„๋‹Œ select ์กฐํšŒ๋ฅผ ํ•  ๋•Œ์—๋Š” update์™€ ๋‹ฌ๋ฆฌ ์ž๋™์œผ๋กœ ๋ฝ์„ ๊ฐ–์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— for update ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์„ค์ •ํ•ด ๋ฝ์„ ์ˆ˜๋™์œผ๋กœ ์–ป๊ฒŒ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

select ์กฐํšŒ๋ฅผ ํ•  ๋•Œ์— lock์„ ์–ป์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์–ธ์ œ์ผ๊นŒ์š”?

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์—์„œ memberA ์˜ ๊ธˆ์•ก์„ ์กฐํšŒํ•œ ๋‹ค์Œ์— ์ด ๊ธˆ์•ก ์ •๋ณด๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์–ด๋–ค ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์ด ๊ณ„์‚ฐ์ด ๋ˆ๊ณผ ๊ด€๋ จ๋œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ณ„์‚ฐ์ด์–ด์„œ ๊ณ„์‚ฐ์„ ์™„๋ฃŒํ•  ๋•Œ ๊นŒ์ง€ memberA ์˜ ๊ธˆ์•ก์„ ๋‹ค๋ฅธ๊ณณ์—์„œ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿด ๋•Œ ์กฐํšŒ ์‹œ์ ์— ๋ฝ์„ ํš๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿด ๋•Œ๋Š” select for update ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด  ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„ธ์…˜1์ด ์กฐํšŒ ์‹œ์ ์— ๋ฝ์„ ๊ฐ€์ ธ๊ฐ€๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์„ธ์…˜์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์„ธ์…˜ 1 / ์„ธ์…˜ 2
  • ์„ธ์…˜ 1์ด commit์„ ํ•ด์•ผ ์„ธ์…˜ 2๋กœ ๋ฝ์ด ๋„˜์–ด๊ฐ€ update๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ธ์…˜ 2 ๋˜ํ•œ ํŠธ๋žœ์žญ์…˜์ด๋ฏ€๋กœ commit์„ ์ˆ˜ํ–‰ํ•ด์•ผ update๊ฐ€ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠธ๋žœ์žญ์…˜ ์ ์šฉํ•˜๊ธฐ

์ด์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง ์—†๋Š” ์ž๋ฐ”์—์„œ DB์— ์ ‘๊ทผํ•ด ๊ณ„์ขŒ์ด์ฒด ํŠธ๋žœ์žญ์…˜์„ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์ •์ƒ ์ฒ˜๋ฆฌ๋œ๊ฒฝ์šฐ์™€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

  • ๊ณ„์ขŒ์ด์ฒด์˜ ๊ฒฝ์šฐ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋‘ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์•„(findById), ๋‘ ๋ฉค๋ฒ„์˜ ๋ˆ์„ ๊ฐฑ์‹ ํ•ด์ฃผ์–ด์•ผ(update) ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ด ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ํŠธ๋žœ์žญ์…˜ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ์ปค๋„ฅ์…˜ ๋‹ค์‹œ๋งํ•ด ๊ฐ™์€ ์„ธ์…˜์—์„œ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ด์ „๊ณผ ๋‹ฌ๋ฆฌ ๋ฉค๋ฒ„๋ฅผ ์ฐพ๊ณ (findById), ๊ฐฑ์‹ (update) ํ•ด ์ค„ ๋•Œ์— ์ปค๋„ฅ์…˜์„ ์ƒˆ๋กœ ๋ฆฌํ„ด๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ•œ ์ปค๋„ฅ์…˜์„ ์ญ‰ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
    Connection con = dataSource.getConnection();
    try
    {
        con.setAutoCommit(false); // ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
        buisnesslogic(con, fromId, toId, money);
        con.commit();
    } catch (Exception e) {
        log.error("error detected!");
        con.rollback();
        throw new IllegalStateException(e);
    } finally {
        release(con);
    }
}
private void release(Connection con) {
    if(con !=null)
    {
        try{
            con.setAutoCommit(true); // ์ปค๋„ฅ์…˜ ํ’€ ๊ณ ๋ ค
            con.close();
        }catch (Exception e)
        {
            log.error("error", e);
        }
    }
}
private void buisnesslogic(Connection con, String fromId, String toId, int money) throws SQLException {
    // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
    Member fromMember = memberRepository.findById(con, fromId);
    Member toMember = memberRepository.findById(con, toId);

    memberRepository.update(con, fromId, fromMember.getMoney()- money);
    validation(toMember);
    memberRepository.update(con, toId,toMember.getMoney()+ money);
}
  • ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด con.setAutoCommit์„ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค
  • ๊ณ„์ขŒ์ด์ฒด ์ˆ˜ํ–‰ ๋„์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ rollbackํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋œ ์ดํ›„์—๋Š” autocommit์„ true๋กœ ๋‹ค์‹œ ์„ค์ •ํ•ด์ฃผ๊ณ  con์„ ๋ฐ˜๋‚ฉํ•ฉ๋‹ˆ๋‹ค.
  • validation(toMember) : toMember์˜ member_id๊ฐ€ "ex"์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋„๋ก ์„ค์ • For Test Code

์ฐธ๊ณ ๋กœ findbyId์™€ update ๋ฉ”์†Œ๋“œ์—๋Š” ๋ฉ”์†Œ๋“œ ์‹œ์ž‘๋ถ€๋ถ„์—์„œ ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ฒŒ ํ•œ ํ›„, ๋กœ์ง ์ˆ˜ํ–‰ ํ›„ ์ปค๋„ฅ์…˜์€ ๋ฐ˜๋‚ฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ ๋กœ์ง์€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์ฝ”๋“œ๋ฅผ ์ฒจ๋ถ€ํ•˜์ง„ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธ ์ง„ํ–‰

@BeforeEach์—์„œ

์ปค๋„ฅ์…˜์„ ๋ฐ›์•„์˜ฌ dataSource๋กœ Hikari CP ์ƒ์„ฑ ๋ฐ url, usename, password ์„ค์ • 

Repository -> HikariCP datasource,

Service -> Repository, Hikari datasource ์ฃผ์ž… 

 

@AfterEach์—์„œ repository ์ดˆ๊ธฐํ™”

1. ์ •์ƒ์ ์œผ๋กœ ์ด์ฒด ๋œ ๊ฒฝ์šฐ

@Test
@DisplayName("์ •์ƒ ์ด์ฒด")
void accountTransfer() throws SQLException {
    // given
    Member memberA = new Member(MEMBER_A, 10000);
    Member memberB = new Member(MEMBER_B, 10000);
    memberRepository.save(memberA);
    memberRepository.save(memberB);

    //when
    log.info("START TX");
    memberService.accountTransfer(memberA.getMemberId(),memberB.getMemberId(),2000);
    log.info("END TX");

    // then
    Member findMemberA = memberRepository.findById(memberA.getMemberId());
    Member findMemberB = memberRepository.findById(memberB.getMemberId());

    Assertions.assertThat(findMemberA.getMoney()).isEqualTo(8000);
    Assertions.assertThat(findMemberB.getMoney()).isEqualTo(12000);
}
  • ์ •์ƒ ์ด์ฒด๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— A์˜ money๋Š” 8000, B์˜ money๋Š” 12000์œผ๋กœ ์„ค์ •๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์ด์ฒด์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ 

@Test
    @DisplayName("์ด์ฒด์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ")
    void accountTransferEx() throws SQLException {
        // given
        Member memberA = new Member(MEMBER_A, 10000);
        Member memberEx = new Member(MEMBER_EX, 10000);
        memberRepository.save(memberA);
        memberRepository.save(memberEx);


        //when
//        memberService.accountTransfer(memberA.getMemberId(),memberEx.getMemberId(),2000);

        Assertions.assertThatThrownBy(
                        () -> memberService.accountTransfer(memberA.getMemberId(),memberEx.getMemberId(),2000))
                .isInstanceOf(IllegalStateException.class);

        // then
        Member findMemberA = memberRepository.findById(memberA.getMemberId());
        Member findMemberEx = memberRepository.findById(memberEx.getMemberId());
        log.info("findMemberA.money = {} ",findMemberA.getMoney());
        log.info("findMemberEx.money = {} ",findMemberEx.getMoney());

        Assertions.assertThat(findMemberA.getMoney()).isEqualTo(10000);
        Assertions.assertThat(findMemberEx.getMoney()).isEqualTo(10000);
    }
  • ์˜ˆ์™ธ ๋ฐœ์ƒํ•˜๋ฉด ๋กค๋ฐฑํ•˜๋„๋ก ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์› ์ƒํƒœ๋กœ ๋ณต๊ตฌ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ DB ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•˜๋ ค๋ฉด ์„œ๋น„์Šค ๊ณ„์ธต์ด ๋งค์šฐ ์ง€์ €๋ถ„ํ•ด์ง€๊ณ , ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•˜๊ณ  ์ถ”๊ฐ€๋กœ ์ปค๋„ฅ์…˜์„ ์œ ์ง€ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋„ ์‰ฌ์šด ์ผ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•ด์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

<์ฐธ๊ณ ์ž๋ฃŒ>

 

 

์Šคํ”„๋ง DB 1ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ•ต์‹ฌ ์›๋ฆฌ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ DB ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜

www.inflearn.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ