01. 문제 상황 패스트캠퍼스 강의를 들으며 실습을 진행하던 도중, 에러를 마주했다. 간단한 유저 엔티티를 작성하고 이를 저장하는 실습이였다. 1. domain 패키지에 User 클래스를 작성하였다. (다만 @Table(name="Users")로 테이블 명을 따로 지정해주었다. User가 키워드이기 때문에!!!) 더보기 package com.fastcampus.jpa.bookmanager.domain; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.*; import java..
분류 전체보기
·JPA
01. 프로젝션 프로젝션이란? SELECT 절에 조회할 대상을 지정하는 것을 말한다. 프로젝션 대상으로는 엔티티, 임베디드 타입, 스칼라 타입 (숫자, 문자 등 기본 데이터 타입) 이 있다. 관계형 데이터베이스 같은 경우, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)만 넣을 수 있다. 엔티티 프로젝션 다음 쿼리의 예시를 보자. SELECT m FROM Member m 이렇게 가져온 쿼리의 결과는 영속성 컨텍스트에 관리가 될까? 된다. 아래는 예시 코드이다. 아래 실행 결과와 같이 영속성 컨텍스트에서 관리되고 있음을 볼 수 있다. 다음 쿼리의 예시를 보자. SELECT m.team FROM Member m Member를 통해 Team을 조회하고 싶다면 다음과 같이 작성하면 된다. List result ..
·JPA
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 등) 엔티티 이름을 사용해야 한다. 테이블 이름..
·JPA
01. 값 타입 컬렉션 값 타입 컬렉션 값 타입을 컬렉션에 담아서 쓰는 것을 말한다. 값 타입을 하나 이상 저장할 때 사용한다. Member 엔티티의 favoriteFoods 변수, addressHistory 변수는 값 타입을 컬렉션으로 갖고있다. 관계형 데이터베이스는 기본적으로 컬렉션을 테이블 내에 담을 수 있는 구조가 없다. @ElementCollection, @CollectionTable을 사용한다. @ElementCollection은 컬렉션 객체임을 JPA에게 알려주는 어노테이션이다. @CollectionTable의 name 속성으로 매핑한 테이블명을 작성한다. @CollectionTable의 joinColumns 속성은 FK를 지정하는 것이다. favoriteFoods에는 예외적으로 @Colum..
·JPA
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..
·JPA
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..
·JPA
01. 임베디드 타입 임베디드 타입 새로운 값 타입을 직접 정의할 수 있다. 주로 기본 값 타입을 모아서 만들어 복합 값 타입이라고도 한다. 회원 엔티티 회원 엔티티는 다음과 같이 이름, 근무 시작일, 근무 종료일, 도시, 번지, 우편번호를 가진다. 근무 시작일, 근무 종료일이 비슷한 속성이고, 도시, 번지, 우편번호가 비슷한 속성이므로 회원 엔티티는 다음과 같이 이름, 근무 기간, 집 주소를 가질 수 있다. 02. 임베디드 타입 사용법 임베디드 타입 사용법 값 타입을 정의하는 곳에 @Embeddable 를 작성한다. 값 타입을 사용하는 곳에 @Embedded 를 작성한다. 기본 생성자는 필수로 있어야 한다. 예시 코드 Member 클래스가 다음과 같이 정의되었을 때, startDate와 endDate를..
·JPA
JPA에서 데이터 타입의 분류는 엔티티 타입, 값 타입(기본값 타입, 임베디드 타입, 컬렉션 값 타입)으로 나타낼 수 있다. 01. JPA의 데이터 타입 분류 엔티티 타입 엔티티 타입이란 @Entity로 정의하는 객체이다. 데이터가 변해도 식별자로 지속해서 추적이 가능하다. 예를 들어, 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식이 가능하다. 값 타입 값 타입이란 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체이다. 식별자가 없고 값만 있으므로 변경 시 추적이 불가능하다. 예를 들어, 숫자 100을 200으로 변경하면 완전히 다른 값을 대체된다. 추적 가능하다는 말이 중요하다. 02. 값 타입 분류 기본값 타입 자바가 기본적으로 제공하는 것들이다. 자바..