10.JPA를 사용한 오브젝트 매핑

강재영's avatar
Aug 19, 2024
10.JPA를 사용한 오브젝트 매핑
 
notion image
 
엔티티 매니저를 통한 쿼리 생성:
  • em.createNativeQuery("select * from board_tb order by id desc", Board.class)를 호출하면, 엔티티 매니저(EntityManager)는 네이티브 SQL 쿼리를 실행할 준비를 합니다.
  • 이 네이티브 쿼리는 데이터베이스 테이블 board_tb에서 모든 레코드를 id 역순으로 가져오도록 합니다.
  • Board.class를 지정함으로써, JPA는 결과를 Board 엔티티로 매핑하도록 설정됩니다.
 
쿼리 실행 및 결과 가져오기:
  • query.getResultList()를 호출하면, 생성된 쿼리가 데이터베이스에서 실행되고, 그 결과가 반환됩니다.
  • 데이터베이스에서 반환된 결과는 각 행(row)이 Board 엔티티로 매핑됩니다. 이 매핑 작업은 하이버네이트가 자동으로 수행합니다.
 
객체 매핑 및 리스트 저장:
  • 하이버네이트는 쿼리 결과로 받은 각 행을 Board 클래스의 인스턴스로 변환합니다. 이 변환 과정에서 데이터베이스의 각 열(column)이 Board 객체의 필드에 매핑됩니다.
  • query.getResultList()는 이 Board 객체들의 리스트(List<Board>)를 반환합니다.
 
 
package shop.mtcoding.blog.board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import java.util.List; //임포트는 알트 + enter @Repository //@Repository를 붙이면 스프링이 new를 해서 Ioc(컬렉션 List 자료형 같은거) 에 저장한다. public class BoardRepository { @Autowired//Ioc에 있는 객체를 찾아온다. private EntityManager em; public BoardRepository() { System.out.println("BoardRepository 생성자"); } public List<Board> findAll() { Query query = em.createNativeQuery("select * from board_tb order by id desc ", Board.class); List<Board> boardList = query.getResultList(); return boardList; } //insert 하기 @Transactional // db의 변경요청시에는 해줘야하한다.(변경중이니까 건들지 말라고 건다) public void save(String title, String content) { System.out.println("리파지토리로오나?"); Query query = em.createNativeQuery("insert into board_tb(title, content, created_at) values (?,?,now())"); query.setParameter(1, title); query.setParameter(2, content); query.executeUpdate(); } }
 

테스트하기

package shop.mtcoding.blog.board; 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; //@SpringBootTest //C R E H2 -> 모든 레이어를 메모리에 다 올리고 테스트할 때 사용하는 어노테이션 @DataJpaTest // h2, em @Import(BoardRepository.class)//br public class BoardRepositoryTest {//컨벤션Test @Autowired private BoardRepository boardRepository; @Test public void findAll_test() { //given //when List<Board> boardList = boardRepository.findAll(); //eye System.out.println("사이즈 : " + boardList.size()); for (Board board : boardList) { System.out.println(board.getTitle()); System.out.println(board.getContent()); } } //테스트 메서드에서는 매개변수를 사용할 수 없다. // 메서드명_test : 컨벤션 @Test public void save_test() { //test의 단계 //given(매개변수를 강제로 만들기) String title = "제목1"; String content = "내용1"; //when(테스트) boardRepository.save(title, content); //eye(눈으로 확인) } }
 
 
notion image
 

결과

notion image
Share article

강재영 블로그