엔티티를 바로 리턴 -> dto로

kkambbak1·2023년 12월 6일
0
package com.ll.netmong.domain.admin.controller;  
  
import com.ll.netmong.common.RsData;  
import com.ll.netmong.domain.reportPost.entity.ReportPost;    
import com.ll.netmong.domain.reportPost.service.ReportPostService;  
import lombok.RequiredArgsConstructor;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
import java.util.List;  
  
@RestController  
@RequiredArgsConstructor  
@RequestMapping("/api/v1/admin")  
public class AdminController {  
  
    private final ReportPostService reportPostService;  
  
    @GetMapping("/reports")  
    public RsData<List<ReportPost>> getReportedPosts() {  
        List<ReportPost> all = reportPostService.findAll();  
        return RsData.successOf(all);  
    }  
}
Hibernate: 
    /* <criteria> */ select
        r1_0.id,
        r1_0.content,
        r1_0.create_date,
        r1_0.modify_date,
        r1_0.report_type,
        r1_0.reported_id,
        r1_0.reporter_id 
    from
        report_post r1_0
Hibernate: 
    select
        m1_0.id,
        m1_0.auth_level,
        m1_0.create_date,
        m1_0.email,
        m1_0.modify_date,
        m1_0.password,
        m1_0.provider_type_code,
        m1_0.real_name,
        m1_0.username 
    from
        member m1_0 
    where
        m1_0.id in (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) 
(through reference chain: com.ll.netmong.common.RsData["data"]->java.util.ArrayList[0]->com.ll.netmong.domain.reportPost.entity.ReportPost["reporter"]->com.ll.netmong.domain.member.entity.Member$HibernateProxy$QmZL6Yqp["hibernateLazyInitializer"])
...

해결: controller에서 리턴값을 dto로 줘야한다.

package com.ll.netmong.domain.admin.controller;  
  
import com.ll.netmong.common.RsData;  
import com.ll.netmong.domain.reportPost.dto.response.ReportPostResponse;  
import com.ll.netmong.domain.reportPost.service.ReportPostService;  
import lombok.RequiredArgsConstructor;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
import java.util.List;  
  
@RestController  
@RequiredArgsConstructor  
@RequestMapping("/api/v1/admin")  
public class AdminController {  
  
    private final ReportPostService reportPostService;  
  
    @GetMapping("/reports")  
    public RsData<List<ReportPostResponse>> getReportedPosts() {  
        List<ReportPostResponse> all = reportPostService.findAllToDto();  
        return RsData.successOf(all);  
    }  
}

쿼리

Hibernate: 
    /* <criteria> */ select
        r1_0.id,
        r1_0.content,
        r1_0.create_date,
        r1_0.modify_date,
        r1_0.report_type,
        r1_0.reported_id,
        r1_0.reporter_id 
    from
        report_post r1_0

결론

jackson 에러 발생

엔티티를 직접 노출하는 것은 좋지 않다.
reporter는 지연 로딩이다. 따라서 실제 엔티티 대신에 프록시로 존재
jackson 라이브러리는 기본적으로 이 프록시 객체를 json으로 어떻게 생성해야 하는지 모름 -> 예외 발생

DTO로 변환해서 반환해야 한다.

프로젝트 진행 중 당연히 dto를 리턴한 줄 알았던 객체가 엔티티였던 건에 대하여

profile
윤성

0개의 댓글