2023. 8. 24. 22:06ㆍ[WEB]/[React-Spring] TeamHs
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'commentController': Unsatisfied dependency expressed through field 'commentService': Error creating bean with name 'commentService': Unsatisfied dependency expressed through field 'commentRepository': Error creating bean with name 'commentRepository' defined in com.teamhs.community.repository.CommentRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract java.util.List com.teamhs.community.repository.CommentRepository.findAllByBoard(java.lang.Long); Reason: Failed to create query for method public abstract java.util.List com.teamhs.community.repository.CommentRepository.findAllByBoard(java.lang.Long); Can't compare test expression of type [Board] with element of type [basicType@14(java.lang.Long,-5)]
게시글에 Board_id를 이용해 해당 게시글의 댓글을 불러오는 과정에서 계속해서 이런 문제가 발생했고, 레포지토리나 다른 파일들에는 문제가 없어 보였다.
@Repository
public interface CommentRepository extends JpaRepository<Comment, Long> {
List<Comment> findAllByBoard(Long boardId);
}
public List<Comment> getCommentsByBoardId(Long boardId) {
return commentRepository.findAllByBoard(boardId);
}
계속해서 풀리지 않고, 나는 혹시나 엔티티 문제인가? 싶어서
이 쪽을 계속해서 수정하고 Repository 쪽도 계속해서 수정했는데 문제가 풀리지 않았다.
ManyToOne 어노테이션 문제인가 싶어 이 쪽을 유심히 보았다.
package com.teamhs.community.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDate;
@Entity
@Table(name = "comment")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-increment
private int commentId;
@Column(nullable = true)
private String userId;
@ManyToOne
@JoinColumn(name = "boardId")
@JsonIgnore
private Board board;
@Column(nullable = true)
private String commentContent;
@Column(nullable = true)
private LocalDate commentDate;
}
package com.teamhs.community.domain;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "board")
@Getter
@Setter
@AllArgsConstructor @NoArgsConstructor
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-increment strategy
private int boardId;
@Column(nullable = true)
private String userId;
@Column(nullable = true)
private int cateId;
@Column(nullable = true)
private String boardTitle;
@Column(nullable = true)
private String boardContent;
@Column(nullable = true)
private LocalDate boardDate;
@Column(nullable = true)
private int boardRecom;
@Column(nullable = true)
private int boardCnt;
@Column(nullable = true)
private int commentCnt;
@OneToMany(mappedBy = "board", cascade = CascadeType.ALL)
private List<Comment> comments = new ArrayList<>();
}
해결
하지만 원인은 따로 있었다.
Repository에 findAllByBoard를 findAllByBoard_boardId로 변경해주니 에러가 발생하지 않았다.
우선 내 코드에서 Board엔티티와 Comment엔티티는 ManyToOne 어노테이션으로 일대다 관계로 매핑되어 있다.
이는 하나의 Board 엔티티가 여러 개의 Comment 엔티티를 가질 수 있다는 뜻이다.
나는 board_id를 통해 해당 게시글의 댓글을 조회하려 했고, 이를 조회하는데 JPA에서 쿼리를 생성하는 도중에 문제가 발생한 것이다.
이를 찾아보니 JPA는 메소드 이름으로 쿼리를 생성할 때, 엔티티간의 관계를 "_"를 이용하여 표현한다고 한다.
따라서 내가 친 코드의 뜻은 아래와 같다.
- findAllByBoard : Board 엔티티에 관련된 모든 엔티티를 조회
- findAllByBoard_boardId : Board 엔티티의 boardId 필드를 이용하여 관련된 모든 엔티티를 조회
만약 findAllByBoard로 쿼리를 생성하려고 할 경우, JPA는 Board 엔티티에 관련된 모든 엔티티를 조회하려고 하지만, 엔티티에는 Board와 관련된 정보가 없기 때문에 이에 맞는 쿼리를 생성할 수 없다고 한다.
따라서 이러한 경우에는 _boardId를 이용하여 명확한 연관관계를 표현하는 것이 중요하다.
게시글에서는 기본적으로 제공하는 save, findById, findAll 등을 사용했지만 이번에는 게시글 번호를 이용해 해당 댓글들을 찾아와야하는 작업이기 때문에 직접 Repository에 만들어줬다. 이 과정에서 "_"로 식별한다는 것을 알게됐고 결국 아이디 값을 찾지 못해서 JPA가 쿼리생성 중에 에러가 발생한 것이다.
결과화면
'[WEB] > [React-Spring] TeamHs' 카테고리의 다른 글
개발 진행도 (0) | 2023.08.24 |
---|---|
Spring JPA: 어노테이션(@) 정리 (0) | 2023.08.24 |
useNavigate() 에러 해결 (0) | 2023.08.23 |
페이지 이동 Route (0) | 2023.08.15 |
2023-08-15 (0) | 2023.08.15 |