01. 페치 조인(fetch join) 이란? 페치 조인은 SQL의 조인 종류와는 무관하다. JPQL에서 성능 최적화를 위해 제공하는 기능으로, 연관된 엔티티나 컬렉션의 SQL을 한 번에 함께 조회하는 기능이다. 쿼리로 내가 원하는 대로 어떤 객체 그래프를 한 번에 조회할 것을 동적인 타이밍에 정할 수 있다. join fetch 명령어를 사용하면 된다. 페치 조인 ::= [LEFT [OUTER] | INNER] JOIN FETCH 조인경로 02. 엔티티 페치 조인 Member를 가져올 때 Team도 가져오고 싶은 경우, JPQL로 select m from Member m join fetch m.team 을 작성하고 실제 나가는 SQL 쿼리문을 보면 SELECT M.*, T.* FROM MEMBER M I..
01. 경로 표현식이란? 경로 표현식이란 .(점)을 찍어 객체 그래프를 탐색하는 것이다. 3가지 경로 표현식이 존재한다. 세 가지 중 어떤 것을 사용하느냐에 따라 내부 동작이 달라지기 때문에 반드시 이해하고 사용해야 한다. 02. 경로 표현식 용어 정리 상태 필드(state field) : 단순히 값을 저장하기 위한 필드이다. 예시로는 select m.username 이 있다. 연관 필드(association field) : 연관관계를 위한 필드이다. 단일 값 연관 필드와 컬렉션 값 연관 필드로 나뉜다. 단일 값 연관 필드 : @ManyToOne, @OneToOne 에 사용하며 대상이 엔티티이다. 예시로는 join m.team t 이 있다. 컬렉션 값 연관 필드 : @OneToMany, @ManyToMa..
작성 개요 현재, 인프런에서 김영한님의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의를 듣고 있다. 자바 ORM 표준 JPA 프로그래밍 - 기본편 에서 들은 내용을 기본으로 하는 강의라서 복습할 겸, 내가 제대로 내용을 이해하고 있는지 정리할 겸 작성을 시작하게 되었다. 01. @Getter 와 @Setter에 관하여 예제에서는 엔티티 클래스에 Getter, Setter를 모두 열어두었다. 실무에서는 Getter 열어두고, Setter는 꼭 필요한 경우에만 사용하는 것을 추천한다고 한다. 실무에서 엔티티 데이터는 조회할 일이 많으므로 Getter는 열어두는 것이 편리하다. Getter는 단순히 데이터를 호출하는 것이므로 호출하는 것 자체만으로 어떤 일이 발생하지 않는다. 하지만 Set..
01. 프로젝션 프로젝션이란? SELECT 절에 조회할 대상을 지정하는 것을 말한다. 프로젝션 대상으로는 엔티티, 임베디드 타입, 스칼라 타입 (숫자, 문자 등 기본 데이터 타입) 이 있다. 관계형 데이터베이스 같은 경우, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)만 넣을 수 있다. 엔티티 프로젝션 다음 쿼리의 예시를 보자. SELECT m FROM Member m 이렇게 가져온 쿼리의 결과는 영속성 컨텍스트에 관리가 될까? 된다. 아래는 예시 코드이다. 아래 실행 결과와 같이 영속성 컨텍스트에서 관리되고 있음을 볼 수 있다. 다음 쿼리의 예시를 보자. SELECT m.team FROM Member m Member를 통해 Team을 조회하고 싶다면 다음과 같이 작성하면 된다. List result ..
01. JPQL 소개 JPQL 소개 JPQL은 객체지향 쿼리 언어이다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라, 엔티티 객체를 대상으로 쿼리한다. 즉 @Entity(name = "")에 name에 해당하는 값을 말한다. 중요한 것은 JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다는 것이다. JPQL은 결국 SQL로 변환된다. (최대한 SQL문과 비슷하게 짜는 것이 좋다.) 02. JPQL 문법 JPQL 문법 예시로 select m from Member as m where m.age > 18을 들 수 있다. 엔티티와 속성은 대소문자를 구분한다. JPQL 키워드는 대소문자를 구분하지 않는다. (SELECT, FROM, WHERE 등) 엔티티 이름을 사용해야 한다. 테이블 이름..
01. 값 타입 컬렉션 값 타입 컬렉션 값 타입을 컬렉션에 담아서 쓰는 것을 말한다. 값 타입을 하나 이상 저장할 때 사용한다. Member 엔티티의 favoriteFoods 변수, addressHistory 변수는 값 타입을 컬렉션으로 갖고있다. 관계형 데이터베이스는 기본적으로 컬렉션을 테이블 내에 담을 수 있는 구조가 없다. @ElementCollection, @CollectionTable을 사용한다. @ElementCollection은 컬렉션 객체임을 JPA에게 알려주는 어노테이션이다. @CollectionTable의 name 속성으로 매핑한 테이블명을 작성한다. @CollectionTable의 joinColumns 속성은 FK를 지정하는 것이다. favoriteFoods에는 예외적으로 @Colum..
01. 값 타입의 비교 값 타입 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 한다. 변수 a와 변수 b의 값이 같으므로 true가 나온다. address1과 address2의 값은 같지만 참조가 다르므로 false가 나온다. public class ValueMain { public static void main(String[] args) { int a = 10; int b = 10; System.out.println("a == b : " + (a == b)); Address address1 = new Address("city", "street", "100"); Address address2 = new Address("city", "street", "100"); System.out.printl..
01. 값 타입 공유 참조 값 타입 공유 참조 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다. side effect가 발생할 수 있다. 예시 코드는 아래와 같다. member1과 member2에 주소값을 넣었다. try { Address address = new Address("city", "street", "100"); Member member1 = new Member(); member1.setUsername("member1"); member1.setHomeAddress(address); em.persist(member1); Member member2 = new Member(); member2.setUsername("member2"); member2.setHomeAddress(addr..