Skip to main content

Command Palette

Search for a command to run...

[ Spring ] AOP

Updated
3 min readView as Markdown
[ Spring ] AOP
S

Nice to meet u :) Im Backend Developer

목표 : Spring에서 AOP(Aspect Oriented Programming)가 필요한 이유, 이를 활용한 실제 애플리케이션 개발 사례

1️⃣ 애플리케이션 로직

애플리케이션 로직은 핵심 기능과 부가 기능으로 나뉘어져있다.

  1. 핵심 기능 : 고유기능 (ex) 주문 로직

  2. 부가 기능 : 보조기능, 단독으로 사용되지 않고 핵심기능과 같이 쓰인다. (ex) 로그 추적 기능 (어떤 핵심 기능이 호출됐는지 로그를 남기기 위해 사용)

만약 , 같은 부가 기능이 여러 곳에서 동일하게 사용하는 횡단 관심사(cross-cutting concerns)가 발생한다면

  1. 부가 기능을 적용할 때마다 코드를 반복해야한다.

  2. 변경할때 많은 수정이 필요하다.

  3. 적용 대상을 전체에서 OrderService만 적용한다면? 많은 수정이 필요하다.

이를 OOP방식으로 해결하기 어려워서 나타난 개념이 바로 AOP이다.

2️⃣ AOP란?

다음과 같이 부가 기능을 핵심 기능에서 분리하였다. 이 부가 기능을 어디에 적용할지 선택하는 기능을 모듈화 한것이 Aspect라고 한다.

Aspect를 사용해서 애플리케이션을 바라보는 관점을 하나의 기능에서 횡단관심사 관점으로 보는 프로그래밍 방식을 관점 지향 프로그래밍 AOP라고 한다. OOP대체가 아닌 횡단관심사를 처리하기 위한 보조 목적으로 개발되었다.

AspectJ

이를 구현한 구현체로 AspectJ가 있다.

AOP는 생성자, static메서드 접근, 필드값 접근, 메서드 실행 지점에 적용할 수 있는데 이렇게 적용할 수있는 지점들을 Join Point라고 한다.

AspectJ는

  1. 모든 Join Point에 AOP를 적용할 수 있다.

  2. CTW,LTW,RTW방식을 사용할 수 있다.

  3. 디자인패턴이 필요 없다.

  4. AspectJ컴파일러로 AOP를 구현한다.

  5. 완전한 AOP를 제공하기 위한 목적을 가지고 있다.

Weaving

AOP를 사용할 때 부가 기능을 실제 로직에 추가한다는 뜻으로 위빙 단어를 사용한다.

  1. Compile-Time Weaving 컴파일 시점

    컴파일러가 소스코드를 .class로 만드는 시점에 부가 기능을 추가한다. 이때 AspectJ컴파일러를 사용하는데 Aspect로 해당클래스가 적용대상인지 먼저 확인 후 핵심기능이 있는 컴파일된 코드 주변에 부가기능을 작성한다.

  2. Load-Time Weaving 클래스 로드 시점

    .class파일을 JVM내부 클래스로더에 보관하기 전 조작한다. 이때, 클래스 로딩 과정에 참여하기 위해 JavaAgent옵션을 사용해야한다.

  3. Run-Time Weaving 런타임 시점

    컴파일도 완료하고 클래스 로더에 클래스도 다 올라간 후인 메인 메서드가 실행된 다음에 조작한다. 프록시를 통해 부가 기능을 적용하는데 여기서 프록시는 메서드 오버라이딩 개념으로 동작한다. 따라서, Join Point는 메서드 실행에만 제한한다.

Proxy

프록시는 핵심 기능을 호출하고 부가 기능을 처리해주는 객체이다. 간접적으로 참조하기 때문에 부가기능을 처리할 수 있다. 부가기능을 처리하기 위해 매번 프록시를 생성해야하는 단점이 존재한다.

Spring AOP

