InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer
(fetch = FetchType.LAZY)
이므로 지연 로딩 설정이 된다.@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Item {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "brand_id")
private Brand brand;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "coordinate_look_id")
@JsonIgnore
private CoordinateLook coordinateLook;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id")
private Category category;
지연 로딩 (LAZY)
엔티티 A와 연관관계인 B를 조회할 때, 실제 엔티티 객체 대신에 가짜 객체인 프록시 객체를 조회한다.
이를 통해 실제 엔티티가 사용될 때까지 데이터베이스 조회를 지연시킬 수 있다.
즉시 로딩 (EAGER)
엔티티 A와 연관관계인 B를 조회할 때, 실제 엔티티 객체를 Outer Join을 사용하여 한 번에 조회한다.
Outer Join을 통해 A를 조회 할 때마다 B도 함께 가져오게 되면 많은 양의 데이터를 처리하게 되고, 많은 시간과 리소스를 소비하게 된다.
이처럼 즉시 로딩은 성능 저하를 야기할 수 있으므로 적절한 해결 방법이 아니다.
DTO 추가
@Data
@NoArgsConstructor
public class CoordinateLookDto {
private Long id;
private String title;
private String image;
private List<ItemDto> items;
@Data
@NoArgsConstructor
public class ItemDto {
private Long id;
private String title;
private String sales_link;
private String image
private Long brandId;
private Long categoryId;
DTO 형식으로 반환하도록 Controller 수정
@GetMapping("/{id}")
public ResponseEntity<CoordinateLookDto> getCoordinateLook(@PathVariable Long id) {
Optional<CoordinateLook> optional = Optional.ofNullable(coordinateLookAdminService.findById(id));
return optional.map(coordinateLook -> {
CoordinateLookDto coordinateLookResponseDto = coordinateLookAdminService.convertToResponseDto(
coordinateLook);
return ResponseEntity.ok(coordinateLookResponseDto);
}).orElse(ResponseEntity.notFound().build());
}
위와 같이 Response DTO를 생성하여 반환하는 방식으로 Jackson Serialize 에러를 해결하였다.
https://offetuoso.github.io/blog/develop/troubleshooting/jpa/no-serializer-found-for-class/