스프링데이터 + JPA/웹 애플리케이션 개발

8. 엔티티 개발 2

sdafdq 2023. 11. 5. 16:19

 

 

다대다

실무에서 안쓴다.

 

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

 

다대다는 위와같은 테이블 형태밖에 할 수 없다.

다대다에 테이블 설정을 해준다.

얘 입장에서 관여할 column은 category_id다. 카테고리니까.

inverseJoinColumns는 직역은 역 조인 컬럼인데,

말 그대로 반대편에서 관여할 컬럼이다.

 

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Getter @Setter
public abstract class Item {
    @Id @GeneratedValue
    @Column(name = "item_id")
    private Long id;

    private String name;

    private int price;

    private int stockQuantity;

    @ManyToMany(mappedBy = "items")
    private List<Category> categories = new ArrayList<>();
}

 

mappedBy 해줘서 주인이 누군지 명확하게 해줬다.

 

 

 

그 다음, 

계층 카테고리 구조.

나는 이게 1depth 카테고리 테이블, 2depth 카테고리 테이블 이렇게 나누는 줄 알았는데,

이런 식.

그냥 카테고리 라는 테이블 안에 정보를 다 넣어놓는데,

 

lev는 level의 줌말로 depth 얘기인 거 같고,

 

그러니까 대충, 부모카테고리의 id, 내 카테고리의 depth, 이 정도를 모아놓은 듯 하다.

 

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

 

여기 보면 그래서 내 테이블에서 조인해서 가져오는데,

부모는 하나를 가져오고,

 

자식들은 아마 join 해서 내 id가 parent_id인 것들을 가져올 것이다.

 

 

저도 뭐 저런 거 할 때 그냥 1depth 카테고리 테이블, 2depth 카테고리 테이블 이렇게 있는 거 아니야? 이렇게 생각했는데,

요런 식으로 그러니까,

아마도 내 depth, 부모 id,

그 정도로 해서 가져오는 듯 싶네요.

대충 내 depth, 부모_id, 카테고리네임 이 정도로 해서

한 카테고리 테이블에 다 때려넣는 식 인거 같아요.

 

그러니까 예를 들어 id를 통해 카테고리를 가져오게 되면,

거기에 부모_id, 또 나의 자식들은 내 id를 가지고 있을 테니

parent도 가져올 수 있고, child 들도 그냥 cc.parent_id = c.category_id 해서 가져올 수 있는..

'스프링데이터 + JPA > 웹 애플리케이션 개발' 카테고리의 다른 글

10. 구현 요구사항  (0) 2023.11.05
9. 엔티티 개발 주의점  (0) 2023.11.05
7. 엔티티 개발  (0) 2023.11.05
6. 도메인 모델과 테이블 설계  (0) 2023.11.04
5. 요구사항 분석  (0) 2023.11.04