AOP

Aspect(관심사)

공통된 관심사?로 이해하면 쉽다.

 

여러 클래스에서 같은 로직(관심사)이 실행될 때 사용한다.

 

공통적인 로직을 클래스에 하나하나 추가하지 않고 별도의 클래스로 생성한다.

 

예를 들어 모든 로직의 수행시간을 측정하려고 한다.

//시작

StopWatch sw = new StopWatch();

sw.start();

//여러가지 로직들

//끝

sw.stop();

System.out.println(sw.prettyPrint());

 

공통된 로직이 모두 들어간다.

 

공통된 로직을 분리 후 실행하는방법

 

-컴파일

컴파일할때 코드를 넣어준다.

 

-바이트코드 조작

A.java -> A.Class 하고 실행 시 클래스 로더가 메모리에 올릴 때 조작한다.

 

컴파일, 바이트코드 조작의 차이점 코드가 아닌 메모리에 올라간다.

두 개다 AspectJ가 지원한다.

 

-프록시패턴(스프링AOP)

인터페이스 implements를 통해 구현한다. 

한번 더 감싸는 구조로 생각하면 쉽다.

 

(

공통 로직

(실행 로직)

공통 로직

)

자동으로 bean 등록될 때 만들어진다.

 

 

애노테이션을 사용하여 AOP 적용한 예제

@LogExecutionTime을 만들어보기

@GetMapping("/owners/find")

//만들 애노테이션 명

@LogExecutionTime

public String initFindForm(Map<String, Object> model) {

model.put("owner", new Owner());

return "owners/findOwners";

}

 

구현할 애노테이션 생성

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface LogExecutionTime {

}

 

 

@Around로 ProceedingJoinPoint를 파라미터로 받는다.

ProceedingJoinPoint는 애노테이션을 설정한 타깃을 말한다.

즉 애노테이션 달려있는 메서드!

//bean으로 등록

@Component

//Aspect 설정

@Aspect

public class LogAspect {



Logger logger = LoggerFactory.getLogger(LogAspect.class);



@Around("@annotation(LogExecutionTime)")

public Object LogExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable{

StopWatch sw =new StopWatch();

sw.start();

//위애 애노테이션 달려있는 메소드 실행

Object procced= joinPoint.proceed();



sw.stop();

logger.info(sw.prettyPrint());



return procced;

}

}

 

같은 로직인데 여러 군데 들어간다면 AOP를 활용하는 게 좋다.

애노테이션을 쓰지 않는 방법도 있다.

여러 가지방법과 사용방법이 존재한다.

'개발 소발 > 개발 Spring' 카테고리의 다른 글

Spring Scope란?  (0) 2020.07.13
Spring Autowired와 ComponentScan이란  (0) 2020.07.10
Spring IoC(Inversion of Control),Bean,의존성주입이란?  (0) 2020.07.08
프레임워크 개념  (0) 2018.01.26
SpringMVC란?  (0) 2018.01.11

AOP어플리케이션 작성 (annotation)이란?


Aspect 클래스 선언 및 설정

Aspect 클래스 구현의 이해

Aspect 테스트


SpringAOP 구현방식

- XML

- Annotion


annotation 방식

- @Aspect 사용한다.

- XML설정파일에 <aop:aspectj-autoproxy />를 설정한다.


@Aspect 란?

- Aspect 클래스 선언할 때 사용한다.

- AspectJ 5버전에 새롭게 추가된 어노테이션이다.

- @Aspect 어노테이션을 이용할 경우 XML 설정 파일에 어드바이스와

포인트컷을 설정하는 것이 아니라 클래스 내부에 정의할 수 있다.

- <aop:aspectj-autoproxy />태그를 설정파일에 추가해서 사용한다.



xml설정파일에 추가



@Before("pointcut")

- 타겟 객체의 메서드가 실행되기 전에 호출되는 어드바이스이다.

- JoinPoint를 통해 파라미터 정보를 참조한다.


@After("pointcut")

- 타겟 객체의 메서드가 정상 종료됐을 때와 예외가 발생했을 때 모두 호출되는 어드바이스이다.

- 리턴값이나 예외를 직접 전달받을 수는 없다.


@Around("pointcut")

- 타겟 객체의 메서드가 호출되는 전,후 모든 과정을 담을수있는 강력한기능을 가진 어드바이스이다.


