본문 바로가기

Framework and Tool/JPA56

JPA - 객체지향 쿼리 언어 - JPQL Paging, 집합, 정렬 - 참조: 자바 ORM 표준 JPA 프로그래밍 - PostgreSQL limit offset: https://www.postgresql.org/docs/12/queries-limit.html - 페이징 API 다양한 데이터베이스에서 개발해본 사람이라면 알겠지만 페이징 SQL 작성은 데이터베이스마다 구문을 다르게 작성해주어야하고 반복되는 일이 많아 번거롭다. JPA 는 페이징에 대한 API 를 제공한다. setFirstResult(int startPosition): 조회 시작 위치(0부터 시작) setMaxResults(int maxResult): 조회할 데이터 수 String jpql = "select m from Member m order by m.name asc"; List members = em.c.. 2021. 7. 29.
JPA - 객체지향 쿼리 언어 - JPQL 기본 - 참조: 자바 ORM 표준 JPA 프로그래밍 - JPQL 개요 에서 엔티티를 조회하는 많은 방법들을 간단하게 살펴보았지만 어쨌든 출발점은 JPQL 이다. 이번 절에서는 JPQL 의 기본 사용법을 알아보자. 우선 JPQL 의 기본사항 부터 확인하고 넘어가도록 하자. JPQL 은 SQL 이 아니라 객체 지향 쿼리 언어이다. 테이블을 대상으로 조회하는것이 아니다. JPQL 은 특정 데이터베이스에 의존하지 않는다. JPQL 은 결국 SQL 로 변환된다. - 기본 문법 JPQL 도 SQL 과 비슷하게 SELECT, UPDATE, DELETE 를 사용할 수 있다. 엔티티 저장시에는 persist() 를 이용하므로 INSERT 문은 존재하지 않는다. SELECT 문은 이미 살펴본적이 있다. String jpql =.. 2021. 7. 29.
JPA - 객체지향 쿼리 언어 - 개요 - 참조: 자바 ORM 표준 JPA 프로그래밍 - Query DSL 공식 홈페이지: https://querydsl.com/ - Query DSL Release note: https://querydsl.com/releases - Query DSL 환경설정: https://www.baeldung.com/intro-to-querydsl - 개요 JPA 는 엔티티 객체를 조회할 수 있는 다양한 쿼리기술을 지원한다. JPQL, Criteria, QueryDSL 등 JPA 를 배우지 못하다가 이렇게 책으로라도 배워야겠다고 마음먹은 사람들이라면 한번쯤 들어봤을 법한 단어들이 바로 엔티티 객체를 조회하는 쿼리기술들이다. 위와 같이 화려한 단어들 중 가장 중요한것은 JPQL 이다. Criteria 나 QueryDSL 도.. 2021. 7. 28.
JPA - 값 타입 - 요구사항 분석과 맵핑5 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 값 타입 사용 이전에 사용했던 UML 다이어그램을 잠시 살펴보자. 위의 다이어그램에서 Member 와 Delivery 엔티티에 city, street, zipcode 속성을 주소로 맵핑해보자. 우선 Address 값 타입을 선언해보자. @Embeddable public class Address { private String city; private String street; private String zipcode; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((city == null) ? 0 : city.hashCode().. 2021. 7. 27.
JPA - 값 타입 - 값 타입 컬렉션 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 값 타입 컬렉션 회원에서 좋아하는 음식들과 주소 내역들을 참조하고 있다고 하면 이런 값 타입을 2 개 이상 저장하기 위해서는 컬렉션에 보관해야 한다. JPA 에서는 값 타입 컬렉션을 맵핑할 수 있는 @ElementCollection 과 @CollectionTable 어노테이션을 제공한다. @Entity public class Member { @Id @Column(name = "USER_ID") private String id; @ElementCollection @CollectionTable(name = "FAVORITE_FOODS", joinColumns = @JoinColumn(name = "USER_ID")) @Column(name = "FOOD_NA.. 2021. 7. 25.
JPA - 값 타입 - 불변객체 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 불변객체 값 타입을 여러 엔티티에서 공유해서 사용하면 위험하다. public static void save(EntityManager em) { EntityTransaction tx = em.getTransaction(); tx.begin(); Member member1 = new Member(); member1.setId("User#1"); Address companyAddr = new Address(); companyAddr.setCity("City#1"); companyAddr.setStreet("Street#1"); member1.setCompanyAddress(companyAddr); em.persist(member1); Member member2.. 2021. 7. 22.
JPA - 값 타입 - 임베디드 타입 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 값 타입 JPA 의 데이터 타입을 분류하면 엔티티 타입과 값 타입이 있다. 엔티티 타입은 @Entity 어노테이션으로 정의했던 객체들이고, 값 타입은 int, String 등 기본 타입이나 값으로 사용하는 객체를 말한다. 엔티티는 식별자가 있다. 우리는 어떤 사람이 자라면서 키나 몸무게가 달라진다고해서 그 사람을 다른사람이라고 인식하지 않는다. 반면 값은 100 에서 200 으로 변하면 완전히 다른 값이 된다. 이는 DDD에서 Value Object 와 Entity 를 구분하는 내용에도 등장하는 개념이므로 헷갈린다면 이번 기회에 이해해두도록 하자. - 기본값 타입 @Entity public class Member extends DateMarkable{ @.. 2021. 7. 20.
JPA - 고급맵핑 - 요구사항 분석과 맵핑4 - 참조: 자바 ORM 표준 JPA 프로그래밍 - Fetch 설정 기억을 되살리기 위해 우리가 요구사항 분석과 맵핑3 까지 작성했던 UML 을 다시 한번 살펴보자. 클래스 간의 연관관계의 다중성을 JPA 코드로 작성할 때 별다른 Fetch 전략을 작성하지 않았었다. 만약 Project 팀에서 기본 전략을 지연 로딩으로 설정하기로 합의했다면 Fetch 를 설정해줘야 한다. Default 설정으로 @OneToMany, @ManyToMany 는 지연 로딩으로 설정되어있으므로 @OneToOne, @ManyToOne 을 설정해주자. 주문(Order) 와 주문 상품(Order Item) 의 @OneToOne, @ManyToOne 이 대상이다. @Entity @Table(name = "ORDERS") public c.. 2021. 7. 18.
JPA - 영속성 전이와 고아 객체 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 영속성 전이: CASCADE 여태까지 예제를 수행할 때 부모 와 자식 엔티티 연관에서 한 가지 불편한 점이 있었을것이다. Parent 가 Child 엔티티를 참조하는 상황에서 Parent 와 Child 가 모두 영속된 상태여야 연관관계가 맵핑됐었다. JPA 에서는 특정 엔티티를 영속 상태로 만들 때 CASCADE 옵션으로 연관된 엔티티도 함께 영속 상태로 만들어주는 영속성 전이 기능을 제공한다. @Entity public class Parent{ @Id @GeneratedValue @Column(name = "PARENT_ID") private Long id; private String name; @OneToMany(mappedBy = "parent") .. 2021. 7. 17.
JPA - 지연 로딩 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 지연 로딩 사내 주문 관리 시스템을 개발한다고 가정해보자. 요구사항은 아래와 같다. 회원은 팀 하나에만 속할 수 있다. 회원은 여러 주문내역을 가진다. 주문내역은 상품정보를 가진다. 이를 UML 다이어그램에서 다중성을 표시하면 위와 같다. 연관 엔티티를 로딩할 때 즉시냐 지연이냐를 결정하는것은 비즈니스 로직을 고려해야 한다. 비즈니스 로직이 아래와 같은 특성을 갖는다고 가정해보자. Member 와 Team 은 자주 함께 사용되었다. Member 과 연관된 Order 는 가끔 사용되었다. Order 와 연관된 Product 는 자주 함께 사용되었다. @Entity public class Member { @Id @Column(name = "USER_ID") .. 2021. 7. 16.