Spring ํธ๋์ญ์ AOP - @Transactional ์ฌ์ฉ
by rlaehddnd0422์ด ์ ํฌ์คํ ์์ ํธ๋์ญ์ ์ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํธ๋์ญ์ ์ถ์ํ์ ํธ๋์ญ์ ํ ํ๋ฆฟ์ ๋์ ํด๋ณด์์ต๋๋ค.
ํ์ง๋ง ์ฌ์ ํ ์๋น์ค ๊ณ์ธต์ ์์ํ ๋น์ฆ๋์ค ๋ก์ง๋ง ๋จ๊ธฐ๋ ๋ชฉํ์๋ ๋๋ฌํ์ง ๋ชปํ์ด์.
์ด๋ด ๋ ์คํ๋ง AOP๋ฅผ ํตํด ํ๋ก์๋ฅผ ๋์ ํ๋ฉด ๋ฌธ์ ๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์คํ๋ง AOP์ ํ๋ก์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ถํ์ ์์ธํ ๊ณต๋ถํ๊ณ ๋จ๊ธฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ๋ก์๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ฉด
์ด๋ ๊ฒ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์๋น์ค ๊ฐ์ฒด๋ฅผ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
์ฌ์ฉ๋ฒ์ ๋งค์ฐ๋งค์ฐ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ณณ์ @Transactional ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์คํ๋ง์ ํธ๋์ญ์ AOP๋ ์ด ์ด๋ ธํ ์ด์ ์ ์ธ์ํด์ ์๋์ผ๋ก ํธ๋์ญ์ ํ๋ก์๋ฅผ ์ ์ฉํด ์ค๋๋ค!
Sol3. ํธ๋์ญ์ AOP - @Transactional ์ฌ์ฉ
์คํ๋ง AOP๋ฅผ ์ ์ฉํ๋ ค๋ฉด ์ด๋๋ฐ์ด์ , ํฌ์ธํธ์ปท, ์ด๋๋ฐ์ด์ค๋ฅผ ํ์๋กํ๋๋ฐ ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด
> ์ด๋๋ฐ์ด์ : BeanFactoryTransactionAttributeSourceAdvisor
> ํฌ์ธํธ์ปท: TransactionAttributeSourcePointcut
> ์ด๋๋ฐ์ด์ค: TransactionInterceptor
๋ฅผ ๋น์ผ๋ก ์คํ๋ง ์ปจํ ์ด๋์ ์๋์ผ๋ก ๋ฑ๋กํด์ค๋๋ค.
MemberService์ ์ ์ฉ
@Slf4j
@RequiredArgsConstructor
public class MemberServiceV3_3 {
// private final PlatformTransactionManager transactionManager;
private final MemberRepositoryV3 memberRepository;
@Transactional
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
buisnesslogic(fromId,toId,money);
}
์ด๋ ๊ฒ @Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด ์๋น์ค ๊ณ์ธต์ ์ค๋ก์ง ์์ํ๊ฒ ๋น์ฆ๋์ค ๋ก์ง๋ง ๊ตฌํํ ์ ์๊ฒ ๋์์ต๋๋ค.
+ ํด๋์ค ๋ ๋ฒจ์ ์ด๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด ์ธ๋ถ์์ ํธ์ถ ๊ฐ๋ฅํ public ๋ฉ์๋๊ฐ AOP ์ ์ฉ ๋์์ด ๋ฉ๋๋ค.
ํ ์คํธ ์ฝ๋์ ์ ์ฉํ๋ ค๋ฉด ํ ์คํธ ์ฝ๋์ ๋ช ๊ฐ์ง ์ค์ ํ์
1. @SpringBootTest : ์คํ๋ง AOP ์ ์ฉํ๊ธฐ ์ํด์๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํ์ํ๋ฐ, ์ด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ํ ์คํธ ์ ์คํ๋ง ๋ถํธ๋ฅผ ํตํด ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑ
2. @TestConfiguration : ํ ์คํธ ์์์ ๋ด๋ถ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค์ด Bean์ผ๋ก ๋ฑ๋กํ๊ณ ๊ตฌํ์ฒด ์ฃผ์ ํ์
3. ํธ๋์ญ์ AOP์์ DataSource, ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ฐ๋์ 2๋ฒ์ ๋น์ผ๋ก ๋ฑ๋กํด์ฃผ์ด์ผ ํฉ๋๋ค.
AOP ๋์๋ฐฉ์์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
ํ ์คํธ ์ฝ๋
@SpringBootTest
@Slf4j
class MemberServiceV3_3Test {
@Autowired
private MemberServiceV3_3 memberService;
@Autowired
private MemberRepositoryV3 memberRepository;
public static final String MEMBER_A = "memberA";
public static final String MEMBER_B = "memberB";
public static final String MEMBER_EX = "ex";
@TestConfiguration
static class TestConfig
{
@Bean
DataSource dataSource(){return new DriverManagerDataSource(URL,USERNAME,PASSWORD);}
@Bean
PlatformTransactionManager transactionManager()
{
return new DataSourceTransactionManager(dataSource());
}
@Bean
MemberRepositoryV3 memberRepository()
{
return new MemberRepositoryV3(dataSource());
}
@Bean
MemberServiceV3_3 memberService()
{
return new MemberServiceV3_3(memberRepository());
}
}
...
// ์ค์ ํ
์คํธ ์ฝ๋๋ ์๋ต
}
- ์คํ๋ง AOP๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํ์ํฉ๋๋ค.
- ๋ฐ๋ผ์ ํด๋์ค ๋ ๋ฒจ์ @SpringBootTest ์ด๋ ธํ ์ด์ ์ ํตํด ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ณ ์ memberRepository์ memberService๋ฅผ ์๋์ผ๋ก ์ปจํ ์ด๋์ ๋ฑ๋กํ๊ณ ํ๋์ฃผ์ ์ผ๋ก ์์กด๊ด๊ณ๋ฅผ ์ค์ ํด์ฃผ์์ต๋๋ค.
- ์ถ๊ฐ์ ์ผ๋ก AOP์์ ํธ๋์ญ์ ๋งค๋์ ์ ๋ฐ์ดํฐ ์์ค๋ฅผ ํ์๋ก ํ๋ฏ๋ก ์ด ๋ํ ์ปจํ ์ด๋์ ๋ฑ๋กํด ์ฃผ์์ต๋๋ค.
์ฐธ๊ณ ๋ก, ํ ์คํธ ์ฝ๋๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ์๋ ํ๋ ์ฃผ์ ์ด ์๋ ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
https://rlaehddnd0422.tistory.com/25
+ DataSource, ํธ๋์ญ์ ๋งค๋์ ์๋ ๋ฑ๋กํ๊ธฐ.
์คํ๋ง ๋ถํธ๋ ์์ ๊ฐ์ด ์ง์ DataSource, ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ง์ ๋น์ผ๋ก ๋ฑ๋กํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด,
๊ธฐ๋ณธ์ ์ผ๋ก DataSource๋ HikariDataSource๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํ๊ณ , ํธ๋์ญ์ ๋งค๋์ ๋ ํ์ฌ ๋ฑ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณด๊ณ JDBC๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋DataSourceTransaction๋ฅผ, JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ JpaTransactionManager๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํฉ๋๋ค. (๋ ๋ค ์ฌ์ฉํ๋ ๊ฒฝ์ฐ JpaTransactionManager ๋ฑ๋ก)
์๋ ๋ฑ๋ก ๋ฐฉ๋ฒ
- application.properties์ datasource์ url, username, password ์ค์ ํ๋ฉด ์คํ๋ง์ด ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋จํด์ ์๋์ผ๋ก ํธ๋์ญ์ ๋งค๋์ ์ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa
spring.datasource.password=
๊ฒฐ๋ก ์ ์ผ๋ก ์คํ๋ง์ ์ฌ์ฉํด (์์ธ ๋์ ๋ฌธ์ ๋ฅผ ์ ์ธํ๋ฉด) ๊ธฐ์กด ์๋น์ค ๊ณ์ธต์ ํธ๋์ญ์ ๋ฌธ์ ๋ฅผ ์์ฃผ ๊น๋ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ํด๊ฒฐํ ์ ์์์ต๋๋ค. ์คํ๋ง์ด ์ด๋ฐ๊ฒ๋ ์ด๋ ธํ ์ด์ ํ๋๋ก ์ฒ๋ฆฌํด์ฃผ๋ ์ ์ ์คํ๋ง์ ๋ฉ๋ฆฌํธ๊ฐ ๋๊ปด์ง๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์ ํฌ์คํ ์์๋ ๋ง์ง๋ง์ผ๋ก ๋จ์ ์์ธ ๋์๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard
'๐ Backend > DB Access' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ErrorCode๋ฅผ ์ด์ฉํ ํน์ ์์ธ ๋ณต๊ตฌ (0) | 2023.04.07 |
---|---|
ํธ๋์ญ์ AOP + ์์ธ ์ ํ ์ ์ฉํ Service ๊ณ์ธต ๋ถ๋ฆฌ (0) | 2023.04.06 |
ํธ๋์ญ์ ์ธํฐํ์ด์ค, ํธ๋์ญ์ ํ ํ๋ฆฟ์ ์ด์ฉํ Service ๊ณ์ธต์ Transaction ๋ฌธ์ ํด๊ฒฐ (0) | 2023.04.05 |
Spring์ ์ฌ์ฉํ์ง ์๊ณ Transaction ํด๊ฒฐ (0) | 2023.04.04 |
์ปค๋ฅ์ ํ by using DataSource Interface (0) | 2023.04.03 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422