@Entity
:: JPA 엔티티임을 명시
@Table
:: 이 엔티티가 사용할 테이블의 이름 명시
@Id
:: 테이블의 키임을 명시
@GeneratedValue(strategy = GenerationType.IDENTITY)
:: 키 생성 방식 지정
@Enumerated(EnumType.STRING)
:: Enum
타입을 테이블에 매핑
@ElementCollection
::
@MapKeyEnumerated
::
@Entity
로 JPA 엔티티임을 먼저 명시하자.
@Table
을 통해 이 엔티티가 사용할 테이블의 이름 또한 명시하자.
@Entity
@Table(name = "beverage") // 가장 하위의 아이템(음료) 정보를 담음
public class Beverage {
}
이제 음료의 정보를 담을 필드를 추가하자. 제일 먼저 기본키를 설정하여야 한다.
@Id
어노테이션으로 berverage
테이블의 기본키를 설정할 수 있다.
음, 근데 나중에 카테고리를 분류할 때, 외래키로 바꾸어야 할 수도 있을 것 같다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "beverage_id")
private Long id;
음료 이름과 간단한 설명은
@Column(name = "name", length = 255, nullable = false)
private String name;
@Column(name = "description", length = 255, nullable = false)
private String description;
음료의 사이즈는 Enum
으로 표현한다. 두 가지 타입만으로 구별이 된다면 Boolean
을 쓸 수 있었겠지만, 나는 세가지 사이즈를 집어 넣을 것이기 때문에 Enum
을 쓸 것이다.
CHAR[]
로 표현할까 생각을 하다가, 코드를 이해하기 힘들 것이므로 Enum
을 쓴다. @Enumerated
를 통해서 Enum
타입을 테이블에 매핑할 수 있다. EnumType.STRING
을 이용하여 Enum
의 문자열 값을 데이터베이스에 저장하도록 지정할 수 있다.
@Enumerated(EnumType.STRING)
@Column(name = "size", length = 20, nullable = false)
private Size size;
Boolean
을 통해 따뜻한 음료와 차가운 음료를 구분한다.
@Column(name = "is_iced", nullable = false)
private Boolean isIced;
음료 옵션과 옵션에 따른 음료 가격을 Map을 통해서 저장한다. @ElementCollection
과 @MapKeyEnumerated
를 통해서 맵을 테이블에 저장할 수 있다.
@ElementCollection
어노테이션은 컬렉션 타입의 필드를 매핑할 때 사용한다. @MapKeyEnumerated
어노테이션은 그 맵의 키가 Enum 타입일 때 사용한다.
@ElementCollection
@CollectionTable(name = "beverage_option")
@MapKeyEnumerated(EnumType.STRING)
@Column(name = "price", nullable = false)
private Map<Option, Integer> optionPriceMap = new HashMap<>();
사용할 Option Enum
타입을 정의해야한다. Option Enum
으로 사용할 옵션들을 표현할 생각이다. @Enumerated
어노테이션을 이용하여 Enum
타입을 매핑할 수 있다. `
@Enumerated(EnumType.STRING)
@Column(name = "option_name", length = 20, nullable = false)
private Option option;
public enum Option {
HOT, ICED;
}
package com.example.myapi.Repository.Entity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.HashMap;
import java.util.Map;
@Entity
@NoArgsConstructor
@Getter
@Table(name = "beverage") // 가장 하위의 아이템(음료) 정보를 담음
public class Beverage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "beverage_id")
private Long id;
@Column(name = "name", length = 255, nullable = false)
private String name;
@Column(name = "description", length = 255, nullable = false)
private String description;
@Enumerated(EnumType.STRING)
@Column(name = "size", length = 20, nullable = false)
private Size size;
public enum Size {
TALL, GRANDE, VENTI;
}
@Column(name = "is_iced", nullable = false)
private Boolean isIced;
@ElementCollection
@CollectionTable(name = "beverage_option")
@MapKeyEnumerated(EnumType.STRING)
@Column(name = "price", nullable = false)
private Map<Option, Integer> optionPriceMap = new HashMap<>();
@Enumerated(EnumType.STRING)
@Column(name = "option_name", length = 20, nullable = false)
private Option option;
public enum Option {
HOT, ICED;
}
@Builder
public Beverage(Long id, String name, String description, Size size, Boolean isIced,
Map<Option, Integer> optionPriceMap, Option option) {
this.id = id;
this.name = name;
this.description = description;
this.size = size;
this.isIced = isIced;
this.optionPriceMap = optionPriceMap;
this.option = option;
}
}