본문 바로가기

Java, Kotlin, Spring/JPA18

일대다(1:N) 페이징 처리(OneToMany Pagination) 일대다(1:N) 페이징 처리(Spring Data JPA) TL;DR 1:N 연관관계인 두 엔티티가 즉시 로딩된다면 (엔티티 그래프나 fetch join 으로 연결되어 있다면) 페이징 처리시 쿼리에 limit 가 붙지 않고 모든 데이터가 메모리에 불러와진다. 페이징 처리를 위해서는 연관된 컬렉션을 한꺼번에 가져올 배치 사이즈를 정한다. (예시: 100개로 정하기) spring: jpa: properties: hibernate: default_batch_fetch_size: 100 요구사항 어드민 화면에서 모든 사용자의 주문내역을 불러오는 화면이 필요합니다. 우리는 수많은 주문들을 한 화면에 불러오기 보다는 페이징 처리를 통해 한번에 필요한 갯수만큼 가져오겠습니다. Entity 연관관계 주문과 주문상품이 .. 2021. 11. 28.
JPA - 기본키 생성 전략 JPA - 기본키 생성 전략 관계형 데이터베이스에서 테이블은 각각의 행을 구별하는 기본키가 필요하다. 기본키를 만들 때는 주민등록번호, 주문번호 같은 '자연키' 를 사용할 수도 있고, 논리적 의미가 하나도 없는 하나씩 증가하는 순번 같은 '대체키'를 사용할 수도 있다. 기본키로 어떤 것을 선택하면 좋을까? 주문번호 관련 생성 정책이 변경되거나 주민등록번호를 더 이상 저장하면 안된다는 정책이 생기는 등 자연키는 기본키로 정할 수 있는 올바른 전략이 아닐 수도 있다. 상황에 따라 다르겠지만 대체키를 권장한다. 대체키를 사용하고자 할 때는 Integer 타입 (약 10자리수, 21억 정도까지 표현) 대신 Long 타입 (약 19자리, 9백경 정도까지 표현)을 사용하여 표현 범위를 .. 2021. 9. 26.
JPA - 연관관계 매핑(N:1, 1:N, 1:1, N:N) JPA 005 - 다양한 연관관계 매핑 다대일, 일대다, 일대일, 다대다 매핑을 알아보자. (앞에 있는 객체가 외래키를 가지는 연관관계 주인이라고 가정한다.) 1. 다대일 (N:1) 저번시간에 JPA - 단방향, 양방향 연관관계 매핑 글에서 Comment (N) - Post (1) 관계에서 연관관계 주인을 Comment로 선택하여 외래키를 Comment가 관리하게 하는 예제를 보았다. 다대일 관계는 이를 말한다. 될 수 있으면 단방향 관계만 설정하고, 반대편 (Post) 에서도 조회하고 싶다면 양방향 관계를 추가하고 양방향 매핑을 주의해서 관리해주면 된다. 2. 일대다 (1:N) 일대다 단방향 매핑 일대다 관계는 자바 컬렉션(Collection, List, Set, Map) 중 하나를 사용해서 참조할 객.. 2021. 9. 21.
JPA - 단방향, 양방향 연관관계 매핑 JPA 004 - 단방향, 양방향 연관관계 매핑 TL;DR 두 테이블이 있고, 한 테이블에 외래키가 있는 상황에서 테이블은 항상 양방향 관계를 가진다. A 객체 안에 B 객체가 필드로 있다면, A에서 B로 가는 단방향 관계를 가진다. 단방향 관계만으로 충분히 연관관계 매핑을 할 수 있다. 아래 예제에서 Post 에 있는 @OneToMany 는 사실 없어도 잘 동작한다. 외래키는 @ManyToOne 이 붙은 Comment 에 자연스럽게 생긴다. 반대방향으로도 조회하고 싶으면 양방향 관계를 설정하자. (반대 방향의 객체 그래프 탐색이 가능해진다.) 대신에, 연관관계 편의 메소드 등을 만들어서 양방향 매핑을 모두 잘해주고, 논리적으로 오류가 없도록 관리를 잘 해주어야 한다. 단방향, 양방향? 테이블 vs 객체.. 2021. 9. 20.
JPA - 상속 객체와 테이블 매핑 JPA 006 - 상속 객체와 테이블 매핑 객체는 상속을 통해 공통된 필드를 부모클래스에 만들고, 나머지 필드를 각 자식클래스에 둘 수 있다. 하지만, 관계형 데이터베이스에는 상속의 개념이 없다. 대신 슈퍼타입-서브타입 모델링 기법을 사용할 수 있다. ORM 은 객체의 상속과 데이터베이스의 슈퍼타입-서브타입 관계를 매핑한다. JPA 에서는 객체와 테이블을 매핑할 때 3가지 전략을 제시한다. 1 Joined 전략 부모테이블과 자식테이블 각각을 모두 생성하고, 원하는 데이터를 조인해서 가져온다. 각 자식테이블은 부모와 같은 PK 를 가지면서, 이 PK는 부모의 PK와 관계를 맺는 FK 가 된다. @Entity @Inheritance(strategy = InheritanceType.JOINED) public .. 2021. 9. 19.
Spring Data JPA - Entity, 관계 매핑 Spring Data JPA 목표 - Entity 만들어 릴레이션과 매핑한다. - Value 타입을 매핑한다. - 관계(1대다, 단방향, 양방향)를 설정한다. application.properties # datasource 설정 - postgreSQL DB spring.datasource.url=jdbc:postgresql://localhost:5432/postgres spring.datasource.username=postgres spring.datasource.password=1234 # hibernate 설정 spring.jpa.hibernate.ddl-auto=create # hibernate WARN 경고 출력 방지 spring.jpa.properties.hibernate.jdbc.lob.non.. 2021. 2. 11.
Spring Data JPA - Auditing Spring Data JPA 014 - Auditing Auditing은 생성일자, 생성자, 수정일자, 수정자를 자동으로 등록할 수 있도록 도와준다. 엔티티의 변경 시점에 위 정보를 기록하는 기능이다. 예제를 보자. @Getter @Setter @Entity @EntityListeners(AuditingEntityListener.class) public class Comment { @Id @GeneratedValue private Long id; private String comment; @ManyToOne(fetch = FetchType.LAZY) private Post post; ... @CreatedDate private Date created; @CreatedBy @ManyToOne private.. 2021. 2. 11.
Spring Data JPA - Transactional Spring Data JPA - Transactional Transaction 스프링 데이터 JPA가 제공하는 Repository의 모든 메소드는 @Transactional이 적용되어 있다. @Transactional 애노테이션을 들여다 보자. 클래스, 인터페이스, 메소드에 사용할 수 있고, 메소드에 가장 가까운 애노테이션의 우선순위가 높다. RuntimeException 또는 Error 가 발생하면 rollback 이 자동으로 일어난다. 특별한 롤백 옵션을 추가할 수도 있다. Transaction manager 를 설정할 수도 있지만 기본은 jpa transactionManager 를 사용한다. Isolation 은 여러 레벨로 설정할 수 있고, 데이터의 동시성(성능)과 무결성(신뢰성)을 조절할 수 있.. 2021. 2. 11.
Spring Data JPA - 여러 기능 2 Spring Data JPA - 여러가지 기능 2 Projection project 란 릴레이션에서 select 할 때 원하는 컬럼 가져오는 것이다. select * from table 처럼 모두를 가져올 수도 있고, 아니면 컬럼 이름을 적어서 일부만 가져올 수도 있다. Closed 프로젝션 인터페이스 기반 프로젝션과 클래스 기반 프로젝션이 있는데, 인터페이스 기반을 먼저 해보자. 조금 더 코드가 덜 많다. 클로즈드 프로젝션은 원하는 attribute 만 선택해서 가져오는 것이므로 쿼리의 성능을 최적화 할 수 있다. public interface CommentSummary { String getComment(); int getUp(); int getDown(); } public interface Comm.. 2021. 2. 11.
Spring Data JPA - 여러 기능 1 Spring Data JPA - 여러가지 기능 1 JPA 쿼리 메소드 JPA 에서 쿼리메소드 사용시 아래와 같은 키워드를 제공한다. And, Or Is, Equals LessThan, LessThanEqual, GreaterThan, GreaterThanEqual After, Before IsNull, IsNotNull, NotNull StartingWith, EndingWith, Containing=isContaining=Contains, Like(와일드카드와 함께) OrderBy Not, In, NotIn True, False IgnoreCase 쿼리를 찾아서 사용하는 기능도 제공한다. 엔터티에 정의한 쿼리를 찾아 사용할 수 있다. @NamedQuery, @NamedNativeQuery @NamedQ.. 2021. 2. 11.
728x90