목록JPA (5)
훈훈훈
Introduction 이번에는 Mybatis 와 JPA 를 동시에 적용한 환경에서 어떤 transactionManager 를 사용해야되는지 살펴보려고 한다. 해당 글은 스프링에서 트랜잭션을 담당하는 핵심 인터페이스인 PlatformTransactionManager 를 먼저 정리 후, Mybatis 그리고 JPA 에 대한 내용을 정리하는 순서로 작성하였다. PlatformTransactionManager 스프링 트랜잭션 추상화의 핵심 인터페이스이다. 모든 스프링 트랜잭션 기능과 코드는 이 인터페이스를 통해 트랜잭션 서비스를 이용할 수 있다. 아래는 해당 인터페이스에 정의 된 메서드 목록이다. getTransaction( ) 메서드는 트랜잭션 속성에 따라 새로 생성하거나 진행 중인 트랜잭션에 참여하거나, ..
이번에는 JPA Entity에서 이벤트가 발생할 때마다 특정 로직을 실행시킬 수 있는 @EntityListeners를 정리해보려고 한다. 예제 코드는 Spring boot와 Kotlin을 사용하여 작성하였다. JPA EntityListeners 란? 하이버네이트 문서에서는 JPA Entity에 이벤트가 발생할 때 콜백을 처리하고 코드를 실행하는 방법이라고 소개하고 있다. 이제 하이버네이트에서 지원하는 콜백 메서드들을 살펴보자. EntityListeners는 JPA Entity에 Persist, Remove, Update, Load에 대한 event 전과 후에 대한 콜백 메서드를 제공한다. 이번 글에서는 간단한 예제로 Update 하는 코드를 작성해보려고 한다. 예제 코드 @Component class U..
이번에 간단하게 Entity를 조회하는 API인데 성능이 생각보다 안좋은 이슈를 발견하게 되었다. 그래서 Entity를 확인해보니 OneToOne 관계를 사용하고 있었고 로그를 확인 했을 때 쿼리가 한 번이 발생하는 것이 아닌 무수히 많은 쿼리가 발생하는 것을 보았다. OneToOne 관계에서 지연로딩이 동작하지 않는다는 것은 인지하고 있지 못하였는데 이 기회에 한 번 정리해보려고 한다. (예제 언어는 자바가 아닌 필자에게 익숙한 코틀린으로 작성하였다. 자바 예제는 추후 추가할 예정이다.) 먼저 결론을 말하자면 JPA 구현체인 Hibernate 에서는 양방향 OneToOne 관계에서는 지연로딩이 동작하지 않는다. 정확하게는 테이블을 조회할 때 외래 키를 갖고 있는 테이블(연관 관계의 주인)에서는 지연로딩..
이번에는 스프링 부트와 Kotlin 그리고 JPA(Hibernate) 사용하면서 겪었던 N+1 이슈를 정리해보려고 한다. 여러 연관관계가 매핑되어 있는 테이블의 전체 데이터를 조회하는 API를 호출하였을 때, 한방 쿼리가 발생할 것으로 예상을 했지만.... 결과는 몇천만 건 이상 쿼리가 발생하는 이슈가 발견되었다. 해당 글에서는 문제를 해결하면서 알게된 사용한 기술들에서 발생한 문제점과 해결방안을 공유하려고 한다. Hibernate 하이버네이트는 지연로딩(Lazy Loading)을 할 때 Entity를 프록시 객체로 조회한다고 한다. 그리고 공식 문서를 확인해보면 Entity Class를 final 속성으로 선언하면 프록시 객체를 생성할 수 없기 때문에 지연로딩을 사용할 수 없다고 명시되어 있다. 코틀린..
이번에는 Spring boot, JPA와 코틀린(Kotlin)을 사용하여 간단한 API를 만들어 보려고 한다. 현재 사내에서 API 서버를 스프링 부트와 코틀린을 사용하여 개발하고 있다. 구글 검색 시 자바에 비해 코틀린에 관한 내용은 많이 부족하다. ....그래서 시간 날떄 틈틈히 정리를 해보려고 한다. 사용한 기술은 아래와 같다. - Spring Boot - Kotlin - gradle - postgresql - JPA IDE는 IntelliJ를 사용하였으며, 이클립스 환경이랑은 약간 차이가 날 수 있다. 이제 아래 코드를 보면서 살펴보자. 프로젝트 구조 먼저 프로젝트 구조는 아래와 같이 구성하였다. 파일 구성은 Controller, Service, DTO, Model, Repository 로 구성하..