이전 프로젝트와 동일한 요구사항인 페이지 제한에 대하여 이번엔 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 |