핵심로직과 부가 기능을 분리하는 프로그래밍
로깅, 트랜잭션 관리, 인증을 공통 부가 기능인 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 |