본문 바로가기

Programming/Java & JSP & Spring

[Spring] AOP 란?

스프링의 여러 특징 중 중요한 특징을 뽑자면 IoC, DI 그리고 AOP라고 볼 수 있다.


AOP는 'Aspect Oriented Programming'의 약어로 기능을 핵심 비지니스 로직과 공통 모듈을 분리함으로써

개발자가 좀 더 비지니스 로직에만 집중해서 처리할 수 있는 방법을 제공한다.

이 말은 즉, 공통 모듈(로깅이나 보안인증 등)을 별도로 작성한 후 코드밖에서 비지니스 로직 사이에 삽입하는 것이

AOP 기능을 사용해 개발한 것이라고 볼 수 있다.


AOP와 비슷한 단어로 Java의 OOP(Object Oriented Programming)이라는 것이 있다.

OOP 즉, 객체프로그래밍이라는 단어와 AOP는 앞만 다르다는 것을 알 수 있다.

AOP는 OOP를 대신하는 새로운 개념이 아니라, OOP를 더욱 OOP답게 사용할 수 있도록 도와주는 개념이다.


객체를 재사용함으로써 개발자들은 반복되는 코드양을 많이 줄일 수 있었지만, 로그나 권한체크, 인증, 예외처리 등

핵심 비지니스 로직은 아니지만 반드시 해야되는 작업은 반복될 수 밖에 없었다.

이러한 문제를 해결해주는 것이 AOP 이다.


쉽게 말해 AOP는 비지니스 로직은 아니지만, 반드시 해야하는 작업 이라고 말할 수 있다.



AOP가 사용되는 경우

  • 간단한 메소드 성능 검사 : 개발 도중 작업 시간을 측정해보고 쿼리등을 개선하는 작업은 매우 의미가 있다. 이런 경우 시간을 측정하는 작업을 해당 메소드에 계속 반복해서 측정하는 것은 매우 번거로운 일이므로 AOP기능을 사용한다.
  • 트랜잭션 처리 : AOP의 설정을 응용한 것이다. 매번 사용하는 트랜잭션의 코드는 복잡하고 번거롭다.
  • 예외반환
  • 기타 등등

AOP의 구현방식은 '프록시(Proxy) 패턴' 이라는 방식을 통해서 구현한다.
외부에서 특정한 객체를 호출하면, 객체를 감싸고 있는 바깥쪽 객체(Proxy)를 통해서 호출이 되는 방식이다.


※ AOP 관련 용어
  • Aspect : 공통 모듈의 추상적인 명칭. 예를 들어 로깅이나 보안, 트랜잭션과 같은 기능 자체에 대한 용어
  • Advice : 실제로 기능을 구현한 객체. 개발자가 만드는 것은 Aspect가 아닌 클래스를 제작하고                                                   @Advice 애노테이션을 적용하는 것이다.
  • Target : 실제 비지니스 로직을 수행하는 객체를 의미. 말 그대로 Aspect를 적용해야 하는 대상 객체를 의미한다.
  • Join Points : 작성된 Advice가 활약할 수 있는 위치를 의미
  • PointCuts : 여러 Join Points 중에서 Advice를 적용할 대상을 선택하는 정보
  • Proxy : Advice가 적용되었을 때 만들어지는 객체
  • Weaving : Advice와 Target이 결합되어서 프록시 객체를 만드는 과정


※ Advice의 종류

  • Before Advice : target의 메소드 호출 전에 적용
  • After returning : target의 메소드 호출 이후에 적용
  • After throwing : target의 예외 발생 후 적용
  • After : target의 메소드 호출 후 예외의 발생에 관계없이 적용
  • Around : target의 메소드 호출 이전과 이후 모두 적용 (가장 광범위하게 사용됨)







참조 : http://addio3305.tistory.com/86

  코드로 배우는 스프링 웹프로젝트

'Programming > Java & JSP & Spring' 카테고리의 다른 글

[Spring] 트랜잭션 처리  (0) 2017.02.02
[Spring] AOP, Filter, Interceptor의 차이  (0) 2017.02.01
[Spring] RestController와 Ajax  (0) 2017.02.01
jQuery와 DOM  (0) 2017.02.01
BootStrap (부트스트랩) 이란?  (1) 2017.01.31