ํต์ฌ๋ก์ง๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๋ ํ๋ก๊ทธ๋๋ฐ
๋ก๊น
, ํธ๋์ญ์
๊ด๋ฆฌ, ์ธ์ฆ์ ๊ณตํต ๋ถ๊ฐ ๊ธฐ๋ฅ์ธ Aspect์ผ๋ก ์ ์ํ๊ณ , Advice๋ฅผ ํตํด ํ์ํ ์์ ์ ์ฃผ์
Spring AOP ๊ตฌํ ๋ฐฉ๋ฒ
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
@AfterReturning(value = "execution(* com.example.service.*.*(..))", returning = "result")
public void logAfterReturning(JoinPoint joinPoint, Object result) {
System.out.println("After method: " + joinPoint.getSignature().getName() + " returned " + result);
}
}
Aspect : ๊ด์ฌ์ฌ ๋ชจ๋ํํ๊ฒ
JoinPoint : Aspect ์ ์ฉ ์ง์
Pointcut : ์ค์ ๋ก Aspect์ ์ ์ฉํ ์ง์ ์ ์ ์ํ๋ ํํ์
Advice : Aspect๊ฐ JoinPoint์์ ์ํํด์ผ ํ ์์
Weaving : Aspect๋ฅผ ์ค์ ์ฝ๋์ ์ ์ฉํ๋ ๊ณผ์ (์ปดํ์ผ, ๋ก๋, ๋ฐํ์ ์ค ํ๋์ ์์ )
@Before, @After, @AfterReturning @AfterThrowing @Around => ChainOfResponsibility ํจํด
AOP๋ ํ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํจ
์คํ๋ง ๋น ๋์์ผ๋ก ๋์ ํ๋ก์๋ฅผ ์์ฑํ์ฌ AOP ๊ตฌํ
JDK ๋์ ํ๋ก์ : ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํ๋ก์ ์์ฑ
CGLIB : ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์์๋ฐ์ ํ๋ก์ ์์ฑ
์๋ณธ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๊ธฐ๋ฅ ์ถ๊ฐ !!
๋ฐ์ฝ๋ ์ดํฐ ํจํด
Wrapping ํด์ฃผ๋ ์ญํ
์ต์ ๋ฒ ํจํด
ํธ๋์ญ์
์ฒ๋ฆฌ๋ฅผ ์ํด ์ ์ธ์ ํธ๋์ญ์
์ ์ฌ์ฉํจ
ํด๋์ค, ๋ฉ์๋ ๋จ์์ ์ ์ธ๋๊ณ ์ด๊ฒ ์ ์ฉ๋ ํ๋ก์ ๊ฐ์ฒด ์์ฑํจ
Commit or Rollback ์ํ
@Transacional๋ proxy์ aspectJ ๋ชจ๋๊ฐ ์๋ค
public ๋ฉ์๋์ ์ ์ฉ๋์ด์ผ ํ๋ค
์์ -> protected ๋ถ์ผ ์ ์์
์กฐํฉ -> public๋ง ์ฌ์ฉํ ์ ์์
์ฃผ์ํ ์
1) ํ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํจ
๊ฐ์ ํด๋์ค ๋ด์ ๋ฉ์๋ ํธ์ถ ์ @Transactional์ด ์ ์ฉ๋์ง ์์ ์ ์๋ค
ํธ๋์ญ์
๋ก์ง์ ๋ฉ์๋ ํธ์ถ ์ ์ ์๋์ผ๋ก ์ฝ์
ํ๋ค
๋ค๋ฅธ ๋น์ ํตํด ํธ์ถํจ
2) ๋กค๋ฐฑ๋์ง ์๋ ์์ธ
@Transactional์ RuntimeException์๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ๋กค๋ฐฑํจ
์ฒดํฌ ์์ธ๋ ํธ๋์ญ์
์ ๋กค๋ฐฑํ์ง ์์
| [ํจํค์ง๋ฐ๋ฐฐํฌ] Jar vs War (0) | 2024.12.21 |
|---|---|
| [Spring] @Transactional (0) | 2024.12.13 |
| [์คํ๋ง] ๋์์ฑ ๋ฌธ์ , ThreadLocal (0) | 2024.11.25 |
| [Spring] Spring IoC Container, BeanScan, ์๋ช ์ฃผ๊ธฐ, ์ค์ฝํ (0) | 2024.11.20 |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค]JPQL : N + 1 ๋ฌธ์ , Fetch Join, ์ฃผ์์ฌํญ (0) | 2023.07.11 |