AOP - XML 예제 프로젝트

이지윤·2022년 5월 6일
0

XML을 이용한 AOP

aop-xml 예제 프로젝트 구성

aop-xml 예제 프로젝트 만들기

aop-xml 예제 프로젝트 환경

<pom.xml>

aop-xml 예제 프로젝트의 AOP 어플리케이션 구성

  • DI, AOP를 이용한 인터페이스 기반의 컴포넌트화를 완성
  • AOP를 통해 횡단 관심사와 이에 영향 받는 객체 간 결합도를 낮춘다.

aop-xml 예제 프로젝트

  • 이전 xml예제 프로젝트에 있는 StudentVO.java, MemberDAO.java, MemberDAOImpl.java, MemberService.java, MemberService.java, MemberServiceImpl.java, MemberSampleMain.java 모두 동일하다

aspect 정의 클래스

  • MemberAspect.java
  • 각 메소드가 advice
  • JoinPoint
    • 메서드 명과 인수 값 접근 가능
  • afterReturning
    - 메서드 수행 후 반환한 값 접근 가능
  • around
    • 반환 값 반드시 리턴
    • before와 after 처리 가능
    • proceed 함수를 통해 메서드 수행을 반드시 처리
  • Throwing
    - AOP 대상이 되는 메서드에서 예외가 발생할 경우만 동작

    applicationContext.xml 설정

Advice 코드 실행 흐름 (before Advice)

Pointcut 기술 방법 : execution() 표현식

  • 대표적인 포인트컷 지시자
  • ex) <aop:pointcut id = "readMethod" expression = "execution(* read(String))"/>
  • 메서드의 수식자, throws 생략 가능
  • 메서드의 반환값, 패키지와 클래스 명은 와일드 카드 '*' 를 이용
  • 패키지, 클래스 명은 생략 가능
  • 해당 패키지 및 하위 패키지를 포함하여 일치시키려면 '..' 를 이용

Pointcut 기술 방법 : execution() 표현식 예

  • execution(* org.tukorea.di.persistence.MemberDAOImpl.write(..))
    - 리턴 타입과 파라미터 상관없이, 클래스는 org.tukorea.di.persistence.MemberDAOImpl, 메소드명이 write인 메소드를 선정하는 포인트컷 표현식
  • execution(* write(int, int))
    - 리턴 타입 상관없이, 모든 패키지, 클래스 내, 메소드 이름이 write이며, 두개의 int 타입의 파라미터를 가진 모든 메소드를 선정하는 포인트컷 표현식
  • execution(* *(..))
    - 리턴 타입과 파라미터의 종류, 개수에 상관없이 모든 패키지, 클래스 내의 모든 메소드를 선정하는 포인트컷 표현식

Pointcut 기술 방법 : within() 표현식

  • 특정 타입에 속하는 메소드를 포인트 컷으로 설정할 때 사용
  • execution()의 여러 조건 중에서 타입 패턴 만을 적용하기 때문에 execution 표현식 문법 보다는 간단
  • within(org.tukorea.aop..*)
    - org.tukorea.aop 및 모든 서브패키지가 포함하고 있는 모든 메소드
  • within(org.tukorea.aop.*)
    - org.tukorea.aop 패키지 밑의 인터페이스와 클래스에 있는 모든 메소드
  • within(org.tukorea.aop.xml)
    - org.tukorea.aop 패키지의 xml 클래스의 모든 메소드

Pointcut 기술방법 : 와일드 카드

  • *
    • 기본적으로 임의의 문자열 의미
    • 패키지를 표현할 때는 패키지 1개 계층 의미
    • 메소드의 매개변수를 표현할 때 임의의 인수 1개 의미
  • ..
    • 패키지를 표현할 때 패키지 0개 이상 계층 의미
    • 매서드의 매개변수를 표현할 때 임의의 인수 0개 이상을 의미
  • +
    • 클랫스 명 뒤에 붙여 씀
    • 해당 클래스와 해당 클래스의 서브 클래스 or 구현 클래스 모두 의미
profile
초보자

0개의 댓글