220721_오답노트(2)

백승한·2022년 7월 21일
0

오답노트

목록 보기
5/6

문제

테스트 코드는 성공했지만 중간 테이블이 2개나 생성되는 현상을 해결하고 싶었다.

  • 생성되는 테이블
    • RESTAURANT_FOODS : RESTAURANT엔티티와 FOOD엔티티 사이의 중간 테이블
    • ORDERS_FOODS : ORDER엔티티와 FOOD 엔티티 사이의 중간 테이블

원인 및 해결 방법

  1. RESTAURANT_FOODS
public class Restaurant {
    @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL)
    @JsonIgnore
    private List<Food> foods = new ArrayList<>();
}

중간 테이블을 제거하기 위해 고쳤을 당시에 RESTAURANT 엔티티에 foods 필드를 갖고있었다.
mappedBy 속성을 추가해서 없애는데 성공하긴 했지만,

찾아보면서 해당 필드는 없어도 테스트 코드에도 문제가 없고, 중간 테이블도 생성되지 않는다는 것을 알게됐다.

  1. ORDERS_FOODS
  • 수정 전
public class Order {
    @OneToMany
    private List<OrderFood> foods = new ArrayList<>();
}
  • 첫 번째 수정 후
public class Order {
    @OneToMany(mappedBy = "order")
    private List<OrderFood> foods = new ArrayList<>();
}
public class OrderFood {
    @ManyToOne()
	private Order order;
}

mappedBy 속성 추가 & OrderFood에 order필드 추가
중간 테이블은 사라졌지만, 주문 조회하는 테스트 코드 실패

  • 최종 수정 후
public class Order {
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "order_id")
    private List<OrderFood> foods = new ArrayList<>();
}

mappedBy 속성 제거 &@JoinColumn 추가 -> 테스트 성공
그런데 ORDER_FOOD 테이블에 ORDER_ORDER_ID 이 생겼다..
그래서 OrderFood 엔티티에서 추가했던 Order order필드 제거했더니 삭제됐음!

느낀 점

  • 같은 요구사항을 받아도 나오는 결과가 천차만별이다.
  • DB설계를 제대로 하지 않으면 구현단계에서 끔찍한 결과를 초래한다.
    => 결국 마지막에 갈아 엎어야 하는 상황까지 올 수 있다.
  • 각 Entity의 연관 관계를 제대로 설정하지 않으면 순환참조에 빠지게 된다. 많이 어렵다...
  • JPA를 사용해 코드를 구현하면서 H2를 사용해서 직접 눈으로 설계된 테이블을 확인하는 방식이 큰 도움이 되었다.
profile
방문해주셔서 감사합니다🙂

0개의 댓글