inblog logo
|
taker
    스프링부트

    익명 블로그 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

    RSS·Powered by Inblog