처음 만들었던 Entity는 같은 음료라도 옵션이 다르면 새 엔티티를 통해 새 테이블을 만들어 줘야 했다!!!
이 무슨 쓰레기같은... 음료 종류가 같으면 옵션이 어떻든 같이 관리하도록 해야 한다. 어떻게 해야할까?
음료의 옵션을 별개의 테이블로 분리하고, 음료 테이블의 기본키를 통해 옵션 테이블에 추가한 해당 음료의 옵션을 찾을 수 있도록 관계를 맺어주면 될 듯하다....! 다른 방법이 있을 수 있지만 일단 이게 맞지 않을까?
Bevarage와 Option 테이블간에 OneToMany 관계를 맺어주고 음료의 옵션을 addOption()을 통해 추가할 수 있도록 만들어 주었다.
@ManyToOne(fetch = FetchType.LAZY)
:: 엔티티 간의 다대일 관계를 매핑할 수 있다. FetchType.LAZY 옵션은 연관 엔티티가 실제로 필요할 때까지 데이터베이스에서 로딩을 지연시킨다. 반대로, FetchType.EAGER 를 사용하면 즉시 로딩한다.
@JoinColumn(name = "beverage_id")
:: 두 엔티티 간의 관계에서 FK를 지정할 때 사용.
@Entity
@NoArgsConstructor
@Getter
@Table(name = "beverage") // 가장 하위의 아이템(음료) 정보를 담음
public class Beverage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "beverage_id")
private Long id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "description", nullable = false)
private String description;
@OneToMany(mappedBy = "beverage", cascade = CascadeType.ALL)
private List<Option> options = new ArrayList<>();
public void addOption(Option option) {
options.add(option);
option.setBeverage(this);
}
public void removeOption(Option option) {
options.remove(option);
option.setBeverage(null);
}
}
@Entity
@Table(name = "option")
@NoArgsConstructor
public class Option {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Size size;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Temperature temperature;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "beverage_id")
private Beverage beverage;
@Builder
public Option(Size size, Temperature temperature) {
this.size = size;
this.temperature = temperature;
}
public void setBeverage(Beverage beverage) {
this.beverage = beverage;
}
}