서비스 구현 (1)

화낼거양's avatar
Nov 15, 2024
서비스 구현 (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 클래스를 만들어 테스트하는 것이 바람직합니다.
 
 
 
 
 
 

Test하기

 
 
 
notion image
 
test 폴더에서 BoardRepositoryTest 클래스를 작성합니다.
(com.example.blog 까지만 원래 존재하였으나 위 이미지는 board 폴더를 추가 생성, 기존에 있던 데모 클래스를 삭제하였습니다.)
 
 
 

Test 클래스 파일 내용:

@Import(BoardRepository.class) @DataJpaTest // DB 관련된 자원들을 메모리(IOC)에 올린다. public class BoardRepositoryTest { @Autowired private BoardRepository boardRepository; // 테스트 코드에서는 언더바를 쓰는 것이 약속이다. @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("====================="); } } }
 
주요 내용은 다음과 같습니다:
  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
테스트는 메서드 왼쪽의 버튼을 누르면 해당 메서드만 테스트 할 수 있습니다. (인텔리제이 기준)

수행 결과

 
(콘솔 출력 화면)
notion image
 
 
 
(디버깅으로도 확인할 수 있습니다.)
notion image
 
 
결과적으로 findAll 메서드를 통해 총 5개의 Board 객체를 받아온 것을 확인할 수 있습니다.
 
Share article

moohyun