오늘의 회고에서는 feign 요청을 하면서 에러가 났던 부분에 대한 이야기를 해보려고 한다.
해당 서비스에서 직접 요청을 하는 건 당연히 잘 받아오는 데
클라이언트가 내 서비스를 이용하기 위해서 내부적으로 내가 클라이언트가 되어 옆 서비스에 요청하는 거에서 io.jsonwebtoken.MalformedJwtException 오류가 났다
코드를 보면
1) Controller 부분
@GetMapping("/jira/project-list")
@ApiOperation(value = "우리 서비스와 연동할 JIRA 프로젝트 목록 가져오기")
public ResponseEntity<List<JiraProjectResponse>> getProjectList(
@LoginUser User user,
@RequestHeader HttpHeaders headers
) {
List<JiraProjectResponse> responses = issueService.getProjectList(
user,
headers.get(HttpHeaders.AUTHORIZATION)
);
return ResponseEntity.ok()
.body(responses);
}
클라이언트한테 요청을 받을 때 headers를 가져온다. 왜냐하면 feign으로 요청할 때 @LoginUser User user 이 자체를 넘기지 않고 accessToken 값을 String으로 보내기 위해서다
2) Service 부분
@Override
public List<JiraProjectResponse> getProjectList(User user, List<String> auths) {
// 에러 나는 부분!
TokenResponse jira = authServiceClient.getToken(auths, "jira");
String jiraBase64 = "Basic " + Base64Utils.encodeToString((jira.getEmail() + ":" + jira.getValue()).getBytes());
return jiraFeignClient.getProjectList(jiraBase64);
}
authService에 feign으로 토큰을 받아오는 요청을 보낼 때 에러가 난 것이다.
검색을 해보니 아래와 같은 블로그를 찾을 수 있었고, 토큰 앞에 붙어 있는 Bearer 를 떼서 줘야한다고 나와 있었다.
[springboot] Java io.jsonwebtoken.MalformedJwtException: Unable to read JSON value:
auths 에 accessToken이 담겨있는데 여기에 Bearer 를 빼고 보내줘야 한다!
그런데 그냥 @LoginUser User user 얘를 그대로 보내주면 어떨까 라는 생각이 들었다.
그 결과 해당 오류는 사라졌다! 대신 나타난 것은
405 Method not allowed
아래 블로그에서 말하길 “feign 요청은 post형태라서 RequestParam 혹은 RequestBody을 붙여야한다”고 말하고 있었다.
4. 그레이들 멀티프로젝트 - 유레카서버와 페인클라이언트 Eureka FeignClient
@FeignClient(name = "auth-service", url = "http://localhost:8000/auth-service")
public interface AuthServiceClient {
@GetMapping("/tokens/{tokenCodeId}")
TokenResponse getToken(
@LoginUser User user,
@PathVariable(name = "tokenCodeId") String tokenCodeId
);
}
나는 해당 오류가 나는 이유를 @Pathvariable 을 사용해서 라고 생각했다.
왜냐하면 token 관련 오류를 @LoginUser 로 해결했다고 생각했기 때문이다.
그래서 @Pathvariable 이 친구를 @RequestBody 로 고쳤더니 파라미터가 많다고 뭐라 해댔다.
@RequestParam 으로 고쳤을 때는.. 기억이 안나지만 해결이 안되긴 했다..!
하지만 진호 팀원이 나를 도와주러 와서 했던 이야기는
@LoginUser 얘가 객체라서 Post로 인식해서 405가 뜨는 것 같다고 얘기했다.
그래서 그냥 Bearer 을 떼고 테스트를 했는데.. 바로 되는 것 ㅠㅠㅠ

왜 나는 User 객체가 앞에 @LoginUser 어노테이션을 가지고 있다는 이유 만으로 왜 얘가 body에 들어가야 하는 객체라는 것을 그냥 놓쳐버렸다!
그래서 내가 해결하고자 생각했던 방법은 service 클래스 내에 private 메서드를 하나 만들어서 헤더에서 값을 꺼내 Bearer 을 때서 String 으로 보내줄 생각을 했었다.
아래처럼!
private static String splitBearer(List<String> auths) {
return auths.get(0).replace("Bearer ", "");
}
그런데 또 진호팀원이 아예 이런 작업이 필요없도록 코드를 작성해주었다.
쨌든 여기서 말하고자 하는 바는
****내가 무엇을 놓치고 있는지 명확히 파악하는 것이 중요하다!**** 라는 것
프로젝트 생성시에 1. 이미지 파일 업로드와 2. 프로젝트 정보를 동시에 요청하기 때문에
@RequestBody가 아니라 @RequestPart 로 보내야 한다
postman으로 요청할 때 나는 평소처럼 Body > raw > JSON 으로 요청을 했는데 되지 않아 질문을 했더니
아래처럼 요청을 해야 하는 것이라는 가르침을 받았다!
form-data로 해서application/json으로
프로젝트의 토큰을 등록/수정 하는 메서드에서 요청이 제대로 반영되지 않았는데
그 원인은 @Transactional 어노테이션을 붙이지 않았기 때문..!? 이라고 한다!
아직 명확한 이유를 알 수는 없으나 혹시 나중에 이런 오류가 날 때 기억이 났으면 하는 마음에 기록해둔다!