본문 바로가기
Language/Java

[Spring] 관점 지향 프로그래밍 AOP

Writer mintparc 2020. 2. 19.

관점 지향 프로그래밍 AOP


관점 지향 프로그래밍이란 횡단 관심사의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 공통된 관심사를 따로 분리해서 주 관심사(CC)와 공통 관심사(CCC)로 나누어 모듈화 시키는 방식이다.

 

  • Advice (CCC)
    • 공통적으로 빠져나온 관심사
  • Join Point (CC)
    • Advice가 연결될 수 있는 모든 point들의 집합
  • Point Cut (CC)
    • Advice가 연결될 결합점에 대한 상세한 정의
  • Advisor (Aspect)
    • Adivice + Point Cut 
    • 흩어진 관심사들을 모듈화한 것
  • Weaving (CrossCutting)
    • Advisor를 대상 객체에 결합하는 행위

 

 

AOP를 그림으로 이해하기


 

여기 비슷한 기능을 하는 메소드를 가지고 있는 세 개의 클래스가 있다.

예를 들어 노란색 기능을 수정해서 사용하고 싶어졌다. 노란색 메소드는 여기저기 흩어져 있기 때문에 A B C 클래스에 있는 모든 노란색 메소드를 일일이 수정해줘야 하는 불편함을 겪게 된다.

핵심기능을 하는 코드와 공통 기능을 하는 코드가 어지럽게 섞여있어 유지보수 효율성이 떨어진다.

 

 

 

 

 

 

이러한 불편함을 해소하기 위해 우리는 흩어져 있는 Advice(주 관심사, 공통 코드)를 모아서 관리하는 방법을 사용할 수 있다. 이것이 바로 AOP이다.

 

 

 

 

 

분리한 Advice(주 관심사, 공통 코드)를 연결할 수 있는 위치를 Join Point라고 한다.

 

  • Advice (CC) : 주 관심사, 공통된 코드
  • Join Point (CCC) : Advice가 적용될 부분

 

 

 

 

 

 

 

Join Point에서 조금 더 상세하게 연결 지점을 정의한 것이 Point Cut이다.

Advice(주 관심사)와 Point Cut을 합쳐 모듈화시킨 것이 Advisor(Aspect)이다.

 

 

마지막으로 모듈화된 코드를 대상 객체에 연결시키는 행위를 Weaving이라고 한다. 

노란 메소드를 클래스A에 연결시키는 행위가 Weaving이 되며 이때 클래스A를 Target이라고도 한다.

 

 

 

 

 

AOP 구현


스프링에서 AOP를 구현할 시 proxy를 사용하며 xml을 기반으로 한 구현방식과 어노테이션을 이용한 구현 방식이 있다.

 

 

 

xml을 기반으로 한 구현 방식


1. 새 메이븐 프로젝트를 생성한다.

 

2. 우리의 목표

 

 

과일 심부름을 간 동생과 과자 심부름을 간 동생 클래스가 있다. 우리는 공통된 부분을 모아서 관리하고자 AOP를 구현하려고 한다.

 

 

3. pom.xml

  • pom.xml 파일을 열어서 <bulid></build>태그 아래 <dependencies></dependencise>태그를 만든다.
  • <dependencies> 태그 안에 자바 프로그래밍 언어용 AOP 확장 기능인 aspectjweaver와 aspectj를 추가해준다.
  • https://mvnrepository.com/
  •  
 

Maven Repository: Search/Browse/Explore

Config Last Release on Feb 18, 2020

mvnrepository.com

<dependencies>
	<dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.9.5</version>
    </dependency>
</dependencies>

 

3. 공통 기능 클래스 작성 (CCC)

우리의 목표 중 공통된 기능은 "동생이 마트에 갔다." 와 "동생이 계산을 하고 집에 왔다."를 출력하는 것이다.

package com.test;

import org.aspectj.lang.JoinPoint;

public class Aspect {
	
	public void before(JoinPoint join) {
		System.out.println("동생이 마트에 갔다.");
	}
	
	public void after(JoinPoint join) {
		System.out.println("동생이 계산을 하고 집에 왔다.");
	}
}

 

 

4. 주 기능 클래스 작성 (CC)


과일 심부름과 과자 심부름 클래스를 만들자.

 

  • 스프링 설정 파일(xml) - bean 생성, aspect 설정

댓글