JPA 객체지향 쿼리 언어(JPQL) - 페이징 API
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 페이징 API JPA는 페이징을 다음 두 API로 추상화한다. setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작) setMaxResult(int maxResult) : 조회할 데이터 수 setFirstResult()와 setMaxResult()는 다음과 같이 사용하면 된다. List result = em.createQuery("select m from Member m order by m.age desc", Member.class) .setFirstResult(0) .setMaxResults(10) .getResultList(); 그리고 테스트..
JPA 객체지향 쿼리 언어(JPQL) - 프로젝션(SELECT)
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 프로젝션(SELECT) SELECT 절에 조회할 대상을 지정하는 것 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입) SELECT m FROM Member m → 엔티티 프로젝션 Member member = new Member(); member.setUsername("member1"); member.setAge(10); em.persist(member); List result = em.createQuery("select m from Member m", Member.class) .getResultList(); 일반적인 조회 방법은 여태 써왔던 방식..
JPA 객체지향 쿼리 언어(JPQL) - 기본 문법과 쿼리 API
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 기본 문법과 쿼리 API JPQL? Java Persistence Query Language JPQL JPQL은 객체지향 쿼리 언어. 따라서 테이블이 아닌 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. → 방언 JPQL은 결국 SQL로 변환이 된다. (매핑 정보 + 방언 = SQL) 프로젝트 새로 생성 후 Member.class @Entity public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @M..
JPA 객체지향 쿼리 언어 - JPQL, QueryDSL 등 소개
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 객체지향 쿼리 언어(JPQL) JPA는 다양한 쿼리 방법 지원 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색 나이가 18살 이상인 회원을 모두 검색하고 싶다면? 이런 경우에는 em.find()로 가져올 수가 없다. JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 애..
JPA 값 타입 - 값 타입 컬렉션
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 값 타입 컬렉션 값 타입을 컬렉션에 담아서 쓰는 걸 값 타입 컬렉션이라 한다. 값 타입 컬렉션에서 문제는 DB 테이블과 매핑할 때가 문제이다. DB 테이블에는 컬렉션을 담을 수 있는 방법이 없다. 컬렉션은 개념적으로 1대다이기 때문에 별도의 테이블로 뽑아줘야 한다. 예제 Member.class @ElementCollection @CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID")) @Column(name = "FOOD_NAME") // 예외적으로 해주는 것. private Set fav..
JPA 값 타입 - 값 타입의 비교
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 값 타입의 비교 값 타입 : 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 한다. // 같다. int a = 10; int b = 10; // 다르다. Address a = new Address("서울시"); Address b = new Address("서울시"); 그런데 객체의 경우엔 == 비교 시 false가 반환된다. 왜나햐면 JAVA에서는 == 비교 시 참조 값을 비교하게 되는데 a와 b는 각각 다른 참조 값을 갖고 있기 때문에 false가 반환된다. 동일성(identity) 비교 : 인스턴스의 참조 값을 비교, == 사용 동등성(equivalence) 비교 : 인스턴..
JPA 값 타입 - 값 타입과 불변 객체
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 값 타입과 불변 객체 값 타입 공유 참조 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다. 부작용(side effect) 발생 위의 그림처럼 city 값을 NewCity로 변경하면 회원1과 2가 들고 있던 city도 NewCity로 변경된다. Address address = new Address("city", "street", "100"); Member member1 = new Member(); member1.setUsername("member1"); member1.setHomeAddress(address); // 같은 address 공유 em.persist(member..
JPA 값 타입 - 임베디드 타입
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 임베디드 타입(복합 값 타입) 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입(embedded type)이라 함 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함 int, String과 같은 타입 → 추적 불가능 예제(회원) 회원은 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다. 회원 엔티티를 보면 몇 개의 필드를 하나로 합쳐 공통화 할 수 있는 부분들이 보인다. workPeriod : startDate + endDate homeAddress : city + street + zipcode 뭔가 어려워보이지만 그냥 공통화 할..
JPA 값 타입 - 기본값 타입
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 기본값 타입 JPA 의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자(id)로 인식이 가능한 것 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체, 100 -> 200으로 변경되었으면 200이란 값이 과거에 어떤 값이었었는지 추적이 불가능하다. 기본값 타입 자바 기본 타입(int, double) 래퍼 클래스(Inte..
JPA 프록시와 연관관계 - 영속성 전이(CASCADE)와 고아 객체
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 영속성 전이(CASCADE)와 고아 객체 영속성 전이 : CASCADE 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 부모가 em.persist()를 날리면 자식까지 모두 자동으로 함께 저장되는 기능 부모와 연관된 자식들을 한 번에 영속성 컨텍스트에 저장하고 싶은 경우 사용한다. 예제 Parent.class @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent") private List chi..
JPA 프록시와 연관관계 - 즉시 로딩과 지연 로딩
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 즉시 로딩과 지연 로딩 나는 여전히 Member만을 조회하고 싶어. 단순히 Member 정보만 사용하는 비즈니스 로직 같은 경우에 어떻게 Member만 조회해올 수 있을까? 이전 글에서는 프록시에 대해 배웠지만 사실 그건 잘 사용하지 않고, 지연 로딩을 사용해서 프록시로 조회하는 방법을 많이 사용한다. 지연 로딩 LAZY // Member.class 중 일부 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; Member 클래스에서 Team과 연관관계 매핑 애노테이션에 fetch = Fet..
JPA 프록시와 연관관계 - 프록시
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 프록시 나는 둘 중에 하나만 조회하고 싶어 Member와 Team이 연관관계로 매핑되어 있다 하자. 그럼 Member만 조회해야 할 때도 있고, Team만 조회해야 할 때도 있고, Member와 Team을 모두 조회해야 할 때도 있다. Member와 Team 함께 출력 private static void printMemberAndTeam(Member member) { String username = member.getUsername(); System.out.println("username = " + username); Team team = member.getTeam(); System.o..
JPA 고급 매핑 - Mapped Superclass 매핑 정보 상속
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. Mapped Superclass 매핑 정보 상속 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공한다. 추상 클래스와 비슷하며 @MappedSuperclass는 실제 테이블과 매핑 되지 않는다. 객체에 공통 속성이 존재하는 필드를 객체 입장에서 속성만 상속 받아서 사용하고 싶을 때 사용한다. 물론 DB와는 별개이다. @MappedSuperclass 매핑 BaseEntity.class @MappedSuperclass public class BaseEntity { private String createdBy; private LocalDateTime create..
JPA 고급 매핑 - 상속관계 매핑
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 상속 관계 매핑 관계형 데이터베이스에는 상속 관계라는 개념이 존재하지 않는다. 대신 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 그나마 유사하다. 상속 관계를 매핑 : 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 슈퍼타입 서브타입 논리 모델 -> 물리 모델로 구현 조인 전략 각각의 테이블로 만들어 JOIN으로 데이터를 뽑아오는 방식이다. ITEM이라는 상위 테이블을 만들고, ALBUM에 관한 데이터를 가져오고 싶으면 ITEM과 ALBUM을 JOIN하여 데이터를 가져온다. 장점 테이블 정규화가 가장 잘 되어있다. 외래키 참조 무결성 제약조건 활용이 가능하다. 저장공간..
JPA 다양한 연관관계 매핑 - 다대일, 일대다, 일대일, 다대다
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. JPA 다양한 연관관계 매핑 연관관계 매핑시 고려사항 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany 다대다 관계는 실무에서 사용하지 않는다. 대부분 다대일 > 일대다 > 일대일 순으로 실무에서 자주 사용한다. 단방향, 양방향 테이블 외래키 하나로 양쪽 조인 가능 -> 사실 방향이라는 개념이 없다. 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 연관관계의 주인 테이블은 외래키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A->B, B->A 처럼 참..