우매함의 봉우리를 넘어서며 개발하면서 기록하기

AOP 정리(Java Spring)

스프링에서는 이 AOP를 활용하여 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용할 수 있도록 지원해준다. 그렇다면 이 AOP는 무엇일까?

AOP란


AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라 불린다. 그럼 이 “관점” 이라는 단어가 무엇을 의미하는 것일까?

스프링에서 구현하는 모든 기능들은 핵심 기능을 중심으로 서비스를 구성한다. 그렇기에 각 핵심 기능들은 서로 공통된 요소를 갖고있 있지 않는다.

예를들어, 게시판에 관련된 서비스를 구성하는 경우 게시판 글 등록, 조회, 수정, 삭제 등 게시판에 관련된 기능들이 모여 있을 것이고 유저에 관련된 서비스를 구성하는 경우 유저 회원가입, 정보 조회, 개인정보 수정 등 유저와 관련된 기능들이 모여있을 것이다.

하지만, 이 기능들을 바라보는 관점을 돌려서 부가 기능 이라는 관점으로 바라보게 된다면 조금 다르게 보일 수 있다. 각 기능들의 주 목적 외에 필요한 부가적인 기능들, 예를 들어 데이터의 트랙잭션이나 로깅 등의 과정은 모두 동일하게 쓰이고 있을 수 있다는 것이다.

즉, AOP는 공통된 기능을 재사용하는 기법은 동일하나, 핵심 기능이 아니라 부가 기능들을 재사용하자! 라는 것에서 출발한다.

AOP의 장점


  1. 애플리케이션 전체에 흩어진 공통된 기능을 한 장소에서 관리할 수 있다.
  2. 각각의 서비스 모듈에서는 본연의 목적만 신경쓸 수 있으며 나머지 부분은 신경을 쓰지 않아도 된다.

AOP 주요 개념


  • Aspect : 모듈화된 관심사로, 주로 부가기능의 모듈화를 뜻함.
  • Target : 구현한 Aspect를 적용하는 곳
  • Advice : 실질적으로 어떤 일을 해야할 지에 대한 기능을 담은 구현체
  • JointPoint : 구현한 Advice가 적용될 위치. 시점에 따라 메서드 진입 전 혹은 진입 후 등 다양하게 적용 가능
  • pointCut : JointPoint의 상세한 스펙을 정의한 것. Advice가 실행될 시점을 더욱 구체하게 정할 수 있음.

Spring에서의 AOP


스프링에서의 AOP는 빈에 등록한 객체만 적용할 수 있으며 스프링 IoC와 연동하여 객체간 관계 복잡도가 증가하거나 중복코드가 발생할 수 있는 흔한 문제에 대한 해결책을 지원해준다.

어노테이션

  1. 의존성 : 스프링에서 AOP를 사용하기 위해서는 다음과 같은 의존성을 추가해야 한다. (코드 가져와)

  2. Aspect 클래스 : @Aspect 어노테이션으로 이 클래스가 Aspect를 나타내는 클래스라는 것을 명시하고 @Component를 붙여 빈으로 등록한다. (코드 가져와)

  3. 클래스의 각 메소드에는 적용 시점을 어노테이션을 통해 지정할 수 있는데 @Before @Around @After @AfterReturning @AfterThrowing

  4. 각 어노테이션은 value를 통해 파라미터를 전달할 수 있는데, 여기 들어가는 value값은 어느 패키지의 어느 클래스의 어느 메소드를 실행할 때 AOP가 작동되는가에 대한 상세한 설명을 붙힐 수 있다