인프런 커뮤니티 질문&답변
강의를 보고 연관관계 매핑을 하는데 모르겠습니다...
작성
·
166
·
수정됨
0
무신사와 비슷하게 만들고 있는데
하나의 옷은 여러개의 카테고리를 가질 수 있잖아요
Ex) [상품] 버버리코트 - [카테고리]상의, 코트, 겨울 등등..
그런데 하나의 카테고리 또한 여러개의 상품에 등록되는 거 같아요
Ex) [상품]아디다스 저지, 빨간색니트, 반팔티 - [카테고리]상의
이래서 N-M으로 연관관계 매핑이 되는 줄 알고 중간테이블로 둬서
1:N , N:1로 만들었습니다.
그런데 아이템을 넣고 확인해보니 중간테이블과 카테고리의 아이디가 동일하게 올라갈 수 밖에 없는 로직으로 구성되어 있습니다. 왜냐하면 옷 하나를 등록할 때 보통 많은 카테고리를 넣기 때문입니다.
Item item = ItemRegisterDto.Request.toItemEntity(itemRegisterDto, findMember);
itemRepository.save(item);
Set<String> categoryNames = itemRegisterDto.getCategoryNames();
for (String categoryName : categoryNames) {
Category category = ItemRegisterDto.Request.toCategoryEntity(categoryName);
category.addItemCategories(item, category);
categoryRepository.save(category);
}public void addItemCategories(Item item, Category category) {
this.itemCategories = new ArrayList<>();
this.itemCategories.add(ItemCategory.builder()
.category(category)
.item(item)
.build());
}중간테이블과 카테고리의 아이디가 동일하게 올라가므로
굳이 중간테이블을 쓰지 않고 옷과 카테고리를 1:N 양방향 매핑으로 연관관계를 만들면 될 거 같다고 생각했습니다.
만약, 옷과 카테고리를 1:N 양방향 매핑이 맞다면 하나의 옷은 여러개의 카테고리를 가질 수 있고 하나의 카테고리 또한 여러개의 옷을 가질 수 있는데 다대다관계가 아닌 이유도 궁금합니다.
마지막으로 어떻게 생각해야 연관관계 매핑에 있어서 잘 지을 수 있을까요?
답변 2
0
안녕하세요. kongminoo님, 공식 서포터즈 y2gcoder입니다.
무신사의 옷과 카테고리에 대한 내부 구현에 대해 알지 못하지만, 제 짧은 생각으로도 옷:카테고리는 N:M 관계라고 생각합니다.
프로젝트 요구사항에 따라 다르겠지만 저라면 옷을 등록한다고 할 때 카테고리를 등록하는 순간에 옷과 카테고리를 매핑해주는 방식보단, 옷을 등록할 때 카테고리를 같이 등록해줄 것 같습니다.
이를 위해서는 미리 카테고리만 먼저 등록해놓거나, 옷 등록화면에서 새로운 카테고리를 등록할 때마다 API를 호출하여 카테고리를 등록해주는 방법을 사용할 수 있을 것 같습니다.
그 후에 옷을 등록할 때는 옷과 함께 카테고리의 Id 목록을 주어 옷을 등록함과 동시에 옷과 카테고리를 매핑할 수 있을 것 같습니다.
혹은 옷을 등록할 때 받은 카테고리 이름들을 가지고 카테고리 Repository에 조회를 하여 있는 것은 엔티티를 가져오고, 없으면 추가하는 방식으로 카테고리 목록을 가져온 후에, 옷을 등록할 때 카테고리를 매핑해주는 방식을 고려해볼 것 같습니다.
위와 같이 생각한 이유는 옷에 대한 카테고리를 지정해주는 것은 카테고리가 주체인 것보단 옷이 주체인 것이 더 자연스러운 흐름이라고 생각했기 때문입니다.
위의 부분은 제 짧은 경험상의 이야기니 참고 정도만 해주셔도 감사하겠습니다~
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
kongminoo님의 질문을 읽어본 결과, 옷과 카테고리의 관계를 어떻게 매핑해야 하는지 혼란스러우신 것 같네요. 실제로 무신사와 같은 시스템에서는 하나의 상품이 여러 카테고리에 속할 수 있고, 하나의 카테고리가 여러 상품을 가질 수 있습니다. 이는 전형적인 N:M(다대다) 관계입니다.
다대다 관계를 JPA에서 활용하면 중간 테이블을 사용하는 것이 일반적입니다. 중간 테이블을 통해 다대다 관계는 각각의 객체와 1:N 및 N:1 관계로 풀어낼 수 있습니다. 그러한 중간 테이블은 실제로 “옷”과 “카테고리”를 연결하는 역할을 하며, 예를 들어 “상품_카테고리”라는 이름을 사용할 수 있습니다.
실제로, 다대다 관계를 JPA에서 지향하지 않는 이유는, 추가적인 속성이나 필드가 필요한 경우에 매우 불편할 수 있기 때문입니다. 예를 들어, 상품과 카테고리의 관계에서 별도로 추가적인 정보가 필요하다면 그 정보를 중간 엔티티에 저장해야 합니다.
올바른 엔티티 설계:
Item엔티티는 여러 개의Category를 가질 수 있습니다.
Category엔티티는 여러 개의Item에 속할 수 있습니다.
- 중간 엔티티
ItemCategory를 만들어 각각 1:N 및 N:1 관계를 매핑합니다.
이에 대한 구체적인 설명은 아래의 관련 질문에서 확인하실 수 있습니다:
이 게시물에서는 중간 테이블의 필요성과 구현 예제가 잘 설명되어 있으니 참고하시길 권장합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





