4. Repository 생성 및 구현

Stupefyee's avatar
Dec 23, 2024
4. Repository 생성 및 구현

1. Repository 구현

@RequiredArgsConstructor // final이 붙어있는 변수의 생성자를 만들어 줌 @Repository public class BoardRepository { // JPA는 EntityManager로 DB에 접근. (자바에서 DBConnection) private final EntityManager em; public List<Board> findAll() { Query q = em.createNativeQuery("select * from board_tb order by id desc", Board.class); // Board 클래스에 매핑하여 전달 return q.getResultList(); } }
자바 스프링 프레임워크를 사용하여 데이터베이스와 상호 작용하는 리포지토리 클래스를 정의

주요내용

  1. 클래스 어노테이션:
      • @RequiredArgsConstructor: final이 붙어있는 모든 필드에 대해 생성자를 자동으로 생성
      • @Repository: 해당 클래스가 데이터베이스와의 상호 작용을 담당하는 리포지토리 클래스임을 나타냄
  1. EntityManager:
      • private final EntityManager em;: JPA(Java Persistence API)에서 EntityManager를 사용하여 데이터베이스에 접근. 이는 자바에서 데이터베이스와의 연결을 관리하는 객체
  1. 메소드:
      • public List<Board> findAll(): 데이터베이스에서 모든 Board 엔티티를 조회하는 메소드
      • Query q = em.createNativeQuery("select * from board_tb order by id desc", Board.class);: Native SQL 쿼리를 사용하여 board_tb 테이블의 모든 레코드를 조회하고, 이를 Board 클래스에 매핑. 레코드는 ID를 기준으로 내림차순 정렬
      • return q.getResultList();: 쿼리 결과를 리스트로 반환
기본적으로 데이터베이스에서 Board 엔티티의 모든 레코드를 조회하고, 이를 자바 객체로 반환하는 역할
💡
이 후 html파일까지 모두 만들어 직접 실행해보고 테스트할 수도 있으나, 해당 방법은 느리고 비효율적이기 때문에 TEST 클래스를 만들어 테스트하는 것이 바람직

2. Test하기

  • test 폴더에서 BoardRepositoryTest 클래스를 작성
com.example.blog 까지만 원래 존재하였으나 위 이미지는 board 폴더를 추가 생성 후 기존에 있던 데모 클래스를 삭제
com.example.blog 까지만 원래 존재하였으나 위 이미지는 board 폴더를 추가 생성 후 기존에 있던 데모 클래스를 삭제

1. Test 클래스 파일 내용:

@Import(BoardRepository.class) @DataJpaTest // DB 관련된 자원들을 메모리(IOC)에 올림 public class BoardRepositoryTest { @Autowired private BoardRepository boardRepository; // 테스트 코드에서는 "테스트 할 메소드 명_test"로 메소드명을 쓰는 것이 컨벤션 @Test public void findAll_test() { // given // when List<Board> boardList = boardRepository.findAll(); System.out.println(); // 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("====================="); } } }

2. 주요 내용

  1. 클래스 어노테이션:
      • @Import(BoardRepository.class): BoardRepository 클래스를 테스트 컨텍스트에 가져 옴
      💡
      • 테스트 컨텍스트 프레임워크
      스프링은 테스트에 사용되는 애플리케이션 컨텍스트를 생성하고 관리하여 테스트에 적용해주는 테스트 프레임워크를 제공
      • 테스트 컨텍스트
      테스트에서 사용되는 애플리케이션 컨텍스트를 생성하고 관리하기 위한 컨텍스트
      • @DataJpaTest: JPA 관련된 테스트를 위한 설정을 제공하며, 데이터베이스 관련 자원들을 메모리에 로드
  1. 변수:
      • @Autowired private BoardRepository boardRepository;: 의존성 주입을 통해 BoardRepository 객체를 자동으로 주입 받음
  1. 테스트 메소드:
      • @Test public void findAll_test(): JUnit 테스트 메소드
        • given: 테스트 초기 설정을 위한 코드가 들어갈 부분
        • when: boardRepository.findAll() 메소드를 호출하여 모든 게시물을 조회
        • then: 조회한 게시물 리스트를 출력
  1. 출력:
      • System.out.println(): 데이터베이스에서 조회한 Board 객체의 ID, 제목, 내용, 생성 시간을 출력
💡
@DataJpaTest 어노테이션을 통해 JPA 관련 설정을 로드하고, @Autowired 어노테이션을 통해 BoardRepository를 주입받아 실제 데이터베이스 접근이 없이 메모리 상에서 테스트를 수행
notion image
테스트는 메서드 왼쪽의 버튼을 누르면 해당 메서드만 테스트 가능. (인텔리제이 기준)

3. 수행 결과

콘솔 출력 화면
콘솔 출력 화면
디버깅으로도 확인
디버깅으로도 확인
💡
결과적으로 findAll 메서드를 통해 총 5개의 Board 객체를 받아온 것을 확인 가능
 
Share article

stupefyee