JPA - JPA에서 일괄 삭제하는 방법과 주의점 (deleteAllById, deleteAllByIdIn, deleteAllByIdInBatch, Querydsl)
·
JPA
배경현재 프로젝트에서 Mybatis -> JPA로 마이그레이션하는 작업을 하고 있다.기존에 데이터를 일괄 삭제하던 쿼리를 JPA의 deleteAllById 메서드 하나로 쉽게 구현할 수 있었다.하지만 테스트 코드로 테스트를 해보니 내가 의도한 것과 다르게 쿼리가 실행되고 있었다. 내가 생각한 쿼리delete from task where task_id in (?, ?)in 쿼리로 일괄 삭제실제 실행된 쿼리-- 각 ID에 대한 개별 조회select task_id from task where task_id = ?select task_id from task where task_id = ?-- 조회된 엔티티 개별 삭제delete task_id from task where task_id = ?delete task..
JPA - 연관 관계를 위한 불필요한 select 줄이기(getReferenceById())
·
JPA
개요데이터베이스에 연관 관계를 가진 엔티티를 저장할 때, 우리는 종종 연관된 엔티티의 모든 정보를 조회(SELECT)하게 된다. 하지만 이러한 방식은 의문점을 들게한다.'실제로 DB에 저장되는건 연관 객체의 ID뿐인데, 왜 모든 정보를 조회해야 할까?' @Service@Transactional@RequiredArgsConstructorpublic class OrderServiceImpl implements OrderService { private final OrderRepository orderRepository; private final CustomerRepository customerRepository; public void saveOrder(Long customerId) { ..
Querydsl - Expressions클래스로 select에서 상수 사용하는 법
·
JPA
개요쿼리 성능을 개선하는 방법 중 하나는 이미 선언된 값은 그대로 사용하는 것이다.매개변수로 넘어왔구나 이미 알고 있는 값을 DB에서 조회하는건 불필요하다. 이 밖에도 Entity보다 DTO로 필요한 필드만 가져오거나 where 및 join 문에 인덱스가 있는 필드만 사용하는 등의 방법이 있다. 본 글에서는 Expressions 클래스로 Querydsl에서 select문에서 상수를 사용하는 방법을 알아보자com.mysema.query.support.Expressions 클래스는 동적 표현식 생성을 위한 클래스이다. constant()constant 표현식은 Entity에 선언되지 않은 필드를 상수로 반환하고 싶을 때 사용한다.Expressions.constant(value) 형태로 사용할 수 있고 Exp..
Spring Data JPA - 외래키(Foreign Key)를 복합 기본키(Composite Primary Key)로 사용하기
·
JPA
개요복합 기본키(Composite Primary Key)란 두 개 이상의 컬럼을 묶어 만든 기본키(Primary Key)를 말한다.복합키는 다대다(N:M) 관계의 테이블의 관계를 풀어주고 공통으로 저장되는 데이터를 다룰 때 사용되는 매핑 테이블에서 사용될 수 있다.예를 들어, 내가 현재 개발중인 업무평가시스템에서 하나의 팀은 다양한 업무를 담당할 수 있고 하나의 업무를 여러 팀이 담당할 수 있다.즉, 팀과 업무 테이블은 다대다 관계를 갖고 있다. 그리고 각 업무에 대한 팀별로 평가를 받을 수 있다. 이 때 매핑 테이블 구조는 다음과 같다. 이제 Spring Data JPA에서 외래키로 복합키를 만드는 방법을 알아보자taskId: 업무 테이블의 외래키(foreign key)teamId: 팀 테이블의 외래..
JPA - 하나의 컬럼에 여러 개의 데이터를 저장하기
·
JPA
배경 프로젝트를 진행하면서 인스타그램의 Feed와 같은 기능을 구현중이었다. Feed에는 여러 장의 Image를 업로드할 수 있다. MultiPartFile로 전달 받은 Image들은 S3에 저장된 후 S3에 저장된 url을 String 값으로 반환한다. 이 ImageUrl들은 별도로 커스텀할 일이 없기 때문에 Entity로 만들 필요를 못느꼈다. 그래서 여러 개의 imageUrl을 하나의 컬럼에 저장할 수 있는 방법에 대해 알아보았고 Converter를 사용하는 방법을 알게되어서 정리한다. 구현 AttributeConverter는 JPA(Java Persistence API)에서 엔티티 클래스와 테이블 간 데이터 변환을 도와주는 인터페이스다. JPA에서는 엔티티 클래스의 필드와 데이터베이스 테이블의 컬..
JPA - Querydsl를 사용해 DTO 받는 방법
·
JPA
프로젝트를 진행하면서 조회한 도메인을 Mapstruct 라이브러리를 사용해 DTO로 매핑했었다. 하지만 점점 비즈니스 로직이 복잡해면서 매핑을 위한 코드도 같이 복잡해지다보니 도메인을 거치지 않고 DTO로 반환하는 방법이 있는지 찾아보게 되었다. 그러다 Querydsl로 DTO를 조회하는 방법을 알게 되었고 그 방법에 대해 정리해보려고 한다. Queyrdsl란?Querydsl은 JPA와 같은 ORM 프레임워크를 사용할 때 쿼리 작성을 더 편하게 해주는 라이브러리다. Querydsl을 사용하면 동적 쿼리 작성이 가능하다. Querydsl을 사용하면 SQL과 JPA의 복잡한 문법을 피할 수 있으며, 코드 작성이 간결해진다. Queyrdsl은 동적 쿼리 작성이 가능하며, 도메인 객체를 DTO로 변환하여 반환하..
Spring Data JPA - Auditing으로 생성일, 수정일 자동화하는 법
·
JPA
JPA Auditing 생성일, 수정일은 거의 모든 엔티티에 사용되고 있다. 이런 공통적인 기능을 엔티티마다 생성해서 관리하는 것은 굉장히 비효율적이다. JPA Auditing을 사용해 하나의 엔티티로 효율적으로 사용해보자. JPA Auditing은 데이터의 생성 또는 수정이 발생하면 자동으로 값을 넣어주는 아주아주 고마운 친구다. @EnableJpaAuditing 추가 @EnableJpaAuditing @SpringBootApplication public class TodoApplication { public static void main(String[] args) { SpringApplication.run(TodoApplication.class, args); } } Spring Boot을 실행시키는 ..
Cold Bean
'JPA' 카테고리의 글 목록