상세 컨텐츠

본문 제목

[스프링] OSIV, AOP

😎 지식/자바_스프링_테스트☕

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

본문

OSIV

JPA와 Hibernate에서 데이터베이스 세션을 웹 요청의 전 과정을 통해 열어두는 전략
지연 로딩 문제를 해결하기 위해 사용함
영속성 컨텍스트는 트랜잭션 내에서만 활성화되지만
OSIV를 활성화하면 뷰 렌더링 단계에서도 영속성 컨텍스트가 열려 있어 데이터를 조회할 수 있음


@Transactional

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

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 해주는 역할 
 
옵저버 패턴
 
 


 

728x90

관련글 더보기