AOP (Aspect Oriented Programming)

이호인·2022년 5월 25일
0

Spring

목록 보기
3/6

📌 들어가기 전에 정리

  • 로그인 체크 기능을 구현하면서 필터와 인터페이스에 대해 조사한 적이 있었다. 그때 항상 같이 등장하던 것이 AOP였는데, 그 당시 이해하기 어려워서 (아직도 어려움😂) 일단 미뤄두었다가 이제 다시 정리해보려고 한다.
  • 처음 들었을 땐 그냥 필터 같은 존재구나! 이 정도였는데 당당히 스프링의 3대 요소에 포함되는 AOP였다.
    (3대 요소 : IoC, DI, AOP)
  • 스터디 중 멘토에게 많이 조언 받았던 점 중에 하나가 단일 책임 원칙이었다. 하나의 메소드는 하나의 기능만 충실하게 잘 할 것, 하나의 클래스가 너무 많은 책임을 갖지 않도록 노력할 것!
  • 요구 사항에 대한 코드 외에 부가적인 코드들 ( 로그 처리, 보안 처리, 트랜잭션 처리 등)이 많아지면 가독성도 떨어지고 유지 보수하기도 어렵기 때문.
  • 이를 위해 AOP라는 관점 지향 프로그래밍을 사용하는데
  1. 요구사항에 대한 비즈니스 로직
  2. 개발자가 필요한 코드 등 (보통 로그, 보안, 트랜잭션 처리)

예를 들자면 이런 식으로 관점에 따라 깔끔하게 코드를 분리할 수 있다. 이 정도로 정리하고 제대로 알아보자.

📌 AOP (Aspect-Oriented Programming)

AOP는 Aspect-Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.
횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.

  • 모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것
  • 횡단 관심사 : 소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들
  • 핵심 기능과 부가 기능이란 관점에서 바라볼 때, 부가 기능 관점에서 공통된 요소를 추출할 수 있다. A,B,C 노란색 부분, A,C는 파란색 부분, A,B는 빨간색 부분을 공통적으로 사용하고 있다. 보통 이런 부분이 로그 처리, 보안 처리 , 트랜잭션 처리 같은 것들이다.

📌 OOP와 AOP

OOP : 비지니스 로직의 모듈화
AOP : 인프라 혹은 부가 기능의 모듈화 ( 주목적 외에 필요한 부가적인 기능들)

📌 AOP 주요 개념

  • Aspect : 흩어진 관심사를 모듈화 한 것. 주로 부가 기능을 모듈화
  • Target : Aspect를 적용하는 곳 (클래스, 메소드 등)
  • Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가 기능을 담은 구현체
  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에 서 값을 꺼내올 때 등 다양한 시점에 적용 가능
  • PointCut : 어디에 적용해야 하는지에 대한 정보

❗ spring AOP의 JointPoint에서는 메서드가 실행될 때만으로 한정하고 있다.

📌 AOP의 구현 방법

▶ 컴파일 타임에 적용

컴파일 시점(.java 파일을 .class 파일로 만들 때)에 바이트 코드를 조작하여 
AOP가 적용된 바이트 코드를 생성

▶ 클래스 로드 시

순수하게 컴파일 한 뒤, 클래스를 로딩하는 시점에 
클래스 정보를 변경 (Load Time Weaving, 로드타임 위빙)

▶ 프록시 패턴

스프링 AOP가 사용하는 방법. 
A 클래스 타입의 Bean을 만들 때 A 타입의 Proxy Bean을 만들어 
Proxy Bean이 Aspect 코드를 추가하여 동작

📌 AOP의 구현체 (자바)

  • AspectJ
  • spring AOP
spring AOPAspectJ
목표간단한 AOP 기능 제공완벽한 AOP 기능 제공
join point메서드 레벨만 지원생성자, 필드, 메서드 등 다양하게 지원
weaving런타임 시에만 가능런타임은 제공하지 않음
compile-time, post-compile, load-time 제공
대상Spring Container가 관리하는 Bean에만 가능모든 Java Object에 가능

📌 Spring AOP 특징

  • 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가 기능을 추가하기 위함
  • 스프링 빈에만 AOP를 적용 가능
  • 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 중복코드 , 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 등 이런 문제들에 대한 해결책을 지원하는 것이 목적

📌 마치며

  • AOP를 공부하기 전에는 그냥 딱 필터 정도 ? 생각했었는데 그런게 아닌듯.
  • 필터와 인터셉터가 AOP에 포함된다고도 봤고 .. AOP를 하기 위해 필터와 인터셉터를 썼다는 말이 맞는 표현인 것 같기도 하다.
  • proxy에 대해서 더 공부해봐야겠다.
  • 현재 적용되어 있는 로그인 필터를 AOP로 바꾸는 작업을 하면서 적용 시점, 적용 방법 같은 것들을 다시 한번 정리해야겠다. 😀

reference!

[10분 테코톡] 🌕제이의 Spring AOP
스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP
위키백과AOP(Aspect Oriented Programming)란 무엇일까?
스프링 AOP 총정리 : 개념, 프록시 기반 AOP, @AOP

profile
공부 기록

0개의 댓글