Programming/TIL

[28] · –  – – –  · – – ·

Noah.log() #0818 2025. 11. 5. 22:34

그냥 갑자기 모스부호가 쓰고싶었음...

오늘 배운 내용


관점 지향 프로그래밍 (AOP)

AOP는 애플리케이션 로직을 핵심기능부가기능 으로 나누어 바라보는 프로그래밍 방식이다.

  • 핵심기능(Core Concern): 객체가 제공하는 고유의 기능 (ex: 게시글 작성, 상품 주문)
  • 부가기능(Cross-Cutting Concern): 핵심기능 전반에 걸쳐 공통으로 필요한 보조기능 (ex: 로그추적, 시간측정, 트랜잭션 관리, 보안)

AOP는 흩어져있는 부가기능(Aspect)을 핵심기능 코드와 분리(모듈화)해 관리한다. AOP는 OOP를 대체하는 것이 아닌 OOP를 도와주는 보조적인 기술이다. 

AOP 작동 원리 : 프록시(Proxy)

Spring AOP는 프록시 패턴을 기반으로 동작합니다. 프록시는 '대리인'이라는 뜻으로 실제 핵심 기능을 수행하는 객체(Target)을 대신해 부가기능을 처리해줍니다.

  1. 개발자가 핵심기능(Target)을 호출하면 Spring은 사실 Target을 감싸고 있는 프록시(Proxy) 객체를 대신 호출한다.
  2. 프록시 객체는 핵심기능이 호출되기 전(Before)에 부가기능을 수행한다.
  3. 그 다음 프록시가 실제 핵심기능을 호출한다.
  4. 핵심기능이 완료된 후(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 패키지 내의 모든 클래스(*)의 모든 메서드(*)에 적용하라는 의미
  • Aspect (애스펙트): Advice + Pointcut의 조합이다. "어떤 부가 기능(Advice)을 어떤 지점(Pointcut)에 적용할 것인가"를 정의한 하나의 모듈이다.

Spring AOP 예시 (Annotation 기반)

  1. AOP 활성화
    • `@Configuration`이 붙은 설정 파일에 `@EnableAspectJAutoProxy` 어노테이션을 추가하여 AOP 자동 프록시 생성을 활성화한다. (XML 설정의 <aop:aspectj-autoproxy/>와 동일한 역할)
  2. Aspect 클래스 작성
    • 부가기능을 담을 클래스 생성
    • `@Aspect` 어노테이션을 붙여 이 클래스가 Aspect임을 선언한다.
    • `@Component` 어노테이션을 붙여 Spring Container가 이 Aspect를 Bean으로 관리하도록 한다.
  3. 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 피드백


  • 일찍자야지 해도 못자는건 해야할 게 많기 때문 -> 강의실에서 최대한 많이 해놓고 집에가자
  • 유연한 사고.

오답노트