유리쯔의일상 2023. 12. 28. 23:18
반응형

 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤ 

 

 


 

 

 

본 포스팅은김영한선생님의
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB접근 기술
강의를 기반으로 작성되었습니다.

 

 

 

 

AOP가 필요한 상황


가상의 시나리오를 생각해보자
모든 메소드의 호출 시간을 측정하고 싶다면?
해당 되는 메소드가 몇 백, 몇 천개라면 ?
AOP를 적용하지 않았을땐 일일히 찾아가서 모두다 적용 시킨 뒤
호출 시간을 측정 후 다시 모두 수정해야한다.

회원가입 가입 시간과 회원 조회 시간을 측정한다가 했을 때

회원 가입 , 회원 조회 : 비즈니스 로직, 핵심 관심 사항
시간 측정 : 비즈니스 로직은 아니다 공통 관심 사항

이렇게 핵심 관심 사항과 공통 관심 사항이 섞여 있다면 유지보수가 어렵다.

 

 

AOP

Aspect Oriented Programming

공통 관심 사항 - Cross-sutting concern
핵심 관심 사항 - Core concern

원하는 곳에 공통 관심 사항을 적용하는 것

@Aspect
클래스를 Aspect로 선언, AOP를 사용하기 위해 반드시 필요한 어노테이션

@Aspect
@Component
public class ExampleAspect {
    // Advice 정의
}

@Pointcut
Advice가 적용될 위치, Join Points를 정의한다

@Pointcut("execution(* com.example.service.*.*(..))")
private void selectAll(){} // 메소드 본문은 비워둠

@Before
대상 메서드가 실행되기 전에 수행될 로직을 정의한다

@Before("selectAll()")
public void beforeAdvice(){
    System.out.println("Before method execution");
}

@After
대상 메서드 실행 후 결과와 상관없이 수행한다

@After("selectAll()")
public void afterAdvice(){
    System.out.println("After method execution");
}

@AfterReturning
해당 메소드가 성공적으로 실행 된 후 수행됨

@After("selectAll()")
public void afterAdvice(){
    System.out.println("After method execution");
}

@AfterThrowing
대상 메소드 실행 중 예외가 발생될때 바로 수행함

@AfterThrowing(pointcut = "selectAll()", throwing = "ex")
public void AfterThrowingAdvice(IllegalArgumentException ex){
    System.out.println("There has been an exception: " + ex.toString());
}

@Around
메소드 실행 전 후로 로직을 수행한다. 가장 주로 쓰는 문법

@Around("selectAll()")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("Before method execution");
    Object result = joinPoint.proceed(); // 대상 메소드 실행
    System.out.println("After method execution");
    return result;
}

 

 

 

 

 

 

 

 

AOP적용 후 의존 관계

  1. 의존성 분리
    공통 기능은 ASpect로 분리되어 핵심 비즈니스 로직과 직접적인 의존 관계가 제거된다
  2. 핵심 비즈니스 로직 순수성 유지
  3. 동적 프록시
    스프링 AOP는 주로 프록시 기반으로 작동한다
    이는 핵심 비즈니스 로직이 호출될 때 스프링이 자동으로 프록시를 통해 관련 Aspect의 Advice를 적용한다
  4. 느슨한 결합
    Aspect의 적용 구성을 통해 이루어지며 이는 코드를 변경하지 않고도 다른 Aspect를 적용하거나 제거할 수 있다

 

 

 

프록시란 무엇일까요

프록시는 간단히 말해 대리인, 중개자 같은 역할을 하는 것 이다
일상 생활의 예를 들어보면 만약 친구에게 선물을 전달하고 싶지만 직접 만날 수 없을 때
다른 친구에게 선물을 전달해 달라고 부탁하는 것과 비슷하다.
선물을 전달해주는 친구가 프록시의 역할을 한다

스프링AOP에서 프록시의 역할

원래 객체(서비스,컴포넌트)의 대산으로 행동한다
프록시는 원래 객체와 동일한 인터페이스를 가지고 있기 때문에
사용자는 원래 객체를 사용하는 것과 마찬가지로 프록시를 사용할 수 있다

프록시의 작동 방식

  1. 요청의 중개자 : 애플리케이션에서 특정 기능(예시 : 메서드)을 호출하면 이 호출은 먼저 프록시를 거친다
  2. 추가 작업 수행 : 프록시는 필요한 추가 작업(로깅이나 보안검사 등)을 수행할 수 있다, 이 작업들은 AOP 어드바이스에 정의되어있음
  3. 원래 객체로 전달 : 프록시는 이후 원래 객체의 해당 기능을 호출한다
  4. 결과 반환 : 원래 객체가 작업을 수행 후 그 결과를 프록시가 다시 받아 사용자에게 변환한다

 

 

 

 

 

스프링 입문 코드로 배우는 스프링부트 - 수업 완강

학원에서 스프링을 들어가며 개념을 다시 잡기 위해 인프런 강의를 열심히 들었다

그 덕분인지 몰라도 빠르게 자리를 잡은 것 같다. 그 다음 수업도 추가 결제 해서 볼 예정인데

그 다음 단계의 수업은 추후 공부하면서 올리도록 하겠다 

반응형