대충 정리

[대충 정리] sw아카데미 Spring 9일차

0taek 2023. 2. 6. 22:27

미리보는 필요성

 

AOP는 중복되는 부가기능(코드)을 모듈화 하고,

어떠한 메소드에 끼워 맞추고 싶을 때 사용한다.


 

 

 

1. AOP(Aspect-Oriented Programming)

관점지향 프로그래밍, 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다

 

간단히 말해서, 각 레이어에 해당하는 기능의 중복되는 부가기능분리해서 코드를 작성할 수 있게 만드는 프로그래밍 기법

 

횡단 관심사(Cross-cutting concern)라고도 한다.

 

 

 

AOP로 해결할 수 있는 문제 상황은?

다음의 AAAA,BBBB같은 코드가 중복되어 작성될 때의 상황을 해결해 줄 수 있다.

 

중복코드(AAAA,BBBB)

 

AOP 적용 방법?

Spring에서는 이러한 AOP 적용 방법을 런타임 시점에 적용 함으로써 제공한다.

 

 

 

 

2. Spring AOP

앞선 용어정리

  • 타겟(Target) : 핵심 기능 모듈로서 부가기능을 부여할 대상
  • 조인 포인트(Join Point) : Advice가 적용될 수 있는 위치, Target 객체가 구현한 인터페이스의 모든 @Override 메서드
  • 포인트 컷(Point Cut) : Advice를 적용할 Target의 메서드를 선별하는 정규표현식
  • 애스팩트(Aspect) : Advice + Point Cut이며, Spring에서는 Bean으로 등록하여 사용
  • 어드바이스(Advice) : Target에 특정 Join Point에 제공할 부가기능 
  • 위빙(Weaving) : Target의 Join Point에 Advice를 적용하는 과정

 

 

 

어드바이스(Advice) 어노테이션

@Before, @After, @AfterReturning, @AfterThrowing

ㆍbefore : 비지니스 메소드 실행 전에 Advice 메소드 실행

ㆍafter-returning : 비지니스 메소드가 성공적으로 리턴되면 Advice 메소드 동작. 즉 비지니스 메소드가 성공적으로 실행되었을 경우에만 Advice 메소드 동작

ㆍafter-throwing: 비지니스 메소드 실행중 예외가 발생할 경우 Advice 메소드 실행. 즉 비지니스 메소드가 실행에 실패했을 경우에만 Advice 메소드 실행

ㆍafter : 비지니스 메소드의 성공 실패와 상관없이 비지니스 메소드 실행 후 무조건 Advice 메소드 동작

ㆍaround : 비지니스 메소드 실행 전과 실행 후 Advice 메소드 동작하는 형태

 

출처 : https://developer-joe.tistory.com/221

 

 

https://mossgreen.github.io/Spring-Certification-Spring-AOP/

 

Spring AOP 적용

 

joinPoint는 Target의 메소드, 굳이 implement 해서 Override 메소드를 넣을 필요는 없는 듯?

proceed()를 통해서 메소드를 실행한다.

 

 

within과 execution은 범위 표현이다. @Around는 Target 아님

 

Class 명 사용하여 범위 지정

 

근데 강사님 두 개를 분리시켜 놓으시네..?

 

 

Target을 지정하고 Retention?

 

 

Target 클래스

Proxy Pattern 이용(Spring AOP랑 별개)

 

1) Target Class 정의

 

여기서 분리 하고픈 부가기능은 CalculatorInterface, Target은 Calculator

 

 

2) 핸들러 정의(InvocationHandler를 implements)

 

 

invoke를 통해 메소드 실행

 

 

3) main 메소드

 

Proxy인스턴스 생성에는

1) InvocationHandler의 ClassLoader

2) 부가기능의 Class 배열

3) InvocationHandler의 인스턴스, 인자는 Target 클래스

 

세 가지를 넣어야 한다.

 

Calculator 클래스에서 CalculatorInterface의 add에 부가기능을 제공하기 위해 proxyInstance를 생성한다.

 

proxyInstance.add(1,2)는 핸들러를 실행하고, 핸들러는(코드상) method 클래스의 invoke를 사용하여 target의 add를 실행한다.

 

 

 

Spring Proxy의 아키텍쳐 구조(TargetObject==CalculatorInterface. TargetObjectImpl == Calculator)

 

 

트랜잭션이 쓰이지 않은 데이터를 읽는 현상 dirty reads

없는 데이터를 읽는 현상 phantom reads

 

트랜잭션에 대해서는..

https://freedeveloper.tistory.com/159