Contents
JPQLv1 익명 블로그 리펙터링 과정입니다.
JPQL
퍼시스트 컨텍스트 = 영속성 컨텍스트 (이하 PC)
두가지가 중점입니다.
PC
엔티티 객체와 DB 간의 상태를 관리(동기화)하는 JPA의 1차 캐시
엔티티의 영속성 상태를 확인하여, DB와의 직접적인 상호작용을 최소화하고
효율적으로 처리할 수 있게 해줍니다.
@Service
@RequiredArgsConstructor
public class BoardService {
private final BoardRepository boardRepository;
@Transactional
public void 게시글쓰기(BoardRequest.SaveDto saveDto) {
boardRepository.save(saveDto.toEntity());
}
}
클라이언트의 게시글 업로드 요청이 해당 Service에 들어온다면
업로드 할 게시글 정보가 SaveDTO로 요청이 오게 됩니다.
이제 서비스에서는 SaveDTO를 .toEntity() 를 통해 Board 엔티티 객체를 만들어줍니다.
현재까지는 비영속 상태를 띄고 있습니다.
public class BoardRequest {
@Data // getter, setter, toString 생성
public static class SaveDto {
private String title;
private String content;
public Board toEntity(){
Board board = new Board(null, title, content, null);
return board;
}
}
}
@Repository
@RequiredArgsConstructor
public class BoardRepository {
private final EntityManager em;
public void save(Board board) {
// 비영속 상태
em.persist(board);
// 동기화 완료 (영속화 완료)
}
Service는 Repository의 save( )메서드를 호출하여 엔티티 객체를 저장 요청하게 됩니다.
이때 save( ) 메서드 내부의 엔티티메니저 em 을 통해 persist가 작동하게 됩니다.
em.persist(board); 를 통해 board 엔티티 객체가 비영속 상태에서 영속 상태로 전환됩니다.
영속화 컨텍스트를 통해 board 엔티티는 1차 캐시에 저장하고,
DB와 동기화를 준비합니다.
이후 영속화 된 엔티티를 DB에 반영합니다. (insert)
JPQL
JPQL 은 JPA에서 제공하는 객체 지향 쿼리 언어로,
엔티티 객체를 대상으로 데이터베이스 작업을 수행합니다.
작업을 수행할 때 DB의 컬럼명이나 테이블명이 아닌 엔티티의 필드명을 참조하여 사용합니다.
public List<Board> findAll() {
return em.createQuery("select b from Board b order by b.id DESC ", Board.class)
.getResultList();
}
위 코드에서 Board는 JPA에서 관리하는 엔티티 클래스입니다.
엔티티를 기준으로 데이터를 조회하는데,
"select b from Board b order by b.id DESC ", Board.class 를 통해 JPQL문을 sql로 전환하여
DB에서 실제 데이터를 가져옵니다.
Share article