@AfterReturning(pointcut="",returning="")

- 타겟 객체의 메서드가 정상적으로 실행을 마친 후에 호출되는 어드바이스이다.

- 리턴값을 참조할 때는 returning 속성에 리턴 값을 저장할 변수 이름을 지정해야한다.


@AfterThrowing(pointcut="",throwing="")

- 타겟 객체의 메서드가 예외가 발생하면 호출되는 어드바이스이다.

- 발생된 예외를 참조할 때는 throwing속성에 발생한 예외를 저장할 변수이름을 지정해야한다.


@Before 어드바이스

- @Before 어드바이스를 이용해서 실행되는 타겟 객체의 메서드명과 파라미터를 출력하는 어드바이스이다.

- 아래의 before 메서드는 myspring 패키지 또는 그 하위 패키지에 있는 모든

public 메서드가 호출되기 이전에 호출된다.

ex)


@AfterReturning 어드바이스(정상적으로 종료되었을때)

- @AfterReturning어드바이스를 이용해서 실행되는 타겟 객체의 메서드명과 리턴값을 출력하는 어드바이스이다.

- 아래의 afterReturning 메서드는 myspring.user.service 패키지 하위에 있는 모든 public 메서드가 정상 종료된 이후에 호출된다.

- 리턴값을 참조할 때는 returning 속성을 이용해서 리턴 값을 담을 변수 이름을 지정해야한다.



@AfterThrowing 어드바이스(예외가 발생하였을때)

- @AfterThrowing 어드바이스를 이용해서 실행되는 타겟 객체의 메서드명과 예외메시지를 출력하는 어드바이스이다.

- 아래의 afterThrowing 메서드는 클래스명이 UserService로 시작되는 클래스에 속한 모든 메서드가 예외가 발생된 이후에 호출된다.

- 발생된 예외를 참조할 때는throwing 속성을 이용해서 예외객체를 담을 변수이름을 지정해야한다.



@After 어드바이스(정상적,예외 둘다 모두 호출)

- @After 어드바이스를 이용해서 실행되는 타겟 객체의 메서드명을 출력하는 어드바이스이다.

- afterFinally 메서드는 메서드명이 User로 끝나는 메서드들이 정상 종료됐을 때와 예외가 발생했을때 모두호출된다.

- 반드시 반환해야 하는 리소스가 있거나 메서드 실행 결과를 항상 로그로 남겨야하는 경우에 사용할 수 있다.

하지만 리턴 값이나 예외를 직접 전달받을 수는 없다.



'개발 소발 > 개발 Spring' 카테고리의 다른 글

Mybatis 셋팅이란?  (0) 2017.12.21
MyBatis란?  (0) 2017.11.27
AOP어플리케이션 작성 (XML)이란?  (0) 2017.11.24
AOP란?  (0) 2017.11.24
jdbc환경설정(mysql)이란?  (0) 2017.11.21

AOP어플리케이션 작성 (XML)이란?


Advice 클래스 작성에 대하여 이해

AOP 설정 및 테스트

PointCut 문법



SpringAOP의 구현방식

xml방식

@Aspect(어노테이션)방식


xml구현방식 절차

- Advice(부가기능)클래스 작성한다.

- xml파일에 <aop:config>를 이용해서 애스펙트를 설정한다.

(aspect애스펙트란? 어드바이스+포인트컷)


Advice의 종류

- Around어드바이스

타겟(핵심로직)메서드가 호출되기 이전(before) 시점과 이후(after) 시점에

모두 처리해야할 필요가 있는 부가기능을 정의한다.

Joinpoint 앞과 뒤에서 실행되는 Advice 이다.

- Before어드바이스

타겟(핵심로직)메서드가 호출되기 이전(before) 시점에 처리해야 할 

필요가 있는 부가기능을 정의한다.

Joinpoint 앞에서 실행되는 Advice 이다.

- After어드바이스

타겟(핵심로직)메서드가 정상적으로 실행된 이후(After)시점에 처리해야 할 

필요가 있는 부가기능을 정의한다.

Joinpoint 메서드호출이 정상적으로 종료된뒤 실행되는Advice 이다.

- AfterThrowing어드바이스

타겟(핵심로직)메서드가 예외를 발생된 이후(after)시점에 처리해야할 필요가 있는 부가기능을 정의한다.

예외가 던져질 때 실행되는 Advice 이다.


