학원/SPRING

12/28 71-2 [SPRING] AOP(수정 )

도원결의 2022. 12. 28. 19:34

 

 

AOP(Aspect Oriented Programming)

 

AOP ?? 이건 또 뭐냐아

관.점.지.향 프로그래밍 이라고 한단다...
jsp에서 필터로 로그인여부 걸러낼 때 사용 했던것과 비슷한 개념임

근데 필터랑은 또 다름

우선 퍼온 사진을 먼저 보면 이해가 빠름

스프링컨택스트 == 스프링영역

이미지는 구글로 찾아와서 양아치처럼 썼어요ㅠㅠ 주말에 제가 다시그려서 바꿀게요.. 감사합니다 ...

 


디스패처서블릿 이랑 컨트롤러사이에
저렇게 핸들러인터셉트가 있음
핸들러인터셉트? 스프링컨테이너에 포함된 아이로
스프링영역 안에 등록되어 있는 빈 들(@configuration+@bean)에 접근이 가능
(필터는 컨테이너 영역 밖에 있기 때문에 그 안에 있는 빈 들에 접근이 불가능)

AOP는 그 핸들러인터셉트가랑 컨트롤러 사이에 있어서
컨트롤러로 가는 요청들을 메소드단위로 사전작업을 함!

AOP의 철학 => 클래스에는 핵심 로직(core concern)만 작성 하고 나머지 공.통.로.직.은AOP로 빼자 !

그리고 필요한  Target클래스에 주입해주면 됨
주입의 대상이 되는 클래스를 Target클래스라고 함 !

장점 : AOP의 장점은 코드가 간결함, 유지보수가 쉬움

<알아야 할 aop관련 용어>  

                 => 우선 간단하게만 알아 둬..
Join Point : 메서드의 실행 시점.혹은 필드값 변경 등 , 
  어느 위치를 기준으로 공통 모듈을 삽입하느냐.  "삽입 지점"
Point Cut : 하나의 시작 점 혹은 여러 시작점이 모여 Point Cut이 된다.
  즉 하나의 Joint Point나 여러 개의 Joint Point를 묶어서 Point Cut이라 함  ==>  걍 쉽게 말하면 공통코드! 공통로직!
Advice : 실.제. 코.딩.의. 단.위.로 Point Cut이 모여서 Advice가 된다.
 즉 중복되는 공통 관심사항을 따로 코드로 만들어 놓은 것.    ==>  공통 코드를 모아둔 곳
Weaving : Advice를 핵심 로직코드에 적용하는 것을 
 위빙이라고 함 즉 공통 코드를 핵심로직코드에 삽.입.하.는.것.
Aspect : 여러 객체에 공통으로 적용되는 공.통.관.심.사항 
트랜잭션이나 보안,로깅등이 Aspect의 좋은 예


개념설명은 대충 요렇고

가쟈 실전으로

 

Aop.jsp

<fieldset class=" form-group border p-3">
    <legend class="w-auto px-3">관점지향 프로그래밍</legend>
    <p>${total}</p>
    <a href="<c:url value="/AOP/Aop.do"/>">AOP</a>						
</fieldset>

적용 전 환경설정

aop용 외부 라이브러리 3개pom.xml에 다운

<!-- aop용 외부 라이브러리 -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.9.1</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>aopalliance</groupId>
    <artifactId>aopalliance</artifactId>
    <version>1.0</version>
</dependency>
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>

크게보면
1.공통코드를 만들고(advice == CrossCuttingConcern)

2.공통코드를 관리하는 aop만들어서( AopController )

3.targetClass에 코드를 주입시키쟈!!

 

 

CrossCuttingConcern java

공통 관심 사항을 위빙할 타겟클래스의
어느 지점에 주입할것인지 정의
 
 Pointcut설정시 execution명시자 형식의 문자열 지정
 execution명시자:
 Advice를 적용할 패키지,클래스 그리고
 메서드를 표현할때 사용
  형식:execution(접근지정자패턴 리턴타입패턴 패키지이름패턴/클래스이름패턴/메서드이름패턴/(파라미터 패턴))
  =>AspectJ표현식이라고 함
 
  접근지정자패턴:생략가능(public ,protected등)
  *:모든 값
  ..:0개 이상이라는 의미
 

