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; ..
-
스프링부트 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도 적용 안 ..
-
양방향 관계 시 주의사항개발/JPA 2023. 7. 11. 16:34
연관관계를 설정할 때 단방향을 기본원칙으로 하는 게 좋다. 설계 단계에서는 단방향으로 설정한다. 개발하면서 편의상 필요할 때 추가해야 사이드 이펙트를 줄일 수 있다. 양방향 관계에서는 고려할 사항이 늘어나기 마련인데, 양방향 관계에서 흔하게 일어날 수 있는 실수를 짚어본다. 다음 코드에서 Member(클래스, 테이블)이 team_id를 외래키로 가지고 있으므로 team을 연관관계의 주인으로 설정했다. 다음 코드는 동작할까? 편의상 여기에서 보이는 코드에서는 트랜잭션 부분은 생략한다. JPA 관점 @Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; @OneTo..
-
시퀀스 최적화개발/JPA 2023. 7. 10. 18:14
GenerationType 순차적으로 증가하는 id 값을 가지려고 할 때 GenerationType으로 TABLE, SEQUENCE, IDENTITY, AUTO가 있다. IDENTITY를 사용하면 테이블이 생성될 때 MySql은 auto_increment, H2Database는 identity라는 전략이 적용된다. 데이터를 삽입할 때마다 id가 1씩 증가하며 따로 시퀀스를 만드는 건 아니다. JPA에서는 엔티티 매니저를 통해 영속성 관리를 하는데, 영속성 관리는 1차 캐시에서 관리되고 있는, DB와 동기화된 하는 데이터 집합이라고 볼 수 있다. 문제 영속성 관리를 위해 데이터는 id를 pk로 설정한다. JPA에서 commit 함수를 호출할 때의 기본 동작은 임시 저장소에 있던 query를 일괄적으로(ba..
-
[Spring JPA] @Query를 이용해 직접 쿼리문을 작성할 때 만나는 오류DB/MariaDB 2020. 11. 3. 11:29
stackoverflow.com/questions/11881479/how-do-i-update-an-entity-using-spring-data-jpa JPA에서는 데이터의 컬럼을 update하기 위해선, 데이터를 가져와 setter를 이용해 값을 바꾸면 됩니다. transaction이 끝나면서 자동으로 변경사항을 반영해주기 때문에 명시적으로 save()를 호출하지 않아도 된다고 합니다. 아직 반복이 부족하고 JPA, repository, service 클래스를 왔다갔다하는 것이 익숙하지가 않아 직접 확인한 사항은 아닙니다. 일단은 참고하는 정도로 알고 있으면 될 것 같습니다. 검증하면 관련한 내용은 업데이트하겠습니다. 해당 글의 답변을 살펴보니까 JPA와 Spring-JPA가 완전히 같지는 않고 Spr..