엔티티 클래스 개발2

다대다 관계 예시

카테고리도 아이템을 여러개 갖고, 아이템도 카테고리를 여러개 갖는다.

다대다 => 일대다, 다대일로 풀어줘야한다. 그러니까 중간에 테이블을 하나 만들어줘야한다. 관계형 DB는 컬렉션 관계를 양쪽에 가질 수 없기 때문이다.

실무에서 예시와 같은 테이블을 구성하지 않는 이유는 필듣 수정이 어렵기 때문이라고 한다. 실무에서는 변수가 많고 수정 작업이 많은데 필드 수정이 어려우면 사용하기 곤란하다.

자세한 설명 @ManyToMany 는 편리한 것 같지만, 중간 테이블( CATEGORY_ITEM )에 컬럼을 추가할 수 없고, 세밀하게 쿼 리를 실행하기 어렵기 때문에 실무에서 사용하기에는 한계가 있다. 중간 엔티티( CategoryItem) 를 만들고 @ManyToOne , @OneToMany 로 매핑해서 사용하자. 정리하면 대다대 매핑을 일대다, 다대일 매핑으로 풀어 내서 사용하자.

카테고리 : 아이템 = 다 : 다 => 중간에 테이블(category_item) 삽입! 카테고리 입장에서 자식이 있고 부모가 있다. 이러한 계층 관계를 어떻게 구현하나? ex) 식품 > 과일 > 딸기, 바나나, 포도 => 다른 테이블과 관계 매핑하듯이 똑같이 부모와 자식을 매핑하면 된다!

주소 값 타 @Embeddable Address 클래스

값 타입은 변경 불가능하도록 설계해야 한다. Getter는 열어두되, 변하면 안되기 때문에 Setter는 닫아둔다!

JPA 스펙상 엔티티나 임베디드 타입(@Embeddable)은 자바 기본 생성자(default constructor)를 public 또는 protected로 설정해야 한다. public 으로 두는 것 보다는 protected 로 설정하는 것이 그나마 더 안전 하다. JPA가 이런 제약을 두는 이유는 JPA 구현 라이브러리가 객체를 생성할 때 리플랙션이나 프록시 같은 기술을 사용할 수 있도록 지원해야하기 때문이다.

Last updated