새로운시작

AOP 본문

기초

AOP

eunnyy 2017. 6. 23. 11:00

AOP ( Aspect Oriented Programming )


등장 배경 


객체지향적인 프로그래밍(OOP/유지보수성과 확장성)을 지향하면서 유지보수를 좀더 편리하게 하기 위한 방법

OOP를 사용하다 보면 inter-object message가 너무 많아 코드 변경이 어렵고, 그로 인해 코드의 재사용이 불가능한 경우가 발생


*OOP 원칙을 지키지 못하였을 경우

- 분산 ( Scattering ) : 하나의 기능을 하나의 모듈로 캡슐화하기 불가능하여 여러 모듈에 분산되어 코드가 반복적으로 나타남.

분산된 코드에 영향을 받는 모듈은 의존성이 강해져 유지보수가 힘들어짐

※ 모듈은 독립적일수록 좋다. 응고결저 - 응집도는 높을수록 결합도는 낮을수록 좋다.

- 혼란 ( Tangling ) : 여러개의 모듈에 분산, 중복되어 있어 모듈화가 불가능한 코드들은 각 모듈의 코드 자체에 부정적인 영향을 준다.






http://blog.afidev.com/entry/61-AOPAspect-Oriented-Programming



용어

  • aspect :  여러 객체에 공통적으로 적용되는 부분
  • advice : 언제 공통관심 기능을 핵심 로직에 적용할지를 정의

- Before : advice 대상 메소드가 호출되기 전에 aspect 기능을 수행

- After : 결과에 상관없이 advice 대상 메소드가 완료된 후에 aspect 기능을 수행

- After-returning : advice 대상 메소드가 성공적으로 완료된 후에 aspect 기능을 수행

- Around : 대상 메소드가 호출되기 전후에 aspect 기능을 수행

  • target : advice가 적용될 객체
  • jounpoint : advice가 적용될 지점(target의 메소드)
  • pointcut : 실제로 advice가 적용된 joinpoint(pointcut은 joinpoint의 부분집합)
  • advison ( = aspect ) : advice + pointcut
  • weaving : Weaving 작업을 통해서 advice를 핵심 로직코드에 적용하는것

- 컴파일 시 Weaving ( AspectJ 방식 )

  초기에는 AspectJ가 지원하는 컴파일러를 통해 컴파일 해야 한다는 제약에 따라 point cut 변경에 따른 관련된

  모든 클래스를 매번 재컴파일을 해야하는 문제점이 있었지만 최근 IDE툴이 지원되면서 대표적인 AOP 지원툴로 자리매김함.

- 클래스 로딩시 Weaving ( AspectWerkz 방식 )

  JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 에이전트를 제공함으로써 클래스의 바이너리 정보를 변경하여 

  알맞은 위치에 공통 코드를 삽입한 새로운 클래스 바이너리 코드를 사용하도록 한다. 즉, 원본 클래스 파일은 변경하지 않고     클래스를 로딩할 때 JVM이 변경 한 바이트 코드를 사용한다.

- 런타임 시 Weaving (Spring AOP 방식)

  소스코드나 클래스를 변경하지 않고 프록시를 이용해 AOP를 적용한다. 즉, 기존 코드에 속한 객체에 직접 접근하지 않고

  중간에 공통 코드가 적용된 프록시를 생성하여 접근한다. 단점은 기존 코드를 실행하기 전/후의 join point만 적용 가능하며,     필드 값 변경 같은 join point에 대해서는 적용이 불가능 하다.




정리

  • 관점 지향적 프로그래밍
  • OPP를 보안 및 확장 
  • AOP 도구 중 대표적인 것으로는 AspectJ, JBossAOP, SpringAOP 존재
초기 (기계어, Fortran ) ▶ 절차지향 ( C, Pascal ) ▶ 객체지향 ( C++, java ,C# )  ▶ 관점지향 기술이 더해짐 (AspectJ) = 발전한 객체지향


목적 및 장점


  • 중복을 줄여 적은 코드 수정으로 전체 변경을 할 수 있다
  • 관심의 분리
  • 핵심관점(업무로직) + 횡단관점(트랜잭션,로그,보안,인증 처리등) 으로 관심의 분리를 실현
  • 중복되는 코드 제거, 효율적인 유지보수, 높은 생산성 , 재활용성의 극대화 , 변화 수용등


Spring에서 AOP의 특징


1) 스프링은 자체적으로 프록시 기반의 AOP를 지원

그래서 스프링 AOP는 메서드 호출 조인포인트만을 지원한다.

만약 필드값 변경 같은 조인 포인트를 사용하고 싶다면 AspectJ 같은 풍부한 기능을 지원하는 AOP 도구를 사용

(스프링 AOP는 JEE 어플리케이션을 구현하는데 필요한 수준의 기능만을 제공)


2) 스프링 AOP는 자바 기반

AspectJ는 에스팩트를 위한 별도의 문법을 제공하고 있는 반면 스프링은 별도의 문법을 익힐 필요없이 자바 언어를 사용.

XML 스키마 기반의 POJO 클래스를 이용한 AOP 구현

Spring2 버전부터 AOP를 설정하기 위한 AOP네임 스페이스 및 네임스페이스와 관련된 xml이 추가됨

AOP네임 스페이스와 관련된 XML 스키마는 Bean태그에 명시 가능.



'기초' 카테고리의 다른 글

Jsp〃[EL]과 [JSTL] 한방에 정리 + Core  (0) 2017.06.22
Comments