ex) public * spring.aop..*(..) 
 => 접근지정자가 public이고 모든 리턴타입에 대해 spring.aop패키지
 및 그 이하에 있는 모든 패키지의 모든 클래스의 메서드에 대해 

 그리고 인자가 0개이상인 모든 메서드를 의미함.

 

 

****공통 코드 메소드  작성 규칙

-반환타입:Object
-메소드명:임의로
-매개변수:ProceedingJoinPoint타입
-Throwable던져 준다.

//1.@Aspect 어노테이션 : 이 클래스는 advice 역할을 하는 클래스라는 것을 컴파일러에게 알려주는 어노테이션
@Aspect
@Component
public class CrossCuttingConcern {
	//타겟 클래스의 어느 지점에 현 Advice를 삽입(위빙) 할 지 포인트 컷 설정
    //@Around는 메소드 전 후로 주입한다는 뜻
    @Around("execution(public * com.kosmo.springapp.basic.aop..*(..))")
    public Object crossCuttingConcern(ProceedingJoinPoint point) throws Throwable{
        String coreConcern= point.getSignature().toShortString();
        System.out.println("대상클래스의 핵심 관점(메소드명):"+coreConcern);
        //대상 클래스의 핵심로직 실행 전 수행 할 공통로직
        long startTime = System.currentTimeMillis();
        Object object =point.proceed(); //요러면 공통관점이 삽입 된 핵심 로직이 실행 됨
        //대상 클래스의 핵심로직 실행 후 실행 할 공통 로직
        long endTime = System.currentTimeMillis();
        System.out.println(coreConcern+"의 총 소요시간:"+(endTime-startTime)/1000.0+"초");		
        return object;
     }
}

 

AopController.jsp    => 공통코드는 여기서 관리!!

@Controller
public class AopController {

    @Autowired
    private TargetClass target;

    @GetMapping("/AOP/Aop.do")
    public String exe(Model model){
        long total = target.getTotal();
        model.addAttribute("total",total);		
        //뷰정보 반환
        return "aop15/Aop";
    }	
}

 

targetClass.jsp ==> 여기서 주입을 당한다!!

//공통관점(로직,기능)을 주입받는 위빙 대상 클래스
@Component
public class TargetClass {	

    public long getTotal() {
        long total=0;
        for(long i=0 ; i<1000000000; i++) total+=i;
        return total;					
	}
}

결과 쟈쟌!!

 

web소캣도 개념만 들어가긴 했는데

이건 내일 진도나가고 같이 정리하는게 나중에 보기편할 거 같아 내일 같이 정리하는게 낫겠다

내일은 채팅기능 구현 한다고 하니

기대된다 히히히

 

 


+++aop 자바코드(@configuration+@Bean)로 등록하는걸로 바꿈!!

우선 AopConfig.java 파일 새로 생성

@Configuration
//xml로 설정 시 아래 어노테이션은 서블릿컨텍스트에서의 <aop:aspectj-autoproxy proxy-target-class="true"/> 역할을 한다
@EnableAspectJAutoProxy
public class AopConfig {
	
	///위빙 할 공통코드가 있는 클래스를 의미! 즉 @Aspect가 붙은 클래스이다
	@Bean
	public CrossCuttingConcern crossCuttingConcern() {
		return new CrossCuttingConcern();
	}
}

 

servlet-context.xml 에서

밑의 코드는 주석처리 (어노테이션으로 AOP구현 시 설정파일에 등록할 필요 없음!)

<aop:aspectj-autoproxy proxy-target-class="true"/>

 

CrossCuttingConcern.java에서

@Component는 주석처리

@Around("execution(public * com.kosmo.springapp.basic.aop..getTotal(..))")로 변경

 

하면 끝 !!