04.21 학습

한강섭·2025년 4월 21일
0

학습 & 숙제

목록 보기
69/103
post-thumbnail

Spring이 강력한 이유 AOP!


🎯 AOP (Aspect Oriented Programming)


📚 AOP 기본 컨셉


👓 객체 지향 vs 관점 지향

  • 객체 지향: 핵심 로직 중심으로 구성
  • 관점 지향: 핵심 로직 + 부가 로직(횡단 관심사) 분리해서 모듈화

✂️ 횡단 관심 사항

메서드 = 핵심 관심사(비즈니스 로직) + 횡단 관심사(공통 기능)

AOP는 횡단 관심사의 모듈화를 통해 코드 재사용성과 유지보수성을 향상시키고,
개발자가 핵심 로직에 집중할 수 있게 도와줍니다.

📌 Aspect → 전문가 (모듈화 단위)

🔑 기본 용어

AOP 기본 용어


⚙️ AOP 작성과 동작


  • 핵심 관심사: DAO의 메서드 로직 등
  • 횡단 관심사: 로그 출력, 트랜잭션 처리 등

📦 spring-boot-starter-aop 의존성 추가 필요

🔄 AOP 동작 원리 - Proxy

Proxy = 대리 객체
클라이언트를 대신해서 요청을 수행하며, Spring은 Proxy 기반의 Bean으로 AOP 구현

  • 기본적으로 CGLIB(Code Generator Library)를 사용하여 클래스 기반 Proxy 생성

📷 CGLIB

🔍 Proxy 동작 방식

Proxy 객체가 타겟을 감싸고 있음 → 타겟 호출 전/후에 advice 실행 가능

📷 Proxy 동작 구조


🎯 Pointcut 작성


Pointcut: 어디에 AOP를 적용할지 정하는 지점

📷 Pointcut 표현식

📌 작성 팁
1. 패키지 이름 포함하여 명시
2. &&, ||, !, and, or, not 등 논리 연산자 사용 가능
3. @Pointcut을 활용한 이름 있는 pointcut 재사용 가능


💬 Advice의 종류


🔹 @Before

  • 메서드 실행 전에 동작
  • 예외 발생 시 타겟 동작 불가
  • 전달받은 argument 조작 가능

🔸 @AfterReturning

  • 메서드가 정상 종료된 경우 실행
  • 반환값 조작 가능 (returning 파라미터 필요)

🔻 @AfterThrowing

  • 예외가 발생했을 때 실행
  • 발생한 예외 객체 참조 가능 (throwing 파라미터 필요)

🔁 @After

  • 항상 실행 (예외 발생 여부와 무관)
  • finally 역할 수행

🔄 @Around

  • 타겟 메서드를 직접 호출 (ProceedingJoinPoint 사용)
  • 파라미터, 리턴값 완전 제어 가능

💡 예시: 결과를 캐시에 저장해 반복 호출 시 빠르게 처리 가능


🧩 Spring 내부 AOP 활용 예시


🔁 Singleton의 비밀

  • 등록된 Bean이 있으면 그대로 반환, 없으면 새로 생성
  • Spring AOP 덕분에 Singleton 관리가 가능함

⚡ @Async

  • 별도 쓰레드/쓰레드풀 생성 없이 비동기 처리 가능
  • 내부적으로 AOP 기반으로 동작

❗ Spring AOP의 한계

  • Spring Bean 기반의 Proxy만 AOP 적용 가능
  • 자기 자신 내부의 메서드 호출은 AOP가 적용되지 않음

📷 내부 호출 AOP 제한

➡️ 이를 해결하려면 별도 Bean 분리 또는 Aspect 호출 방식 변경 필요


숙제

VELOG 정리, 1 알고리즘

profile
기록하고 공유하는 개발자

0개의 댓글