AOP 관점지향 프로그래밍 


Aspect Oriented Programming(관점 지향 프로그래밍): 객체 지향 프로그래밍을 보완하는 

개념으로 메소드나 클래스를 관점에 따라 분리시켜서 구현하는 프로그래밍 방법

하나의 메소드에 비지니스 로직을 수행하는 문장과 공통으로 사용하는 ㅁ눈장이 같이 존재할 때 이를 분리해서 구현하기 위한 프로그래밍 방식 

관점지향 프로그래밍이라고 하는데 spring에서는 공통으로 사용하는 문장을 별도의 클래스에 작성해서 분리를 할 수 있는 기능을 제공합니다.

실행될 때 코드를 합쳐서 하나의 proxy 객체를 만들어서 실행합니다. 




**AOP 적용

AOP: 하나의 메소드에 비지니스 로직을 수행하는 문장과 공통으로 사용하는 문장이 같이 존재할 때 이를 분리해서 구현하기 위한 프로그래밍 방식

관점 지향 프로그래밍이라고 하는데 spring에서는 공통으로 사용하는 문장을 별도의 클래스에 작성해서 분리를 할 수 있는 기능을 제공합니다.

실행 될 때 코드를 합쳐서 하나의 proxy 객체를 만들어서 실행합니다.


=>Dao 클래스의 메소드가 호출될 때의 시간을 매일 파일에 기록하는 AOP


1.advice로 사용될 클래스를 생성

=>kr.co.pk.advice.LoggingAdvice


package kr.co.pk.advice;


import java.io.FileOutputStream;

import java.io.PrintWriter;

import java.util.Calendar;


import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.springframework.stereotype.Component;


//객체를 자동으로 생성하기 위한 어노테이션

@Component

//Advice 클래스로 만들기 위한 어노테이션

@Aspect

public class LoggingAdvice {


//advice로 수행될 메소드

//pointcut 작성

//접근지정자는 public 다음 *은 모든 리턴 타입

//kr.co.pk.. 은 kr.co.pk 패키지 안에 있는 모든

//*Dao 는 Dao로 끝나는 클래스 .* 은 메소드 이름이 무엇이든지

//(..)은 매개변수 개수에 상관없이

@Around("execution(public * kr.co.pk..*Dao.*(..))")

public Object invoke(ProceedingJoinPoint joinPoint)

throws Throwable{

//pointcut으로 설정된 메소드가 호출되기 전에 수행할 내용

//메소드 이름 가져오기

String methodName = joinPoint.getSignature().toLongString();

//현재 시간 만들기

Calendar cal = Calendar.getInstance();

java.util.Date date = new java.util.Date(

cal.getTimeInMillis());

//파일에 문자열 기록하기 - 파일이 존재하면 이어쓰기

FileOutputStream fos = 

new FileOutputStream("d:\\log.txt", true);

//문자열을 기록할 수 있는 클래스의 객체 만들기

PrintWriter pw = new PrintWriter(fos);

//파일에 기록

pw.println(methodName + " " + date.toString() + "\n");

pw.flush();

pw.close();

Object obj = joinPoint.proceed();

//pointcut으로 설정된 메소드가 호출 된 후에 수행할 내용

return obj;

}

}


2.pom.xml 파일에 aop를 사용하기 위한 의존성 라이브러리를 추가

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.8.8</version>

</dependency>


<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-aop</artifactId>

<version>${org.springframework-version}</version>

</dependency>


<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-aspects</artifactId>

<version>${org.springframework-version}</version>

</dependency>


3.servlet-context.xml 파일에 aop 네임스페이스를 추가하고 어노테이션으로 설정한 aop를 사용할 수 있는 태그를 추가

<!-- 어노테이션으로 만든 AOP 적용 -->

<aop:aspectj-autoproxy />



+ Recent posts