작성
·
697
0
@ManyToOne
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
부모와 자식을 이렇게 설정해준다는데,
부모를 Many To One
자식을 One To Many 로 해주는게 이해가 안갑니다.
왜 이렇게 연관관계를 설정해 줘야 하는건가요?
답변 1
2
안녕하세요, 김지수 님. 공식 서포터즈 y2gcoder 입니다.
부모-자식 또는 계층 관계에서의 설정에 대해서 질문해주셨습니다. 계층형 카테고리라고 하여 1차 카테고리 밑에 2차 카테고리, 그 밑에 3차 카테고리를 두는 저는 쇼핑몰 같은 곳에서 많이 봤던 카테고리라고 생각합니다.
질문해주신 의도에 대해 제가 잘 이해했는지는 모르겠으나 2가지 의도로 이해해보았습니다.
위와 같은 계층형 카테고리 관계를 설정해주는데 왜 위와 같이 설정해준 것이냐?
이는 예시와 함께 생각해보면 좋을 것 같습니다. 쇼핑몰 사이트라고 생각하고,
전체 -상의 - 아우터, 티셔츠, 맨투맨
-하의 - 청바지, 슬랙스, 반바지
와 같은 느낌으로 카테고리를 나눴다고 하겠습니다.
그러면 이 때 중간 카테고리인 상의를 기준으로 위의 코드와 같이 보겠습니다. 상의의 부모는 사실 전체 하나(1) 입니다. 상의의 자식들은 아우터, 티셔츠, 맨투맨 의 3개(N)입니다. 그러면 이를 다시 카테고리의 입장에서 일반화해서 보면 계층형 카테고리에서 하나의 카테고리에게 부모는 1개까지 존재할 수 있고, 자식은 N개 존재할 수 있습니다. 그렇기 때문에 위의 코드와 같이 관계를 설정해준 것입니다. 만약 전체 카테고리를 조회해왔다면 parent는 null, child에는 상의, 하의가 들어갈 수 있을 것이고, 아우터를 기준으로 한다면 parent는 상의, child는 빈 리스트일 것입니다.
계층 구조를 설계하는 방식이 진정 이것밖에 없냐?
그렇지는 않습니다. 위의 방식은 계층형 카테고리를 설계하는 방식 중 간단하고 보편적인 방식입니다. 이와 다른 방식을 보고 싶으시다면 다음 링크(클릭)을 들어가보시겠습니까? 각 방식마다 각각의 장단점이 있으니 보시고 편하신 방식을 선택하셔도 좋을 것 같습니다.
감사합니다.
위에 적힌 코드에서 예시를 들자면 현재 객체 this는 상의 , parent는 전체, child는 아우터, 티셔츠, 맨투맨 입니다. 클래스에 정의된 parent는 현재 객체의 부모입니다.
연관관계에 대해서 이해가 가지 않으신다면 JPA 기본편에 대한 학습이 필요합니다!
지극히 간단하게 말씀드려보겠습니다. ManyToOne이라면 Many는 현재 카테고리 객체, One은 해당 애노테이션을 달아준 private Category parent 로 생각하시면 됩니다. 그러면 현재 객체에 비해 부모는 하나, 부모에 비했을 때 자식 카테고리는 여러 개가 될 수 있으니 Many가 됩니다.
또 현재 객체 기준으로 자식 객체는 여러 개가 될 수 있고 자식 객체에 대해 부모는 본 객체 하나만 존재할 수 있습니다. 그래서 OneToMany에서 현재 객체 this가 One, 자식 객체는 Many로 잡아주는 것입니다.
아마 현재 객체를 놓치고 계신 것 같습니다. 현재 객체 기준으로 부모와 자식 객체가 각각 존재하고 있습니다.
parent - 전체
this - 상의
child - 아우터, 티셔츠, 맨투맨
현재 객체가 parent가 아닙니다.
아직 잘이해가 될듯 말듯 하는데요
상의가 부모
아우터, 티셔츠, 맨투맨이 자식이라고 할때
카테고리 입장에서 부모는 1개 (상의)
자식은 아우터, 티셔츠, 맨투맨으로 3개 즉, n개 라고 할때
부모쪽을 @Many To one 으로 다대일 로 설정을 했고,
자식쪽을 @One To many 일대다를 설정을 해놨던데, 저는 이게 서로 반대여야 한다고 생각이 듭니다.
부모가 한개고, 자식이 여러개니까 부모 입장에서는 One To Many
자식은 N 개고, 부모는 1개니까 자식입장에서는 Many To one 으로 설정해줘야 하는게 아닌가요??
왜 코드에서는 아래와 같이 되어 있는지 이해가 안갑니다.
//부모
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="parent_id")
private Category parent;
//자식
@OneToMany(mappedBy="parent")
private List<Category> child = new ArrayList<>();