JPA
-
Delete 배치 처리 (feat. deleteAllInbatch() vs batchUpdate() + rewriteBatchedStatements=true vs in 절)Spring 2025. 4. 8. 20:58
이전에 bulk insert에 대해서 찾아보았다. ↓https://dodop-blog.tistory.com/498 Spring JPA의 save() vs saveAll() vs bulk insert() (feat. db client)이번에 면허 재검증 프로세스를 구성하면서 면허 검증 로깅에 관한 작업을 구성하게 되었다. 면허 검증에는 배치로 검증하는 과정이 있기 떄문에, 로깅도 한번에 저장되어 DB 팀에게 어느정도dodop-blog.tistory.com 그렇다면 다량의 데이터를 delete 처리할 때는 어떨까? 1. jpa의 delete() 메서드 활용 가장 먼저 for문을 이용해서 delete()메서드를 연속호출하여 인서트를 수행해보자. @Test fun delete() { ..
-
Spring JPA의 save() vs saveAll() vs bulk insert() (feat. db client)Spring 2025. 4. 8. 01:37
이번에 면허 재검증 프로세스를 구성하면서 면허 검증 로깅에 관한 작업을 구성하게 되었다. 면허 검증에는 배치로 검증하는 과정이 있기 떄문에, 로깅도 한번에 저장되어 DB 팀에게 어느정도의 데이터를 한번에 저장할 수 있는지 문의드렸다. 단건 수행이 아닌 bulk insert로 하는 경우 더 많은 양의 데이터를 저장할 수 있다는 답변을 받고 해당 내용을 구현하였다. 작업 환경에서는 id의 채번 규칙을 auth_increment 전략을 사용하고 있었다. JPA auth_increment ID 채번 방식 id의 채번 규칙을 auth_increment 전략을 사용하면 bulk insert가 가능할까? 해당 전략을 사용하게 되면, JPA규칙에 의해서 bulk insert는 사용할 수 없게 된다. auto_i..
-
SpringData JPA를 사용하는 환경에서 multi-database (feat. master/slave구분, querydsl) 구성하기Spring 2025. 1. 21. 00:35
이번에 면허 재검증 프로세스를 구현하면서, multi database 환경을 구성해야 하는 작업을 수행했다. 작업하면서 구성한 내용을 개인화해서 정리해본다! 구현 환경 및 dependency 설정 작업을 구현해야 하는 환경은 Kotlin, SpringBoot, JPA, Mysql 환경이었다. 두가지의 데이터베이스를 다룰때 모두 JPA를 사용한다. 디폴트 데이터베이스와 추가로 연결할 데이터베이스를 지정한다. 여기서는 디폴트로 사용할 데이터베이스는 DefaultDatabase, 추가로 사용할 데이터베이스는 ADatabase라고 지정한다. 추가한 dependency는 다음과 같다. plugins { kotlin("jvm") version "1.9.25" kotlin("plugin.spring") v..
-
코틀린에서 Data클래스에 JPA를 사용할 때 주의해야 할 점KOTLIN 2022. 11. 27. 14:27
코틀린의 data 클래스를 JPA와 함께 사용하려던 도중 몇가지 문제가 발생하여 알아보았다. 기본생성자 코틀린에서 data타입을 이용한 객체를 구현하여 JPA를 사용할 때 기본생성자를 작성해주어야한다. 이전 자바 공부할 때 배웠듯이 JPA의 경우 reflection을 이용해서 구현되기 때문에 기본생성자가 필수이다. @Entity data class Restaurant( @Id @GeneratedValue(strategy = GenerationType.AUTO) var id: Long? = null, @Column(unique = true, nullable = false) var name: String ) { constructor() : this(null, "") } 하지만 매번 기본생성자를 생성하기 위한..
-
Validation failed for query for method public abstract 오류 발생시 (JPA)Spring 2022. 3. 4. 22:26
existsBy를 이용하여 연관관계의 데이터 아이디로 데이터 존재여부를 아는 쿼리를 작성하려고 할때 알맞은 쿼리임에도 쿼리 실패 오류가 발생했다. 기존의 코드 @Query(value = "SELECT CASE WHEN count(f) > 0 THEN true ELSE false END FROM Follow f LEFT JOIN FETCH f.fromUser a LEFT JOIN FETCH f.toUser b WHERE a.id=:fromUserId AND b.id=:toUserId") boolean existsByFromUserIdAndToUserId(Integer fromUserId, Integer toUserId); 기존코드를 보면 네이티브 쿼리로 작성되어 있으므로 수정한 코드 @Query(value..
-
existsBy, countBy (JPA)Spring 2022. 2. 13. 18:52
미션을 진행하다가 넘어온 아이디로 조회한 객체가 존재하지 않을 때 예외를 발생시켜야 하는 부분에서 실제 객체를 찾고 null객체인지 확인하는 방법으로 체크를 하였는데 이 부분을 existsBy로 하여 JPA를 활용하도록 피드백을 받게 되었다. null 객체 확인 방법 ( 기존에 하던 방법 ) public ReviewDTO update(ReviewCreateDTO reviewCreateDTO) { if (reviewRepository.findById(reviewCreateDTO.getId()) == null) { throw new ReviewNotFoundException(); } } 하려고 하는 의도가 어떤 것인지 명확하지 않고 불필요한 부분이 존재한다. existsBy public ReviewDTO u..
-
JPA 엔티티에 생성 시점, 수정 시점 Timestamp 추가하기 ( + Auditing)Spring 2022. 1. 13. 09:19
프로젝트 엔티티를 구성할 때 엔티티에 중복으로 created_at, updated_at 등의 생성 시간, 업데이트 시간을 column으로 중복적으로 필요해질 때가 있다. 이럴 때 JPA Auditing을 사용해서 시점 생성을 자동화 할 수 있다. BaseTImeEntity 생성 @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class BaseTimeEntity { @CreatedDate @Column(nullable = false) private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime updatedAt; public LocalDat..
-
JPA getById() 와 findById()의 차이Spring 2022. 1. 12. 22:33
jpa에서 ID를 이용하여 객체를 가져오는 방법에는 getById(), findById() 두가지 방법이 존재한다. getById() public void get_activity_with_id(Integer id) { //given //when Activity activity = repo.getById(id); //then } getById()는 원래 메소드인 getOne()이 deprecated되어 대체된 메소드로 내부적으로 EntityManager.getReference() 메소드를 호출하여 엔티티가 아닌 프록시를 반환한다. 이 때문에 실제로 사용하기 전에는 데이터 베이스에 접근하지 않고 실제로 사용될 때 프록시에서 데이터 베이스에 접근하려고 할때 데이터가 존재하지 않는다면 EntityNotFound..