01. 임베디드 타입 임베디드 타입 새로운 값 타입을 직접 정의할 수 있다. 주로 기본 값 타입을 모아서 만들어 복합 값 타입이라고도 한다. 회원 엔티티 회원 엔티티는 다음과 같이 이름, 근무 시작일, 근무 종료일, 도시, 번지, 우편번호를 가진다. 근무 시작일, 근무 종료일이 비슷한 속성이고, 도시, 번지, 우편번호가 비슷한 속성이므로 회원 엔티티는 다음과 같이 이름, 근무 기간, 집 주소를 가질 수 있다. 02. 임베디드 타입 사용법 임베디드 타입 사용법 값 타입을 정의하는 곳에 @Embeddable 를 작성한다. 값 타입을 사용하는 곳에 @Embedded 를 작성한다. 기본 생성자는 필수로 있어야 한다. 예시 코드 Member 클래스가 다음과 같이 정의되었을 때, startDate와 endDate를..
JPA에서 데이터 타입의 분류는 엔티티 타입, 값 타입(기본값 타입, 임베디드 타입, 컬렉션 값 타입)으로 나타낼 수 있다. 01. JPA의 데이터 타입 분류 엔티티 타입 엔티티 타입이란 @Entity로 정의하는 객체이다. 데이터가 변해도 식별자로 지속해서 추적이 가능하다. 예를 들어, 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식이 가능하다. 값 타입 값 타입이란 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체이다. 식별자가 없고 값만 있으므로 변경 시 추적이 불가능하다. 예를 들어, 숫자 100을 200으로 변경하면 완전히 다른 값을 대체된다. 추적 가능하다는 말이 중요하다. 02. 값 타입 분류 기본값 타입 자바가 기본적으로 제공하는 것들이다. 자바..
01. 영속성 전이: CASCADE 사용 목적 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다. 예시로 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하고 싶을 때가 있다. 영속성 전이(CASCADE)를 사용하지 않는다면? 위의 Parent와 Child에 대한 예시로 코드를 작성해보겠다. Child와 Parent는 다대일 양방향 연관관계를 갖는다. 다음은 Child 클래스 코드이다. @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn(name = "parent_id") private Parent parent; //..
01. 지연 로딩 Member를 조회할 때 Team도 함께 조회해야 할까? 다음 그림과 같은 연관관계를 맺고 있는 엔티티가 있다고 할 때, 단순히 member 정보만 사용하는 비즈니스 로직은 println(member.getName()); 이다. 이 경우, Team도 조인해서 가져오면 손실이 있다. JPA는 지연 로딩이라는 것을 제공한다. 지연 로딩을 이용하면 이 문제를 해결할 수 있다. 지연 로딩 LAZY를 이용해서 프록시로 조회하는 예시 Member 클래스의 @ManyToOne에 속성 (fetch = FetchType.LAZY)을 추가한다. @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; 해당 속성을..
01. 프록시 개요 Member를 조회할 때 Team도 함께 조회해야 할까? Member와 Team은 다음과 같은 관계를 맺고 있다. 회원과 팀을 함께 출력하는 경우, 코드는 다음과 같다. public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름: " + member.getUsername()); System.out.println("소속팀: " + team.getName()); } 회원만 출력하는 경우, 코드는 다음과 같다. public void printUser(String memberId)..
01. @MappedSuperclass 사용 목적 공통 매핑 정보가 필요할 때 사용한다. DB 입장에서 테이블은 다른데 객체 입장에서 상속 받아서 사용하고 싶을 때 사용한다. 아래 그림에서 id와 name이 공통 속성인 것을 볼 수 있다. @MappedSuperclass는 1) 상속관계 매핑이 아니다. 2) 엔티티를 나타내는 것이 아니며, 테이블과 매핑하지 않는다. 3) 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다. 4) 조회 및 검색이 불가능하다. 5) 직접 생성해서 사용할 일이 없으므로 추상 클래스로 만들기를 권장한다. 6) 테이블과 관계는 전혀 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다. 7) 주로 등록일, 수정일, 등록자, 수정자와 같은 전체 엔티티에..
01. 상속관계 매핑 상속관계 매핑 개요 객체에는 상속관계가 있지만, 관계형 데이터베이스에는 상속관계가 없다. 하지만 관계형 데이터베이스에서, 슈퍼타입-서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑 상속관계 매핑이란 슈퍼타입-서브타입 논리 모델을 실제 물리 모델로 구현하는 방법이다. 아래 그림이 논리 모델이다. 아래 그림은 객체의 상속 관계를 보여준다. 상속관계 매핑 방법 상속관계를 매핑하는 방법으로는 3가지가 있다. 조인 전략은 각각을 테이블로 변환하는 것이다. 단일 테이블 전략은 하나의 통합 테이블로 변환하는 것이다. 구현 클래스마다 테이블 전략은 서브타입 테이블로 변환하는 것이다. 02. 상속관계 주요 어노테이션 @Inheritance 상속관계 매핑 시 사용하며 슈퍼타입에 작..
01. 연관관계 매핑 시 고려사항 3가지 다중성 다대일 @ManyToOne 일대다 @OneToMany 일대일 @OneToOne 다대다 @ManyToMany 단방향, 양방향 테이블은 외래 키 하나로 양쪽에서 조인이 가능하다. 객체는 참조용 필드가 있는 쪽으로만 참조가 가능하다. 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이라고 생각하면 된다. 사실 단방향, 양방향이라는 말은 우리가 이해하기 쉽게 사용하는 용어이다. 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는다. 객체 양방향 관계는 참조가 2군데이다. (A에서 B로 참조하는 것 하나, B에서 A로 참조하는 것 하나) 객체 양항뱡 관계는 참조가 2군데 있으므로 둘 중 테이블의 외래 키를 관리할 곳을 지정해야 한다. 연관관계의..