[익명 게시글을 쓰는 블로그 만들기 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에 더미 데이터로 세팅해놓은 데이터들이 출력됨
- 테스트 실행해서 출력이 잘 됐다면 쿼리도 잘 작동된다는 의미

쿼리 테스트를 디버깅으로 해보기
- 디버그 할 코드가 위치한 라인 숫자를 클릭하고 디버깅 실행

- 디버그 결과 콘솔 출력
- 쿼리문 작동 결과의 데이터 확인 할 수 있음

Share article