Contents
완성된 전체 코드기존의 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();
}
설명:
- JPQL 쿼리 작성:
"select b from Board b order by b.id desc"
라는 JPQL 쿼리를 작성합니다. 이는Board
엔티티의 모든 레코드를id
내림차순으로 정렬하여 선택합니다.
- 쿼리 실행:
createQuery
메서드를 호출하여 위의 JPQL 쿼리를 실행할 준비를 합니다.Board.class
를 통해 반환 타입이Board
객체임을 지정합니다.
- 결과 반환:
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));
}
설명:
- 엔티티 조회:
em.find(Board.class, id)
를 사용하여id
로Board
엔티티를 조회합니다.
- Optional 사용:
Optional.ofNullable
을 사용하여null
이 반환될 수 있는 결과를 감싸서 반환합니다.
save 메서드
public void save(Board board) {
// 비영속
em.persist(board);
// 동기화 완료 (영속화됨)
}
설명:
- 엔티티 영속화:
em.persist(board)
를 호출하여board
엔티티를 영속성 컨텍스트에 저장합니다.
delete 메서드
public void delete(int id) {
em.createQuery("delete from Board b where id = :id")
.setParameter("id", id)
.executeUpdate();
}
설명:
- JPQL 쿼리 작성:
"delete from Board b where id = :id"
라는 JPQL 쿼리를 작성합니다. 이는id
에 해당하는Board
엔티티를 삭제하는 쿼리입니다.
- 파라미터 설정:
setParameter("id", id)
를 사용하여 쿼리의id
파라미터를 설정합니다.
- 쿼리 실행:
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