Advice클래스의 정보

클래스명 : PerformanceTraceAdvice.java

클래스 기능 : 이 어드바이스는 타겟 객체의 메서드 실행시간을 계산해서 출력해주는 부가기능을 제공한다.

advice유형 : Around 어드바이스

(타겟 객체의 메서드 실행 전, 후의 시간을 측정하여 계산하면 타겟객체의 메서드 실행시간을 알 수 있다.)

구현 메서드명:trace(ProceedingJoinPoint joinPoint)


JoinPoint인터페이스

- JoinPoint는 SpringAOP혹은 AspectJ에서 AOP가 적용되는 지점을 뜻한다.

- 해당지점을 AspectJ에서 JoinPoin라는 인터페이스로 나타낸다.

- JoinPoint에서 제공하는 메소드

 getArgs

 메소드 아큐먼트를 반환(오브젝트배열)

 getThis

 프록시 객체를 반환

 getTarget

 대상 객체를 반환(오브젝트형태)

 getSignature

 어드바이즈되는 메서드의 설명을 반환(메소드명,리턴타입)

 toString

 어드바이즈되는 메서드의 설명을 출력


- 모든 어드바이스는 org.aspectj.lang.JoinPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언해야한다.

- Around 어드바이스는 JoinPoint의 하위 클래스인 ProceedingJoinPorint를 필수적으로 선언해야한다.



JoinPoint(인터페이스)before,after사용한다.

    ↑

proccedingJoinPoint(상속받은 인터페이스) around사용한다.


proccedingJoinPoint 인터페이스란?

- around 조인포인트에서 사용한다.

- 계속해서 진행하다를 뜻이다.

- 타겟객체 앞뒤에서 모두사용할떄 사용한다.

- procced메서드 : 요청을 가로채 실행하고 타겟을 실행시킨다.

(아규먼트가 있는 메서드와 없는메서드가있음)



PerformanceTraceAdvice.class



bean설정방법

AOP설정




Advice를 정의하는 태그

<aop:before>

- 메서드 실행 전에 적요오디는 어드바이스를 정의한다.

<aop:after-returning>

- 메서드가 정상적으로 실행된 후에 적요오디는 어드바이스를 정의한다.

<aop:after-throwing>

- 메서드가 예외를 발생시킬 때 적용되는 어드바이스를 정의한다.

<aop:after>

- 메서드가 정상적으로 실행되는지 또는 예외를 발생시키는지 여부에 상관없이 어드바이스를 정의한다.

try-catch-finally에서 finally블록과 비슷하다.

<aop:aroung>

- 메서드 호출 이전, 이후, 예외발생 등 모든 시점에 적용가능한 어드바이스를 정의한다.



PointCut표현식



예제

