엔티티에서 가장 중요한 부분은 연관관계 설정이라고 생각했다. JPA를 사용했기 때문에 일반적으로 외래키를 필드로 넣어주는게 아닌 객체 자체를 필드로 넣었다. 이로 인해 객체 간 연관관계를 맺고 있기에 CRUD 이벤트 발생 시 그에 맞게 연관관계 처리를 잘 해줘야 한다. 

 코드를 다 첨부하기엔 너무 길어서 주요 메소드 부분만 정리하였다.

 

(1) Member

public void setLocation(Location location) {
        // 기존 지역 정보 삭제
        if(this.location != null) {
            this.location.getMembers().remove(this);
        }
        this.location = location;
        location.getMembers().add(this); // 연관관계 추가
    }

 

(2) Product

    public void setProductStatus(ProductStatus productStatus) {
        if(this.productStatus != null && this.productStatus.equals(ProductStatus.COMPLETE)) { // 거래완료에서
            if(productStatus.equals(ProductStatus.SALE) || productStatus.equals(ProductStatus.RESERVATION)) { // 예약중 or 판매중으로 변경 시
                this.deal.setProduct(null); // 해당 상품 거래 연관관계 삭제
            }
        }

        this.productStatus = productStatus;
    }
    
    public void setMember(Member member) {
        // 등록된 상품의 등록자가 바뀔 일은 없음.
        // 초기 등록자 설정만 필요
        this.member = member;
        this.member.getProducts().add(this);
    }

    public void setCategory(Category category) {
        if(this.category != null) {
            this.category.getProducts().remove(this); // 예전 카테고리의 상품목록에서 제거
        }
        this.category = category; // 새롭게 설정될 카테고리 설정
        category.getProducts().add(this);
    }


    public void setLocation(Location location) {
        if(this.location != null) {
            this.location.getProducts().remove(this);
        }
        this.location = location; // 등록자의 지역으로 상품 지역 설정
        this.location.getProducts().add(this);
    }

 

(3) Comment

public void setProduct(Product product) {
        if(product == null) { // 연관관계 삭제
            this.product.getComments().remove(this);
        }else {
            if(this.product != null) {
                this.product.getComments().remove(this);
            }
            this.product = product;
            product.getComments().add(this);
        }
    }

(4) Deal

 요구사항 중에 상품의 진행 단계를 자유롭게 바꿀 수 있었다. 그에 의해 처리해줘야 할 경우의 수가 조금 더 많았다.

public void setProduct(Product product) {
    this.product = product;
    if(product == null) { // 상품 자체 삭제 또는 상품 진행 단계 변경(거래완료 -> 예약중 or 거래완료 -> 판매중)으로 인한 연관관계 삭제
        //this.product.setDeal(null); // 상품 - 거래 연관관계 삭제
        this.member.getDeals().remove(this); // 회원 - 거래 연관관계 삭제
    }else {
        this.product.setDeal(this);
        this.member.getDeals().add(this); // 회원의 거래 목록에 추가
    }
}

'개인 프로젝트' 카테고리의 다른 글

3 - (4). 주요 코드 - Controller  (0) 2022.01.23
3 - (3). 주요 코드 - Service  (0) 2022.01.23
3 - (2). 주요 코드 - Repository  (0) 2022.01.23
2. ER Diagram  (0) 2022.01.23
1. 서론 - 시작 계기, 진행 방향  (0) 2022.01.23

+ Recent posts