본문 바로가기

SPRING

AOP 개념 및 적용 - Before

절차지향, 객체지향과 같은 새로운 방법이 아니라 객체지향을 응용하는 관점

즉, 관점지향 = 객체지향 + 응용

 

관점지향은 프록시 패턴을 바탕으로 한다.

프록시 패턴이란?

어떤 객체에 대한 접근을 제어하는 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴

 

 

일단, AOP를 어떤 상황에서 사용할 수 있는지 확인해보자.

 

다음과 같이, 소년과 소녀는 전반적으로 똑같은 일을 하지만, 게임을 하고 요리를 하는 것처럼 핵심 기능이 다르다.

중복된 횡단 코드 줄여줘야할 필요성이 있다.

하나의 메서드를 만들어서 중복된 코드를 몰아 넣고, 각각 소년 소녀 클래스에서 불러서 쓴다면 해결이 가능하다.

하지만, 그 메서드의 기능이 변경되면 혹은 메서드명이 변경되면 각각 클래스로 가서 다~~바꿔줘야하는 불편함이 있다.

그래서 AOP라는 개념을 활용하면 코드를 수동적으로 바꾸지 않아도 자동으로 추가되도록 할 수 있다.


어노테이션을 활용하는 방법

 

1. aop 태그 및 어노테이션을 사용하기 위해 라이브러리 추가

 

mvnrepository.com 메이븐 저장소 -> 메이븐 라이브러리들 관리 -> pom.xml에 들어가는 코드들이 들어있는 곳

다시! 메이븐이 뭐다? 빌드 도구!! 다양한 종류가 있어 그레이들같은~

aop 사용시 pom.xml에 하단 의존 추가

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.1.0.RELEASE</version> <!-- 같은 그룹끼리는 같은 버전으로 쓰기! -->
</dependency>
<dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.7.4</version>
</dependency>

 

2. Boy Girl 클래스의 상위 개념인 Person 인터페이스 생성

 

 

3. Boy Girl 클래스 구현 (Person을 구현)

 

인터페이스를 구현했으니 이제 Boy Girl은 부모 타입인 Person으로 다룰 수 있게 된다.

이 클래스들은 중복되는 부분만 제거하고, 딱 자기들이 하는 핵심 기능만 들어있게 됨

 

 

4. 공통 기능을 구현하는 MyAspect 클래스

 

어떤 클래스에서 쓸 공통 기능들이 들어있는 클래스다.

따라서 어떤 것과 무슨 연관이 있다 이런 개념보다는 공통 기능을 구현해놓은 별도의 클래스라고 생각하자.

다른 곳과 연결하려면 execution 표현식을 써서 이 기능을 사용할 메서드를 지정해주는! 오키?

Person을 구현하거나 이런게 절대 아니다!!

 

 

5. 빈 컨테이너에 객체 생성 및 aop 네임스페이스 추가

 

 

6. 메인에서 돌려보기

 


POJO / XML 파일을 이용하는 방법

 

공통된 기능이 담긴 MyAspect는 아무 처리를 하지 않고 의존도 없고 뭣도 없는 깔끔한 상태 -> POJO

XML에서 <aop:config> <aop:aspect> <aop:before> 태그를 이용하여 모든 조건을 걸어줬음

 


개념 정리

 

- AOP는 횡단 관심사를 한 곳에서 정의하고 이후 필요한 부분에 코드를 주입해주는 방법

- 횡단 관심사 코드를 어느 시점에 주입할 수 있는가?

- 객체 지향에서 코드(로직)가 있는 곳은 메서드의 내부에 존재

- 메서드가 호출될 때 횡단 관심코드를 주입해줄 수 있는 시점들이 존재

 

Before : 메서드 시작 전 시점

After  : 메서드 종료 후 시점

- Afterreturning : 메서드가 정상적으로 종료 시점

- Afterthrowing  : 메서드에서 예외가 발생되어 종료된 시점

Around : 위 시점 전체를 포함하여 개발자가 원하는 시점을 선택할 수 있는 시점 

ex) Calculator - 핵심 기능이 두 번째 줄에 들어있잖아

 

AOP 핵심 개념

- 스프링 AOP는 인터페이스 기반

- 스프링 AOP는 프록시를 기반으로 한다.

- 스프링 AOP는 런타임(실행 중) 기반이다.

 

AOP 관련 용어

- Aspect : 관점, 측면, 양상

- Advisor : 조언자, 고문

- Advice : 조언, 충고

- PointCut : 자르는 지점. JoinPoint 중에 하나(이번 예제에서는 Before)

- JoinPiont : 결합점. PointCut이 될 수 있는 후보(Before, After, Afterreturning, Afterthrowing, Around)

 

 

**JoinPoint 개념

 

Pointcut 지시자

[접근제한자] 반환자료형패턴[패키지&클래스패턴.]메서드이름패턴([파라미터패턴])[throws예외패턴]

 

ex) 

* runSomething()

- 접근제한자는 무엇이든

- 반환 자료형은 무엇이든

- 모든 패키지에서(생략)

- 모든 클래스내에(생략)

- 메서드 이름은 runSomething이고

- 파라미터는 없음

- 예외처리는 있든 없든

위 조건에 맞는 JoinPoint가 PointCut이 된다.

 

public void aop002.Boy.runSomething()

- 접근제한자 public

- 반환 자료형 void

- aop002 패키지에

- Boy라는 클래스에

- runSomething이라는 메서드가

- 파라미터가 없고

- 예외는 있든 없든

위 조건에 맞는 부분이 Pointcut이다.

 

 

**Advice (언제, 무엇을)

Pointcut 지점에 언제, 무엇을 적용할 것인지 정의한 로직(메서드)

before() 메서드 자체를 Advice라고 한다

ex) Pointcut이 시작(호출)되기 전(@Before)에 before() 메서드를 실행

 

 

**Aspect (관점)

AOP에서 여러 개의 Advice와 여러 개의 Pointcut이 결합된 것을 의미

Aspect = Advice + Pointcut

 

언제, 어디에, 무엇을 적용할 것이냐?

예제에서 @Aspect가 선언된 클래스의 내용이다.

Pointcut이 시작되기 전(@Before)에 before() 메서드를 실행하는 것