Java 14 부터 Record class 가 등장했다. Kotlin의 data class처럼 보일러 플레이트 코드를 제거할 수 있다는 장점이 있다.
실제로 롬복을 사용하면 해결할 수 있지만 라이브러리 도움 없이 Java의 순수한 기능만으로 해결할 수 있음에 사이드 프로젝트에
적용을 했었다. 하지만 추후 캐시 기능을 구현하면서 다음과 같은 에러가 발생했다.
Could not read JSON:Unexpected token (START_OBJECT), expected START_ARRAY: need Array value to contain `As.WRAPPER_ARRAY` type information for class java.lang.Object
해당 문제를 찾아봐도 적당한 해결법을 찾을 수 없었다. 다만 이전과 달라진점은 내가 Record를 쓰기 시작했다는점이었다.
그래서 원인이 될만한 것들을 찾아보다 Record 사용시 임의로 custom constructor를 생성하지 않으면 필드내 지정한 변수들만이 기본 생성자가 되고 나머지 생성자는 존재하지 않는다는 사실을 알게 되었다. 즉 다음과 같이 record 선언한 경우를 예를 들면
public record BoardResponseDto(
String id,
String userId,
String nickname,
String data,
Long cheer
) {
}
해당 record는 생성자를 다음과 같이 갖는다.
var a = new BoardResponseDto("", "", "", "", 0); // OK
var b = new BoardResponseDto() // compile error!!!
즉 내가 custom하게 생성자를 지정해주지 않아서 직렬화/역직렬화시 문제가 생기는것이라 추론을 했다. 실제로 일반적인 class type을 캐싱할때 기본생성자가 없는 경우 에러가 발생하며 캐싱이 되지 않는다. 그래서 기존 Record class를 lombok을 사용한 일반적인 class로 변환을 하였다.
--- after ---
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BoardResponseDto {
private String id;
private String userId;
private String nickname;
private String data;
private Long cheer;
}
그리고 캐시 테스트를 하니 정상적으로 작동함을 알 수 있었다.
'Backend' 카테고리의 다른 글
SQL - 선택조건 조건줄 구현하기 (0) | 2024.04.07 |
---|---|
헥사고날 아키텍처 (1) | 2024.03.17 |
Spring Security 3.x.x h2-console enable Error (0) | 2024.03.03 |
[JAVA]java.lang.OutOfMemoryError: GC overhead limit exceeded 예방법 (java.io 의 close 필요성) (0) | 2024.02.26 |
CacheEvict key 패턴과 매치되는 경우 제거 (1) | 2024.02.25 |