가수면

JPA와 MyBatis 본문

웹 개발/웹 개발

JPA와 MyBatis

니비앙 2024. 6. 7. 13:42

- JPA -

기타 DB 조작 SQL 쿼리

https://jhchoi1182.tistory.com/272

 

MySQL

스프링 부트에서 MySQL 도커로 실행했을 때의 환경으로 정리 의존성 설치 // Spring Boot 3.1 이상 com.mysql mysql-connector-j // Spring Boot 3.0 이하 mysql mysql-connector-java 설정 // application.properties spring.datasource.ur

jhchoi1182.tistory.com

@EntityGraph

다대일이나 일대다가 설정된 속성을 지정해주면 조인 연산을 수행한다.

선언적으로 사용하기 쉬우며,  엔티티들을 한 번의 쿼리로 가져올 수 있다.

public interface PostRepository extends JpaRepository<Post, Long> {
    @EntityGraph(attributePaths = {"comments"})
    Optional<Post> findById(Long id);
}

JOIN FETCH

EntityGraph 어노테이션보다 보다 유연한 쿼리를 작성할 수 있다.

마찬가지로 지정한 쿼리들을 바탕으로 여러 쿼리를  한 번의 쿼리로 가져올 수 있다.

public interface PostRepository extends JpaRepository<Post, Long> {
    @Query("SELECT p FROM Post p JOIN FETCH p.comments WHERE p.id = :id")
    Optional<Post> findByIdWithComments(@Param("id") Long id);
}

벌크 업데이트

여러 쿼리들을 묶어서 한번에 실행하는 것을 말함.

@Modifying 어노테이션과 함께 @Query를 사용한다.

벌크 업데이트는 데이터 베이스를 직접 수정하기 때문에 영속성 콘텍스트와 불일치하는 문제가 발생하며,

이 경우 캐싱 등의 이점을 누릴 수 없기 때문에 재활용되지 않는 데이터 처리(삭제 등)을 할 때 사용하는 것이 효율적이다.

 

코드 예시)

Hibernate는 :post 자리에 전달된 Post 엔티티의 식별자(보통은 기본 키)를 사용하여 comment.post 필드와 일치하는 Comment 엔티티를 찾는다. 이 필터링 과정을 통해 해당 Post 엔티티와 연관된 모든 Comment 엔티티를 식별하고, 이들에 대해서만 UPDATE 조건을 적용한다.

    @Transactional
    @Modifying
    @Query("UPDATE Comment comment SET comment.removedAt = CURRENT_TIMESTAMP WHERE comment.post = :post")
    void deleteAllByPost(@Param("post") Post post);

:post - @Param("post") 어노테이션을 통해 바인딩되며, 쿼리 실행 시 이 위치에 실제 Post 엔티티 객체가 바인딩되어 조건 비교에 사용됨.

- MyBatis -

CDATA

XML 기반의 쿼리 템플릿이나 설정 파일에서 SQL 쿼리를 작성할 때, >=, <=와 같은 연산자는 XML 예약어와 충돌할 수 있다. 이를 방지하기 위해 CDATA 섹션을 사용하여 이러한 연산자를 문자 그대로 처리하도록 하여 연산을 정상 동작시킬 수 있다.

AND DATE_FORMAT(icr.rpap_publ_dt, '%Y-%m')  <![CDATA[>=]]> #{startDt}
  • <![CDATA[ ... ]]> - ... 부분에 들어가는 내용은 문자 그대로 해석됨
  • #{변수명} - SQL 쿼리 내에서 바인딩 변수를 사용하여 동적으로 값을 지정

MyBatis foreach 태그

AND icr.rpap_colt_site_num IN
<foreach collection="siteNums" item="siteNum" open="(" separator="," close=")">
  #{siteNum}
</foreach>

// siteNums가 [1, 2, 3]라고 가정한다면
// AND icr.rpap_colt_site_num IN (1, 2, 3)
// 결과 → rpap_colt_site_num 중 1, 2, 3만 선택
  • collection - 반복할 컬렉션의 이름
  • item - 컬렉션 내에서 반복될 각 요소의 이름
  • open - 반복이 시작될 때 삽입할 문자열
  • separator - 각 요소 사이에 삽입할 문자열
  • close - 반복이 끝날 때 삽입할 문자열

'웹 개발 > 웹 개발' 카테고리의 다른 글

DB 데이터 이전  (0) 2024.07.26
yarn 오류  (0) 2024.06.23
[Svelte] 기본  (0) 2024.05.28
Vercel의 배포 방식과 느릴 수밖에 없는 이유  (1) 2024.04.12
조회수 어뷰징 방지 방법들  (0) 2024.04.11
Comments