๐ง ๋ ๋ฒจ ์ ๊ทธ๋ ์ด๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ ๋, ์ ๊ทธ๋ ์ด๋ ๋ณ๊ฒฝ ๊ณผ์ ์ค์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด?
์๋ฌ๊ฐ ๋๊ธฐ ์ ๊น์ง ์ ์ ๋ค์ ์ ๊ทธ๋ ์ด๋๊ฐ ๋ ๊น?
ํ๋ฒ ์ผ๋ถ๋ก ์ ๊ทธ๋ ์ด๋ ๊ณผ์ ์ค์ ์๋ฌ๋ฅผ ๋ฐ์์์ผ ๊ฐ์ ์ ์ธ ์ํฉ์ ๋ง๋ค์ด ํ์ธํด๋ณด์!
@Test
public void upgradeAllOrNothing() {
UserService testUserService = new TestUserService(users.get(3).getId());
testUserService.setUserDao(this.userDao);
userDao.deleteAll();
for(User user : users) userDao.add(user);
try {
testUserService.upgradeLevels(0);
fail("TestUserServiceException expected");
}
catch(TestUserServiceException e) {
}
checkLevel(users.get(1), false);
}
์์ ๊ฐ์ด 3๋ฒ์งธ ์ ์ ์์ ์๋ฌ๋ฅผ ๋ฐ์์์ผ๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด 3๋ฒ์งธ ์ ์ ์ ๊น์ง์ ์ ์ ๋ค์ ๋ ๋ฒจ์ด ์ ๊ทธ๋ ์ด๋๊ฐ ๋์์ ๋ณผ ์ ์๋ค.
๐ง ์ ์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ์๊น?
์์ธ์ ๋ฐ๋ก upgradeLevels() ๋ฉ์๋๊ฐ ํ๋์ ํธ๋์ญ์ ์์์ ๋์ํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ํธ๋์ญ์ ํต์ฌ ์์ฑ ์ค ํ๋์ธ ์์์ฑ์ ๋ง์กฑํ์ง ๋ชปํ๋ค.
ํธ๋์ญ์ ์ด๋?
๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ (Database Transaction)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ๋๋ ์ ์ฌํ ์์คํ ์์ ์ํธ์์ฉ์ ๋จ์์ด๋ค. ์ฌ๊ธฐ์ ์ ์ฌํ ์์คํ ์ด๋ ํธ๋์ญ์ ์ด ์ฑ๊ณต๊ณผ ์คํจ๊ฐ ๋ถ๋ช ํ๊ณ ์ํธ ๋ ๋ฆฝ์ ์ด๋ฉฐ, ์ผ๊ด๋๊ณ ๋ฏฟ์ ์ ์๋ ์์คํ ์ ์๋ฏธํ๋ค.
์ด๋ก ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๊ฐ๊ฐ์ ํธ๋์ญ์ ์ ๋ํด ์์์ฑ(Atomicity), ์ผ๊ด์ฑ(Consistency), ๋ ๋ฆฝ์ฑ(Isolation), ์๊ตฌ์ฑ(Durability)์ ๋ณด์ฅํ๋ค. (์ํค ์ฐธ์กฐ)
๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒด๋ก๋ ์๋ฒฝํ ํธ๋์ญ์ ์ ์ง์ํ์ง๋ง,
์์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฌ๋ฌ ๊ฐ์ SQL์ ์ฌ์ฉํด ํ๋์ ํธ๋์ญ์ ์ ์ทจ๊ธํด์ผํ๋ ํ๋ ๊ฒฝ์ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ด๋ค
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ update์ธ SQL๋ค์ ํธ๋์ญ์ ๋กค๋ฐฑ๊ณผ ์ปค๋ฐ์ ์ด์ฉํด ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ง๋ค์ด์ค์ผํ๋ค.
๐ ํธ๋์ญ์ ๋กค๋ฐฑ : SQL์ด ์ฑ๊ณต์ ์ผ๋ก DB์ ์ํ๋๊ธฐ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์์ ์ฒ๋ฆฌํ SQL ์์ ์ ์ทจ์ํด์ฃผ๋ ์์ .
๐ ํธ๋์ญ์ ์ปค๋ฐ : ๋ชจ๋ SQL ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ๋ง๋ฌด๋ฆฌ๋ ๊ฒฝ์ฐ ์์ ํ์ ํ๋ ์์ .
๋ณดํต JDBC์ ํธ๋์ญ์ ์ ํ๋์ Connection์ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ ํธ๋์ญ์ ์ ์์๊ณผ ์ข ๋ฃ๋ Connection๊ฐ ๋ง๋ค์ด์งํ, ์์ด์ง ๋ ๋ฐ์ํด
setAutoCommit(false)๋ก ํธ๋์ญ์ ์ ์์ํ๊ณ commit(), rollback()์ผ๋ก ํธ๋์ญ์ ์ ์ข ๋ฃ ํ ์ ์๋ค.
๋ณดํต ์ด๋ ๊ฒ ํธ๋์ญ์ ์ ์์์ ์ ์ธํ๊ณ ํธ๋์ญ์ ์ ์ข ๋ฃํ๋ ์์ ์ ํธ๋์ญ์ ๊ฒฝ๊ณ์ค์ ์ด๋ผ ํ๋ค.
์ ๋ฌธ์ ๋ UserService์์ ๊ฐ User๋ง๋ค update()๋ฉ์๋๋ฅผ ๋ถ๋ ๊ณ ,
์ด ๋ฉ์๋ ์์ ์๋ JdbcTemplate์ด ๋ถ๋ฌ์ง ๋๋ง๋ค Connection์ ์์ฑํด ๋ฐ์๋๋ค๊ณ ๋ณผ ์ ์๋ค.
๋ฐ๋ผ์ user๋ง๋ค Connection์ด ์์ฑ ๋์ด ๊ฐ๊ฐ ํธ๋์ญ์ ์ด ๋ง๋ค์ด์ง๋ ๊ฒ์ด ์๋
UserService์์ ๋ชจ๋ User๋ฅผ ์ํ Connection์ ๊ณตํต์ผ๋ก ๋ง๋ค๊ธฐ ์ํด
ํธ๋์ญ์ ๊ฒฝ๊ณ์ค์ ๊ตฌ์กฐ๋ก ์ฝ๋ ๊ตฌํํ์ฌ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ์!
โ๏ธ ํธ๋์ญ์ ๊ฒฝ๊ณ์ค์ ๊ตฌ์กฐ์ ์์
๐ ์ ๋ฆฌ
์ฐธ๊ณ ๋ฌธ์ :
ํ ๋น์ ์คํ๋ง3 (์ด์ผ๋ฏผ)
'Back-end > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ๊ฐ๋จํ๊ฒ HTTP POST ์์ฒญํ๊ธฐ (3) | 2020.10.02 |
---|---|
[Spring] ํธ๋์ญ์ ๋ฌธ์ ํด๊ฒฐ - ํธ๋์ญ์ ๋๊ธฐํ ๊ธฐ๋ฒ (0) | 2020.08.28 |
[Spring] ๋ฆฌํฉํ ๋ง ํด๋ณด๊ธฐ (feat. ๊ฐ์ฒด์งํฅ์ ์ธ ๊ด์ ) (0) | 2020.08.26 |
[Spring] JdbcTemplate ์ฌ์ฉ๋ฒ - update(), queryForInt(), queryForObject(), query() (2) | 2020.08.19 |
[Spring] JdbcTemplate์ด๋? (0) | 2020.08.19 |