❤ 김춘장이의 위키백과 - 나만의 공부 기록 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적용 후 의존 관계
- 의존성 분리
공통 기능은 ASpect로 분리되어 핵심 비즈니스 로직과 직접적인 의존 관계가 제거된다 - 핵심 비즈니스 로직 순수성 유지
- 동적 프록시
스프링 AOP는 주로 프록시 기반으로 작동한다
이는 핵심 비즈니스 로직이 호출될 때 스프링이 자동으로 프록시를 통해 관련 Aspect의 Advice를 적용한다 - 느슨한 결합
Aspect의 적용 구성을 통해 이루어지며 이는 코드를 변경하지 않고도 다른 Aspect를 적용하거나 제거할 수 있다
프록시란 무엇일까요
프록시는 간단히 말해 대리인
, 중개자
같은 역할을 하는 것 이다
일상 생활의 예를 들어보면 만약 친구에게 선물을 전달하고 싶지만 직접 만날 수 없을 때
다른 친구에게 선물을 전달해 달라고 부탁하는 것과 비슷하다.
선물을 전달해주는 친구가 프록시
의 역할을 한다
스프링AOP에서 프록시의 역할
원래 객체(서비스,컴포넌트)의 대산으로 행동한다
프록시는 원래 객체와 동일한 인터페이스를 가지고 있기 때문에
사용자는 원래 객체를 사용하는 것과 마찬가지로 프록시를 사용할 수 있다
프록시의 작동 방식
- 요청의 중개자 : 애플리케이션에서 특정 기능(예시 : 메서드)을 호출하면 이 호출은 먼저 프록시를 거친다
- 추가 작업 수행 : 프록시는 필요한 추가 작업(로깅이나 보안검사 등)을 수행할 수 있다, 이 작업들은 AOP 어드바이스에 정의되어있음
- 원래 객체로 전달 : 프록시는 이후 원래 객체의 해당 기능을 호출한다
- 결과 반환 : 원래 객체가 작업을 수행 후 그 결과를 프록시가 다시 받아 사용자에게 변환한다
스프링 입문 코드로 배우는 스프링부트 - 수업 완강
학원에서 스프링을 들어가며 개념을 다시 잡기 위해 인프런 강의를 열심히 들었다
그 덕분인지 몰라도 빠르게 자리를 잡은 것 같다. 그 다음 수업도 추가 결제 해서 볼 예정인데
그 다음 단계의 수업은 추후 공부하면서 올리도록 하겠다
'🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤 > ⠀⠀⠀⠀ SᴛʀɪɴɢBᴏᴏᴛ' 카테고리의 다른 글
H2 DataBase (In-Memory Mode)로 사용설정 (0) | 2024.04.05 |
---|---|
스프링의 생태계/Spring과 객체지향/SOLID원칙/Spring의 핵심 및 컨셉 (1) | 2024.02.09 |
Spring Boot - JPA (1) | 2023.12.27 |
Spring Boot - JdbcTemplate (0) | 2023.12.27 |
Spring Boot - 스프링 통합 테스트 (0) | 2023.12.27 |