[참고로 Spring JPA로 구현하는 예시입니다.]
crud를 구현하다보면 service쪽에서 자주 생기는 중복 코드가 있다. 바로!!
User user = userRepository.findById(userId)
.orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다."));
이 친구다.
이 두 줄이 매번 자꾸 쓰이게 되는데 아예 아래에 메서드로 뺄까에 대해서 고민하다가 일단은 해당 로직을 공통 로직으로 분리하지 않고 냅두었다. 좋은 방법에 대해서 좀 더 연구한 후에 수정하기 위함이다.
그런데 오늘 한 가지 방법을 알게 되었다. 이게 좋은 방법이라는 뜻은 아닌데, 보통은 service로직에서 분리해서 작성하는 것으로 생각하게 되는데 repository에 따로 이 로직을 검증할 거라고 생각을 못했어서 요 방식에 대해서 가볍게 작성해보겠다.
주의사항: 내 코드의 경우 거의 다 서비스 로직에서 해당 유저를 검증하는 편이라 코드의 규칙이랄까? 조금 깨질 수 있지만 그냥 그렇구나 정도로 알아가두면 좋을 거 같다.
위에서 소개한 userRepository에서 userId를 통해 User 객체를 가져오는 로직이 사실은 단순히 유저가 존재하는지 아닌지에 대해서만 알고 싶었던 로직인 경우도 있다. 즉, User user를 따로 사용하지는 않고 해당 유저의 여부만 알고 싶을 경우를 말하는 것이다.
이런 경우에 UserRepository에서는 default 접근 지정자와 void의 반환타입으로 해당 로직을 처리해볼 수도 있다. 그러면 각각의 파일에는 코드가 아래와 같이 작성이 된다.
// UserRepository.java
default void checkUserId(Long userId) {
findById(userId)
.orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다." + userId));
}
// FollowRepository.java
userRepository.checkUserId(userId);
이렇게 되면 해당 userRepository의 의존성만 주입받아 유저의 여부를 확인하기 편해질 거 같다. 그냥 생각치 못한 방법이라 신기해서~~ 적는 글이다.