JPA

JPA

[JPA] saveAll() 문제점과 JDBC를 통한 해결

개요Spring data repository의 saveAll() 메서드는 그 이름 덕분인지, 여러 개의 데이터들을 하나의 쿼리로 처리할 것만 같다. 하지만 실제 적용해보니 예상과는 다르게 동작하는 부분들이 있었기에 기록으로 남겨보려 한다. 문제customerCreditTransactionRepository.saveAll(creditTransactions);100개 정도 되는 데이터를 한 번에 저장할 일이 있었다. 나는 위 코드처럼 saveAll()을 통해서 하나의 쿼리로 처리할 수 있을 줄 알았다. 하지만 실제 동작은 데이터를 각각의 INSERT 쿼리로 처리하는 것 아닌가... 원인왜 saveAll() 메서드가 한 번에 쿼리로 처리하지 못하는 것일까? 원인은 JPA의 기본키 생성 전략이였다. @Ent..

JPA

[JPA] @SQLRestriction으로 soft delete 구현하기

개요데이터 삭제 정책이 soft delete라면, 데이터 조회 시 delete 상태 여부를 확인하는 조건을 일일이 넣어주어야 할 것이다.@SQLRestriction 어노테이션을 통해 SQL의 where절에 delete 상태 여부를 체크하는 조건을 넣는 방법을 소개하려 한다. 문제코드를 살펴보자. 먼제 Hospital 엔티티이다.@Entity@Table(name = "hospitals")class Hospital( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, val name: String, ... //삭제가 된 상태라면, 해당 필드에 값 존재 var deletedAt..

JPA

[JPA] 프록시 객체와 OneToOne 양방향 관계 이슈

개요OneToOne 양방향 관계로 설정한 엔티티에서 의도치 않게 N+1 이슈가 발생하였다. 관련된 개념인 프록시 객체와 즉시 로딩 & 지연 로딩에 대해 정리하고, 이슈를 공유하려 한다. 프록시 객체실제 엔티티 객체 대신 사용되는 가짜 객체이다. 프록시 객체는 엔티티를 상속받고 위임 패턴으로 구현된다. //실제 엔티티//DB 조회 쿼리 발생Member member = em.find(Member.class, member.getId());//프록시 객체//DB 조회 쿼리 발생되지 않음Member proxyMember = em.getReference(Member.class, member2.getId());//이 때, DB 조회 쿼리 발생proxyMember.getName();//다시 한 번 조회할 때는 쿼리 ..

JPA

[JPA] 영속성 컨텍스트와 flush 시점

개요최근 영속성 컨텍스트 내에서 flush 시점에 대해 잘못 짚고 있던 부분이 있어서, 영속성 컨텍스트와 flush 시점에 대해서 정리해보고 트러블 슈팅을 공유하려 한다. 엔티티와 생명 주기JPA에서 엔티티는 DB 테이블과 매핑되는 자바 객체를 말한다.엔티티는 다음과 같은 생명 주기를 갖는다. 1. 비영속Member member = new Member();member.setId(100L);member.setName("HelloJPA");엔티티가 처음 만들어졌을 때 상태이다. 2. 영속EntityManager em = emf.createEntityManager();//비영속Member member = new Member();member.setId(100L);member.setName("HelloJPA"..

JPA

[JPA] 테스트를 통해 알아본 JPA와 영속성 컨텍스트

개요프로젝트가 한창이다. 프로젝트하며, 테스트 환경에서 JPA와 관련하여 발생한 이슈에 대해 글로 작성하면 좋을 것 같아 정리하였다. 이슈 1. 더티 체킹 (Dirty Checking)바로 코드로 간다.다음은 예제 코드로 시나리오는 다음과 같다.user 정보를 더티 체킹을 통해 업데이트 한다업데이트가 잘 되었는지 검증한다.@SpringBootTest@AutoConfigureMockMvcpublic class ExampleTest extends TestContainerSupport { @Autowired private UserRepository userRepository; @Autowired private TokenProvider tokenProvider; @Autowired ..

JPA

[Query DSL] Expressions를 사용하여 여러 값에 대한 존재 여부 확인하기

개요Query DSL에 대한 개념과 기능들을 공부하고 프로젝트에 필터링 검색 기능으로 적용해보던 중, 여러 값에 대한 존재 여부를 조건절로 걸어야 했다. 간단할 줄 알았지만 추가적인 공부가 필요했고, 다행히 Query DSL에서는 해당 이슈 해결을 위한 API를 제공해주고 있었다. 실제로 다른 사이트에서도 많이 봐온 기능이라 이렇게 글로 정리해본다. 요구사항필터링 검색 기능 중 '어떤 모임에 가고 싶으세요' 요구사항을 다음과 같은 경우로 나누어 비교하려 한다단일 태그를 만족하는 모임을 필터링 검색할 수 있다 - 단일 값 존재 여부 확인여러 태그 중 일부 만족하는 모임을 필터링 검색할 수 있다 - 여러 값 존재 여부 확인 2번 요구사항에 대해 추가적으로 설명하자면, 검색 조건이 '외향적인', '친구끼리'..

kkang._.h00n
'JPA' 카테고리의 글 목록