[TIL 2024/09/09] 스프링부트 AOP 사용해보기

2024. 9. 10. 23:42·TIL

이전 프로젝트와 동일한 요구사항인 페이지 제한에 대하여 이번엔 AOP를 사용하여 관리를 하도록 한다.

이전에는 컨트롤러마다 검증로직을 추가하다 보니 중복되는 코드가 불필요하게 많아짐을 느꼈었는데

프로젝트 후반부였어서, 그리고 리팩토링 할 생각을 미처 하지 못했던 거 같다.

 

이번엔 처음부터 AOP로 관리하고자 한다!

import java.util.Arrays;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class PageableAspect {

    private static final int DEFAULT_PAGE_SIZE = 10;
    private static final int[] ALLOWED_PAGE_SIZES = {10, 30, 50};

    @Around("execution(* com.three_iii.company..*(.., org.springframework.data.domain.Pageable, ..))")
    public Object validatePageable(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < args.length; i++) {
            if (args[i] instanceof Pageable) {
                Pageable pageable = (Pageable) args[i];
                int size = DEFAULT_PAGE_SIZE;

                if (Arrays.stream(ALLOWED_PAGE_SIZES).anyMatch(s -> s == pageable.getPageSize())) {
                    size = pageable.getPageSize();
                }

                // 수정된 Pageable로 변경
                args[i] = PageRequest.of(pageable.getPageNumber(), size, pageable.getSort());
            }
        }
        return joinPoint.proceed(args);
    }
}

pageable을 파라미터로 갖는 모든 컨트롤러에서 유효성 검사를 진행한다.

@Around : 대상 메서드가 호출되기 전과 후에 모두 실행되는 로직을 정의할 수 있다.

 

execution(* com.three_iii.service..*(.., org.springframework.data.domain.Pageable, ..))

 

  • *: 반환 타입에 상관없이
  • com.three_iii.service..*: com.three_iii.service 패키지와 하위 패키지의 모든 클래스의 모든 메서드
  • ..: 메서드의 매개변수가 여러 개일 수 있으며, 그 중 하나는 Pageable 타입일 때
  • Pageable이 파라미터에 포함된 모든 메서드에 이 어드바이스가 적용됨

 

 

'TIL' 카테고리의 다른 글

[TIL 2024/09/11] HTTP Interface  (1) 2024.09.12
[TIL 2024/09/10] 프로그래머스 카드뭉치  (0) 2024.09.11
[TIL 2024/09/06] MSA 프로젝트 초기설정  (2) 2024.09.07
[TIL 2024/09/05] 프로그래머스 명예의 전당(1)  (0) 2024.09.05
[TIL 2024/09/04] 깃허브(GitHub) 사용법 & 협업방법  (0) 2024.09.04
'TIL' 카테고리의 다른 글
  • [TIL 2024/09/11] HTTP Interface
  • [TIL 2024/09/10] 프로그래머스 카드뭉치
  • [TIL 2024/09/06] MSA 프로젝트 초기설정
  • [TIL 2024/09/05] 프로그래머스 명예의 전당(1)
dev_ajrqkq
dev_ajrqkq
알고리즘 천재가 될 거야
  • dev_ajrqkq
    기록이 자산이다
    dev_ajrqkq
  • 전체
    오늘
    어제
    • 분류 전체보기 (144) N
      • Front-end (0)
      • Back-end (11)
        • Spring (1)
        • Java (8)
      • CS (9)
        • 데이터베이스 (5)
        • 네트워크 (4)
      • Algorithm (77) N
      • 이것저것 (0)
      • 버그잡기 (1)
      • TIL (37)
      • 후기 (1)
      • 취준 (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      티스토리챌린지
      항해99
      99클럽
      코딩테스트준비
      TypeScript
      개발자취업
      Til
      오블완
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    dev_ajrqkq
    [TIL 2024/09/09] 스프링부트 AOP 사용해보기
    상단으로

    티스토리툴바