728x90
반응형
■ AOP
□ 이론
### POJO란?
POJO : Plain Old Java Object
==> Simple java, 어떤 규약에 종속되지 않는 객체 개념을 이용하여 로직을 구현해보자
### Application을 POJO로 개발할 수 있도록 하는 3대 기술
DI(IOC) : Dependecy Injection(의존성주입) (Inversion Of Control : 제어의 역전)
AOP : Aspect Oriented Programming(관점지향 프로그래밍)
PSA : Portable Service Abstractions(포터블 서비스 추상화)
예) spring MVC(웹) : 스프링 별명이 "스플링 서블릿"이지만 서블릿코드 안 만들어짐
즉, annotation으로 처리하지만 내부적으로 서블릿이 돌아감
<AOP 개요>
- Aspect Oriented Programming (관점지향 프로그래밍)
* 기존의 객체지향에 따른 모듈화로 중복된 코드 및 공통된 처리에 관련한 것들을 aspect(관점)으로 뽑아내어 공통으로 처리하는 방식
즉, 기존의 주요(핵심, core, concern) 기능과
공통(부가, 횡단관심, cross cutting concern) 기능의
혼합형태를 배제하는 방식으로 이것을 구분하여 공통기능의 재사용 기능을 높임
(참고) AOP의 별명
cross cutting : "횡단"의 "공통" 부분을 잘라냈다는 의믜
input.jsp process.jsp output.jsp
---------- ---------- ----------
db 드라이버 로딩 db 드라이버로딩 db 드라이버로딩 <횡단관심> (aspect)
---------- ---------- ----------
입력 주요작업 처리 주요작업 출력 주요작업 ==> 핵심, 주요로직 (target)
---------- ---------- ----------
보안처리 보안처리 보안처리 <횡단관심> (aspect)
### <AOP - 용어>
- Weaving : 핵심기능과 공통기능(Aspect)를 묶어주는 것
- Advice : "언제" 공통기능을 적용할지를 정의(what)
* Before : 메소드 호출 전에 공통기능 실행
* After : 메소드 실행 후 무조건 공통기능 실행
* After Returning : 메소드가 exception 없이 실행된 후에 공통기능 실행
* After Throwing : exception 발생한 경우 공통기능 실행
* Around : 메소드 실행 전, 후 exception 발생시점에 공통기능 실행
- Joinpoint : 어디에서 호출할지를 결정하는 것 (필드에서 호출이냐? 메소드에서 호출이냐?)
(Advice 적용가능한 지점, 스프링은 메소드 호출만 지원) (where)
- Pointcut : 실제로 Advice가 적용되는 Joinpoint (메소드 중에서 어떤 메소드 호출시 적용?)
( 그 where가 어떤 메소드야?)
### 추가할 jar 파일
-- (예) SecurityBean에러시 jar 파일이 없는 경우
-- non maven은 직접 추가
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 추가해야
- weaving : 공통과 핵심을 연결실행하는 과정으로 실행점에 따라 compile time, run time, load time
로그인 + 초기메소드()
AspectJ는 자바 AOP의 표준을 말하며 PARC에서 개발
(1) aspect + 소스코드 후 weaving하는 Compile Time Weaving(CTW)
(2) class 파일이 JVM에 로드시까지 기다렸다 weaving하는 Load Time Weaving(LTW)
(3) spring AOP에서 사용하는 방식(RTW : runtime Weaving)
-- proxy를 생성해서
### <maven에서 aspectj 사용해보기>
- pom.xml에 aspectjrt와 aspectjweaver 추가가 필요하다
* aspectjrt : aspectj 사용을 위해 aspectj runtime 라이브러리가 필요
* aspectweaver : aspect의 정보를 바탕으로 aspect를 구성한 코드를 생성하는데 필요한 유틸리티 프로그램
############################### non maven(library) 방식 추가시 ###############################
<Aspectj의 Pointcut Expression(표현식) 3가지>
-- execution, within, bean
### execution ==> 이것이 Base 방식
형식 executtion(public등-생략가능) return type [클래스명|메소드명] (parameter)
.xml에서 before, after 등의 advice가 적용되는 target 메소드가 뭐야?
<aop:pointcut expression = "execution(Double helloProcess.HelloProcess.cheori())"
--> return type Double인 HelloProcess의 cheori() 메소드에 before, after 등등이 적용됨
<aop:pointcut expression="execution(Public void cheo*(..))"
return type이 void, cheo로 시작하는 메소드,
parameter는 0개 이상
즉, 메소드 중에서 cheoriilkkeul() cheorinya() cheori(aa) 등에 before, after 등등이 적용됨
만일..이 없다면 괄호안에 인자가 없어야 함
<aop:pointcut expression="execution(*hello.hello1.*.*())"
--> hello.hello1 패키지의 모든 메소드들, parameter는 없다
즉, hello1~~~.aa() hello1~~!.bb() (o) hello1~~~.cc(yy) (x) 등에 before, after 등등이 적용됨.
### within : 어떤 형식(클래스, 인터페이스...) 아래의 모든 target 메소드가 PointCut이 된다.
<aop:pointcut expression = "within(helloProcess.HelloProcess)"
--> HelloProcess 클래스 아래의 모든 메소드들
■ AOP 실습
□ aopxml1.xml
<?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.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!--
나는 aopxml1.xml
공통(aspect), 핵심(주요)(target) 로직에 대한 처리 방식을 알려준다.
-->
<!-- Security는 공통기능(aspect) -->
<bean name="securityBean" class="helloProcess.Security"/>
<bean name="helloProcessBean" class="helloProcess.HelloProcess"/>
<!-- 2개의 클래스에 대한 bean 객체를 각각 위처럼 만든다. -->
<!--
aop 태그를 적는 방법
<beans>
<bean></bean>
<bean></bean>
<aop:config>
</aop:config>
</beans>
-->
<!-- HelloProcess 핵심기능(target) -->
<!-- aop 구성 시작 - 이건 xml이다(no annotation) -->
<aop:config>
<aop:aspect id="securityAspect" ref="securityBean">
<aop:pointcut expression="within(helloProcess.HelloProcess)" id="secuPoint"/>
<aop:before pointcut-ref="secuPoint" method="goSecurity"/>
</aop:aspect>
</aop:config>
<!--
즉, helloProcess.HelloProcess에 있는 모든 메소드(kajaDrive(), kajaTravel()가 실행되려고 하면
그 전에 goSecurity라는 메소드가 먼저 수행되고 나서 수행된다.
-->
</beans>
ㅁ helloProcess
* Security.java
package helloProcess;
public class Security {
public void goSecurity() { // aspect 처리를 위한 메소드
// 나는 공통로직 (aspect)
System.out.println("공통 : 여기는 보안 처리중");
}
}
// com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 추가해야
// 안 하면 에러 남
* HelloProcess.java
package helloProcess;
public class HelloProcess {
public void kajaDrive() {
// 나는 주요(핵심)(target) 로직 메소드
System.out.println("멋지게 드라이브 하자");
}
public void kajaTravel() {
// 나는 주요(핵심)(target) 로직 메소드
System.out.println("즐겁게 여행가자");
}
}
□ hello
* Hello.java
package hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import helloProcess.HelloProcess;
public class Hello {
public static void main(String[] args) {
System.out.println("<<<<<안녕>>>>>");
ApplicationContext ac1 = new GenericXmlApplicationContext("aopxml1.xml");
// HelloProcess hp1 = (HelloProcess) ac1.getBean("helloProcessBean");
HelloProcess hp1 = ac1.getBean("helloProcessBean", HelloProcess.class);
hp1.kajaDrive();
hp1.kajaDrive();
hp1.kajaDrive();
hp1.kajaTravel();
hp1.kajaTravel(); // HelloProcess 클래스 하위의 모든 메소드가 보안적용됨
((AbstractApplicationContext) ac1).close();
}
}
728x90
반응형
'IT&코딩 > 국비지원' 카테고리의 다른 글
리눅스 - 1 (centos, 설치) (0) | 2023.08.16 |
---|---|
JDBC (0) | 2023.08.09 |
형상관리 (0) | 2023.07.10 |
스프링 - 1 (0) | 2023.06.20 |
Servlet - 5 (파일업로드) (0) | 2023.06.13 |