[스프링 입문을 위한 자바 객체 지향의 원리와 이해] 07. 스프링 삼각형의 설정 정보

off_sujin·2022년 7월 10일
0


스프링을 이해하는 데에는 POJO(Plain Old Java Object)를 기반으로 하는 IoC/DI, AOP, PSA의 스프링 삼각형을 이해하는 것이 중요하다.

IoC/DI - 제어의 역전/의존성 주입

AOP - 로직 주입

AOP

  • Aspect-Oriented Programming의 약자
  • 관점 지향 프로그램
  • 스프링 DI -> 의존성(new)에 대한 주입, 스프링 AOP -> 로직(code) 주입

횡단 관심사

횡단 관심사

  • 다수의 모듈에 공통적으로 나타나는 부분
  • ex) 로깅, 보안, 트랜잭션

핵심 관심사

  • 모듈별로 다르게 나타나는 부분
  • ex) 입금, 출금, 이체 로직

로깅, 보안, 트랜잭션과 같은 공통된 로직이 매 비즈니스 로직마다 반복적으로 작성된다.

=> 공통 로직을 Aspect로 분리하고, 해당 Aspect가 사용되는 메서드를 매핑해준다!

메서드에서 로직을 주입할 수 있는 곳

  • Around(메서드 전 구역)
  • Before(메서드 시작 전)
  • After(메서드 종료 후)
  • AfterReturning(메서드 정상 종료 후)
  • AfterThrowing(메서드에서 예외가 발생하면서 종료된 후)

예제 : AOP 적용 전

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("저는 여성입니다.");
    }
}

횡단 관심사 -> 문 열고 들어가기
핵심 관심사 -> 성별 설명하기

예제 : AOP 적용 후

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("열쇠로 문을 열고 집에 들어간다.");
    }
}
  • @Aspect
    • 해당 클래스를 이제 AOP에서 사용하겠다
  • @Before
    • 대상 메서드 실행 전에 이 메서드를 실행하겠다
  • JoinPoint
    • @Before에서 선언된 메서드인 runSomething()

Proxy!

스프링 AOP는 프록시 패턴을 이용해 횡단 관심사를 핵심관심사에 주입한다.

  • 호출하는 쪽에서 romeo.runSomething() 메서드를 호출하면 프록시가 그 요청을 받아 진짜 romeo 객체에게 요청을 전달한다.
  • 프록시 객체에 있는 runSomething() 메서드는 주고받는 내용을 감시하거나 조작할 수 있다.

스프링 AOP 요약

스프링 AOP는 인터페이스(interface) 기반이다.
스프링 AOP는 프록시(proxy) 기반이다.
스프링 AOP는 런타임(runtime) 기반이다.

AOP 용어 정리!

PointCut

Aspect를 적용할 실제 타깃 메소드를 선택하는 지시자

@Aspect
public class MyAspect {
    @Before("execution(*runSomething())")
    public void before(JoinPoint joinPoint) {
        System.out.println("얼굴 인식 확인: 문을 개방하라");
        //System.out.println("열쇠로 문을 열고 집에 들어간다.");
    }
}
  • *runSomething()이 바로 Pointcut이다.
  • 타깃 메서드 지정자 패턴
    • [접근제한자패턴] 리턴타입패턴 [패키지&클래스패턴]메서드이름패턴(파라미터패턴)[throws 예외패턴]

JoinPoint

  • Aspect를 적용할 수 있는 모든 지점
  • PointCut은 JoinPoint의 부분 집합
  • 스프링 AOP에서 JoinPoint란 스프링 프레임워크가 관리하는 빈의 모든 메서드에 해당한다.

위의 예제에서 JoinPoint는 romeo.runSomething(), juliet.runSomething()이라고 볼 수 있다.

Advice

Pointcut에 언제, 무엇을 적용할지 정의한 메서드
(before, after, afterThrowing, afterRetuning, around)

// Pointcut이 시작되기 전(@Before)에 before() 메서드를 실행한다.
@Before("execution(*runSomething())")
public void before(JoinPoint joinPoint) {
    System.out.println("얼굴 인식 확인: 문을 개방하라");
}

Advisor

Advisor = 한 개의 Advice + 한 개의 Pointcut

Aspect

  • 여러 개의 Advice와 여러 개의 PointCut의 결합체
  • Aspect = Advice들 + Pointcut들
    • Aspect = When + Where + What

PSA - 일관성 있는 서비스 추상화

PSA

  • Portable Service Abstraction의 약자
  • 어댑터 패턴을 적용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한 것
  • 스프링 프레임워크에서는 서비스 추상화를 위해 다양한 어댑터를 제공한다.
    • ex) JDBC
profile
학습 중..

0개의 댓글