이를 해결하기 위해 Spring AOP가 등장한다.

  1. RTW를 사용하기 때문에 프록시 기반 AOP이다.

  2. Join Point는 메서드 실행으로만 제한된다.

  3. 프록시 객체를 자동으로 생성해줌으로서 프록시 생성 중복코드를 해결해준다.

  4. Spring IoC로 간단한 AOP구현이 목적이다.

용어

  1. Advice : 부가기능 자체

  2. JoinPoint: Advice가 적용될 위치, AOP가 적용될 수 있는 모든 지점

  3. Pointcut: Joinpoint 중 Advice가 적용될 위치를 선별

  4. Target: Advice를 받는 객체

  5. Aspect : Advice + Pointcut

  6. Advisor : 1개의 Advice + 1개의 Pointcut (Spring Aop에서 사용)

  7. Weaving : Pointcut으로 결정한 Target의 JoinPoint에 Advice적용

  8. Aop프록시 : AOP 기능을 구현하기 위해 만든 프록시 객체

3️⃣ 사례

Repository안 메서드 실행전에 로깅을 남기는 Advice를 정의하였다.

⚡ 정리

AOP : 횡단관심사 관점으로 애플리케이션을 바라본다.

단점으로 , 만약 오류가 발생한다면 어디서 발생했는지 확인하기 힘들다.

출처

More from this blog

[Spring] N+1문제 발생과 분석

✍️ 작성하게 된 이유 옷을 관리하는 서비스를 개발하면서 Cloth 엔티티와 그에 연관된 ClothWithAttributes, Attribute 데이터를 함께 조회하는 기능이 필요했다.그런데 연관 데이터를 조회할 때마다 쿼리가 폭발적으로 증가(N+1 문제) 하며, 성능이 급격히 저하되는 상황을 마주하게 되었다. Spring JPA의 대표적인 문제로 N+1임을 알고있었지만, 해결하는 방법은 Fetch Join밖에 몰랐다. 지연로딩되는 필드를 엔티...

Sep 17, 20256 min read
[Spring] N+1문제 발생과 분석

데이터베이스 기본 개념 정리

1️⃣ 데이터베이스(DB) & DBMS DB (Database): 일정한 규칙(스키마)에 따라 구조화되어 저장된 데이터의 집합. DBMS (Database Management System): DB를 제어/관리하는 시스템 소프트웨어. 특징: 실시간 접근 가능, 동시 공유 가능. 구조: 데이터베이스 → DBMS → 응용 프로그램 → 사용자 2️⃣ 엔티티(Entity) & 릴레이션(Relation) 엔티티: 여러 속성을 가진 "개체"...

Aug 5, 20252 min read
데이터베이스 기본 개념 정리

[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

✍️ 작성하게 된 이유 무신사, 29cm는 Jsoup으로 충분히 크롤링이 가능했기 때문에, ZigZag도 당연히 Jsoup으로 처리될 것이라 생각했다. 무신사, 29cm와 마찬가지로 필요한 데이터는 모두 <script> 태그 안에 들어있었다. 하지만… 예상은 보기 좋게 빗나갔다. 🧪 현상 ✅ 로컬 크롤링 → 정상 작동 Jsoup으로 script 태그 내에서 대표 이미지와 상품명을 잘 추출 로컬 환경에서는 아무 문제 없이 작동 ❌ A...

Jul 30, 20253 min read
[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

✍️ 작성하게 된 이유 날씨에 따라 옷을 추천해주는 서비스를 만들면서, 사용자가 입력한 구매 링크에서 옷 정보( 대표이미지, 상품명 )를 불러오는 기능이 필요했다. 처음에 해당 페이지를 동적 페이지로 판단했고, 자연스럽게 Selenium을 도입했다. 하지만 이 결정이 과연 최선이었는지는 수많은 시행착오 끝에야 알 수 있었다. 🕸️ Selenium을 선택한 이유 동적 페이지는 Jsoup으로 크롤링이 어렵다는 인식으로 처음부터 Selenium을 ...

Jul 28, 20254 min read
[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

Soyulia's Blog

49 posts