스프링을 이해하는 데에는 POJO(Plain Old Java Object)를 기반으로 하는 IoC/DI, AOP, PSA의 스프링 삼각형을 이해하는 것이 중요하다.
횡단 관심사
핵심 관심사
로깅, 보안, 트랜잭션과 같은 공통된 로직이 매 비즈니스 로직마다 반복적으로 작성된다.
=> 공통 로직을 Aspect로 분리하고, 해당 Aspect가 사용되는 메서드를 매핑해준다!
package aop002;
public class Boy {
public void runSomething() {
System.out.println("열쇠로 문을 열고 집에 들어간다.");
System.out.println("저는 남성입니다.");
}
}
package aop002;
public class Girl {
public void runSomething() {
System.out.println("열쇠로 문을 열고 집에 들어간다.");
System.out.println("저는 여성입니다.");
}
}
횡단 관심사 -> 문 열고 들어가기
핵심 관심사 -> 성별 설명하기
package aop002;
public interface Person {
void runSomething();
}
package aop002;
public class Boy implements Person {
public void runSomething() {
System.out.println("저는 남성입니다.");
}
}
package aop002;
public class Girl implements Person{
public void runSomething() {
System.out.println("저는 여성입니다.");
}
}
package aop002;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class MyAspect {
@Before("execution(*runSomething())")
public void before(JoinPoint joinPoint) {
System.out.println("얼굴 인식 확인: 문을 개방하라");
//System.out.println("열쇠로 문을 열고 집에 들어간다.");
}
}
스프링 AOP는 프록시 패턴을 이용해 횡단 관심사를 핵심관심사에 주입한다.
스프링 AOP는 인터페이스(interface) 기반이다.
스프링 AOP는 프록시(proxy) 기반이다.
스프링 AOP는 런타임(runtime) 기반이다.
Aspect를 적용할 실제 타깃 메소드를 선택하는 지시자
@Aspect
public class MyAspect {
@Before("execution(*runSomething())")
public void before(JoinPoint joinPoint) {
System.out.println("얼굴 인식 확인: 문을 개방하라");
//System.out.println("열쇠로 문을 열고 집에 들어간다.");
}
}
위의 예제에서 JoinPoint는 romeo.runSomething(), juliet.runSomething()이라고 볼 수 있다.
Pointcut에 언제, 무엇을 적용할지 정의한 메서드
(before, after, afterThrowing, afterRetuning, around)
// Pointcut이 시작되기 전(@Before)에 before() 메서드를 실행한다.
@Before("execution(*runSomething())")
public void before(JoinPoint joinPoint) {
System.out.println("얼굴 인식 확인: 문을 개방하라");
}
Advisor = 한 개의 Advice + 한 개의 Pointcut