06. AOP
728x90

proxy

 - 핵심 기능의 실행은 다른 객체에 위임하고 부가적인 기능을 제공하는 객체

 - 대상 객체: 실제 핵심 기능을 실행하는 객체

 - 핵심 기능을 구현하지 않는 대신 여러 객체에 공통으로 적용할 수 있는 기능 구현

AOP

 - Aspect Oriented Programming

 - 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법

더보기

핵심 기능에 공통 기능 삽입

 - 컴파일 시점에 코드에 공통 기능을 삽입하는 방법

 - 클래스 로딩 시점에 바이트 코드에 공통 기능을 삽입하는 방법

 - 런타임에 프록시 객체를 생성해서 공통 기능을 삽입하는 방법(Spring에서제공)

주요 용어

주요 용어 의미
Advice 언제 공통 관심 기능을 핵심 로직에 적용할지를 정의
예를 들어 '메서드를 호출하기 전'(언제)에 '트랜잭션 시작'(공통 기능) 기능을 적용한다는 것을 정의함
Joinpoint Advice를 적용 가능한 지점을 의미
메서드 호출, 필드 값 변경 등이 해당
Pointcut Joinpoint의 부분 집합으로서 실제 Advice가 적용되는 Joinpoint를 나타낸다
스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Pointcut을 나타냄
Weaving Advice를 핵심 로직 코드에 적용하는 것
Aspect 여러 객체에 공통으로 적용되는 기능: 트랜잭션, 보안 등

Advice 종류

종류 설명
Before Advice 대상 객체의 메서드 호출 전
After Returning Advice 대상 객체의 메서드가 익셉션 없이 실행된 이후
After Throwing Advice 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우
After Advice 익셉션 발생 여부에 상관없이 대상 객체의 메서드 실행 후
Around Advice 대상 객체의 메서드 실행 전, 후 또는 익셉션 발생 시점(주로 사용)

 

스프링 AOP 구현

@Aspect

 - 클래스 앞에 붙임

@Order(1)

 - Aspect가 적용되는 순서

@Pointcut

 - 공통 기능을 적용할 대상 메서드에 붙임

 - 메서드를 public으로 바꾸면 재사용 가능

@Around("적용대상메서드()")

 - 공통 기능 앞에 붙임

@EnableAspect

 - @Aspect를 붙인 클래스를 공통 기능으로 사용하고 싶을 때 설정 클래스 앞에 붙임

 

프록시 생성 방식

 - AOP 적용 시, 빈 객체가 인터페이스를 상속하면 인터페이스를 이용해서 프록시를 생성

 - 빈의 실제 타입이 다르더라도 인터페이스의 이름에 해당하는 빈 객체의 타입은 인터페이스를 상속받은 프록시 타입이 된다 -> 타입 변환을 할 수 없기 때문에 익셉션 발생

 - EnableAspectAutoProxy(proxyTargetClass = true) : 타입 변환 가능

 

@Transactional

 - 첫 번째 쿼리문은 통과, 두 번째 쿼리문은 통과하지 못했을 때 첫 번째 쿼리문 이전으로 롤백해야 함

 - 회원가입 시 이메일 인증 발송 등

 - 트랜잭션 범위에서 실행하고 싶은 메서드 앞에 붙임

 - 클래스 앞에 @EnableTransactionManagement 붙임

 - 플랫폼 트랜잭션 매니저(PlatformTransactionManager) 빈 설정

 

@Transactional(rollbackFro = SQLException.class)

 - 원하는 롤백 시점을 지정

 - 반대로 noRollbackFor 속성도 사용 가능

 

728x90

'프로그래밍 > SPRING' 카테고리의 다른 글

08. MVC 1 - 컨트롤러, 뷰 구현  (0) 2022.08.02
07. Spring Web MVC  (0) 2022.08.01
05. DI 적용  (0) 2022.04.24
04. DI  (0) 2022.04.23
03. Spring Framework  (0) 2022.04.23