가수면
JPA와 MyBatis 본문
- JPA -
기타 DB 조작 SQL 쿼리
https://jhchoi1182.tistory.com/272
@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 |