1.Category 엔티티분석 및 카테고리 테이블분석
Category 엔티티
-id
-name
-items: List (다대 다 관계)
-parent: Category
-child: List
-상품과 다대다 관계를 맺는다. parent, child로 부모, 자식 카테고리를 연결한 다.
*계층 구조를 이렇게 매핑할 수 있다를 보여주기 위해 이렇게 설정 했다.
*자기자신을 셀프로 계층구조형태로 매핑을 하진 않았을 것 같아 이렇게 설정했다.
카테고리 테이블 분석
CATEGORY_ID
-PARENT_ID (FK)
-NAME
설명
카테고리와 상품 테이블 분석
-@ManyToMany를 사용해서 매핑한다.
(실무에서 @ManyToMany는 사용하지 말자. 여기서는 다대다 관계를 예제로 보여주기 위해 추가했을 뿐이다)
2.(Category_Item)중간테이블 및 카테고리와 상품 연관관계 맵핑
CATEGORY_ITEM
-CATEGORY_ID (FK)
-ITEM_ID (FK)
카테고리 엔티티
-id
-name
-items: List
-parent: Category
-child: List
아이템 엔티티
-id
-name
-price : int
-stockQuantity
-categories: List
a.카테고리클래스에서 상품과 맵핑
설명
@JoinTable(name = "category_item",
joinColumns = @JoinColumn(name = "category_id),
inverseJoinColumns = @JoinColumn(name = "item_id"))
@JoinTable
-객체는 컬렉션이 있어 다대 다관계가 가능하지만
관계형 DB는 컬렉션관계를 양측에 가질 수 있는 것이 아니기 때문에 1대 다, 다대 1 관계의
중간테이블을 이용한다.
@JoinTable어노테이션
-중간테이블에 있는 외래 키를 매핑 할 때 먼저 사용
joinColumns = @joinColumn(name="category_id)
-중간테이블에 있는 category_id 외래키 매핑
inverseJoinColumns = @JoinColumn(name = "item_id")
-중간테이블에 있는 item_id 외래키 매핑(item과 연관관계 매핑하기 위함)
b.Item클래스에서 카테고리와 맵핑
실습
설명
@ManyToMany(mappedBy ="items")
private List(Category> categories = new ArrayList<>();
*foreign key가 있는 items 클래스에 있는 item이 연관관계의 주인이다.
*mapped by - order_item 테이블에 있는 item필드에 의해 맵핑된 거울일 뿐이야라는 뜻
주의
실무에서 @ManyToMany는 사용하지 말자.
-실무에서는 다대 다관계로 연관관계를 풀어내지 말 것
-이러한 상태의 테이블만 구현이 가능하고, 다른 필드를 추가하는 것이 불가하다.
3. 카테고리 구조
카테고리가 계층구조로 내려간다.
위의 부모구조 아래에는 자식구조
실습
@ManyToOne
@JoinColumn(name ="parent_id")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
설명
-자식 카테고리는 여러개 가질 수 있다.
-셀프로 category안에서 이름만 다를 뿐이지 양방향 연관관계 매핑하듯이 해주면 된다.
자 이제 작성한대로 데이터베이스 테이블이 제대로 구성이 되었는지 확인해 보자.
그리고 실제 데이터베이스 테이블구성 및 데이터베이스 명령어 작성/실행
실습
create table orders (
order_id bigint not null,
order_date timestamp,
status varchar(255),
delivery_id bigint,
member_id bigint,
primary key (order_id)
);
-> 이것으로 실행시키면 원래 작성했던 코드대로 테이블 구성이 된다.
*JPA는 alter할 때 작성한 foreign키 컬럼을 전부 잡아준다.
참고
foreign key를 꼭 걸어야 되요 안 걸어야 되요?
-시스템마다 다르다.
-실시간 트래픽이 중요하고, 정확성보다는 잘 서비스가 되는 유연한 것이 중요하면
foreign key를 빼고, 인덱스만 잘 잡아주면 된다.
-하지만, 돈과 관련된 중요한 것이라던가, 데이터가 항상 맞아야 하는 시스템이라면
foreign key를 넣어주면 된다.
'신입개발자로 취업하기까지 > JPA쇼핑몰기능구축' 카테고리의 다른 글
20200524 엔티티설계 및 개발시 주의점_2 (0) | 2020.06.08 |
---|---|
20200523 엔티티설계 및 개발시 주의점_1 (0) | 2020.06.08 |
20200518 도메인분석설계_엔티티클래스 개발 1-5 (0) | 2020.06.07 |
20200517 도메인분석설계_엔티티클래스 개발 1-4 (0) | 2020.06.07 |
20200516 도메인분석설계_엔티티클래스 개발 1-3 (0) | 2020.06.07 |