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 속성도 사용 가능
'프로그래밍 > 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 |