웹 & 프레임워크

Spring AOP란 무엇이고 용어를 알아보자

늘근이 2014. 6. 27. 14:31
"AOP"는 무엇일가

 

 

AOP는 OOP를 더 OOP처럼만들어주는 아주 고마운 애다.

AOP를 쓰면 내가 이용하는 대상이 누구라고하지도않고 이용한적도 없는데 이용한것처럼 실행이된다? 오오

일종의 우렁각시네

 

AOP는 관심사의 분리



예를들어 로깅하는 거시기가 있다고 하자. 공통로직인 로깅코드를 계속 불러오면 어지럽다.

register() {} 와 같은 메서드안에 다 logging.log()를 집어넣어야하는데
AOP는 그 메서드안에 번거롭고 지저분하게 넣어주는게 아니라, logging.log()가 안에서 호출하는게 없는데도 이 메서드를 사용할수있다

그러면 의존성이 없어지면, loggin.log()없이도 단위테스트가 가능할정도로 컴파일도된고 거시기도된다

위빙 : 핵심로직 <-- 공통로직이용(호출) 코드 삽입
우렁각시만들어내는 과정을 weaving이라고 한다. 이거 만들어내는 핵심적인 방법이 3가지가 있다.

  1. 컴파일 위빙(컴파일되는 class파일에 삽입, 소스에 안짜는데 스프링이 집어넣어줌)
  2. bytecode위빙(컴파일은 평상시대로 함. 소스를 기반으로 함. 컴파일된 클래스가 jvm에서 메모리로 로드될때 바이트코드에삽입, 위빙이 일어남), 역컴파일해도 안보임. 일시적
  3. 런타임의 프록시를 위빙 (대행자) 메모리고 코드뭐고 다 없음.. 우리가 짠 그녀석대신 공통로직을 이용해주는 다른애가 막생김 그게 프록시라고 함! (유저프록시는 유저서비스랑 똑같은것처럼 행새를 해야한다, 그렇다면 구조가 같아야 하는데, 인터페이스가 필요함! 코드까지 같다능건 아니다능 그냥 대신해주고싶다능
음 그러면 3번 방법에 의해 UserServiceImple과 같은 핵심로직과 똑같은 구조로 메서드와 구조를 만든다
UserProxy클래스는 login(){} register(){} 구조, 껍데기가 다 들어있다, 그 대행되는 타게팅 대상을 타겟거시기???
일종의 타겟을 감싸고 있는 Proxy라고 하겠다

스프링이 지원하는건 세번째 방식임. 나머지는 스프링의 AOP말고 AOP의 전문프레임을 써야함!
그래서 이 세번째 방식은 각각 거시기들 사이사이에 예외처리 등등이 들어갈수있따?? 뭔가 막 자꾸자꾸 여러군데서 껴드는건 세번째방식말고 딴걸 써야한다. 그러나 님들같은 초보들은 그냥 세번째가 좋다


proxy는 가라임. 바지사장이고, 사실 일은 UserServiceImpl이 할것이다. 래핑을 하는놈! 프록시를 이용한 위빙방식 스프링이 다 해줌
스프링보고 야 얘가 타겟이야 프록시만들어내야돼..공통로직이런거야 이런거 설정으로 만들어줌.


AOP용어 해설

어드바이스(Advice) : 공통로직코드! cross cutting concern과 동의어임!

조인포인트! : 공통로직코드가 들어갈수있는 부분. 

포인트컷! 조인포인트를 필터링하기 위한거시기.. 위빙이 될수있는 조인포인트를 필터링, 찾아내기 위한 표현식이 포인트컷임..

로그인메서드만 , 유저로 끝나는 메서드만 하면서 제한을 둘수있따. 그래서 이게 필터와 같이 동작하는거임

공통로직의 성격에따라서 고고싱,포인트컷에는 클래스 필터링과 메소드필터링의 역할두가지를  할수있다

타입정보 생략시 모오든 놈들이 타겟이 됨. 타입 -> 메소드 기반으로 필터링을 함.. 메서드타입은 리턴타입이 아니라 메소드에 관련된 정보를 말하는것이라능. 

애스펙트 - 포인트컷과 어드바이스를 합쳐서 애스펙트라고 부른다.. (어드바이저라고 부르기도 한다.)