본문 바로가기

JPA9

일대다(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.
Spinrg data 초기화, migration Springboot - Spring Data 초기화, migration 초기화 JPA로 DB 초기화 application.properties spring.jpa.hibernate.ddl-auto=update update : 자동으로 DB schema(테이블, 칼럼 등)가 생성된다. 기존에 것은 냅두고, 새로운 스키마를 추가해준다. create : 이미 있던 스키마를 제거하고 새로 스키마 생성한다. 안에 있던 데이터도 삭제된다. create-drop : 자동 스키마 생성하고 종료할 때 삭제한다. spring.jpa.generate-ddl=true 이 옵션도 추가해야 스키마가 생성된다. 운영용 환경에서는 아래와 같이 사용하면 객체가 엔터티와 잘 매핑이 되어있는 지 검증하는데 유용하다. spring.jpa.h.. 2021. 1. 20.
Springboot - Spring Data JPA Springboot 014 - Spring Data JPA ORM (Object Relational Mapping) 자바 코드는 객체 지향 프로그래밍인데 이를 릴레이션과 매핑할 때 개념적으로 불일치가 일어난다. 예를들면 객체의 다양한 크기들을 데이터 테이블에 어떻게 매핑을 시킬 수 있는가? 객체는 상속이 있지만, 테이블은 상속이 없는데 어떻게 매핑 할 것인가? Identity 는 객체의 경우 해쉬코드, equals method 를 통해 알지만, 테이블의 경우 인덱스 컬럼이 있다. 서로 다른 Object 와 Relation은 어떻게 일치시키는가? 에 관한 문제가 있다. ORM 은 이를 해결하기 위한 프레임워크고, 자바 (EE) ORM 표준으로 JPA 가 있다. 스프링 데이터 JPA는 위에서 말한 JPA를 .. 2021. 1. 20.
[springboot] mysql database - java (JPA) 연동 [springboot] mysql - java (JPA) 연동 자바에서는 데이터베이스와 자바를 연동하는 방법을 만들어낸다. jdbc(java database connectivity) 를 사용하면 된다. 이 글에서는 java springboot jpa를 사용할 때 mysql을 jdbc를 통해 연결하는 방법을 알아본다. 먼저, 빌드도구로 여기서는 gradle을 사용한다. (maven 은 maven 홈페이지 - spring boot) 를 참고하면 좋다. mysql 우선, mysql 이 사용자 환경에 설치되어 있어야 한다. 본인은 맥os에서 rdijin 이라는 유저환경에 mysql을 설치했다. 설치는 brew를 통해 간단히 설치했다. % brew install mysql mysql을 처음에 root 계정으로 접.. 2020. 10. 3.
728x90