AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍이다. 코드에서 반복되어 사용하는 부분을 부분적으로 나누어서 모듈화하는 것을 말한다.
간단히 말하면 코드에 흩어져 있는 횡단 관심사들을 aspect로 모듈화 한 것이다.
package com.example.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogAspect {
Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Around("execution(* com.example.aop.*.*(..))")
public Object logging(ProceedingJoinPoint pjp) throws Throwable {
logger.info("start - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());
Object result = pjp.proceed();
logger.info("finished - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());
return result;
}
}
실제로 실행해 보았을 때, Aspect를 적용할 컴포넌트가 존재하지 않을 경우 에러가 발생한다.
@Aspect만으로는 빈으로 등록되지 않으므로 빈으로 등록하기 위한 Component가 필요하다.
@EnableAspectJAutoProxy: @Aspect를 적용한 컴포넌트들을 사용할 수 있도록 설정하는 역할
@Aspect: aspect로 정의하여 AspectJAutoProxy가 사용할 수 있도록 한다.
@Around: 메소드 실행 전후 공통 로직을 적용할 때
@Before: 메소드 실행 전 공통 로직을 적용할 때
@After: 메소드 실행 후 공통 로직을 적용할 때
@Component: bean을 생성하는 역할
Aop가 적용될 위치를 정할 때 사용하는 pointCut의 일종이다. Advice(무엇을 할 지 정의한 부분, 여기서는 로깅)를 적용할 메서드를 등록할 때 많이 쓰인다.
표현식은 이와 같다.
execution([수식어] 리턴타입 [클래스이름].이름(파라미터)
수식어 : public, private 등 수식어를 명시합니다. (생략 가능)
리턴타입 : 리턴 타입을 명시합니다.
클래스이름 및 이름 : 클래스이름과 메서드 이름을 명시합니다. (클래스 이름은 풀 패키지명으로 명시해야합니다. 생략도 가능)
파라미터 : 메서드의 파라미터를 명시합니다.
" * " : 모든 값을 표현합니다.
" .. " : 0개 이상을 의미합니다.
Dynamic proxy로 동작한다.
dynamic proxy가 프록시 패턴인지 데코레이터 패턴인지에 대해서는 생각해볼 가치가 있는데, 데코레이터 패턴에 가깝다고 볼 수 있다.
출처: https://engkimbs.tistory.com/746 [새로비]
https://jeong-pro.tistory.com/171
https://icarus8050.tistory.com/8
PSA란
환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하려는 추상화 구조
를 뜻한다.
Java EJB가 환경에 너무 의존적이기 때문에 조금만 변화하여도 코드를 변경해야 했고, 테스트도 어려운 단점이 있었다. 따라서 이와 반대되는 POJO라는 명칭을 사용하게 되었고,