@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;
}
}