JPA에서 PostgreSQL Batch Insert 사용하기 (feat. Batch Size)
·
Spring/JPA
0. 들어가기 전JPA를 사용해서 개발 시 여러 건의 Entity를 INSERT를 해야하는 상황이 있었습니다. 이때, Spring Data JPA의 커스텀 메소드인 saveAll을 사용하면 Batch Insert 상태로 동작할 것이라고 예상했습니다.하지만 실제 쿼리는 Batch Insert로 1건의 쿼리가 아닌 여러 건의 INSERT 쿼리가 발생하는 것을 확인했습니다. 그래서 이번에 JPA, PostgreSQL에서 Batch Insert를 어떻게 할 수 있는지 알아보도록 하겠습니다.1. 문제 상황@Transactionalpublic List createAll(Collection skills, String jobId) { ... skillRepository.saveAll(entities); ..
JPA에서 delete, insert 시 왜 insert 쿼리가 먼저 실행될까?
·
Spring/JPA
0. 들어가기 전JPA를 사용해서 개발하던 중에 예상과 다르게 동작하는 테스트를 발견하게 되었습니다. Update 로직을 delete, insert로 구현했는데 delete 후 insert가 되는 것이 아니라, insert 후 delete로 동작하는 것을 확인했습니다. 왜 이러한 쿼리 순서로 실행되는지 상황부터 원인, 해결방법까지 살펴보도록 하겠습니다!1. 문제 상황먼저 기본 컨텍스트를 알려드리면 다음과 같습니다.Job - Skill 1:N이지만, 연관관계는 맺지 않고 JobId로 간접 참조Skill의 update 로직 메소드에서 상황 발생/** * DELETE & INSERT */@Transactionalpublic void replaceUpdateByJobId(Collection skills, Str..
[JPA] JPA, Spring Data JPA의 내부 동작 원리 알아보기
·
Spring/JPA
0. 들어가기 전이전에 대부분의 프로젝트에서 JPA를 사용해서 SQL을 작성하지 않고추상화된 메소드를 사용하여 영속화 계층에 접근하고, DB에 SQL을 반영했습니다. 이번에 개인적으로 JPA를 사용할 때 내부 동작 원리를 이해하지 않고 추상화된 메소드를 사용하기만 한다는 것을 깨닫게 되었습니다. 따라서, JPA에서 추상화된 메소드들이 어떻게 내부적으로 동작해서 쿼리가 생성되는지 알아보도록 하겠습니다.더 나아가서, Spring Data JPA은 어떻게 JPA를 추상화했는지도 살펴보도록 하겠습니다. 이번 포스팅은 JPA의 기본 개념, 동작들을 이미 안 상태에서 원리를 알아보는 것이므로기본적인 JPA의 개념이나 동작 설명들은 생략하고 가도록 하겠습니다!1. JPA의 기본 동작 원리먼저, JPA가 어떻게 객체와..
테스트 시 @ElementCollection 테이블 동적으로 가져오기(테스트 데이터 초기화)
·
Spring/JPA
0. 들어가기 전프로젝트 개발을 진행하다가, 테스트에서 테스트 초기화가 제대로 수행되지 않아서 테스트가 실패하는 상황이 있었습니다.결과적으로는 @ElementCollection으로 생성되는 테이블이 동적으로 초기화되지 않아서 발생하는 문제였습니다.그래서 이번 포스팅에서 문제 상황과 @ElementCollection 테이블을 동적으로 가져와서 해결한 방법에 대해서 간단히 다뤄보겠습니다!1. 문제 상황프로젝트에서 하나의 기능을 개발하고, 전체 테스트를 실행했을 때테스트에서 테스트 초기화가 제대로 수행되지 않아서 테스트가 실패하는 상황이 있었습니다. 프로젝트의 테스트에서는 E2E 테스트를 진행할 때 RestAssured를 사용하고 있습니다.이때 RestAssured가 통합 테스트를 수행하는 스레드와 @Tran..
[JPA] JPA N+1 문제 및 근본적인 원인에 대한 개인적인 고찰
·
Spring/JPA
0. 들어가기 전JPA를 사용하면서 발생하는 N+1 문제는 널리 알려져 있고, JPA를 사용하다보면 제법 자주 만나게 됩니다.그래서 N+1 문제를 다룬 블로그나 다른 레퍼런스들이 상당히 많습니다.저 또한 N+1 문제를 공부하기 위해 많은 글들을 살펴봤었습니다.하지만, 다른 글들을 읽어보고 더 깊은 N+1 문제에 대한 개인적인 궁금증들이 생겨나고 쉽게 풀리지 않아서이번 포스팅을 작성하면서 테스트를 진행해보고 기록해보고자 합니다. N+1 문제 및 근본적인 원인에 대해 추론하고 해결방법을 알아보면서, N+1 문제에 대해서 고찰해보도록 하겠습니다! 😃(뇌피셜 파티가 될 예정입니다.. 🤣) 예시 엔티티는 가장 간단한 Team-Member 엔티티로 구성하여도메인 이해가 N+1 문제의 이해에 방해되지 않도록 다음..
[JPA] JPA 1:N 관계에서 연관관계 주인을 1 대신 N에 두는 이유
·
Spring/JPA
이전에 JPA를 사용해서 1:N 연관관계 매핑을 할때는 연관관계 주인이 1 보다 N에 두는 것이 좋다고 배워서 관성적으로 N이 연관관계 주인으로, FK를 가지게 했습니다. 그러나 왜 연관관계 주인이 1이 되면 좋지 않은 건지 제대로 알지 못하고 사용하고 있었기 때문에 연관관계 주인이 1쪽이 되었을 때의 어떤 점이 안 좋은지를 살펴보려고 합니다! 예시는 Member와 Post의 1:N 관계로 설명하도록 하겠습니다! (멤버가 여러 게시글을 작성할 수 있고, 게시물에는 1명의 작성자만 존재한다고 해봅시다!) 🎯 1. 연관관계의 주인이란? 들어가기에 앞서서, 연관관계의 주인이란 무엇을 말하는지 알아봅시다! 우선 '연관관계의 주인' 이라는 용어가 규칙으로 정해진 용어는 아니지만 JPA를 사용할 때 해당 용어로 많..
[JPA] @JoinColumn 파헤치기 (feat. JPA 연관관계별 사용)
·
Spring/JPA
✌🏻 0. 들어가기 전 JPA 강의 중에 @JoinColumn을 마스터하면 JPA 연관관계를 어느정도는 다 알 수 있다고 들었다. 그래서, 여러 JPA 개념 중에 @JoinColumn에 대해 파헤쳐보면서 JPA 연관관계를 이해해보려고 한다! 앞으로 설명할 연관관계에서 연관관계별로 다음과 같은 예제로 설명하겠다! 1:1 - student lecture 1:N / N:1 - Line(1) Station(N) 🎯 1. @JoinColumn 이란? JoinColumn 어노테이션 클래스를 번역해보면서 이해해보자. JoinColumn의 최상단 주석에는 JoinColumn에 대한 설명이 나와있다. 맨 위의 내용을 요약하면 다음과 같다. Entity 연관관계 또는 Element Collection을 연결하기 위한 Co..
BE_성하
'Spring/JPA' 카테고리의 글 목록