회원 기능이 개발됨에 따라 각 회원 엔티티에 장바구니와 찜목록을 추가할수 있었다.
이를 구현하다가 어떻게 매핑할까 생각해본 내용을 포스팅 한다.
회원과 상품간의 장바구니 , 찜목록 을 구현하기 위한 관계를 생각해보자.
여러명의 회원이 존재하며 여러 상품이 존재한다.
한명의 회원에 여러 상품이 담길수도 있고 하나의 상품이 여러 회원의 찜목록과 장바구니에 담길수도 있다.
@ManyToMany 이다.
@ManyToMany를 사용하면 JPA 의 구현체인 hibernate 가 두 객체의 중간 테이블을 자동 생성하여 처리하게 된다.
자동으로 무언가 처리해줌 은 좋은거 아닌가 ? 싶지만 그 중간 테이블의 내용을 우리가 마음대로 다룰수가 없다.
생성된 중간 테이블에 우리에게 필요한 비지니스 로직 정보를 넣을수 없다면 아무 쓸모가 없어진다.
hibernate 가 생성해주는 중간 테이블을 우리가 직접 만드는 방법이 있다.
User 와 Product 사이에 Cart 라는 중간 테이블을 만들어서 User 와 Product 만을 담았지만
코드를 작성할때 확작성 부분을 신경써야 하기 때문에 중간테이블을 생성하여 구현하였다.
또 이번에도 역시 초반 설계의 실수로 코드 이곳저곳을 찾아다니며 수정하는 작업을 하게되었다.
설계도를 잘 그리자 ...
@Entity
@Getter
public class Cart {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(fetch = FetchType.LAZY)
private UserInfo userInfo;
@OneToMany(mappedBy = "cart")
private List<Product> products = new ArrayList<>();
public void addProduct(Product product) {
this.products.add(product);
}
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
}
gpt 에게 똑같이 Entity 를 생성해봐 라고 했더니 List 를 초기화 하지 않고 선언만 해두고
사용할때 초기화 하더라.
초기화를 미리 해두는것이 자원을 사용하니까 당연히 손해겠지 ?
그럼 GPT 처럼 사용할때 null 체크를 해서 초기화 해주는게 좋은 방법일까 ? 맞나 ?
하는 고민이 생겼다. 이에 대해서 자세히 알아보고 이또한 포스팅 해볼 예정이다.
userInfo 보단 user 가 맘에 드는....
좋은 글 감사합니다. 자주 올게요 :)