데이터 관리/Spring data(JPA)
Spring Data JPA Stream으로 대용량 데이터 조회하기 (100만 건 이상)
Spring Data JPA Stream으로 대용량 데이터 조회하기 (100만 건 이상)
2021.04.16Java 8 에서부터 제공되는 Stream을 Srping Data 1.8부터 지원하게 되면서, JPA를 통해 100만 건 이상의 대용량 데이터 효율적으로 조회할 수 있게 되었다. JPA가 Stream을 지원하기 이전에는 대용량 데이터 조회를 위해 아래와 같은 방법을 사용하였다. 이 포스팅은 하단 참고문헌에 링크해둔 글을 이해하고 학습하기 위해 의역하며 샘플코드를 작성하였다. 정확한 정보 슥듭을 확인하고 싶으신 분들은 아래 링크를 꼭 확인하도록 권한다. High-performance data fetching using Spring Data JPA Stream High-performance data fetching using Spring Data JPA Stream Java 8 has brought a nu..
JPA 자식 엔티티가 변경되지 않을 때 (feat. cascade)
JPA 자식 엔티티가 변경되지 않을 때 (feat. cascade)
2021.02.05cascade는 특정 Entity의 영속성 상태가 변경되었을 때 이를 연관된 Entity에도 전파시킬 지 선택하는 옵션이다. 특정 Entity에 @ElementCollecion으로 관리되던 하위 컬렉션이 @Entity로 변경되었는데 cascade 옵션이 함께 설정하지 않았다. 컬렉션은 기본적으로 부모 Entity와 한 쌍으로 움직이기 때문에 cascade 옵션이 없어도 부모 Entity와 함께 저장/삭제된다. (cascade 옵션을 ALL로 준 것 처럼 작동함) 하지만 Entity 간의 연관 관계에서는 기본적으로는 아무런 상태도 전이시키지 않기 때문에 연관을 설정할 때 cascade 옵션에 대해 고려해야한다. @ElementCollecion으로 관리할 때에는 부모 Entity를 통해 자식 테이블에 저장이..
JPA @ElementCollection
JPA @ElementCollection
2021.01.29RDB에는 컬렉션과 같은 형태의 데이터를 컬럼에 저장할 수 없기 때문에, 별도의 테이블을 생성하여 컬렉션을 관리해야한다. 이때 컬렉션 객체임을 JPA에게 알려주는 어노테이션이 @ElementCollection이다. JPA는 @Entity가 아닌 Basic Type이나 Embeddable Class로 정의된 컬렉션을 테이블로 생성하며 One-To-Many 관계를 다룬다. 아래에는 스터디그룹과 멤버 구성을 관리하는 Entity이다. 스터디 그룹에 대해 멤버는 1:N 관계로 구성되며, 멤버는 다양한 스터디 그룹에 참여할 수 있다. StudyGroup entity : Entity, 스터디 그룹을 관리 id : PK, 스터디 그룹을 대표하는 값 topicTags : Basic Collection, 스터디 주제 G..
[JPA Error] IllegalStateException: Multiple representations of the same entity
[JPA Error] IllegalStateException: Multiple representations of the same entity
2021.01.201:N 관계의 부모 Entity와 자식 Entity를 동시에 저장할 때 에러가 발생했다. error : java.lang.IllegalStateException: Multiple representations of the same entity 에러 메시지를 토대로 원인을 찾아보니 다음과 같은 Hibernate 이슈글을 발견했다. 원문은 하단 참고문서에 링크해두었다. Hibernate throws IllegalStateException when merging entity 'x' if it has references to 2 detached entities 'y1' and 'y2' (obtained from different sessions), and y1 and y..
Hibernate에서 제공되지 않는 DB 종속 함수 사용(mysql group_concat)
Hibernate에서 제공되지 않는 DB 종속 함수 사용(mysql group_concat)
2020.11.19Hibernate는 특정 데이터베이스에 종속되지 않고 객체지향스럽게 사용할 수 있도록 추상화해준다. 때문에 특정 DB에 종속된 함수(예를 들면 mysql의 group_concat)는 제공하지 않는다. 되도록 DB 확장성을 위해 특정 DB에 종속된 기능 사용은 고려해볼 필요가 있지만, 그 기능이 비즈니스 요구사항을 풀기에 적절하고 필요하다고 판단된다면 확장성에 너무 얽매일 필요는 없다고 생각한다. 물론 DB를 변경할 예정이라면 어차피 바꿔야 하니 사용하지 말자. 어쨌든 특정 데이터베이스에서만 제공하는 함수, 여기에서는 mysql group_concat을 사용하기 위해 Dialect를 확장하여 커스텀 SQL 함수를 등록해보자. CustomMysqlDialect 클래스 생성 import org.hibernat..
ORM 뉴비가 바라본 JPA 학습 방법
ORM 뉴비가 바라본 JPA 학습 방법
2020.09.13Springboot + JPA 조합의 시스템을 처음으로 개발하게 되면서 JPA를 어떻게 방식으로 접근해서 공부해야할지 생각해봤다. JPA, 엄밀히 말하면 ORM을 처음 만났을 때의 나의 모습이다. "웹어플리케이션이 실행될 때 마다 테이블을 매번 생성한다고?" (옵션 변경 가능) "단순히 DB 모델링을 @Entity class로 단순히 형상화한게 아니라 DB에 직접 관여하는 객체라고?" "아니, update가 auto commit이라고? commit 시점은 언젠데?" "아, transaction을 잘 설정해야하는구나. 근데 self Invocation에서는 안된다고ㅠㅠ?" (Spring AOP는 proxy기반이라 Self Invocation 상황에서는 proxy 객체를 가르키는게 아니라 this를 가르키기..