서론

org.springframework.data.mapping.model.MappingInstantiationException: 
Failed to instantiate com.example.springwebflux.domain.feed.router.dto.response.QueryFeedList$FeedElement 
using constructor fun `<init>`(java.util.UUID, kotlin.String, kotlin.String, kotlin.String): 
com.example.springwebflux.domain.feed.router.dto.response.QueryFeedList.FeedElement with arguments 
74e4f5ea-6a29-42ba-a78f-8d42c71599a1,asdfjk,asdflj,null at org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator$EntityInstantiatorAdapter.createInstance(ClassGeneratingEntityInstantiator.java:278) 
~[spring-data-commons-3.1.3.jar:3.1.3] Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:

jpql을 사용해 쿼리하던 도중 다음과 같은 에러가 발생했다.


발생한 이유

data class QueryFeedList(
    val feedList: List<FeedElement>,
) {
    data class FeedElement(
        val id: UUID,
        val title: String,
        val content: String,
        val name: String, // 기존에는 userName이었음
    )
}
@Query(
        """
            select 
            f.id,
            f.title,
            f.content,
            u.name
            from tbl_feed as f
            inner join tbl_user as u 
                on f.user_id = u.id
        """
    )
suspend fun queryAllFeed(): Flux<FeedElement>

저기 FeedElement의 값이 f.~, u.~해서 조회하는 값이랑 똑같아야 JPQL이 제대로 만들어진다.

느낀 점

querydsl-jpa를 쓸 때는 dto의 실제 이름과는 상관 없었기 때문에

컬럼에 테이블 이름을 굳이 나타낼 필요가 없었는데 R2DBC를 쓸 때는 jpql을 써야하기 때문에

컬럼에 테이블 이름을 나타내는 것도 필요하겠다 생각했다.