양방향과 연관관계 메소드

프로젝트

목록 보기
24/39
post-thumbnail
  • Order, OrderDetail, Delivery 3개의 엔티티가 있다.

    • OrderOrderDetail@OneToMany로 가지고,
      OrderDetailOrder@ManyToOne으로 가진다.
    • Order(mappedBy)와 Delivery(주인)는 @OneToOne 관계다.
  • OrderRepository<Order, Long> 1개를 이용해서 한번에 3개의 엔티티 정보를 한번에 넣고싶은게 내 목표였다.

고민 & 문제

  • 맨처음에 테스트 코드를 짜는 것은 쉬웠다. set으로 그냥 값만 넣었기 때문이다.
    하지만 이번에는 Builder를 이용했기 때문에 간단하게 set으로 값을 넣는것이 아니였으며,
    가장 고민 했던 부분은 OrderDetail과 Delivery가 Order의 Pk인 num을 가지는데 이 pk인 num값을 어떻게 주문 상세와 배송정보가 갖느냐 였다.

시도

  1. @index를 사용해봤다.
    find로 현재의 주문 Order pk의 가장 Max인 값을 구해와서 +1 해서 구하면 되지 않을까? 라고 생각했다가 이 글 속에

    이건 안된다는 얘기가 있어서 하지않았고, 마찬가지로 이 글 속의 코드 중에 @Index를 쓰셨길래 찾아봤다. 하지만, 이건 거의 조회로직때 많이 사용하는 것 같아서 만들어봤다가 다시 지웠다.

  1. @PrimaryKeyColumn
    : @ManyToOne를 한 쪽(주인)에도 사용하고 @OneToMany쪽에서도 가끔 넣어서 사용하던데, 처음봤다.
    왠지 @Primary라는 이름이 들어가있어서 Fk이자 Pk로 사용할 수 있는건가? 해서 이것저것 사용해봤지만 이것도 아닌것 같았다.

  1. 연관관계 편의 메서드
    : 이번에 양방향 관계에 대해 막 찾아보다가 시간을 보내고 하루의 절반이 지난 쯤에 연관관계 메서드가 생각났다.
    그래서 여러개로 시도해봤는데 안돼서 계속 정보를 찾았다. 그러다가 이 블로그 글을 찾아서 좀 이해가 됐다.
    💡 양방향은 그저 조회 때문에 사용하는 것이다. 양방향 중 주인(Order의 Pk를 PK이자 FK로 갖는 OrderDetail, Delivery)이 데이터 삽입, 수정 등의 권한을 가지고 @OneToMany 또는 @OneToOne(mappedBy)를 가지는 Order는 그저 OrderDetail, Delivery를 쉽게 조회하기 위해서 가지고 있는 것이다.
    ➡︎ 주문 상세와 배송정보에 Order의 정보를 필수로 넣어야 되고, Order에는 주문상세와 배송정보를 넣지 않아도 된다! → 하지만 넣는게 좋다.
    💡 최대한 단방향으로 해라. 김영한님 인프런 댓글중에서 OneToOne은 진짜 현업에서 거의 진짜 보기 힘들다고. 단방향 위주로 하고, 양방향은 필요할때만 추가해라.
    💡 양방향 시에 toString() 사용하지 마라!
    ➡︎ json으로 값을 잘 받아오나 확인하려고 toString를 사용했다가 무한루프 걸렸다.

해결

Order.class

OrderDetail.class

OrderDetail.class

OrderService.class

  • 연관관계 주인에 값을 넣어주기 위해서는 dto.get객체() 하면 안되고, entity객체로 만들어 준 후, 그 객체를 넣어야 한다!
    ➡︎➡︎ 양방향 주인에서 Builder로 값을 주입하는게 아니라 연관관계 메서드로 한다! -> 그대신 OneToOne일 경우, 양쪽 다 주입해야함
  • attempted to assign id from null one-to-one property mapsid -> 양방향 주인(Delivery)에 order 객체가 설정되지 않아서(연관관계 편의메서드)연결 안돼서 계속 발생했음
profile
백엔드를 공부하고 있습니다.

0개의 댓글