JPA54 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. JPA - 즉시 로딩과 지연 로딩 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 즉시 로딩과 지연 로딩 이전에 살펴본 프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용한다. Member member = em.find(Member.class, 2L); Team team = member.getTeam(); System.out.println(team.getName()); 위와 같이 회원이 팀에 소속되어 있다고 가정해보자. 이때 회원 엔티티 조회시 팀까지 한꺼번에 하는게 좋을까? 아니면 팀 엔티티를 실제 사용시할때까지 조회를 미루는것이 좋을까? JPA 는 이 두 가지 방식을 모두 지원한다. 즉시 로딩: 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다. @ManyToOne(fetch = FetchType.EAGER) 로 설정할 수 있.. 2021. 7. 15. JPA - 프록시 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 프록시와 즉시로딩, 지연로딩 객체가 데이터베이스에 저장되어있으면 연관된 객체를 탐색하기 난해하다. JPA 구현체들은 이런 문제 해결을 위해 프록시를 이용한다. 프록시를 이용하면 실제 이용하는 시점에 데이터베이스에서 조회할 수 있다. JPA 에서는 즉시로딩 혹은 지연로딩으로 시점을 정할 수 있다. - 프록시 엔티티를 사용할 때 연관된 엔티티의 사용 유무는 비즈니스 로직에 따라 다르다. @Entity public class Member { @Id @GeneratedValue @Column(name = "USER_ID") private Long id; private String userName; @ManyToOne @JoinColumn(name = "TEAM_.. 2021. 7. 14. 이전 1 2 3 4 5 6 다음