[자바와 객체 지향 그리고 스프링] 07. AOP: 관점지향 프로그램(3)

코린이서현이·2024년 1월 28일
0

😴들어가면서😴

기존의 어노테이션 기반 ADP를 POJO와 XML기반 AOP로 변경하자. 

📌 POJO와 XML기반으로 코드를 변경

POJO란 : plain Old Java Object
자바로 만들어진 순수한 객체를 말한다.

MyAspect 변경

  • 스프링 프레임 워크에 의존하지 않는 순수한 자바가 된다.
package aop003;

import org.aspectj.lang.JoinPoint;

public class MyAspect {
  public void before(JoinPoint joinPoint){
    System.out.println("얼굴 인식 확인: 문 개방");
  }
}

xml 파일 변경

    <aop:aspectj-autoproxy/>

    <bean id="myAspect" class="aop003.MyAspect"/>
    <bean id="boy" class="aop003.Boy"/>
    <bean id="girl" class="aop003.Girl"/>

    <aop:config>
        <aop:aspect ref="myAspect">
            <aop:before method="before" pointcut="execution(* runSomething())"/>
        </aop:aspect>
    </aop:config>

</beans>

실행화면

얼굴 인식 확인: 문 개방
컴퓨터로 게임을 한다.
얼굴 인식 확인: 문 개방
요리한다.

🤔 POJO와 XML기반으로 코드 vs 어노테이션

어노테이션 기반

장점

  • 코드가 간단해지고 가독성이 올라간다.
  • 어노테이션을 사용하면 컴파일 타임에 문제를 발견할 수 있다.

단점

  • 설정이 소스 코드에 섞인다. 따라서 설정 변경시 코드 수정을 해야한다.
  • 어노테이션만으로는 표현하기 어려운 고급 설정이 필요한 경우가 있을 수 있습니다.

XML 기반

장점

  • AOP 설정을 코드와 분리할 수 있습니다.
    설정 변경 시에 코드 수정 없이 설정을 수정할 수 있다는 장점을 가져옵니다.
  • XML을 사용하면 더 많은 설정 옵션과 유연성을 제공받을 수 있습니다.

단점

  • XML 설정 파일이 복잡해질수록 가독성이 떨어질 수 있습니다.
  • XML 기반 설정은 런타임에만 문제를 발견할 수 있습니다.

일반적으로는 간단한 경우에는 어노테이션 기반으로, 복잡한 설정이 필요한 경우에는 XML 기반으로 설정하는 것이 일반적이다.


📌 추가 코드 완성

After Advice - xml 기반으로

MyAspect 수정

package aop004;

import org.aspectj.lang.JoinPoint;

public class MyAspect {
  public void before(JoinPoint joinPoint){
    System.out.println("얼굴 인식 확인: 문 개방");
  }

  public void after(JoinPoint joinPoint) {
    System.out.println("외출: 문 잠금");
  }
}

xml 파일 수정

    <aop:config>
        <aop:aspect ref="myAspect">
            <aop:before method="before" pointcut="execution(* runSomething())"/>
            <aop:after method="after" pointcut="execution(* runSomething())"/>

        </aop:aspect>
    </aop:config>

실행 코드

얼굴 인식 확인: 문 개방
컴퓨터로 게임을 한다.
외출: 문 잠금
얼굴 인식 확인: 문 개방
요리한다.
외출: 문 잠금

한번더 리팩토링하기 - 중복없애기

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd" >
    <aop:aspectj-autoproxy/>

    <bean id="myAspect" class="aop004.MyAspect"/>
    <bean id="boy" class="aop004.Boy"/>
    <bean id="girl" class="aop004.Girl"/>

    <aop:config>
        <aop:pointcut id="iampc" expression="execution(* runSomething())"/>
        <aop:aspect ref="myAspect">
            <aop:before method="before" pointcut-ref="iampc"/>
            <aop:after method="after" pointcut-ref="iampc"/>

        </aop:aspect>
    </aop:config>

</beans>
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글