📢 오늘의 목표 📢
✔️ 알고리즘, SQL 문제 풀이
✔️ 알고리즘 코드카타
✔️ SQL 코드카타
✔️ 프로그래머스 Level 2
✔️ 스프링 개인 과제
✔️ 7, 8, 9단계
⏱️ 오늘의 일정 ⏱️
9:00 ~ 10:00 - 알고리즘 코드 카타
10:00 ~ 10:30 - 팀 회의
10:30 ~ 11:00 - 스프링 개인 과제
11:00 ~ 12:00 - 필터 특강
12:00 ~ 13:00 - 스프링 개인 과제
13:00 ~ 14:00 - 점심시간
14:00 ~ 18:00 - 스프링 개인 과제
18:00 ~ 19:00 - 저녁 시간
19:00 ~ 20:00 - 스프링 개인 과제
20:00 ~ 21:00 - TIL 작성
📜 Chapter 1. refresh token
refresh token에 대해서는 아는 바가 전혀~ 없어서 어디서부터 만들어야 할지 고민되었으나,
https://www.youtube.com/@xxxjjhhh/videos
전에 팀원에게 추천받았던 이 분 강의를 보며 만들어 보았다!
@PostMapping("/user/reissue")
public ResponseEntity<?> reissue(HttpServletRequest request, HttpServletResponse response) {
//get refresh token
String refreshtoken = request.getHeader(JwtUtil.REFRESH_TOKEN_HEADER);
if (refreshtoken == null) {
return new ResponseEntity<>("refresh token이 없습니다.", HttpStatus.BAD_REQUEST);
}
// 유효성 체크
try {
jwtUtil.validateToken(refreshtoken);
} catch (ExpiredJwtException e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
String username = (String) jwtUtil.getUserInfoFromToken(refreshtoken).get("sub");
UserRoleEnum role = UserRoleEnum.valueOf((String) jwtUtil.getUserInfoFromToken(refreshtoken).get("auth"));
// 엑세스 톸큰 새로 만들어 헤더에 등록
String newAccess = jwtUtil.createToken(JwtUtil.ACCESS_TOKEN_HEADER, username, role, 600000L);
response.setHeader(JwtUtil.ACCESS_TOKEN_HEADER, newAccess);
return new ResponseEntity<>("refresh token 발급 성공", HttpStatus.OK);
}
나는 헤더에 Access, Refresh 토큰을 둘 다 등록했다.
그리고 토큰을 갱신하는 역할은 클라이언트가 할 것이기 때문에 재발급해주는 api만 작성해 주었다.
null체크, 유효성 체크를 하고 Refresh 토큰의 정보로 엑세스 토큰을 새로 만들어 발급한다.
개발자 유미님 영상이 정말 많이 도움이 되었기 때문에, 과제를 다 마치면 남는 시간동안 정주행 해야겠다~
📜 Chapter 2. 필드가 하나 뿐인 DTO의 생성자
아주 별 것 아닌 놈 때문에 몇 시간을 고생했는지 모른다.
분명 똑같은 로직을 타는데 일정 작성은 되고 댓글 작성은 안 되는 걸까!
Error가 JwtAuthenticationFilter에서 발생하였기 때문에 원인 파악 하는 것도 오래걸렸다...
(Warning을 잘 봤으면 이런 일 안 생기는 건 맞음.)
https://beaniejoy.tistory.com/76
일단 이 사람의 json 직렬화, 역직렬화에 대한 글을 보고오자.
@Getter
@AllArgsConstructor
public class CommentRequestDto {
@NotNull
@Size(min = 1, max = 500)
private String contents;
public Comment toEntity(Schedule schedule, String username) {
return Comment.builder()
.contents(contents)
.username(username)
.schedule(schedule)
.build();
}
}
문제는 바로 이 필드가 하나 뿐인 Dto 때문이었다.
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `...MemberConstructorDto` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
인자가 한 개인 생성자의 경우 ObjectMapper가 모듈을 등록해도 역직렬화를 해주지 못한다.
해결 방법은
@NoArgsConstructor
기본 생성자를 추가해주는 것이다.
원래 Jackson은 기본생성자로 역직렬화를 시켜준다.
jackson-module-parameter-names 모듈 덕분에 파라미터가 있는 생성자로도 가능했던 것...
🌙 오늘을 마치며 🌙
앞으로는 TIL에 딱 필요한 것만 기재하려고 한다.
일단 새로운 것을 배우기보단 과제를 하는 중이기도 해서 오늘은 겪었던 어려움만 얘기하였다.