AOP에 대해서 설명해주세요.
AOP(Aspect-Oriented Programming)는 관점 지향 프로그래밍을 의미한다.
우리는 여태까지 객체 지향 프로그래밍을 해왔을 것이다. 객체 지향은 책임과 관심사에 따라 클래스를 구분했다.
그래서 객체 지향으로 설계를 하면 응집도는 높아지고 결합도는 낮아지게 됐다.
그런데 각 클래스마다 공통된 기능들을 똑같이 가지게 되는 경우가 생기게 된다.
위 사진에서는 클래스 A, B, C가 각각 Logging, Security, Transaction을 전부 가지고 있다.(이 얼마나 비효휼적인가)
관점 지향 프로그래밍은 이렇게 독립적으로 분리하기 어려운 부가 기능들을 모듈화 시키는 방식을 칭한다.
사진처럼 공통으로 가지는 관심사를 횡단 관심사(Cross cutting concenrns)라고 하며 이 부가 관점만 Aspect로 모듈화 하는 것이다.
(객체 지향에서 모듈화의 단위가 Class 였다면, 관점 지향에서는 Aspect 라고 한다.)
현재 만들고 있는 프로젝트에서 유저가 로그인 했을 때 로그를 등록하는 시간을 측정해보자(AOP 사용)
AOP는 특정 메서드에 실행 전, 후로 원하는 작업을 추가할 수 있다.
@Transactional
public UserInfoResponseDTO getUserInfo(HttpServletRequest request) {
간단하게 UserService에서 유저의 정보를 클라이언트로 보내주는 메서드다.
여기서 로그인 Log도 동시에 저장하도록 구성하였다.
이 메서드를 실행하기 전과 후에 AOP를 통해 동작 시간을 계산하는 메서드를 만들어보자.
따로 aop라는 패키지를 만들어서 MethodLogAspect 클래스를 만들어주었다.
@Aspect
@Component
@Slf4j
public class MethodLogAspect {
private long startTime;
@Before("execution(* com.parkchoi.scrum.domain.user.service.UserService.getUserInfo(..))")
public void beforeMethodExecution(){
startTime = System.currentTimeMillis();
log.info("로그인 로그 시작");
}
@AfterReturning(pointcut = "execution(* com.parkchoi.scrum.domain.user.service.UserService.getUserInfo(..))", returning = "response")
public void afterMethodExecution(UserInfoResponseDTO response){
long endTime = System.currentTimeMillis();
log.info("로그인 로그 등록 완료");
log.info("실행 시간(ms) : {} 밀리초", (endTime - startTime));
}
}
@Aspect 어노테이션을 통해 aop를 사용한다고 알려준다.
beforeMethodExecution 메서드를 통해 해당 메서드 동작 전에 시작 시간을 등록하고
afterMethodExecution 메서드를 통해 해당 메서드 동작 완료 시간을 보여주도록 만들었다.
어노테이션 사용법과 경로 등은 다른 블로그의 aop 사용법을 참고하면 됩니다.
이렇게 aop를 만들게 되면 실행 과정은 아래와 같다.
1. Spring은 UserService 빈을 생성할 때, 해당 클래스에 적용된 AOP가 있는지 확인. AOP가 있다면 UserService의 프록시를 생성한다.
2. getUserInfo 호출이 발생하면 프록시의 해당 메서드 호출. 먼저 AOP에 정의된 beforeMethodExecution를 실행한다.
3. beforeMethodExecution 실행이 완료되면 프록시는 실제 UserService의 getUserInfo를 호출.
4. getUserInfo 실행이 완료되고 결과가 반환되면, 프록시는 afterMethodExecution 메서드 호출.
5. afterMethodExecution 메서드 호출이 완료되면 프록시는 getUserInfo 메서드의 결과를 원래 호출자에게 반환한다.
결국 AOP를 적용하게 되면 UserService의 실제 메서드를 호출하는 것이 아니라, 프록시를 호출하게 되고, AOP 어드바이스를 실행한 후에 실제 메서드를 호출한다는 점이다.
'면접' 카테고리의 다른 글
백엔드 기술 면접 후기(3) (1) | 2024.01.03 |
---|---|
백엔드 기술 면접 후기(2) (1) | 2024.01.01 |
백엔드 기술 면접 후기(1) (2) | 2023.12.25 |