ํธ๋์ญ์ AOP ์ดํด
์ง๊ธ๊น์ง ํธ๋์ญ์ ์ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ํธ๋์ญ์ ์ถ์ํ๋ ๋์ ํ๊ณ ,
์ถ๊ฐ๋ก ๋ฐ๋ณต์ ์ธ ํธ๋์ญ์ ๋ก์ง์ ํด๊ฒฐํ๊ธฐ ์ํด ํธ๋์ญ์ ํ ํ๋ฆฟ๋ ๋์ ํ๋ค.
ํธ๋์ญ์
ํ
ํ๋ฆฟ ๋๋ถ์ ํธ๋์ญ์
์ ์ฒ๋ฆฌํ๋ ๋ฐ๋ณต ์ฝ๋๋ ํด๊ฒฐํ ์ ์์๋ค.
ํ์ง๋ง ์๋น์ค ๊ณ์ธต์ ์์ํ ๋น์ฆ๋์ค ๋ก์ง๋ง ๋จ๊ธด๋ค๋ ๋ชฉํ๋ ์์ง ๋ฌ์ฑํ์ง ๋ชปํ๋ค.
์ด๋ด ๋ ์คํ๋ง AOP๋ฅผ ํตํด ํ๋ก์๋ฅผ ๋์ ํ๋ฉด ๋ฌธ์ ๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
์ฐธ๊ณ ) ์ง๊ธ์ @Transactional ์ ์ฌ์ฉํ๋ฉด ์คํ๋ง์ด AOP๋ฅผ ์ฌ์ฉํด์ ํธ๋์ญ์ ์ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํด์ค๋ค ์ ๋๋ก ์ดํดํด๋ ๋๋ค.
ํ๋ก์๋ฅผ ํตํ ๋ฌธ์ ํด๊ฒฐ
ํ๋ก์ ๋์ ์

ํ๋ก์๋ฅผ ๋์ ํ๊ธฐ ์ ์๋ ๊ธฐ์กด์ฒ๋ผ ์๋น์ค์ ๋ก์ง์์ ํธ๋์ญ์ ์ ์ง์ ์์ํ๋ค.
์๋น์ค์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํธ๋์ญ์
์ฒ๋ฆฌ ๋ก์ง์ด ํจ๊ป ์์ฌ์๋ค.
ํ๋ก์ ๋์ ํ

