[스프링부트] 글 목록 보기 쿼리 테스트

익명 블로그 V1 - 7
이나겸's avatar
Nov 18, 2024
[스프링부트] 글 목록 보기 쿼리 테스트

[익명 게시글을 쓰는 블로그 만들기 7]


BoardRepository 클래스

  • .getResultList() : 결과를 컬렉션(List)로 알아서 받아줌
package com.example.blog.Board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; @RequiredArgsConstructor // final이 붙어있는 필드에 대한 생성자를 만들어줌 @Repository public class BoardRepository { // JPA는 EntityManager로 DB에 접근(Java에서의 DBConnection) private final EntityManager em; public List<Board> findAll() { // Board.class => Board 클래스에 mapping Query q = em.createNativeQuery("select * from board_tb order by id desc", Board.class); // q.getResultList() : 결과를 컬렉션(List)로 알아서 받아줌 return q.getResultList(); } }
 

쿼리 테스트 - BoardRepository 테스트

src - test - java - com.example.blog 패키지 - board 패키지 생성 - BoardRepositoryTest 클래스 생성 (테스트 클래스)

  • 테스트 파일(클래스) 이름 끝에 Test 붙이는게 약속 (컨벤션) ⇒ 구분을 하기 위함
  • 테스트할 메소드 이름 끝에 _test붙이는게 약속 (컨벤션)
  • 테스트 코드에서의 의존성 주입 (DI, Dependency Injection)
    • 테스트 클래스는 new가 안돼서 생성자로 의존성 주입 불가능
    • 의존할 클래스(테스트할 클래스)를 필드 선언 후 @Autowired 이용해서 의존성 주입 ⇒ 이 경우 BoardRepositoty 클래스를 의존하기 때문에 그 안에 있는 메소드들은 다 테스트 가능
  • 테스트 코드에서는 의존성 주입해놓아도 테스트 메소드 파라메터에 매개변수로는 안 넣음
    • 테스트는 JVM이 실행하기 때문에 제어가 안됨 (테스트 코드 문법 주의점)
  • @Test : 테스트할 메소드 / 테스트할 자체 스레드 생성됨

테스트 3단계 : given - when - then(초보자들은 eye)

  • given : 테스트할 메소드의 파라미터
    • 이 경우 테스트할 BoardRepository의 findAll() 메소드의 파라미터에는 매개변수가 없어서 given 생략 가능
  • when : 테스트할 메소드 ⇒ boardRepository.findAll()
  • tnen : 상태 검증하는 곳
  • eye(눈으로 보다) : 초보자들은 눈으로 봐야하므로 then보다는 eye를 해보는것이 적합
package com.example.blog.board; import com.example.blog.Board.Board; import com.example.blog.Board.BoardRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; import java.util.List; // 테스트 파일은 이름끝에 Test 붙이는게 약속(컨벤션) @Import(BoardRepository.class) // BoardRepository 클래스를 import해서 띄움 @DataJpaTest // DB 관련된 자원들을 메모리(IOC)에 올림 public class BoardRepositoryTest { // 테스트 클래스는 new가 안됨 (테스트용이라서 안되도록 해놓음) // => 생성자로 의존할 것을 가져와서 의존성 주입하는게 안됨 // => @Autowired 이용해서 의존성 주입 (DI, Dependency Injection) // BoardRepositoty 클래스를 의존하기 때문에 그 안에 있는 메소드들은 다 테스트 가능 @Autowired // 의존성 주입(스프링이 자동으로 bean 찾아서 주입) private BoardRepository boardRepository; // 테스트 코드에서는 의존성 주입해놔도 테스트 메소드 파라미터에 매개변수로는 안넣음 // => 테스트는 JVM이 실행하기 때문에 제어가 안됨 (테스트 코드 문법으로 알아둘것) @Test // 테스트할 메소드 (테스트할 자체 스레드가 생김) public void findAll_test() { // 테스트 메소드 이름끝에 _test 붙이는게 약속 // 테스트 3단계 : given - when - then(초보자들은 eye) // given : 테스트할 메소드의 파라미터 // 이 경우, 테스트할 BoardRepository의 findAll() 메소드의 파라미터에는 매개변수 없음 // => given 생략 가능 // when : 테스트할 메소드 (데이터를 어디서 찾을건지) List<Board> boardList = boardRepository.findAll(); // tnen : 상태 검증하는 곳 // eye(눈으로 보다) : 초보자들은 눈으로 봐야하므로 then보다는 eye를 해보는것이 적합 for(Board board : boardList) { System.out.println(board.getId()); System.out.println(board.getTitle()); System.out.println(board.getContent()); System.out.println(board.getCreatedAt()); System.out.println("======================="); } } }
 

쿼리 테스트 결과

  • Hibernate에 테스트된 메소드의 쿼리문 출력 ⇒ BoardRepository 클래스의 findAll() 메소드에 작성된 쿼리문
  • 쿼리문 결과 데이터들이 출력됨
    • 이 경우 h2 DB에 더미 데이터로 세팅해놓은 데이터들이 출력됨
  • 테스트 실행해서 출력이 잘 됐다면 쿼리도 잘 작동된다는 의미
notion image
 

쿼리 테스트를 디버깅으로 해보기

  • 디버그 할 코드가 위치한 라인 숫자를 클릭하고 디버깅 실행
notion image
  • 디버그 결과 콘솔 출력
    • 쿼리문 작동 결과의 데이터 확인 할 수 있음
notion image
Share article

Nakyeom's Study