[스프링] AOP / PSA

Lil_Young·2025년 10월 29일

Spring

목록 보기
3/6
post-thumbnail

AOP (Aspect Oriented Programming)

로깅, 보안, 트랜잭션과 같은 공통 기능을 분리하여 하나의 책임을 가지게 하는 프로그래밍 기법

코드의 재사용으로 생산성을 높이고, 유지보수를 용이하게 만든다.

해당 사진처럼 횡단관심 기능이 핵심관심 기능에 공통으로 들어가는데, 이것을 분리하여 핵심관심에 재사용하는 것이 AOP다.

AOP 용어

Advice

  • AOP 관점에서 분리된 횡단관심 기능, 실제로 Joinpoint에서 사용될 코드

Target

  • AOP 관점에서 핵심관심 기능, Advice가 적용될 대상

Joinpoint

  • Advice를 적용 가능한 지점, 특정 작업이 실행되는 시점
  • 프링은 메소드에 대한 Joinpoint만 가능하다 : 프록시를 이용해 AOP를 구현하기 때문.

Pointcut

  • 실제로 Advice가 적용되는 Joinpoint를 나타냄

Weaving

  • Joinpoint를 Advice로 감싸는 과정

Aspect를 사용하는 예시

// Aspect 어노테이션 사용
@Aspect
 	class A{		// 이곳에서 타겟은 "b()" 메소드다.
  	// Around: 타켓의 실행 전후로 처리 됨
  	@Around("b()")
	public void test(){
    		// b() 메소드의 적용될 코드
      }
      // Before: 타켓이 실행 전 처리 됨
      @Before("b()")
      public void test2(){
    		// 생략
      }
      // After Returning: 타겟이 실행 후 처리 됨
      @After Returning("b()")
      public void test3(){
		// 생략
      }
      // After Throwing: 타겟이 예외를 발생시키면 처리 됨
      @After Throwing("b()")
      public void test4(){
		// 생략
      }
}

이와 같이 Pointcut을 활용하여 특정지점, 또는 시점에 적용할 수 있는 코드를 작성할 수 있다.


PSA (Portable Service Abastraction)

SpringFramework에서 제공하는 서비스 추상화 계층

다양한 서비스 기술을 추상화하여 코드를 특정 기술에 종속시켜 구현하는 것이 아닌 변경에 용이하게 편의성을 제공해준다.

해당 프로젝트에는 SpringWeb을 dependency로 가지고 있고, WAS로 Tomcat이 사용되고 있다.

하지만, build.gradle에서 spring-boot-starter-Web을 spring-boot-starter-webflux로 변경하면 내부 코드 변경 없이

WAS가 Netty로 변경된다.

Spring 내부에는 이미 추상화 서비스가 구현되어 있기 때문에 같은 서비스내에서는 내부 코드 변경없이 간단하게 서비스를 변경할 수 있다.

이밖에도 트랜잭션, JDBC, 캐시와 관련된 여러가지 부분이 서비스 추상화 계층을 통해 특정 기술에 의존하지 않고, 일관된 코드로 구현할 수 있게 해주는 핵심이다.

0개의 댓글