Spring이 강력한 이유 AOP!
🎯 AOP (Aspect Oriented Programming)
📚 AOP 기본 컨셉
👓 객체 지향 vs 관점 지향
- 객체 지향: 핵심 로직 중심으로 구성
- 관점 지향: 핵심 로직 + 부가 로직(횡단 관심사) 분리해서 모듈화
✂️ 횡단 관심 사항
메서드 = 핵심 관심사(비즈니스 로직) + 횡단 관심사(공통 기능)
AOP는 횡단 관심사의 모듈화를 통해 코드 재사용성과 유지보수성을 향상시키고,
개발자가 핵심 로직에 집중할 수 있게 도와줍니다.
📌 Aspect → 전문가 (모듈화 단위)
🔑 기본 용어

⚙️ AOP 작성과 동작
- 핵심 관심사: DAO의 메서드 로직 등
- 횡단 관심사: 로그 출력, 트랜잭션 처리 등
📦 spring-boot-starter-aop 의존성 추가 필요
🔄 AOP 동작 원리 - Proxy
Proxy = 대리 객체
클라이언트를 대신해서 요청을 수행하며, Spring은 Proxy 기반의 Bean으로 AOP 구현
- 기본적으로 CGLIB(Code Generator Library)를 사용하여 클래스 기반 Proxy 생성
📷 
🔍 Proxy 동작 방식
Proxy 객체가 타겟을 감싸고 있음 → 타겟 호출 전/후에 advice 실행 가능
📷 
🎯 Pointcut 작성
Pointcut: 어디에 AOP를 적용할지 정하는 지점
📷 
📌 작성 팁
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가 적용되지 않음
📷 
➡️ 이를 해결하려면 별도 Bean 분리 또는 Aspect 호출 방식 변경 필요
숙제
VELOG 정리, 1 알고리즘