스트림 익명블로그 V2 (JPA변경) (1)

화낼거양's avatar
Nov 20, 2024
스트림 익명블로그 V2 (JPA변경) (1)
 
 
💡
기존의 nativeQuery로 작성했던 Repository 내용들을 모두 JPA(Java Persistence API)를 사용한 예제로 변경하는 내용입니다.
 

findAll 메서드

public List<Board> findAll() { return em.createQuery("select b from Board b order by b.id desc", Board.class).getResultList(); }
 
설명:
  1. JPQL 쿼리 작성: "select b from Board b order by b.id desc"라는 JPQL 쿼리를 작성합니다. 이는 Board 엔티티의 모든 레코드를 id 내림차순으로 정렬하여 선택합니다.
  1. 쿼리 실행: createQuery 메서드를 호출하여 위의 JPQL 쿼리를 실행할 준비를 합니다. Board.class를 통해 반환 타입이 Board 객체임을 지정합니다.
  1. 결과 반환: getResultList 메서드를 호출하여 쿼리의 결과를 List<Board> 형식으로 반환합니다.
 
 

알아두면 좋은 정보 :

 
  • 쿼리 파싱:
    • JPQL 쿼리가 파싱되어 데이터베이스의 SQL 쿼리로 변환됩니다. 예를 들어, 다음과 같은 SQL 쿼리로 변환될 수 있습니다:
    • select b from Board b order by b.id desc >>>> SELECT * FROM Board ORDER BY id DESC;
       
  • 데이터베이스에서 조회:
    • 변환된 SQL 쿼리가 데이터베이스에서 실행되어 Board 테이블의 모든 레코드를 id 내림차순으로 정렬하여 조회합니다.
  • 엔티티 매핑:
    • 조회된 레코드가 Board 엔티티 객체에 매핑됩니다. JPA는 데이터베이스에서 가져온 결과를 자동으로 엔티티 객체로 변환합니다. (동기화)
 
 
 

findById 메서드

// 고유키로 조회하는 경우 find 메소드만 사용해도 찾을 수 있다. public Optional<Board> findById(int id) { // null 처리를 연습하기 위해 해당 예제만 Optional 처리를 하였음 return Optional.ofNullable(em.find(Board.class, id)); }
 
설명:
  1. 엔티티 조회: em.find(Board.class, id)를 사용하여 idBoard 엔티티를 조회합니다.
  1. Optional 사용: Optional.ofNullable을 사용하여 null이 반환될 수 있는 결과를 감싸서 반환합니다.
 

save 메서드

public void save(Board board) { // 비영속 em.persist(board); // 동기화 완료 (영속화됨) }
 
설명:
  1. 엔티티 영속화: em.persist(board)를 호출하여 board 엔티티를 영속성 컨텍스트에 저장합니다.
 

delete 메서드

public void delete(int id) { em.createQuery("delete from Board b where id = :id") .setParameter("id", id) .executeUpdate(); }
 
설명:
  1. JPQL 쿼리 작성: "delete from Board b where id = :id"라는 JPQL 쿼리를 작성합니다. 이는 id에 해당하는 Board 엔티티를 삭제하는 쿼리입니다.
  1. 파라미터 설정: setParameter("id", id)를 사용하여 쿼리의 id 파라미터를 설정합니다.
  1. 쿼리 실행: executeUpdate 메서드를 호출하여 쿼리를 실행합니다.
 
 
 
 

update 메서드

 
해당 메서드는 Repository 클래스에서 필요하지 않기 때문에 삭제하였습니다.
 
 
 
 

완성된 전체 코드

 
@RequiredArgsConstructor // final이 붙어있는 변수의 생성자를 만들어준다 @Repository public class BoardRepository { // JPA는 EntityManager로 DB에 접근한다. (자바에서 DBConnection) private final EntityManager em; public List<Board> findAll() { return em.createQuery("select b from Board b order by b.id desc", Board.class) .getResultList(); } // 고유키로 조회하는 경우 find 메소드만 사용해도 찾을 수 있다. public Optional<Board> findById(int id) { // null 처리를 하기 위해 Optional 처리를 하였음 return Optional.ofNullable(em.find(Board.class, id)); } public void save(Board board) { // 비영속 em.persist(board); // 동기화 완료 (영속화됨) } public void delete(int id) { em.createQuery("delete from Board b where id = :id") .setParameter("id", id) .executeUpdate(); } // update는 작성하지 않아도 된다. }
 
Share article

moohyun