ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 12장 AOP
    스프링 프레임워크 기초 공부 2020. 4. 30. 22:55

    Aspect oriented programming관점 지향 프로그래밍

    1.하나의 프로그램을 관점 이라는 논리적인 단위로 분리하여 관리하는 개념

    2.로깅,트랜잭션,보안,캐싱등 다양한 곳에서 다용된다

    3.여기에서는 메서드 호출을 관심사로 설정하여 aop에 관한 실습을 진행할것이다.

    4.관점을 통해 spring framework가 어떤 메서드가 호출되는지 관심있게 지켜보다가 특정 메서드가 호출되면 자동으로 

    메서드 전과 후에 다른 메서드가 호출 될 수 있도록 한다.

     

     

    자바에서 메서드를 호출하면 호출된 메서드가 동작한다        이때 개발자가 호출된 메서드 전과 후에 메서드를 작동시키고싶을때  자바에서는 호출메서드 전에 수행할 메서드와 호출메서드 수행후의 메서드 총 3개의 메서드를 작성하고 호출하여야합니다, 하지만 aop개념에서는 수행할 메서드만 호출하면 spring framework에서 그 호출을 가로채서 호출된 메서드 동작 전,후에 알아서 호출후 동작시켜준다

     

     

     

    관점 지향 프로그램

    프로그램을 개발할때 관점(관심사)를 설정한다, 해당 관점(관심사)가 수행되는지 지켜보다가 해당 관점이 수행되면 구현되어져있는 다른 작업을 먼저 수행하고 관점을 동작시킨다 반대로 관점을 먼저 수행후 다른 작업을 수행하기도함

     

    spring aop 용어

     

    Joint Point (메서드 호출) (관심사 설정부분)

    모듈이 삽입되어 동작하게 되는 특정 위치(메소드 호출등)

     

    Point Cut(전,후)

    다양한 Joint Point 중에 어떤 것을 사용할지 선택

     

    Advice(호출된 메서드 전,후 실행될 모듈)

    Joint Point 에 삽입되어 동작할 수 있는 코드

       - before:메서드 호출 전에 동작하는 advice

       - after-returning:예외 없이 호출된 메서드의 동작이 완료되면 동작하는 advice

       - ather-throwing:호출된 메서드 동작 중 예외가 발생했을 때 동작하는 advice

       - after:예외 발생 여부에 관계없이 호출된 메서드의 동작이 완료되면 동작하는 advice

       - around:메서드 호출 전과 후에 동작하는 advice

     

    Weaving(모듈 삽입,호출된 메서드 ,모듈 삽입 세 부분을 하나의 동작으로 만듬 )

    Advice를 핵심 로직 코드에 적용하는 것

     

    Aspect

    Point Cut+Advice

     

    aop를 사용하기 위해선 라이브러리를 추가해야한다

    https://mvnrepository.com/

     

    Maven Repository: Search/Browse/Explore

    flexmark-java core and all extension modules and converters Last Release on Apr 29, 2020

    mvnrepository.com

     

                     <dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjweaver</artifactId>
    			<version>${org.aspectj-version}</version>
    		</dependency>

    pom.xml에 추가

     

    package kr.co.softcampus.beans;
    
    public class TestBean {
    	public void method1() {
    		System.out.println("method1 호출");
    	}
    }
    

     

    package kr.co.softcampus.advisor;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    public class AdvisorClass {
    	public void beforeMethod() {
    		System.out.println("beforeMethod 호출");
    	}
    
    	public void afterMethod() {
    		System.out.println("afterMethod 호출");
    	}
    
    	public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
    		System.out.println("arroundMethod 호출1");
    
    		Object obj = pjp.proceed();
    
    		System.out.println("arroundMethod 호출2");
    		return obj;
    	}
    
    }
    

     

    <?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:context="http://www.springframework.org/schema/context"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans
    						http://www.springframework.org/schema/beans/spring-beans.xsd
    						http://www.springframework.org/schema/context
    						http://www.springframework.org/schema/context/spring-context.xsd
    						http://www.springframework.org/schema/aop
    						http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    	<bean id='xml1' class='kr.co.softcampus.beans.TestBean'/>
    	<bean id='advisor1' class='kr.co.softcampus.advisor.AdvisorClass'/>
    	
    	<!-- 관심사 설정 -->
    	<aop:config>
    		<aop:aspect ref='advisor1'>
    			<aop:pointcut id="point1" expression="execution(* method1())"/><!-- 모든 패키지의 모든 클래스의 method1을 호출하는 행위를 관심사로 설정한다 -->
    			<aop:before method="beforeMethod" pointcut-ref="point1"/>
    			<aop:after method="afterMethod" pointcut-ref="point1"/>
    			<aop:around method="aroundMethod" pointcut-ref="point1"/>
    		</aop:aspect>
    	
    	</aop:config>
    </beans>
    

     

    package kr.co.softcampus.main;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import kr.co.softcampus.beans.TestBean;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
    		
    		TestBean bean1 = ctx.getBean("xml1",TestBean.class);
    		bean1.method1();
    		
    		ctx.close();
    	}
    
    }
    

     

    출력값

    beforeMethod 호출
    arroundMethod 호출1
    method1 호출
    arroundMethod 호출2
    afterMethod 호출

    '스프링 프레임워크 기초 공부' 카테고리의 다른 글

    spring jdbc  (0) 2020.05.16
    xml namespace  (0) 2020.05.01
    11장 어노테이션을 이용한 빈 설정  (0) 2020.04.30
    10장 자바코드를 활용한 bean 만들기  (0) 2020.04.29
    9장 DI 자동주입  (0) 2020.04.27
Designed by Tistory.