스프링 부트 강의에서 코인 거래 미니프로젝트를 만들어보았다.

클라이언트 단을 완성하고 난 이후에 관리자 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 해주었다.