Comment entity
data.sql로 추가한 4번 게시글의 댓글들 SELECT
/entity/Comment.java
id : Long
article : Article (@ManyToOne)
nickname : String
body : String
1:n
해당 comment 엔티티 여러개가 하나의 Article에 연관된다.
일대다 : 한개의 게시글에 여러개의 댓글
name="article_id"
해당 컬럼에 Article의 대표값을 저장
(즉, FK로 지정)
@ToString
@Entity
@AllArgsConstructor
@Getter
@NoArgsConstructor
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "article_id")
private Article article;
@Column
private String nickname;
@Column
private String body;
}
//import 생략
댓글 리포지토리는 JPA리포지토리를 상속받았다.
Jpa리포지토리는 데이터 CRUD, 데이터 정렬 등의 기능을 지원한다.
사진 출처 : https://cloudstudying.kr/lectures/484
public interface CommentRepository extends JpaRepository<Comment, Long> {
//1번째 방법. 어노테이션을 이용
//특정 게시글의 모든 댓글
@Query(value =
"SELECT * " +
"FROM comment " +
"WHERE article_id = :articleId",
nativeQuery = true)
List<Comment> findByArticleId(@Param("articleId")Long articleId);
//2번째 방법. xml을 이용
//특정 닉네임의 모든 댓글
List<Comment> findByNickname(String nickname);
}
리포지토리에 sql을 직접 작성해주는 방법을 nativeQuery라고 한다.
네이티브 쿼리 작성에 두가지 방법을 사용해 보았다.
@Query 어노테이션을 이용하여 sql문 작성.
articleId를 찾지 못할 경우 @Param 어노테이션을 붙여준다.
<?xml version="1.0" encoding="utf-8" ?>
<entity-mappings xmlns="https://jakarta.ee/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence/orm
https://jakarta.ee/xml/ns/persistence/orm/orm_3_0.xsd"
version="3.0">
<named-native-query
name="Comment.findByNickname"
result-class="com.example.firstproject.entity.Comment">
<query>
<![CDATA[
SELECT
*
FROM
comment
WHERE
nickname = :nickname
]]>
</query>
</named-native-query>
</entity-mappings>
그 전의 test 코드처럼 @SpringBootTest로 할 수도 있지만 Repository test임으로 JPA와 연동한 테스트를 의미하는 @DataJpaTest를 해주었다.
@DataJpaTest //jpa와 연동한 테스트
class CommentRepositoryTest {
@Autowired
CommentRepository commentRepository;
@Test
@DisplayName("Test01")
void findByNickname() {
//특정 닉네임의 모든 댓글을 조회하는 test
//입력 데이터 준비
String articleNickname= "Ang";
//실제 수행
List<Comment> comments = commentRepository.findByNickname(articleNickname);
//예상
Comment a = new Comment(3L,new Article(4L,"Name",".."),articleNickname,"mond");
Comment b = new Comment(6L,new Article(5L,"Age",".."),articleNickname,"5");
Comment c = new Comment(9L,new Article(6L,"Call_num",".."),articleNickname,"012");
List<Comment> expected = Arrays.asList(a, b, c);
//검증
assertEquals(expected.toString(), comments.toString(),"Ang님의 모든 댓글 조회 !");
}
}
테스트 결과에 보여줄 이름