상세 컨텐츠

본문 제목

[스프링] AOP와 @Transactional

😎 지식/스프링

by :부셔져버린개발자 2024. 11. 27. 20:04

본문

 

 
 

AOP

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

@Transactional

트랜잭션 처리를 위해 선언적 트랜잭션을 사용함
클래스, 메서드 단위에 선언되고 이게 적용된 프록시 객체 생성함
Commit or Rollback 수행
 
@Transacional도 proxy와 aspectJ 모드가 있다 
public 메서드에 적용되어야 한다 
상속 -> protected 붙일 수 있음
조합 -> public만 사용할 수 있음
 
주의할점
1) 프록시 기반으로 동작함
같은 클래스 내의 메서드 호출 시 @Transactional이 적용되지 않을 수 있다 
트랜잭션 로직을 메서드 호출 전에 자동으로 삽입한다
다른 빈을 통해 호출함 
 
2) 롤백되지 않는 예외
@Transactional은 RuntimeException에만 기본적으로 롤백함
체크 예외는 트랜잭션을 롤백하지 않음
 


 

728x90

관련글 더보기