이 험난한 세상에서어어~

[Spring Boot]Could not resolve property 본문

Spring/error

[Spring Boot]Could not resolve property

토끼띠NJW 2023. 5. 21. 21:52

오류 발견 계기

일단 나는 현재 웹소설 연재 플랫폼을 개발중이다(예전부터 써오던 블로그에 들어가면 더 자세하게 그 내용을 볼 수 있음.   https://velog.io/@jy1999/series/HCI-projec). 때문에 소설과 각 챕터 엔티티를 관계지을 때 '1대 다'의 관계로 연결을 해주었다.

 

그리고 나는 어느 특정 소설이 가지고 있는 챕터만 리스트로 받아서 그 내용을 확인하고 싶었다. 때문에 챕터 레파지토리에 아래와 같이 검색 메소드를 jpql 쿼리로 넣어주었는데...

    public List<Chapter> findNovelChapter(Long novelId){
        return em.createQuery("select c from Chapter c where c.novel_id = :id", Chapter.class).setParameter("id", novelId).getResultList();
    }

Could not resolve property라는 오류가 생겼다.

 

오잉?

해결 방법

에러 메시지를 찬찬히 읽어보니 Chapter에서 novel_id를 찾을 수가 없다는 내용이었다. 그래서 Chapter 엔티티로 넘어가서 해당 부분을 확인하고 검색을 했다.

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "novel_id")
    private Novel novel;

이에 대한 해답은 예상보다 간단하게 찾을 수 있었는데, db에는 Chapter에 novel_id로 되어 있지만 실제 클래스에서는 novel로 설정되어 있기에 한 번 더 novel 엔티티를 참조해야 한다는 것이다.

 

그래서 위의 쿼리를 아래처럼 바꿔주었는데도 문제는 계속 되었다.

return em.createQuery("select c from Chapter c where c.novel.novel_id = :id", Chapter.class).setParameter("id", novelId).getResultList();

 

그러나 이번에는 오류 메시지가 위와는 조금 달랐다. 바로 Novel 엔티티에서 novel_id를 찾을 수 없다는 것이었다. 그렇다면 스프링이 Chapter의 novel까지 가는 것은 성공했지만, 그 다음으로 넘어가지 못했다는 의미다.

 

이는 바로 db의 이름을 내가 따로 지정해 줬던 것에 있었다. 먼저 novel 엔티티를 한 번 보자.

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "novel_id")
    private Long id;

위의 코드를 보면 내가 외부서는 id가 아니라 novel_id로 보이기 설정을 해주었다. 그렇기에 나는 당연히 novel_id로 id를 검색하라고 했던 것이다. 그러나, 위의 novel_id는 db에서 쓰이는 컬럼 명이고 내부에서 설정을 해줄 때는 내가 설정한 id로 접근을 해야 한다. 때문에 'c.novel.novel_id'가 아니라 'c.novel.id'로 쿼리를 작성해야 제대로 돌아가는 것이다.

 

제대로 작성한 쿼리

    public List<Chapter> findNovelChapter(Long novelId){
        return em.createQuery("select c from Chapter c where c.novel.id = :id", Chapter.class).setParameter("id", novelId).getResultList();
    }

이렇게 하면 잘 돌아간다.

 

여담

굉장히 간단한 해결 방법이지만, 막상 오류를 접하고 해결하기까지는 시간이 많이 걸렸다. 물론 그 와중에 novel 엔티티의 FK 문제나 클래스 명 고치기 등등 여러 잡다한 오류를 해결하긴 했지만. 그럼에도 위의 오류가 나오면 나중에는 금방 해결할 테니까 매우 뿌듯하긴 하다.

참고한 블로그

 

[SpringBoot] 에러해결: org.hibernate.QueryException: could not resolve property: article_id of: com.example.spring_jpa.Comme

문제/에러 에러로그: org.hibernate.QueryException: could not resolve property: article_id of: com.example.spring_jpa.Comment 설명: hibernate가 특정 property (article_id ) 를 해석할 수 없음 상황 - 아래는 댓글 엔티티이다. 이

i5i5.tistory.com