프로젝트에서 유저가 작성한 구매 폼을 조회하는 API를 구현하던 중 로직에 대한 고민이 들었다.
해당 구매 폼은 폼을 작성한 작성자만 조회할 수 있어야 하므로 memberId를 이용해 로그인한 유저와 작성자가 일치하는지 확인하는 로직이 필요했는데 이 때, JPA 레포지토리에서 조회 시 memberId를 같이 조회하는 것이 좋을지 아니면 폼을 조회해온 후 로그인한 유저와 일치하는 memberId인지를 확인하는 로직을 분리하는 것이 좋을지에 대한 고민이 들었다.
우선 첫 번째 방법은 다음과 같다.
PurchaseForm purchaseForm = purchaseFormRepository
.findByIdAndMemberId(purchaseFormId, memberId)
.orElseThrow(() -> new GlobalException(NOT_FOUND_FORM));
이 방법의 장점은 코드가 더 간결하고 쿼리 수가 적다는데 있다. 구매폼 조회시 memberId까지 같이 파라미터로 전달하여 조회하므로 일치하는 유저가 아닐 경우 아예 조회가 되지 않는다.
다만 경우 유저가 일치하지 않아도 NOT_FOUND_FORM 에러가 발생하므로 구매폼이 존재하지 않는다는 것인지 유저가 일치하지 않는다는 것인지 알 수 없다.
두 번째 방법은 이를 분리하는 것이다.
PurchaseForm purchaseForm = purchaseFormRepository
.findById(purchaseFormId, memberId)
.orElseThrow(() -> new GlobalException(NOT_FOUND_FORM));
if (!purchaseForm.getMemberId().equals(memberId)) {
throw new GlobalException(UNAUTHORIZED_MEMBER);
}
이 경우 purchaseForm이 존재하지 않을 경우 NOT_FOUND 예외를, 로그인 유저와 폼 작성자가 일치하지 않을 경우 UNAUTHORIZED 예외를 던지게 된다. 더 명확하고 유연한 코드 작성이 가능하지만 if문에서 추가 쿼리가 실행된다.
우선은 쿼리가 한 번 더 실행되더라도 명확하게 코드를 작성하기 위해 방법2를 택하였다. 더 나은 방법에 대한 고민이 필요할 것 같다.