개발/JPA
-
[돌다리 두들기기] Builder 패턴개발/JPA 2024. 4. 24. 14:43
JPA 엔티티에서 롬복의 @Builder 패턴을 사용할 경우 @AllAgrsConstructor와 @NoArgsContructor를 붙여야 한다. JPA 스펙에서 엔티티 클래스는 기본 생성자를 가져야 하며, @Builder에서 코드를 만들 때 필드를 받아서 객체를 생성하는 생성자를 필요로 한다. @Builder 패턴에서 생성되는 코드는 다음과 같다. 롬복의 코드와 똑같진 않지만 기본 흐름은 다르지 않다. public class Person { private String name; private int age; public static class PersonBuilder { private String name; private int age; ..
-
[JPA][Archiving] in_clause_parameter_padding 옵션개발/JPA 2024. 3. 3. 12:38
이 글은 nhn cloud 기술 블로그에 올라온 글을 그대로 가져왔습니다. (원본 링크) Java ORM 기술의 표준 명세인 JPA가 소개된 지 참 오래되었지만, 국내 현실상 대규모 시스템에서 적용되어 사용된 운영 경험이 충분히 쌓이지 않고 공유되지도 않는 것 같습니다. 대부분 JPA를 사용한다고 하면 Hibernate를 구현체로 사용하게 됩니다. 제가 담당하는 서비스 역시 Spring Data JPA를 활용하고 있고 JPA 구현체로 Hibernate를 사용하고 있습니다. 개발과 서비스를 운영하면서 겪은 일 중에 SQL의 in 절과 관련해서 발생한 문제를 해결하면서 알게 된 옵션과 그로 인한 효과를 소개해 드리고자 합니다. 증상 운영 중인 서버가 이유 없이 응답이 느려집니다. 그리고 가비지 컬렉션을 너무..
-
Update개발/JPA 2024. 3. 3. 12:35
특정 필드만 업데이트 하려는 목적으로 코드를 작성하지만 JPA가 작성하는 query를 보면 해당 레코드 전체를 업데이트 한다. 이는 JPA가 어플리케이션을 로딩할 시점에 PreparedStatement로 해당 엔티티의 update query를 미리 만들어둔다고(참고 인프런 김영한님 답변). 해당 내용은 공식 문서에서 찾게 되면 해당 내용를 업데이트 하겠다. 어쨌든 오동작이나 최적화 문제는 아니라는 것을 알고 있자. 굳이 필요하면 @DynamicUpdate를 하이버네이트가 변경된 필드에 대해서는 업데이트하도록 할 수 있다. 아직 개발을 오래 한 건 아니지만 '굳이' 해야 되는 일은 대부분 안 해도 되는 거더라.
-
스프링부트 3.1.2 Querydsl 설정개발/JPA 2023. 8. 2. 14:17
스프링부트 3.x.x 설정이 querydsl 설정이 스프링부트 2.x.x에 비해 많이 간결해졌다. 지금 프로젝트가 3.1.2이므로 여기에 기준한 설정이다. build.gradle implementation "com.querydsl:querydsl-jpa:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" a..
-
페치 조인의 한계과 극복(요약 ver.)개발/JPA 2023. 7. 25. 15:14
JPA를 사용할 때 fetchType은 기본적으로 LAZY로 지정하고 시작한다. EAGER는 최적화가 제한되기 때문에 선택지에서 아예 제외하도록 하자. OneToOne, ManyToOne(이하 XxxToOne)은 조인을 해도 결과 데이터 수가 늘어나지 않는다. 일대다 조인을 하면 다(N)에 맞춰서 데이터가 늘어나게 된다(데이터 뻥튀기). 팀과 멤버가 일대다 관계라고 했을 때, 팀과 멤버를 조인하게 되면 멤버 데이터에 팀이 합쳐진 데이터가 출력된다. 엔티티를 로딩할 때 XxxToOne 데이터는 페치 조인으로 데이터를 Query 한 번으로 가져와 성능 최적화를 할 수 있지만, 문제는 컬렉션이다. 페치 조인을 하게 되면 그 뻥튀기 된 데이터가 전부 조회된다. SQL 단계에서 당연히 distinct도 적용 안 ..
-
MVCC=TRUE개발/JPA 2023. 7. 18. 16:50
이 오류로 검색을 해보면 application.yml에서 Dialect를 수동으로 설정해줘야 할 것 같은 느낌이 든다. spring: jpa: database-platform: org.hibernate.dialect.H2Dialect 그러고 나서야 정확한 오류를 알려준다. 23년 7월 기준 최신 스프링부트(3.1.1)를 사용하고 있다면 datasource url에서 MVCC=true 옵션은 주면 안 된다. url: jdbc:h2:tcp://localhost/~/test;MVCC=TRUE (x) url: jdbc:h2:tcp://localhost/~/test
-
일대다 연관관계를 지양하자개발/JPA 2023. 7. 18. 12:31
다대일 연관관계 웬만하면 다대일 연관관계를 가져가는 게 맞다. 다음 테이블 관계도를 보자. 다(N)인 쪽에 외래키를 생성하는 것이 당연하다. 그리고 JPA는 당연히 그렇게 테이블을 만든다. Team에 Member 외래키가 생긴다면 같은 팀이 계속 추가되니까 정규화를 잘못한 거다. 외래키를 가지고 있는 Member에서 단방향으로 연관관계를 설정하고 team 객체를 주인으로 설정하는 게 자연스럽다. 단방향이니까 Team에는 아무런 설정이 필요 없다. 지연 로딩은 기본 정책으로 가져가자. @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") pri..
-
영속성 전이와 고아 객체개발/JPA 2023. 7. 13. 13:43
사용법은 쉬우니까 개념만 짧게 정리하자. 영속성 전이(CascadeType) 특정 엔티티를 영속 상태로 만들 때 연관 엔티티도 함께 영속 상태로 만들어준다 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장 연관관계 매핑과는 관련이 없다 연관 엔티티를 함께 영속화하는 편리함을 제공하는 것뿐 ALL, PERSIST, REMOVE 옵션을 많이 쓴다 단 하나의 부모가 자식들을 관리할 때는 유의미하게 사용할 수 있다 둘의 라이프사이클이 같거나 거의 유사할 때 연관 관계가 딱 하나의 관계에서만 나올 때(단일 소유자) - Parent만 Child를 소유 ex. 게시물의 첨부파일(파일을 여러 곳에서 관리하는 거라면 안 되겠지) Child child1 = new Child(); Child child2 = new Chil..