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 />
'Java > 스프링' 카테고리의 다른 글
6.Spring MVC Project - 인터셉터 (0) | 2018.05.17 |
---|---|
5-3.Spring MVC Project - 게시글삭제 (0) | 2018.05.17 |
5-2.Spring MVC Project- 게시판 수정하기 (0) | 2018.05.15 |
5-1. Spring MVC Project- 게시판 상세보기 (0) | 2018.05.15 |
5.Spring 게시판 만들기 (0) | 2018.05.10 |