
오늘 배운 내용
관점 지향 프로그래밍 (AOP)
AOP는 애플리케이션 로직을 핵심기능 과 부가기능 으로 나누어 바라보는 프로그래밍 방식이다.
- 핵심기능(Core Concern): 객체가 제공하는 고유의 기능 (ex: 게시글 작성, 상품 주문)
- 부가기능(Cross-Cutting Concern): 핵심기능 전반에 걸쳐 공통으로 필요한 보조기능 (ex: 로그추적, 시간측정, 트랜잭션 관리, 보안)
AOP는 흩어져있는 부가기능(Aspect)을 핵심기능 코드와 분리(모듈화)해 관리한다. AOP는 OOP를 대체하는 것이 아닌 OOP를 도와주는 보조적인 기술이다.
AOP 작동 원리 : 프록시(Proxy)
Spring AOP는 프록시 패턴을 기반으로 동작합니다. 프록시는 '대리인'이라는 뜻으로 실제 핵심 기능을 수행하는 객체(Target)을 대신해 부가기능을 처리해줍니다.
- 개발자가 핵심기능(Target)을 호출하면 Spring은 사실 Target을 감싸고 있는 프록시(Proxy) 객체를 대신 호출한다.
- 프록시 객체는 핵심기능이 호출되기 전(Before)에 부가기능을 수행한다.
- 그 다음 프록시가 실제 핵심기능을 호출한다.
- 핵심기능이 완료된 후(After)에 프록시가 다시 부가기능을 수행하고 호출자에게 결과를 반환한다.
AOP 핵심 용어
- Target (타겟): 부가 기능(Advice)이 적용될 핵심 기능을 가진 실제 객체이다.
- Advice (어드바이스): '무엇을(What)' 할 것인가. 즉, 부가 기능의 실제 로직(코드)이다.
- `@Before`: Target 메서드 실행 전에 동작.
- `@After`: Target 메서드 실행 이후에 동작 (성공/실패 여부와 관계없이 finally처럼 동작).
- `@AfterReturning`: Target 메서드가 정상적으로 성공했을 때 동작.
- `@AfterThrowing`: Target 메서드에서 예외(Error)가 발생했을 때 동작.
- `@Around`: 가장 강력하며, Target 메서드 실행 전/후를 모두 제어합니다. 메서드 실행 여부도 결정할 수 있다.
- Join Point (조인 포인트): '어디서(Where)' Advice가 적용될 수 있는 모든 지점(시점)이다. Spring AOP에서는 주로 메서드 실행 시점을 의미한다.
- Pointcut (포인트컷): '어떤 Join Point를(Which)' 선택할 것인가. 수많은 Join Point 중에서 Advice를 적용할 특정 지점을 선별하는 표현식(Expression)이다.
- 예시: `execution(* com.noah.service.*.*(..))`
- com.noah.service 패키지 내의 모든 클래스(*)의 모든 메서드(*)에 적용하라는 의미
- 예시: `execution(* com.noah.service.*.*(..))`
- Aspect (애스펙트): Advice + Pointcut의 조합이다. "어떤 부가 기능(Advice)을 어떤 지점(Pointcut)에 적용할 것인가"를 정의한 하나의 모듈이다.
Spring AOP 예시 (Annotation 기반)
- AOP 활성화
- `@Configuration`이 붙은 설정 파일에 `@EnableAspectJAutoProxy` 어노테이션을 추가하여 AOP 자동 프록시 생성을 활성화한다. (XML 설정의 <aop:aspectj-autoproxy/>와 동일한 역할)
- Aspect 클래스 작성
- 부가기능을 담을 클래스 생성
- `@Aspect` 어노테이션을 붙여 이 클래스가 Aspect임을 선언한다.
- `@Component` 어노테이션을 붙여 Spring Container가 이 Aspect를 Bean으로 관리하도록 한다.
- Advice 및 Pointcut 정의
- Aspect 클래스 내부에 부가 기능으로 사용할 메서드를 만든다.
- `@Before`, `@Around` 등의 Advice 어노테이션을 붙인다.
- 어노테이션의 값으로 Pointcut 표현식을 작성하여 이 Advice가 적용될 위치를 지정한다.
@Aspect
@Component
@EnableAspectJAutoProxy // 설정 클래스에 추가
public class LogginAspect {
// com.noah.service 패키지 아래의 모든 메서드 실행 전에 이 코드를 실행
@Before("execution(* com.noah.service.*.*(..))")
public void logBefore() {
System.out.println("메서드 실행 전 로그를 남깁니다.");
}
}
회고
오늘 배운 AOP는 사실 그렇게 잘 사용하진 않는 것 같다. 그래도 프록시 패턴은 중요한 부분이니까~
이전에 Spring을 혼자서 보고 대충 이런게 있구나 하던걸 한번더 보다보니 이해력 부분에서 많은 도움이 돼 다행인듯 싶다.
관통프로젝트도 슬슬 구상해 보고 있는데 생각보다 도전적으로 해야할 것 같다.
당분간 배울 스프링은 크게 어려울 게 없을 듯 싶어 자기소개서도 쓰고 취업관련해서 조금씩 준비해볼 예정!
개선점 or 피드백
- 일찍자야지 해도 못자는건 해야할 게 많기 때문 -> 강의실에서 최대한 많이 해놓고 집에가자
- 유연한 사고.
오답노트
'Programming > TIL' 카테고리의 다른 글
| [30] 💊 (알러지) 약 때문에 너무 졸린 날 (0) | 2025.11.11 |
|---|---|
| [29] 🔨 Maven은 안해봤어요ㅜ.ㅜ (2) | 2025.11.10 |
| [27] ❄️ 나는 윈터가 좋드라 (Spring Framework - DI) (4) | 2025.11.04 |
| [26] 그동안 왜 TIL이 없었냐고요?...☠️ (6) | 2025.11.03 |
| [25] 뭔지 모르겠지만 일단 하는 나 (0) | 2025.10.14 |