뉴스피드 프로젝트를 진행하는 중에 Postman으로 http요청을 보내는데 자꾸 에러가 뜨면서 진행이 되지 않았다.
결론적으로 말하자면 굉장히 많은 문제들이 겹쳐있어서 한 가지만 해결해서 될 문제가 아니었다. 일단 로그를 보면서 하나씩 해결해 나가기로 했다.
1.Validation
첫 번째는 내가 정한 Email의 형식을 지키지 않은 형태의 데이터값이 넘어와 데이터 검사에서 걸린 것이다.
이는 다시 형식에 맞춰 보내니 해결되었다.
2. 토큰검증 시 예외발생
요청헤더에 토큰을 담아 보내는데 자꾸 예외가 발생했다. 그래서 토큰 관련 메서드를 보면서 잘못작성한 코드가 있는지 확인해 봤다.
// 토큰 생성 메서드
public String createToken(String userId){
Date date = new Date();
long TOKEN_TIME = 1000*60*60;
return BEARER_PREFIX +
Jwts.builder()
.setSubject(userId)
.setExpiration(new Date(date.getTime()+TOKEN_TIME))
.setIssuedAt(date)
.signWith(key, signatureAlgorithm)
.compact();
}
//토큰 추출 메서드
public String resolveToken(HttpServletRequest request) {
String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
if(StringUtils.hasText(bearerToken) && bearerToken.startsWith(BEARER_PREFIX)){
return bearerToken.substring(7);
}
return null;
}
이 두 메서드를 확인하면서 둘러보던 중에 잘못된 부분을 발견했다.
public static final String BEARER_PREFIX = "Bearer"; // "Bearer " 가 되야함
bearerToken에서 앞부분을 떼어내기 위해 substring을 사용했는데 index가 잘못 설정되어 있었다. BEARER_PREFIX의 값에 공백을 넣어서 수정하거나 index를 6으로 설정해야 했다.
3. final
@Service
@RequiredArgsConstructor
public class MemberDetailsService {
private MemberRepository memberRepository; // -> private final MemberRepository memberRepository;
public UserDetails getMemberDetails(String userId){
Member member = memberRepository.findByUserId(userId)
.orElseThrow(() -> new UsernameNotFoundException("Not Found" + userId));
return new MemberDetailsImpl(member);
}
}
로그에서 자꾸 memberRepository가 null이라고 한다. 그래서 찾아보니 MemberRepository 객체 앞에 final 이 없어서 의도했던 객체를 참조할 수 없었던 것 같다. 그래서 final을 붙여주니 문제가 해결되었다.
'개발일지' 카테고리의 다른 글
20231128 - 세 번째 팀 프로젝트를 마치며 (0) | 2023.11.28 |
---|---|
20231127 - redis 사용법 (0) | 2023.11.27 |
개발일지 24 - Validation (0) | 2023.11.20 |
개발일지 23 - @PathVariable, @RequestBody (0) | 2023.11.16 |
개발일지 22 - 현재까지 자주 사용하고 있는 어노테이션 (0) | 2023.11.15 |