테이블 목록 : [Runner, Supporter, RunnerPost, RunnerPostTags, SupporterRunnerPost] 시나리오 : Runner가 Supporter에게 리뷰 요청을 하기 위해 RunnerPost를 작성한다. Supporter는 RunnerPost에 리뷰 해준다고 신청할 수 있다. 이 때 Supporter가 지원한 RunnerPost 목록을 페이징하여 조회한다. 추가적으로 RunnerPost에 지원한 Supporter 수를 ApplicantCount라 부르고 이것은 테이블 컬럼에 저장되어 있지 않다. 즉, 하나의 RunnerPost에 관련된 Supporter가 몇 명이 있는지 카운트해서 찾아야 한다. 이번 포스팅은 ApplicantCount를 RunnerPost 내부에 ..
JPA의 데이터 타입은 크게 두 가지로 분류할 수 있다. 엔티티 값타입 엔티티는 @Entity로 정의한 객체이다. 값타입은 int, Integer, String 같은 기본 타입과 객체를 의미한다. 값타입을 조금 더 자세히 분류하면 세 가지가 나온다. 기본값 타입 (int, String, Integer) 임베디드 타입 (사용자 정의 값 : Address, Name, ...) 컬렉션 값 타입 (하나 이상의 값타입) 이제부터 기본값 타입, 임베디드 타입, 컬렉션 값 타입에 대해서 하나하나 알아보자. 🟩 기본값 타입 (Basic Value Type) int, double 과 같은 기본 값 타입 Integer, String과 같은 래퍼 타입이 있다. 기본값 타입은 이전 예제부터 자주 사용하고 있었다. @Entit..
🟩 영속성 전이 (Transtive Persistence) 특정 엔티티를 영속 상태로 만드는 동시에 연관된 엔티티도 영속 상태로 만들고 싶을 때 "영속성 전이 기능"을 사용한다. 01. 영속성 전이 옵션 없이 부모 엔티티와 자식 엔티티를 저장하는 예시 부모, 자식 매핑 코드 @Entity public class Parent { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "parent") private List children = new ArrayList(); } @Entity public class Child { @Id @GeneratedValue private Long id; @ManyToOne private Parent parent; } ..
🟩 프록시 다음과 같은 회원 엔티티을 조회할 때 팀에 대한 정보까지 조인해서 가져오게 된다. @Entity public class Member { @Id @GeneratedValue private Long id; @ManyToOne private Team team; } @Entity public class Team { @Id @GeneratedValue private Long id; } 회원에 대한 로직을 수행할 때 팀에 대한 정보가 필요하다면 유용할 수 있다. 하지만 팀에 대한 정보가 필요없다면 비용만 증가할 뿐이다. 사실 이런 문제는 엔티티를 실제 사용하는 시점에서 데이터베이스에서 조회할 수 있도록 하면된다. 이러한 행동을 EntityManager.getReference()를 통해서 조회를 미룰 수 ..
🟩 데이터베이스 슈퍼타입 서브타입 관계 데이터베이스에서 슈퍼타입과 서브타입은 데이터간의 일반화와 특수화한 관계를 나타낸다. 다음과 같이 상품에 대한 상품 구분이 있을 때 다음과 같이 표현할 수 있다. 이때 상품을 슈퍼타입이라고 하고 상품 구분을 서브타입이라고 한다. 배타적 : 슈퍼타입은 많아야 단 하나의 서브타입과 관련된다. 포괄적 : 슈퍼타입은 하나 이상의 서브타입과 관련된다. 그리고 이러한 슈퍼타입 서브타입 모델을 테이블로 구현할 때 3가지 방법이 있다. 01. 각각의 테이블로 변환 상품_타입 컬럼을 통해서 어떤 상품을 나태는지를 확인하고 상품_식별자값으로 조인하여 나태낼 수 있다. 02. 통합 테이블로 변환 통합 테이블의 경우 모든 상품을 하나의 테이블로 관리하게 된다. 상품_타입을 통해서 상품을 ..
🟩 엔티티 연관관계 매핑 고려할 3가지 01. 다중성 연관관계에는 다중성이 있다. 다중성은 엔티티 간의 관계에서 한 엔티티가 다른 엔티티와 어떤 관계를 맺는지에 대한 개념이다. 01-01. 다중성 종류 다대일 (N:1, @ManyToOne) 일대다 (1:N, @OneToMany) 일대일 (1:1, @OneToONe) 다대다 (N:M, @ManyToMany) 이 중에서 다대일, 일대다 관계를 가장 많이 사용한다. 다대다 관계의 경우는 잘 사용하지 않는 편이다. 02. 단방향, 양방향 테이블은 외래키 하나로 양방향으로 조회가 가능하다. 때문에 테이블에는 방향이라는 개념이 없다. 하지만 객체에서는 참조용 필드를 가지고 있다. 객체는 참조용 필드를 가진 객체만이 연관된 객체를 조회할 수 있기 때문에 방향을 가질..
🟩 단방향 연관관계 01. "객체 연관관계"와 "테이블 연관관계" 01-01. 상품(Product)과 카테고리(Category)의 관계 상품은 하나의 카테고리에 속할 수 있다. 여러 상품이 하나의 카테고리에 속할 수 있다. 상품과 카테고리는 N:1(다대일) 관계이다. 01-02. 객체 연관관계 상품과 카테고리는 필드(Product.category)로 연관관계를 맺는다. 상품과 카테고리는 단방향 관계이다. 단방향 관계인 이유 Product.category를 통해서 상품의 카테고리를 알 수 있다. Category는 어떤 상품이 존재하는지 알 수 없다. 오직 상품만이 카테고리를 알 수 있는 관계이다. 01-03. 테이블 연관관계 상품과 카테고리는 외래키(FK)로 연관관계를 맺는다. 상품 테이블과 카테고리 테이..
🟩 기본 키 매핑 (@Id) @Id 어노테이션은 Entity 클래스에서 사용되고, 해당 클래스의 기본 키 필드를 지정하는데 사용된다. 🤔 기본키? 데이터베이스 테이블에서 각 행을 고유하게 식별하는데 사용되는 필드라고 생각하자. 아래와 같이 사용할 수 있다. @Entity public class Member { @Id private Long id; public Member() { } } 🟩 JPA가 제공하는 데이터베이스 기본 키 생성 전략 생각해보면 데이터베이스마다 기본 키를 생성하는 방식이 다르다. 생성 방식이 다른 문제를 해결하기 위해서 JPA는 여러 기본 키 생성 전략이 존재한다. 기본 키 생성 전략을 크게 나누면 직접 할당, 자동 할당이 있다. 직접 할당은 단순히 @Id 어노테이션만을 이용하여 애플..
🟩 @Entity 란? 테이블과 매핑할 클래스에 @Entity 어노테이션을 붙인다. @Entity가 붙은 클래스는 JPA가 관리해주며, 이것을 엔티티(Entity)라고 한다. 🟩 @Entity 사용 예제 // Entity에 member라는 이름을 부여한다. @Entity(name = "member") public class Member { @Id @GeneratedValue private Long id; // 생성자 접근제어자 - public 또는 protected public Member() { } } 🟩 @Entity 속성 속성 기능 기본값 name JPA에서 사용할 Entity 이름 지정한다. 기본값은 클래스 이름이다. 이름이 같은 엔티티 클래스가 없어야 한다. 설정하지 않은 경우 클래스 이름을 사..