Take A Sip (1) :: 첫 Entity!!

ggyu_55·2023년 4월 19일
0

take A Sip

목록 보기
2/8
post-custom-banner

음료 정보를 담을 Entity :: Beverage


개요

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

사용할 Entity 코드 전문

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;
    }
}
post-custom-banner

0개의 댓글