메소드 레벨 보안을 통해
메소드 호출을 제어하는 것 이외에
필터링 조건도 강제할 수가 있는데
이는 메소드로 받는 입력
메소드에서 내보내는 출력에 모두 해당 됩니다
Java 메소드에 받고싶지 않은
특정 입력이 있거나
받고 싶지 않은
권유 규칙 기반의 입력이 있는
이런 상황에서 우리는
@PreFilter라는 주석을 이용할 수 있습니다
이는 @PreAuthorize 주석과 굉장히 유사합니다
@PreFilter라는 주석을 통해
실제 메소드 비즈니스 로직에
작성해둔 요구사항 기반으로
필터링된 정보만 보낼 수 있습니다
보시다시피
saveContactInquiryDeatils 메소드를 사용할 때
연락처(contact) 객체(object) 목록을 받게 될 것입니다
입력으로 해당 메소드에서는
이름이 Test가 아닌
contact 객체만 보내고 싶은 상황입니다
예를 들어 누군가
contact 객체 속 Test라는 이름의 contact을 보내려 한다면
해당 데이터를 처리하고 싶지 않기 때문에
받고 싶지 않은 것입니다
이러한 필터링은
@PreFilter 주석의 도움으로 달성할 수 있습니다
물론 해당 @PreFilter 주석을 이용하여
로그인된 유저의 입력만 받는 필터링도 진행할 수 있습니다
따라서 이러한 요구 사항이 있다면
@PreFilter 주석도 이용할 수 있는 것입니다
하지만 놓쳐서는 안될
중요한 사실이 있습니다
@PreFilter 주석은 사용할 때마다
PreFilter하려는 메소드 입력은
반드시 컬렉션 인터페이스
유형이어야 한다는 점입니다
예를 들어 List input, Set input
Map input에만 적용할 수 있는 것입니다
따라서 @PreFilter 주석을
사용할 때는 항상
컬렉션 인터페이스 유형이어야 합니다
그리고 @PreFilter과 유사하게
@PostFilter 주석도 존재합니다
@PostFilter 주석을 이용하여
작성한 메소드의 객체의
필터링 기준 혹은 권한 기준을
시행할 수 있습니다
그리고 @PreFilter와 같이
필터링 조건을 적용할 때
객체는 컬렉션 유형이어야 합니다
작성한 객체에 필터링 조건을
적용하기 위해서는
작성된 객체는 컬렉션 유형이어야 합니다
때문에 이 메소드의 작성된 형식은
Contact 목록입니다
목록이 아니라 단순히 Contact라면
작동하지 않을 것입니다
항상 성립하기 때문입니다
필터링 기준을 적용하고 싶을 때는
목록 또는 세트 내에
데이터의 양이 넉넉해야 합니다
따라서 PostFilter 혹은 PreFilter 사용시에는
필터링하고자 하는 입력 객체
혹은 작성된 객체가
컬레션 인터페이스 유형임을
반드시 확인해야 합니다
그리고 여기는 PostFilter의 도움으로
아무 입력 값이나 허용할 수 있습니다
하지만 이 메소드로 출력을 작성하고 있다면
Contact 객체에만 쓰고
Contact 이름이 'test'와
같지 않도록 확인해야 합니다
Spring 데이터 저장소 메소드에도
PostFilter 주석을 사용할 수 있습니다
예를 들어 한 10개의 연락처 객체 혹은
대출 정보를 다시 전달하려고 한다면
필터링 기준 기반으로
test의 이름으로 된 contact 객체가 있다면
엔드 유저는
8개의 contact 객체만 받게 됩니다
왜냐하면 두개는 PostFilter 속에 정의해둔
기준에 부합하지 않기 때문입니다
이해 되셨기를 바랍니다
다음 수업 때는 이 @PreFilter와
@PostFilter 주석 구현해서
더욱 명확히 이해해 보도록 하겠습니다
그럼 다음 강의 때 뵙겠습니다
감사합니다