AOP라는 것은 Aspect Oriented Programming의 약자로 횡단 관심사를 쉽게 처리해주는 프로그래밍 기법을 말한다.

보통 로그를 출력하여 완성도를 높일 때 사용한다.

AOP를 적용하여 log를 출력하기 위해서는 
1. pom.xml 에 AspectJRT, AspectTools를 등록
2. AOP생성 및 타겟 객체 설정
3. 원하는 로그 설정
이렇게 세가지를 해야한다.

순서대로 진행을 해보겠다.



======================== pom.xml ========================

<!-- 1. pom.xml -->

        <!-- AspectJ -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

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

</dependency>

<!-- AspectJtools -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjtools</artifactId>

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

</dependency>

======================== pom.xml ========================




pom.xml 설정을 그냥 붙여넣기만 해도 된다.

중요한 건 다음부터이다.





======================== JAva ========================

package org.zerock.aop;


import java.util.Arrays;


import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;


// 자동적으로 생성하게 하는 어노테이션: 

// @Controller, @Service, @Repository, @Component, @restController

@Component

@Aspect

public class SampleAdvice {

private static final Logger logger = LoggerFactory.getLogger(SampleAdvice.class);

@Before("execution(* org.zerock.board.service.BoardService*.*(..))")

public void startLog(JoinPoint jp) {

// System.out.println("----------------");

// System.out.println(Arrays.toString(jp.getArgs())); // 넘어가는 데이터를 확인.

// System.out.println(jp.getKind());

// System.out.println(jp.getTarget());

// System.out.println(jp.getSignature());

logger.info("-------------------------------");

logger.info(jp.getSignature().toString());

logger.info(Arrays.toString(jp.getArgs()));

logger.info("-------------------------------");

}// end of startLog()

}// end of class SampleAdvice{}


======================== Java ========================




위의 소스 코드에는 2, 3 과정이 들어가있다. 

@Component는 시작시 SampleAdvice가 생성되도록 하는 어노테이션, @Aspect는 AOP로 만들어주는 어노테이션이다.

위에서 타겟 객체는 
@Before("execution(* org.zerock.board.service.BoardService*.*(..))")
이부분이다.

@Before은 service에 들어가기 전에 로그를 출력하기 위해 사용하는 어노테이션이다. 참고로 보통의 경우에는 @Around를 사용한다.

타겟은 MVC2 패턴을 이용하여 직접 만든 게시판 모듈이다.

MVC 패턴이므로 어떤 행동을 하더라도 전부 controller, service, dao를 거쳐가기 때문에 아무거나 타겟으로 잡아도 상관없다. 일단 여기서는 service를 타겟으로 잡았다.

BoardService*.*(..) 는 
첫번째 *, BoardService 뒤에 Impl이 붙는 경우도 있기에 *를 설정하여 앞이 BoardService이기만 하면 다 잡아낼 수 있도록 만들었다.
두번째 *, BoardService* 내부의 어떤 메서드를 사용하더라도 로그가 찍히도록 하는 *이다.
세번째(..), 매개변수 갯수와 어떤 형태를 받더라도 상관없도록 ..을 사용한 것이다.

서비스 매서드가 실행되면 System.out.print~를 이용해서 출력해도 되지만 스프링 기본으로 탑재되어있는 log출력용 객체인 org.slf4j.Logger를 이용해서 출력했다. 혹시나 자바 기본 프린트가 되는지 실험을 해보기 위해 위처럼 주석처리로 해놓았다.



======================== log확인 ========================

// 로그 출력 확인


INFO : org.zerock.aop.SampleAdvice - -------------------------------

INFO : org.zerock.aop.SampleAdvice - List org.zerock.board.service.BoardService.list(Criteria)

INFO : org.zerock.aop.SampleAdvice - [Criteria [page=1, perPageNum=10, startRow=1, endRow=10, totalCount=0, totalPage=0, displayPageNum=10, startPage=0, endPage=0, prev=false, next=false, searchType=null, keyword=null]]

INFO : org.zerock.aop.SampleAdvice - -------------------------------

======================== log확인 ========================


원하는대로 정상적으로 출력되는 것을 확인할 수 있었다.



+ Recent posts