
엔티티 매니저를 통한 쿼리 생성:
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(눈으로 확인)
}
}

결과

Share article