38DAYS) Spring Framework 핵심 개념(3) - AOP (Aspect Oriented Programming)

nacSeo (낙서)·2022년 12월 12일
0

◉ 학습목표

1. AOP의 의미와 필요성, 사용되는 용어들에 대해 이해할 수 있다.
  1. AOP (Aspect Oriented Programming)

⦿ 학습내용

☞ 에스펙트 (Aspect)

✔︎ 부가 기능과 해당 부가 기능을 어디에 적용할 것인지 정의한 것
✔︎ 분리한 부가 기능과 그 기능들을 어디에 적용할지 선택하는 기능을 합해서 하나의 모듈로 만든 것
✔︎ 애플리케이션을 바라보는 관점을 하나 하나의 기능에서 횡단 관심사(cross-cutting concerns) 관점으로 보는 것

☞ AOP (Aspect Oriented Programming)

✔︎ 애스펙트를 사용하여 다양한 기능들을 분리
✔︎ 핵심 기능과 부가 기능을 분리하고, 분리된 부가 기능을 어디에 적용할 지 선택하는 기능들을 만듦
✔︎ 기존 사용하던 OOP를 대체하기 위한 것이 아닌, 횡단 관심사를 깔끔하게 처리하기 위해 OOP의 부족한 부분을 보조하는 역할

☞ 중요 기본 개념

✔︎ 핵심 기능(Core Concerns) : 객체가 제공하는 고유의 기능(업무 로직 등)을 포함하는 기능
✔︎ 부가 기능(Cross-Cutting Concerns) : 핵심 기능을 도와주는 부가적인 기능

  • 로깅, 보안, 트랜잭션
  • 단독으로 사용되지 않고 핵심 기능과 함께 사용
  • 여러 곳에 적용 시 번거롭고 중복 코드 발생
  • 수정이 필요할 때, 사용되는 클래스에 하나씩 수정해가야함

✔︎ Aspect

  • 여러 객체에 공통으로 적용되는 기능 (공통 기능)
  • 부가 기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어디에 적용할지 결정하는 포인트컷(PointCut)을 합친 개념
  • 어드바이스 + 포인트컷을 모듈화하여 애플리케이션에 포함되는 횡단 기능
  • 여러 어드바이스와 포인트컷 존재

☞ 객체 지향 프로그래밍 (Object Oriented Programming : OOP)

✔︎ 정의된 기능을 재사용하기 위해 동작보다는 객체 중심으로 프로그래밍
✔︎ 공통된 목적을 띈 데이터와 동작을 묶어 하나의 객체로 정의하는 것이 핵심🌟
✔︎ 객체를 적극적으로 활용함으로써 기능을 재사용할 수 있는 것이 큰 장점
✔︎ 객체를 잘 활용하기 위해선 관심사 분리(Separation Of Concerns, SOC)의 디자인 원칙을 준수해야 함
✔︎ 주요 개념

  • Spring MVC 구조는 @Controller, @Service, @Repository와 같이 관심사별로 계층을 나눠 객체를 관리
  • 관심사 분리는 모듈화의 핵심

✔︎ 문제점

  • 트랜잭션, 보안, 로깅 등의 필수 부가 기능들이 불특정 다수의 클래스에 존재
  • 비즈니스 클래스에 횡단 관심사와 핵심 관심사가 공존하게 됨 🚨
    • 메서드의 복잡도 증가 → 비즈니스 코드 파악 어려움
    • 부가 기능의 불특정 다수 메서드가 반복적으로 구현됨 → 횡단 관심사의 모듈화가 어려움

☞ AOP의 등장

✔︎ OOP의 모듈화 핵심 단위는 클래스이고, AOP의 모듈화 핵심 단위는 관점
✔︎ Aspect는 여러 유형과 객체 간에 발생하는 문제(ex.트랜잭션)의 모듈화를 가능하게 함

☞ AOP 용어

✔︎ 조인 포인트 (Join Point)

  • 클래스 초기화, 객체 인스턴스화, 메소드 호출, 필드 접근, 예외 발생과 같은 애플리케이션 실행 흐름에서의 특정 포인트
  • 애플리케이션에 새로운 동작을 추가하기 위해 조인포인트에 관심 코드(aspect code) 추가 가능
  • 횡단 관심은 조인포인트 전∙후에 AOP에 의해 자동 추가
  • 추상적인 개념으로, AOP를 적용할 수 있는 모든 지점
  • 스프링 AOP는 프록시 방식을 사용하므로, 조인 포인트는 항상 메소드 실행 지점으로 제한
  • 어드바이스 적용이 필요한 곳은 애플리케이션 내에 메서드를 가짐

✔︎ 어드바이스 (Advice)

  • 조인포인트에서 실행되는 코드
  • Aspect를 언제 핵심 코드에 적용할지 정의
  • 시스템 전체 애스펙트에 API 호출 제공
  • 메소드 호출 전에 각 상세 정보와 모든 메소드를 로그로 남기기 위해, 메소드 시작 전의 포인트인 조인포인트 S를 선택
  • 부가 기능에 해당

✔︎ 포인트컷 (PointCut)

  • 조인포인트 중 어드바이스가 적용할 위치를 선별하는 기능
  • AspectJ 표현식을 사용해 지정
  • 프록시를 사용하는 스프링 AOP는 메소드 실행 지점만 포인트컷으로 선별 가능

✔︎ 위빙 (Weaving)

  • 포인트컷으로 결정한 타겟의 조인포인트에 어드바이스를 적용
    • Advice를 핵심 코드에 적용
  • 핵심 기능 코드에 영향을 주지 않고, 부가 기능 추가 가능
  • AOP 적용을 위해 애스펙트 객체에 연결한 상태
    • 컴파일 타임 (AspectJ compiler)
    • 로드 타임
    • 런타임, 스프링 AOP는 런타임, 프록시 방식

✔︎ AOP 프록시 (Proxy)

  • AOP 기능을 구현하기 위해 만든 프록시 객체
  • 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시

✔︎ 타겟 (Target)

  • 핵심 기능을 담고 있는 모듈
  • 부가 기능을 부여할 대상
  • Advice를 받는 객체이고, 포인트컷으로 결정

✔︎ 어드바이저 (Advisor)

  • 하나의 어드바이스와 하나의 포인트컷으로 구성
  • 스프링 AOP에서만 사용되는 용어

◉ 느낀 점

☞ DI보다는 좀 더 이해가 가는 내용들이었다. 아직 실습은 못해봤지만 ,,, 😅
내일까지 AOP를 공부하는 시간으로 잡혀있기에 직접 실습해가면서 내 것으로 만들어야겠다. DI 보다야 덜 중요하다 하지만 알고 지나가는 것과 모르고 지나가는 것은 확실히 다르기에... 최선을 다해서 이해하겠다 😤 오늘도 고생했뜨ㅏ!!!!

◉ 내일의 키워드

・ AOP (Aspect Oriented Programming)
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글