티스토리 뷰
AOP란?
1.공통적으로 실행되는 것을 따로 빼서 사용하는 것
예) 은행관련 로직을 수행할 때 항상 본인 인증을 요구하는데 본인 인증 로직을 따로 구현하고 이체나 현금서비스등 돈과 관련된 로직을 수행하려고 하면 그 전에 본인 인증을 요구하게 만드는 것(interceptor나 filter와 유사)
2.관점 지향 프로그래밍을 말한다.
관점 지향 프로그래밍이란??
객체가 가지고 있는 기능을 분리하는 것.
예를 들자면 dao가 DB에 접근해 데이터를 가져오는데 가지러 갈 때 DB에 대한 커넥션 정보를 그때 넣어주고 다 쓴 객체는 닫아주는 로직을 한번에 구성할 수 있지만 dao와 service를 나눈다. 그리고 service에서 커넥션에 대한 정보를 넣어서 dao를 호출을 한다. 데이터를 리턴받은 service는 그때 다 쓴 객체를 닫아준다.
즉, dao는 그저 정보를 가져오는 것에만 관심을 갖도록 기능을 분리하는 것이다.
*interceptor와 차이점
필터나 인터셉터는 서블릿에 들어오기전이나 서블릿으로 들어오고 매핑된 메소드로 가기 직전에 처리를 하는 반면에 AOP는 서블릿안에 들어와 controller든, service든, dao든 가리지않고 내가 원하는 위치(메소드,객체)에서 전/후/전후 처리를 해줄 수 있다. AOP가 좀더 사용범위가 크다고 볼 수 있다.
AOP의 구성요소 5가지
1.Aspect(관점) : 구현하고자 하는 횡단 관심사의 기능, 한개 이상의 Pointcut(발생되는 메소드)과 Advice(발생시기)의 조합
2.JoinPoint(끼어들 지점) : 메소드가 호출되는 부분 (리턴되거나 인스턴스가 만들어지거나 예외가 던져지거나 클래스 초기화)
3.Pointcut : 어느 메소드, 어느 클래스 패턴방식을 이용하여 설정(AspectJ 모듈이 지원하는 패턴)
4.advice : 각 조인포인트에 삽입되어져 동작할 수 있는 코드
-Before Advice : 메소드 실행 전
-Around Advice : 메소드 실행 전, 후
-AfterReturning Advice : 메소드 리턴 시, *리턴된 오브젝트에 접근가능!
-After : 메소드 실행 후
-After Throwing : 예외 발생 시 실행
5.weaving : 끼어드는 처리 하는 것
AOP적용 방법 2가지
1.선언적 표현(xml에 설정)
2.어노테이션 방식
필자가 수업때 위 2가지 방식을 해보았지만 역시 어노테이션이 편리한 것 같아 본 포스팅은 어노테이션만 다룹니다..
적용 순서
1. aop-config
2. aop:aspect : 적용 객체 등록
3. aop:pointcut : 적용 시킬 메소드, 객체
4. aop:advice : aop로 실행될 메소드, 적용할 포인트컷 등록
자 이제 시작해보자
1.aspectj weaver 라이브러리 등록하기
1 2 3 4 5 6 7 | <!-- AOP설정 하기위한 라이브러리 --> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${org.aspectj-version}</version> </dependency> | cs |
2.aspect-config.xml 등록하기
appServlet에다 bean file을 생성
맨 위에 2개 선택하고 Finish
3.autoproxy등록하기
1 2 3 4 5 6 7 8 9 | <?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-4.3.xsd"> <aop:aspectj-autoproxy/> </beans> | cs |
선언적 방식을 할 땐 여기다 이것저것 설정을 많이 해줘야하지만 어노테이션은 1줄로 끝~
4.web.xml에 등록하기
web.xml에 등록할 때 위치에 유의해야한다. 시큐리티 컨피그 파일은 프로젝트 전체에 적용하기 위해 context-param에 했지만 aop는 어플리케이션 단위로 해야하기 때문에 아래 빨간 네모에 추가해줘야한다. (aop-config부분)
5.bean객체 등록과 aop로 지정하기
일반 클래스로 생성하고 클래스위에 @Component 라 쓰고 임포트를 하면 빈 객체로 등록이 되면서 스프링이 관리하게 된다. 스프링이 관리하는 빈 객체이므로 왼쪽에 해당 객체에 S가 생긴것을 볼 수 있다. 그리고 이 빈 객체가 AOP임을 알리기 위해 Aspect로 추가로 설정(aop:aspect 부분)
6.Pointcut과 Advice등록 하기
제일먼저 Pointcut으로 어느 메소드에서 실행 할지 선언을 해주고 매개변수로 경로를 지정해준다. (패턴형식으로 지정) 위와 같은 형식으로 지정하면 member 아래의 모든 메소드가 실행될 때 가져오겠다는 의미다. 그리고 변수?같은 느낌으로다가 아래 메소드를 만들어준다.
그 아래 Before은 일전에 말했던 Advice부분인데 포인트컷 부분에서 메소드 실행 전에 하겠다는 의미이고 매개변수로 위에서 사용한 메소드를 넣음으로써 패키지 member 아래의 메소드 전부 사용될 때마다 before의 내용을 먼저 실행 시키겠다는 의미
그래서 패키지 member안에 있는 login의 로직을 수행하면 위와같이 3번 출력된다. 왜 3번이 찍히냐면 member.controller, member.service, member.dao를 거쳤기 때문이다. controller만 거쳐갈 때 찍히도록 다시 바꿔보자.
7.AOP에서 Parameter 가로채기
중간에서 가로채서 뭔가 하려면 넘어가고 있는 파라미터를 건들여야 하기에 그 방법을 해본 것 이다.
before 는 JoinPoint로 받고
Around는 ProceedingJoinPoint로 받으면된다.
joinPoint는 object로만 받을 수 있고 여러 개 일 경우 배열로 받으면된다. 현재 로그인 하기위해 id와 pw를 받고 컨트롤러에서 vo객체에 넣고 서비스로 넘기던중 Pointcut의 패턴에 의해 가로챈 상황이다. 2번째 로그엔 사용자가 입력한 id와 pw가 있고 35번째 줄에서 id값을 바꿨다. 그러니까 sql 구문에 'admin 장난 쳐야지~'가 들어가서 return값이 비워져 있는 상태다. 이런식으로 파라미터값을 수정하여 사용할 수 있다.
8.AOP에서 Request 가로채기
파라미터뿐만 아니라 request값도 가져올 수 있다. 위 처럼 조작이 가능하고 아니면 Session같은 request 내장 객체는 똑같이 다 사용이 가능하다.
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
'Back-end > Spring' 카테고리의 다른 글
Spring 파일업로드 하기 (0) | 2019.02.23 |
---|---|
Spring MVC2 패턴으로 페이징 구성하기 (0) | 2019.02.23 |
Spring Interceptor (중간에 가로채기) (0) | 2019.02.19 |
Spring log4j 이용하여 기록남기기 (4) | 2019.02.19 |
Spring Session으로 로그인관리, ModelAndView사용하기 (0) | 2019.02.18 |