도메인 분석 설계

OneTwoThree·2023년 8월 6일
0

출처


계층구조

@Entity
@Getter
@Setter
public class Category {

    @Id
    @GeneratedValue
    @Column(name = "category_id")
    private Long id;

    private String name;

    @ManyToMany
    @JoinTable(name = "category_item",
            joinColumns = @JoinColumn(name = "category_id"),
            inverseJoinColumns = @JoinColumn(name = "item_id")
    )
    private List<Item> items = new ArrayList<>();

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Category parent;

    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();

}

@ManyToOne으로 parent를 걸어주고 @OneToMany로 child를 걸어준다.

엔티티를 생성해주는 ddl은 그대로 사용하면 안되고 다듬어서 사용해야 한다.

엔티티 설계 시 주의점

  • 엔티티 설계 시 Setter를 사용하지 말자
    유지보수가 어렵다
  • 모든 연관관계는 지연로딩으로 설정
    즉시로딩은 예측이 어렵다
    실무에서 모든 연관관계는 지연로딩 LAZY 로 설정하자
    @XtoOne 은 기본이 즉시로딩이라 모두 지연로딩으로 바꿔줘야 한다
  • 컬렉션은 필드에서 초기화하자
    npe에가 나지 않는다
  • 연관관계 메서드
    양방향인 경우 한쪽의 객체를 생성할 때 다른 쪽의 객체도 생성하는게 좋다.
@Entity
@Table(name="orders")
@Getter @Setter
public class Order {

    @Id @GeneratedValue
    @Column(name="order_id")
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="member_id")
    private Member member;

    @OneToMany(mappedBy = "order")
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name="delivery_id")
    private Delivery delivery;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

    // 연관관계 메서드
    public void setMember(Member member){
        this.member = member;
        member.getOrders().add(this);
    }

    public void addOrderItem(OrderItem orderItem){
        orderItems.add(orderItem);
        orderItem.setOrder(this);
    }

    public void setDelivery(Delivery delivery){
        this.delivery = delivery;
        delivery.setOrder(this);
    }

}

1개의 댓글

comment-user-thumbnail
2023년 8월 6일

글 잘 봤습니다.

답글 달기