스프링 부트 강의에서 코인 거래 미니프로젝트를 만들어보았다.
클라이언트 단을 완성하고 난 이후에 관리자 admin 페이지도 만들어보았다.
admin 페이지에서는 login 을 하지 않은 경우 관리자 페이지의 리스트를 볼 수 없게끔 session 값을 확인 해주어야한다.
하지만 리스트 페이지가 많은 경우에는 controller 하나하나에 session 체크를 해주어야하는데,
그렇게 되면 중복되는 코드가 너무 많아지게 된다. 이럴때 AOP 를 사용하면 코드의 중복을 막아줄 수 있다.
package com.example.admin.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpSession;
@Aspect
@Component
public class AdminAop {
//* com.example.admin.manage.buy.BuyListController.*(..)
@Pointcut(" execution(* com.example.admin.manage..*.*(..))") // 실제 advice 가 적용될 지점.
public void cut() {
}
@Around("cut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
HttpSession session = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest().getSession();
if(session.getAttribute("id") == null){ //로그인을 안했을 때
return null;
} else { // 로그인을 했을 때
return joinPoint.proceed();
}
}
}
나는 com.example.admin.manage 패키지 내에 아래와 같이 RestController 들이 구성되어있다.
관리자가 로그인이 되어있지 않은 경우 해당 RestController 에서 리스트 값이 반환되면 안된다.
(빈 페이지만 보여주어야함)
그래서 Pointcut 에 advice 가 적용될 지점을 기준으로 session id 값이 없는 경우 return null 을 통해서 비즈니스 로직이 수행될 수 없도록 하고,
session 값이 있는 경우 비즈니스 로직을 수행하도록 ProceedingJoinPoint 를 통해서 proceed 해주었다.