ํ๋ก์ : ์ผ์ข ์ ๋๋ฆฌ์ธ์ด๋ค. ๋์ ๋ฌด์ธ๊ฐ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ์ฌ๋์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์๋น์ค๋ฅผ ์ง์ ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผ ํ๋ก์๋ฅผ ํตํด์ ํธ์ถํ๋ค.
ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์๋น์ค ๊ฐ์ฒด๋ฅผ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ ์ ์๋ค.
ํธ๋์ญ์ ํ๋ก์๊ฐ ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ก์ง์ ๋ชจ๋ ๊ฐ์ ธ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ํธ๋์ญ์ ์ ์์ํ ํ์ ์ค์ ์๋น์ค๋ฅผ ๋์ ํธ์ถํ๋ค.
ํธ๋์ญ์ ํ๋ก์ ๋๋ถ์ ์๋น์ค ๊ณ์ธต์๋ ์์ํ ๋น์ฆ๋์ฆ ๋ก์ง๋ง ๋จ๊ธธ ์ ์๋ค.
ํธ๋์ญ์ ํ๋ก์ ์ฝ๋
public class TransactionProxy {
private MemberService target;
public void logic() {
//ํธ๋์ญ์
์์
TransactionStatus status = transactionManager.getTransaction(..);
try {
//์ค์ ๋์ ํธ์ถ
target.logic();
transactionManager.commit(status); //์ฑ๊ณต์ ์ปค๋ฐ
} catch (Exception e) {
transactionManager.rollback(status); //์คํจ์ ๋กค๋ฐฑ
throw new IllegalStateException(e);
}
}
}
ํธ๋์ญ์ ํ๋ก์๊ฐ ์ค์ ํธ์ถํด์ผํ ๋น์ฆ๋์ค ๋ก์ง(target)์ ๋ด๋ถ์ ๊ฐ๊ณ ์๋ค .
ํธ๋์ญ์ ํ๋ก์ ์ ์ฉ ํ ์๋น์ค ์ฝ๋
public class Service {
public void logic() {
//ํธ๋์ญ์
๊ด๋ จ ์ฝ๋ ์ ๊ฑฐ, ์์ ๋น์ฆ๋์ค ๋ก์ง๋ง ๋จ์
bizLogic(fromId, toId, money);
}
}
์คํ๋ง์ด ์ ๊ณตํ๋ ํธ๋์ญ์
AOP
๊ฐ๋ฐ์๋ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ณณ์ @Transactional ์ ๋ ธํ ์ด์ ๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
์คํ๋ง์ ํธ๋์ญ์ AOP๋ ์ด ์ ๋ ธํ ์ด์ ์ ์ธ์ํด์ ํธ๋์ญ์ ํ๋ก์๋ฅผ ์ ์ฉํด์ค๋ค.
@Transactional ์ ์ฉ
@Transactional
public void accountTransfer(String fromId, String toId, int money) throws
SQLException {
bizLogic(fromId, toId, money);
}
์์ํ ๋น์ฆ๋์ค ๋ก์ง๋ง ๋จ๊ธฐ๊ณ , ํธ๋์ญ์ ๊ด๋ จ ์ฝ๋๋ ๋ชจ๋ ์ ๊ฑฐํ๋ค.
์คํ๋ง์ด ์ ๊ณตํ๋ ํธ๋์ญ์ AOP๋ฅผ ์ ์ฉํ๊ธฐ ์ํด @Transactional ์ ๋ ธํ ์ด์ ์ ์ถ๊ฐํ๋ค.
AOP ํ ์คํธ ์ฝ๋
@SpringBootTest
class MemberServiceV3_3Test
@SpringBootTest : ์คํ๋ง AOP๋ฅผ ์ ์ฉํ๋ ค๋ฉด ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํ์ํ๋ค.
์ด ์ ๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ํ ์คํธ์ ์คํ๋ง ๋ถํธ๋ฅผ ํตํด ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ค.
@Autowired
MemberRepositoryV3 memberRepository;
@Autowired
MemberServiceV3_3 memberService;
๊ทธ๋ฆฌ๊ณ ํ ์คํธ์์ @Autowired ๋ฑ์ ํตํด ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ๋น๋ค์ ์ฌ์ฉํ ์ ์๋ค.
@TestConfiguration
static class TestConfig {
@Bean
DataSource dataSource() {
return new DriverManagerDataSource(URL, USERNAME, PASSWORD);
}
@Bean
PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
MemberRepositoryV3 memberRepositoryV3() {
return new MemberRepositoryV3(dataSource());
}
@Bean
MemberServiceV3_3 memberServiceV3_3() {
return new MemberServiceV3_3(memberRepositoryV3());
}
}
@TestConfiguration : ํ ์คํธ ์์์ ๋ด๋ถ ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ฉด์ ์ด ์๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด,
์คํ๋ง ๋ถํธ๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๋น๋ค์ ์ถ๊ฐ๋ก ํ์ํ ์คํ๋ง ๋น๋ค์ ๋ฑ๋กํ๊ณ ํ ์คํธ๋ฅผ ์ํํ ์ ์๋ค.
DataSource ์คํ๋ง์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ ๋ฐ์ดํฐ์์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
์ถ๊ฐ๋ก ํธ๋์ญ์ ๋งค๋์ ์์๋ ์ฌ์ฉํ๋ค.
DataSourceTransactionManager ํธ๋์ญ์
๋งค๋์ ๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
์คํ๋ง์ด ์ ๊ณตํ๋ ํธ๋์ญ์ AOP๋ ์คํ๋ง ๋น์ ๋ฑ๋ก๋ ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ฐพ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด๋์ด์ผ ํ๋ค.
ํธ๋์ญ์ AOP ์ ์ฉ ์ ์ฒด ํ๋ฆ
0. AOP ํ๋ก์ ์์ฑ : @Transactional ์ด๋ ธํ ์ด์ ์ด ์๋ ๋ฉ์๋๋ ์คํ๋ง์ด ํธ๋์ญ์ ์ ์ ์ฉํ๋ ํ๋ก์๋ฅผ ๋ง๋ฆ
AOP ํ๋ก์์์ ํธ๋์ญ์ ๋ก์ง์ ๋ค ์ฒ๋ฆฌํด์ค๋ค. ์ค์ ์๋น์ค๋ ๋์ ํธ์ถํด์ค๋ค.
1. ํด๋ผ์ด์ธํธ ์๋น์ค ํธ์ถ : ์ง์ ํธ์ถํ๋ ๊ฒ์ด ์๋ ํ๋ก์๋ฅผ ํตํด ํธ์ถ
2. ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด ํธ๋์ญ์ ๋งค๋์ ํ๋
3. ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ํตํด์ ํธ๋์ญ์ ์ ์์ํ๋ค.
4. ๋ฐ์ดํฐ์์ค๋ฅผ ๊ฐ์ง๊ณ ์ปค๋ฅ์ ์ ์์ฑ
5. con.setAutoCommit(false) / ์๋ ์ปค๋ฐ ๋ชจ๋ ์ค์
6-7. ์ปค๋ฅ์ ๋๊ธฐํ : ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ์ปค๋ฅ์ ์ ๋ณด๊ด
8. ํ๋ก์์์ ์ค์ ์๋น์ค๋ฅผ ํธ์ถ
9. ์๋น์ค ๋น์ฆ๋์ค ๋ก์ง์ด ์ํ -> ๋ฆฌํฌ์งํ ๋ฆฌ ํธ์ถ
๋ฆฌํฌ์งํ ๋ฆฌ์์๋ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ๋ณด๊ด๋ ์ปค๋ฅ์ ์ ๊บผ๋ด์ ๋ฐ์ดํฐ ์ ๊ทผ ๋ก์ง์ ์ํ
10. ์ฑ๊ณต -> commit / ์์ธ -> rollback
์ ๋ฆฌ
์คํ๋ง์ด ์ ๊ณตํ๋ ์ ์ธ์ ํธ๋์ญ์ ๊ด๋ฆฌ ๋๋ถ์ ๋๋์ด ํธ๋์ญ์ ๊ด๋ จ ์ฝ๋๋ฅผ ์์ํ ๋น์ฆ๋์ค ๋ก์ง์์ ์ ๊ฑฐํ ์ ์์๋ค.
๊ฐ๋ฐ์๋ ํธ๋์ญ์
์ด ํ์ํ ๊ณณ์ @Transactional ์ ๋
ธํ
์ด์
ํ๋๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.
๋๋จธ์ง๋ ์คํ๋ง ํธ๋์ญ์ AOP๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค๋ค.
์ ์ฒด ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋๋ฐ ์ด์ ์ ๋ง์ถ์.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard
์คํ๋ง DB 1ํธ - ๋ฐ์ดํฐ ์ ๊ทผ ํต์ฌ ์๋ฆฌ - ์ธํ๋ฐ | ๊ฐ์
๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ์ํ DB ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ์ ๊ธฐ์ด๋ถํฐ ์ดํดํ๊ณ , ์์ฑํ ์ ์์ต๋๋ค. ์คํ๋ง DB ์ ๊ทผ ๊ธฐ์ ์ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ๋ ๊น์ด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์์ต๋๋ค., - ๊ฐ์
www.inflearn.com
'Spring > Spring DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง DB 1ํธ] - 12. ์์ธ(Exception)์ ์ดํด / ์ฒดํฌ,์ธ์ฒดํฌ ์์ธ (0) | 2023.03.29 |
---|---|
[์คํ๋ง DB 1ํธ] - 11. ์คํ๋ง ๋ถํธ์ ์๋ ๋ฆฌ์์ค ๋ฑ๋ก (0) | 2023.03.25 |
[์คํ๋ง DB 1ํธ] - 9. ํธ๋์ญ์ ํ ํ๋ฆฟ (0) | 2023.03.25 |
[์คํ๋ง DB 1ํธ] - 8. ํธ๋์ญ์ ์ถ์ํ (2) | 2023.03.24 |
[์คํ๋ง DB 1ํธ] - 7. ์คํ๋ง๊ณผ ๋ฌธ์ ํด๊ฒฐ - ํธ๋์ญ์ (0) | 2023.03.21 |