🍀 Spring

AOP(Aspect Oriented Programming)

정의

💡
핵심적인 관점, 부가적인 로직으로 나누어, 그 관점을 기준으로 기능을 모듈화하는 프로그래밍 방법론

목적 및 특징

전통적인 객체지향 설계 방식을 충실히 따르더라도 여러 클래스에 로깅이나 보안 및 트랜잭션 등 공통된 기능들이 흩어져 존재
이렇게 독립적으로 분리하기 어려운 부가 기능모듈화하여 재사용 할 수 있도록 하는 프로그래밍 방식

특징

Weaving

  • 컴파일 타임 Weaving : class file 조작
  • 메모리 로드 타임 Weaving : JVM에 Class Byte Code 적재할 때 조작
  • Runtime Proxy Weaving : Proxy를 동적으로 생성하여 조작(Spring AOP의 방식
    • → 메소드 호출 관련 JoinPoint에 국한됨

용어

Target

Weaving 대상이 되는 핵심 로직

Advice

Weaving 대상이 되는 공통 로직

JoinPoint

공통 로직이 결합될 핵심 로직의 위치

PointCut

Weaving 대상을 필터링하는 표현식(메소드 필터링(필수) || Type 필터링(옵션) || )

Aspect(Advisor)

Advice + PointCut

장점

  • '로깅', '트랜잭션', '에러 처리'등 비즈니스단의 메소드에서 조금 더 세밀하게 조정하고 싶을 때 사용 , Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.

예시

메서드 단위의 공통 로직은 AOP로 적용하면 편리
  • 로깅
  • 보안
  • @Transactional
  • 로그인 관련(세션 체크)처리
  • 권한체크
  • XSS(Cross site script)방어

비교군과의 차이

AOP
Filter
Interceptor
공통점
공통 관심사항 해결 행동 기준으로 로직 실행 위치 설정
특징
메소드 단위 Proxy 패턴
Servlet 단위에서 실행
Servlet 단위에서 실행
역할
공통된 기능 모듈화 및 재사용
요청과 응답에 따라 필터
요청에 대한 작업 전/후로 가로챔
용도
• 로깅 • 보안 • @Transactional • 로그인 관련(세션 체크)처리 • 권한체크 • XSS(Cross site script)방어
• 모든 요청에 대한 로깅 • 공통된 보안 및 인증/인가 관련 작업(XSS방어) • 이미지/데이터 압축 및 문자열 인코딩 변환 처리 • Spring과 분리되어야 하는 기능
• Spring 안에서 작동하는 기능 • 로그인 체크 • 권한체크 • 프로그램 실행시간 계산작업 로그확인 등의 작업 • 세부적인 보안 및 인증 / 인가 공통 작업 • API 호출에 대한 로깅 • Controller로 넘겨주는 정보(데이터)의 가공(필터와 다르게 HttpServletRequest나 HttpServletResponse 등과 같은 객체를 제공받으므로 객체 자체를 조작할 수는 없음,대신 해당 객체가 내부적으로 갖는 값은 조작할 수 있으므로 컨트롤러로 넘겨주기 위한 정보를 가공 가능EX) JWT 토큰 정보를 파싱해서 컨트롤러에게 사용자의 정보를 제공하도록 가공)
대상 지정
주소, 파라미터, 애노테이션 등 PointCut이 지원하는 다양한 방법
주소(URL)로 대상을 지정
주소(URL)로 대상을 지정
실행 메소드 또는 적용 방법
AOP의 포인트컷 1. @Before 2. @After 3. @After-returning 4. @After-throwing 5. @Around
Init() doFilter() destroy()
preHandler() postHandler() afterCompletion(): view 페이지 렌더링 이후

AOP VS Filter

공통점

공통 관심 사항을 효과적으로 해결할 수 있다.
어떠한 행동 기준으로 로직 실행 위치를 설정할 수 있다.

차이점

  1. 실행 순서
    1. 적절하지 않는 호출이 오면 자신의 상태에서 빠르게 종료 가능

AOP VS Interceptor

공통점

공통 관심 사항을 효과적으로 해결할 수 있다.
어떠한 행동 기준으로 로직 실행 위치를 설정할 수 있다.

차이점

  1. AOP는 프로그래밍 철학, 개념 중 하나임 Interceptor는 구현체에 가까움
  1. '로깅', '트랜잭션', '에러 처리'등 비즈니스단의 메소드에서 조금 더 세밀하게 조정하고 싶을 때 사용 , Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.(메소드 단위에 Proxy 패턴의 형태로 실행) Interceptor는 전 후에 가능(Servlet 단위에서 실행)
  1. AOP는 주소, 파라미터, 애노테이션 등 PointCut이 지원하는 다양한 방법으로 대상을 지정할 수 있다. Interceptor와 Filter는 주소(URL)로 대상을 지정
  1. AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이다. Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출한다. 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.
 

사용법

AOP 사용법

면접 질문

  • 특정 컨트롤러에 적용하고자 하는 공통 관심사가 있습니다. Interceptor과 AOP중에서 고민 중인데, 어떤 것을 적용하는 것이 더 나은 선택일지 본인의 생각을 말씀해주세요.
    • [스프링 MVC의 컨트롤러]는 타입이 하나로 정해져 있지 않다.
    • 실행 메소드 또한 제각각이기 때문에 적용할 메소드를 선별하는 포인트컷 작성도 쉽지 않다.
    • 파라미터나 리턴값 또한 일정치 않다.
    • 이에 따라, 컨트롤러에 AOP를 사용할 경우 많은 수고가 필요하다.
    • 하지만 Interceptor는 모든 종류의 컨트롤러에게 동일한 HandlerInterceptor를 적용할 수 있게 해준다.
    • 따라서 컨트롤러에 공통적으로 적용할 부가기능이라면 HandlerInterceptor를 이용하는 편이 낫다.