1. JWT 토큰의 처리 로직은 Controller단에 존재해야 한다.
2. 토큰 체크 로직이 겹쳐서는 안된다.
아래와 같이 바꾸기로 했다.
위처럼 Service에서는 그 기능에 해당하는 역할만 해야 자연스러울 것이다. 이것을 위해 만들어낸 클래스가 아래와 같다.
@RequiredArgsConstructor
@Component
public class CheckUtil {
private final JwtUtil jwtUtil;
private final UserRepository userRepository;
public User tokenChecker(HttpServletRequest request) {
String token = jwtUtil.resolveToken(request);
Claims claims;
if (token != null) {
if (jwtUtil.validateToken(token)) {
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "토큰 에러입니다");
}
return userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new ResponseStatusException(HttpStatus.BAD_REQUEST, "사용자가 존재하지 않습니다")
);
} else throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "토큰 에러입니다");
}
}
프로젝트에 util이라는 pakage를 추가하고 그 안에 controller, 혹은 service에서 쓰이는 로직을 담아놨다. 이 로직은 서비스단에서가 아닌, 컨트롤러 단에서 다음과 같이 쓰인다.
MemoController에서 쓰이는 모습. @RequiredArgsConstructer어노테이션을 달고, 필드에 private final CheckUtil 와 같이 선언해줌으로써 의존성 주입을 했다.
또한 이 CheckUtil은 다른 컨트롤러에서도 사용될 수 있다.
토큰의 검증은 Util로 만들고, 그것을 의존성 주입으로 사용하는 것이 더 편하다. 더불어 더 간결하고 아름답다.
controller에서 토큰의 검증이 이루어져야 한다. Service는 로직만 제공한다.