execution([접근제한제 패턴] 타입패턴 [타입패턴.]이름패턴 (타입패턴|"..",...)


execution(* hello(..))

- hello라는 이름을 가진 메서드를 선정하는 것이다.

파라미터는 모든종류를 다허용한다.

execution(* hello())

- 위와동일하나 파라미터가없는것이다.


execution(* myspring.user.service.UserServiceImpl.*(..))

- myspring.user.service.UserServiceImpl 클래스를 직접 지정하여 

이 클래스가 가진 모든 메서드를 선택한다.


execution(* myspring.user.service.*.*(..))

- myspring.user.service 패키지의 모든 클래스에 적용한다.

하지만 서브패키지의 클래스는 포함되지 않는다.


execution(* myspring.user.service..*.*(..))

- myspring.user.service 패키지의 모든 클래스에 적용된다.

그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함한다.


execution(* *..Target.*(..))

- 패키지에 상관없이 Target이라는 이름의 모든 클래스에 적용한다.

다른 패키지에 같은 이름의 클래스가 있어도 적용이 된다는 점에 유의해야한다.

'개발 소발 > 개발 Spring' 카테고리의 다른 글

MyBatis란?  (0) 2017.11.27
AOP어플리케이션 작성 (annotation)이란?  (0) 2017.11.27
AOP란?  (0) 2017.11.24
jdbc환경설정(mysql)이란?  (0) 2017.11.21
데이터엑세스개념(jdbc,springjdbc)이란?  (0) 2017.11.21

AOP란?


AOP의 개요와 용어

AOP의 특징 및 구현방식

Aspect와 SpringAOP설치


AOP의 개요와 용어

- 핵심기능(Core Concerns)

업무로직을 포함하는 기능이다.

- 부가기능(Cross-cutting Concerns)

로깅,보안등 부가기능이다.


객체지향의 기본 원칙을 적용하여도 핵심기능에서 부가기능을 분리해서 모듈화하는것은 어렵다.

하지만 AOP 개념을 적용하면 부가기능을 쉽게 분리할 수 있다.


AOP 개요

- 애플리케이션에서의 관심사의 분리(기능의분리)를 말한다.

- 즉, 핵심적인 기능에서 부가적인 기능을 분리하는 것.

- 분리한 부가기능을 애스펙트(Aspect)라는 독특한 모듈형태로 만들어서 설계하고 개발하는 방법이다.

- OOP를 적용하여 핵심기능에서 부가기능을 쉽게 분리된 모듈로 작성하기 어려운 문제점을 AOP가 해결해준다.

- 핵심기능과 부가기능을 분리하여 객체지향적인 가치를 지킬수 있도록 도와주는 개념이다.


Aspect란?

- 부가기능을 정의한 코드 어드바이스이다.(Advice와 어디바이스를 어디에 적용할지 정하는 포인트컷(PointCut)을 합친개념)

- Advice + PointCut = Aspect

- 핵심기능 코드 사이에 침투된 부가기능을 독립적인 애스펙트로 구분가능하다.

- 런타임시점에 필요한 부분에 동적으로 참여하게 가능이다.


AOP용어

- 타겟Target(핵심기능)

핵심기능을 담고 있는 모듈로, 타겟은 부가기능을 부여할 대상이 된다.

- 어드바이스(Advice)

어드바이스는 타겟에 제공할 부가기능을 담고 있는 모듈이다.

- 조인 포인트(Join Point)

어드바이스가 적용될 수 있는 위치를 말한다.

즉, 타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가된다.

- 포인트 컷(PointCut)

어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식이다.

포인트컷 표현식은 execution으로 시작하고, 메서드의 Signature를 비교하는 방법을 주로 이용한다.

- 애스펙트(aspect)

애스펙트는 AOP의 기본 모듈이다.

애스펙트 = 어드바이스 + 포인트컷

애스펙트는 싱글톤 형태의 객체로 존재한다.

- 어드바이저(Advisor)

어드바이저 = 어드바이스 + 포인트컷

어드바이저는 Spring AOP에서만 사용되는 특별한 용어이다.

- 위빙(Weaving)

위빙은 포인트컷에 의해서 결정된 카겟의 조인포인트에 부가기능(어드바이스)를 삽입하는과정이다.

위빙은 AOP가 핵심기능(타겟)의 코드에 영향을 주지않으면서 필요한 부가기능(어드바이스)을 추가할 수 

있도록 해주는 핵심적인 처리과정이다.


기존(핵심,부가기능이 같이잇음)

한 로직 안에 PrimaryConcern,(핵심기능),Cross_cutting(부가기능) 두가지 모두 같이 있다

ex)로그인체크(부가기능), 회원리스트가져오기(핵심기능)


AOP

Weaving(핵심기능에 적용하는과정)

Pointcout (advice를 적용할 대상을 선별하는식) --------------> PrimaryConcern(핵심기능)

↑(advice)<=부가기능지칭

Cross_cutting(부가기능)


위에 Pointcut+advice = Aspect


로그인체크와 회원리스트가져오기를 분리한다.

회원리스트가져오기(핵심기능)

로그인체크(부가기능)

두가지로 분리하게된다.


Spring AOP의 특징

- Spring은 프록시(Proxy)기반 AOP를 지원한다.

타겟객체에 대한 프록시를 만들어 제공한다.

타겟을 감싸는 프록시는 실행시간(runTime)에 생성된다.

프록시는 어드바이스를 타겟객체에 적용하면서 생성되는 객체이다.    

- 프록시(Proxy)가 호출을 가로챈다.

프록시는 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고

난 후에 타겟의 핵심기능 로직을 호출한다.(전처리 어드바이스)

또는 타겟의 핵심기능 로직 메서드를 호출한 후에 부가기능(어드바이스)를 수행하는 경우도 있다.(후처리어드바이스)


- 메서드 조인 포인트만 지원한다.

Spring은 동적 프록시를 기반으로 AOP를 구현하므로 메서드 조인 포인트만 지원한다.

