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
Spring / ์์กด๊ด๊ณ ์ฃผ์ - ์์ฑ์, ์์ ์, ํ๋, ๋ฉ์๋
์ฌ๋ฌ๊ฐ์ง ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ ํฌ๊ฒ 4๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. 1. ์์ฑ์ ์ฃผ์ 2. sertter ์ฃผ์ 3. ํ๋ ์ฃผ์ 4. ๋ฉ์๋ ์ฃผ์ 1. ์์ฑ์ ์ฃผ์ ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ ์ง๊ธ๊น์ง ์ฌ์ฉํด์จ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ์๋ฅผ ํตํด์
rlaehddnd0422.tistory.com
+ 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
์คํ๋ง DB 1ํธ - ๋ฐ์ดํฐ ์ ๊ทผ ํต์ฌ ์๋ฆฌ - ์ธํ๋ฐ | ๊ฐ์
๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ์ํ DB ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ์ ๊ธฐ์ด๋ถํฐ ์ดํดํ๊ณ , ์์ฑํ ์ ์์ต๋๋ค. ์คํ๋ง DB ์ ๊ทผ ๊ธฐ์ ์ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ๋ ๊น์ด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์์ต๋๋ค., - ๊ฐ์
www.inflearn.com
'๐ 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