AOP란(Aspect Oriented Programming ) ? : 관심지향 프로그래밍
1. 공통된 관심사항 <> 핵관심사항 을 분리 후,
2. 각각의 클래스로 작성한후 적절한 시점에 핵심 로직이 실행될 때 ,
공통기능이 같이 실행되도록 처리
공통된 관심사항(cross-cutting concern) : 부가기능, 로그, 성능측정, 트랜잭션, 보안, 등
핵심 관심사항(core concern) : 비니스로직, 게시글등록, 게시글 목록, 등
AOP를 정의 하기위해 필요한 것 1. 대상 : 공통기능을 적용할 핵심 로직을 담고 있는 메서드 (ex. board패키지의 모든 것) 2. Advice : 공통기능을 구현한 클래스 (ex. TimeCheckAopObj.java의 클래스) 3. 포인트컷 : aop를 실행하기위해서 타겟이 어떤 것인지 정의하기 위한 표현식
@Before : 메서드 호출전에, 공통모듈을 실행하겠다
@After : 메서드 종료되고, 공통모듈을 실행하겠다
@Around : 메서드 실행 전후에, 모두 공통모듈을 실행하겠다 (ProceedingJoinPoint)
execution(정규표현식) 으로 실행
execution( [접근제어자], 리턴타입 패키지명. 클래스명. 메서드명. (매개변수) ) 이순로 만들수 있다.
ㄴ [ ] 생략가능
공통 | |
* | 어떤 문자열이든 ok |
. . | 없음 or 1 or 모든것 |
리턴타입 | 패키지 | |||
* | 모든리턴타입 | com.multi.ggo | 패키지라는 것을 정확하게 명시 | |
void | void메서드 | com.multi.ggo.. | com.multi.ggo로 시작하든 모든 패키지 | |
int | int를 리턴하는 메서드 | com.multi.ggo.*.get* | com.multi.ggo 패키지의 모든 클래스 get 시작하는 모든메서드에 적용 |
|
!void | void가 아닌 메서 | com.multi.ggo.*.*.get* | com.multi.ggo로 시작하는 모든 패키지의 모든 클래스 get 시작하는 모든메서드에 적용 |
메서드 | 매개변수 | |||
* ( .. ) | 모든메서드 | ( .. ) | 모든 매개변수 | |
get*( .. ) | get으로 시작하는 모든메서드 | ( * ) | 매개변수1개짜리 메서드 | |
( Integer, .. ) | 1개 이상의 매개변수를 갖는 메서드 단, 첫번째 타입은 Integer |
|||
( Integer, * ) | 2개의 매개변수를 갖는 메서드 단, 첫번째타입은 Integer |
핵심로직은 원래대로 사용하고,
어느시점에 어떤로직에 실행할지를 정하는게 포인트컷 + execution(정규표현식 )
Q. 메서드별 실행시간이 어떻게 되는지 초단위로 측정 하라고한다면 ??
ㄴ 전체메서드 가 한두군데도 아니고, 하게된다면 이런식으로 개노가다가 필요할것이다;
갑자기 , 측정단위또한 바뀐다면 다시 노가다...
예를들어 이 메서드별시간을 한번만 써서 관리를 하는것이 aop이다. (공통관심사항)
방법은 3가지
프록시 패턴사용
1. 라이브러리추가 (pom.xml)
<!-- AOP관련 라이브러리 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
spring config에 namespace 가 확인이 되지않는다면, 수동으로 source 에추가
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
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-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
2. 공통된 관심사항을 분리할 클래스만들기
공통으로 이거는 꼭실행할거다 ( 로그기록, 메서드실행시간 등등 분)
메서드 실행시간 체크
로그기록
'스프링MVC' 카테고리의 다른 글
스프링MVC 초기설정 - BootStrap 테마연결(3) (0) | 2023.01.28 |
---|---|
스프링MVC 초기설정 (1) (0) | 2023.01.28 |
트랜잭션 ( Transaction)처리 (0) | 2023.01.24 |
인터셉터(interceptor) (0) | 2023.01.24 |
스프링 백업한 프로젝트 import하기 ( ! 느낌표해결 ) (0) | 2023.01.24 |