spring boot #13

·2022년 5월 5일
0

spring

목록 보기
14/22

💬 게시글의 댓글 entity

Comment entity

data.sql로 추가한 4번 게시글의 댓글들 SELECT

💬 comment entity

/entity/Comment.java

id : Long
article : Article (@ManyToOne)
nickname : String
body : String

▪ @ManyToOne

1:n
해당 comment 엔티티 여러개가 하나의 Article에 연관된다.
일대다 : 한개의 게시글에 여러개의 댓글

primary key : 본인의 아이디 PK

foregin key : 대상을 가르키는 아이디 FK

▪ @JoinColumn(name = "")

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 생략

💬 comment repository

댓글 리포지토리는 JPA리포지토리를 상속받았다.

▪ JpaRepository

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);
}

▪ nativeQuery

리포지토리에 sql을 직접 작성해주는 방법을 nativeQuery라고 한다.
네이티브 쿼리 작성에 두가지 방법을 사용해 보았다.

1. @Query로 작성

@Query 어노테이션을 이용하여 sql문 작성.

articleId를 찾지 못할 경우 @Param 어노테이션을 붙여준다.

2. 네이티브 쿼리을 xml 파일로 작성

<?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>

💬 comment test

▪ @DataJpaTest

그 전의 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님의 모든 댓글 조회 !");
    }
}    

▪ @DisplayName

테스트 결과에 보여줄 이름

0개의 댓글

관련 채용 정보