즉, 핵심기능(타겟)의 메서드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있다.

반면에 AspectJ 같은 고급 AOP 프레임워크를 사용하면

객체의 생성, 필드값의 조회와 조작,static메서드 호출 및 초기화 등의 다양한 작업에 부가기능을 적용할 수 있다.


Spring AOP의 구현방식

XML의 기반의 POJO 클래스를 이용한 AOP구현

-부가기능을 제공하는 Advice클래스를 작성한다.

-XML 설정 파일에 Maop:config>를 이용해서 애스펙트를 설정한다.

(즉,어드바이스와 포인트컷을 설정함)

@Aspect 어노테이션을 이용한AOP 구현

-@Aspect어노테이션을 이용해서 부가기능을 제공하는 Aspect클래스를 작성한다.

Aspect클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다.

-XML설정파일에 (aop:aspectj-autoproxy />를 설정한다.



AspectJ와 SpringAOP 라이브러리 설치

Pom.xml에 추가



Spring프레임워크란?


스프링 프레임워크의 정의와 전략

스프링 프레임워크의 특징

스프링 페리임워크의 기능요소


스프링프레임워크란?

Java 엔터프라이즈 개발을 편하게 해주는 오픈소스이다.(경량급 애플리케이션 프레임워크)

엔터프라이즈 개발(뒷단을 제공 비지니스로직개발에 전념)보안,인증등을 제공한다.

스프링프레임워크의 전략

삼각형이다.(Portable Service Abstraction,Aop,Di)

Portable Service Abstract(서비스 추상화)

- 트랜잭션 추상화,Object Xml MAppting,데이터 액세스의 Exception을 제공한다.

- 개발자는 기술사용하는 인터페이스만 사용한다.


Di(의존관계주입)

객체지향 개발 충실하기위한 설계가 가능하도록 한다.

확장가능한 객체이다.(인터페이스만들고 구현클래스를 생성하게한다.)


AOP(관점지향프로그래밍)

기술 관련 코드를 분리에서 사용하게한다.


POJO

일반적인 자바 오브젝트이다.(HttpServlet는 웹컨테이너가잇어야해서 아님)

특정환경이나 규약에 종속되지않고 JRE만잇으면 사용가능한다.


스프링 프레임워크의 특징

컨테이너 역할

자바객체의 라이프사이클을 관리 ,스프링 컨테이너로부터 필요한 객체를 가져와사용한다.

DI지원

Spring 설정파일(XML) 이나 어노테이션 @ex 통해서 객체간의 의존관게를 설정한다.

AOP지원(관점지향)

핵심모듈(업무로직)에서 공통적인 로직(로그)을 분리에서 적용한다.

POJO지원

어떠한 규약에 종속되지않는 자바객체개발가능하다.

트랜잭션 처리를 위한 일관된 방법을 지원

DB(COMMIT,ROLLBACK)등을 코드가 아닌 설정(XML,@어노테이션)으로 설정해서 모두 동일한 코드사용가능하다.

영속성 관 관련된 다양한 API 지원

Mybatis,Hibernate 등 DB처리위한 ORM프레임워크들과 연동지원한다.



스프링 프레임워크의 기능요소

7가지

 Spring Core

 스프링프레임워크에 기본기능제공(bean) *컨테이너기능

BeanFactory 지원

 Spring Aop

 업무로직과 공통로직을 분리

 Aspect 지향프로그래밍

 Spring Orm

 db 프레임워크와 연동가능하게함 

 Spring DAO

 jdbc코딩과 예외처리 간편화시킴 AoP 트랜잭션 관리 서비스 제공

 Spring Web

 웹애플리케이션 개발에 필요한 기본기능 제공

 다른 웹프레임워크와 연동

 Spring Context

 core부분을 확장

 국제화,이벤트,유효성검증등

 Spring WebMvc

 애플리케이션 로직과 웹애플리케이션을 분리에서 개발하게함


'개발 소발 > 개발 Spring' 카테고리의 다른 글

Bean등록 및 메타정보구성이란?  (0) 2017.11.21
bean,properties설정이란?  (0) 2017.11.20
Junit,Spring-Test란?(의존성예제)  (0) 2017.11.20
IoC,DI란?  (0) 2017.11.20
STS,maven이란?  (0) 2017.11.20

+ Recent posts