Back-end/Spring

[Spring] ํŠธ๋žœ์žญ์…˜ ๋ฌธ์ œ ์ฐพ๊ธฐ (feat. ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„์„ค์ • ๊ตฌ์กฐ)

 

๐Ÿง ๋ ˆ๋ฒจ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, ์—…๊ทธ๋ ˆ์ด๋“œ ๋ณ€๊ฒฝ ๊ณผ์ • ์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด?

 

์—๋Ÿฌ๊ฐ€ ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์œ ์ €๋“ค์€ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๋ ๊นŒ?

 

ํ•œ๋ฒˆ ์ผ๋ถ€๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ณผ์ • ์ค‘์— ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๊ฐ•์ œ์ ์ธ ์ƒํ™ฉ์„ ๋งŒ๋“ค์–ด ํ™•์ธํ•ด๋ณด์ž!

	@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 (์ด์ผ๋ฏผ)

๋ฐ˜์‘ํ˜•