사용환경

  • MacBook Air (M1, 2020) 16GB
  • OpenJDK 11
  • IntelliJ IDEA Community


에러의 발생

QueryException could not resolve property : column of entity
  • API 서버를 만들면서 모든 파라미터를 정확하게 작성했다고 생각했는데 이런 오류 메세지가 나오면서 응답에 대한 요청을 보내지 못하는 것이었다. 500에러 한가득 받음…
  • 내가 원해던 것은 /diaries/{id} URL로 회원의 아이디를 적어 보내면 해당 회원이 작성한 일기 전체 목록을 응답하는 서버였다.


문제 해결

  • 원인은 쿼리를 잘못 작성한 것이었다…
  • 쿼리문의 where절에 회원의 아이디를 매핑하는 부분에서 매핑할 컬럼명을 잘못 작성한 것이 원인이었다.
@Entity
@Getter
@NoArgsConstructor
public class Diary {
    @JoinColumn(name = "member_id", nullable = false)
    @JsonIgnore
    private Member member;
}
  • 일기 엔티티에서 회원 엔티티를 외래키로 설정하면서 컬럼이름을 member_id라고 지정해서 테이블에는 member_id라는 이름으로 생성되었다.

select d from Diary d where d.member_id = :member_id

  • 그래서 당연히 이런 쿼리를 작성했다. 하지만 나를 맞이하는 오류 메세지

  • 구글링 결과 쿼리문 내의 컬럼 값을 실제 테이블의 컬럼 이름이 아닌 엔티티 내의 필드명으로 입력을 해 주어야 했다.

@Entity
@Getter
@NoArgsConstructor
public class Member {

    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    public Member(String name) {
        this.name = name;
    }

    @Column(nullable = false)
    private String name;
    private String password;
}
  • 일기 엔티티에서는 위와 같이 구성된 회원 엔티티를 필드값으로 사용하고 있었기 때문에 회원.id로 매핑을 해 주어야 했던 것이다!

select d from Diary d where d.member.id = :member_id

  • 즉 쿼리문을 이렇게 작성하는 것이 올바른 것이었다. 이렇게 수정 후 정상 작동되는 것을 확인할 수 있었다.


정리

  • 처음에는 쿼리문을 올바르게 작성했다고 생각했기 때문에 오류 메세지를 납득할 수 없었다. 왜 프로퍼티를 찾지 못하는 것일까?
  • 하지만 역시 구글에는 없는 것이 없었고 이내 Querydsl을 잘못 알고 있었다는 것을 알 수 있었다. 이름이 비슷할 뿐 실제 SQL 쿼리문은 아니며 JPA를 위한 쿼리문인 만큼 작성하는 관점 자체가 DB 테이블이 아닌 엔티티여야 한다는 것을 깨달았다.


참고

@Query : QueryException could not resolve property : column of entity