익명 블로그 V2 (JPA)

김인범's avatar
Nov 21, 2024
익명 블로그 V2 (JPA)
Contents
JPQL
v1 익명 블로그 리펙터링 과정입니다.
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

taker