일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 구현
- mysql
- LEVEL1
- CSS
- LCS
- 오류
- leetcode
- PYTHON
- 백준
- gold5
- error
- Kakao
- jpa
- spring
- 프로그래머스
- AWS
- leetcode 69
- 백엔드
- Gold4
- 개념
- 9252
- java
- 배포
- glod4
- glod5
- Thymeleaf
- gold2
- HTML
- siver3
- LEVEL2
- Today
- Total
이 험난한 세상에서어어~
[Spring Boot]Could not resolve property 본문
오류 발견 계기
일단 나는 현재 웹소설 연재 플랫폼을 개발중이다(예전부터 써오던 블로그에 들어가면 더 자세하게 그 내용을 볼 수 있음. 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 문제나 클래스 명 고치기 등등 여러 잡다한 오류를 해결하긴 했지만. 그럼에도 위의 오류가 나오면 나중에는 금방 해결할 테니까 매우 뿌듯하긴 하다.
참고한 블로그
'Spring > error' 카테고리의 다른 글
thymeleaf, Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long' (0) | 2023.07.10 |
---|---|
Package name does not correspond to the file path 오류 (0) | 2023.06.29 |