커미션 신청 - (1) DB와 Entity 설계

jinvicky·2023년 12월 21일
0
post-thumbnail

현재 아래와 같이 오픈카톡 또는 크레페를 이용해서 커미션 신청을 받고 있다.

이걸 공통으로 관리하기 위해서 커미션 신청 기능을 만들려고 한다.

1. DB 설계

위 신청서를 정리해 보면 사용자 입력과 어드민 입력으로 나뉜다.

기능

  • 사용자가 신청서를 보내면 내가 금액과 마감 날짜를 책정해서 코멘트와 함께 보낸다.

  • 또한 신청할 때 이미지를 여러 장 첨부하기 때문에 이미지들은 별도 테이블로 관리하려고 한다.

  • 또 아래와 같이 결제부터 완료까지 상태를 타임라인으로 저장해서 사용자가 건별로 상태리스트를 조회하게 하고 싶다.

이러한 사항들을 반영해서 아래와 같이 설계했다.

2. Entity 설계

먼저 상태코드 먼저 정의한다.
GlocalCode.java

@Getter
@AllArgsConstructor
public enum GlobalCode { //타입 등의 코드

  // ... 기존 포스팅에... 

    //커미션 프로세스
    REQ_PENDING("CM01", "신청 대기중"),
    PAY_PENDING("CM02", "결제 대기중"),
    PAY_COMPLETE("CM03", "결제 완료"),
    CMS_START("CM04", "작업 시작"),
    CMS_PROCESS("CM05", "작업중"),
    CMS_COMPLETE("CM06", "작업물 제출"),
    CMS_REQ_EDITING("CM07", "요청사항 수정중"),
    CMS_CONFIRM("CM08", "최종 완료"),
    CMS_REVIEW("CM09", "리뷰 작성 완료");

    private final String code;
    private final String desc;
}

CmsApplyDto

import com.cms.world.utils.GlobalCode;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.validator.constraints.Length;

import java.time.LocalDateTime;

@Entity
@Table(name="cms_aply")
@Getter
@Setter
public class CmsApplyDto {

    //필수사항
    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    @Column(name = "ID")
    private String id;

    @Column(name = "TP_CD")
    private String cms_tp;

    @Column(name = "CONTENT", nullable = false)
    @Length(min = 10, max = 2000)
    private String content;
    
    @Column(name = "USER_NM", nullable = false)
    private String user_name; //사용자 이름

    // TODO:: 나중에 user_id를 fk로 추가 고려

    @Column(name = "ACC_NM", nullable = false)
    private String bank_owner;

    //선택사항
    @Column(name = "PAY_AMT")
    private Double pay_amt;

    @Column(name = "DPSIT_YN")
    private String deposit_yn;

    @Column(name = "CMMNT")
    private String admin_cmmnt;
    
    @Column(name = "STATUS")
    private String status ;

    @Column(name = "END_DT")
    @CreationTimestamp
    private LocalDateTime end_date;

    @Column(name = "RGTR_DT")
    @CreationTimestamp
    private LocalDateTime reg_date;

    @PrePersist
    public void doPersist () {
        this.cms_tp = GlobalCode.REQ_PENDING.getDesc();
    }

}

@Column에는 nullable 속성이 있는데, 기본값이 true라서 false로 설정해주지 않으면 널 허용이 되어버린다.

pk를 제외한 not null값들에 아래 처리를 하자.

@Column(nullable = false)

@CreationTimestamp를 사용하면 데이터 insert시 자동으로 시간값을 채워준다고 한다.

@Column(name = "RGTR_DT")
    @CreationTimestamp
    private LocalDateTime reg_date;

@Length 어노테이션을 사용하려면 builde.gradle에 아래를 추가한다.

dependencies {
		... 
    implementation ("org.springframework.boot:spring-boot-starter-validation")

}

컬럼명 도메인 범위를 지정할 수 있고, @Size를 써도 된다.

CmsApplyImgDto.java

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

@Entity
@Table(name = "cms_aply_img")
@Getter
@Setter
public class CmsApplyImgDto {

    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    @Column(name = "UUID")
    private String uuid;

    @ManyToOne
    @JoinColumn(name = "CMS_ID") //name은 설정할 fk 이름이다.
    private CmsApplyDto applyDto;

    @Column(name = "IMG_URL", nullable = false)
    private String img_url;

    @Column(name = "RGTR_DT")
    private String reg_date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd"));

}

@JoinColumn(name = "fk제약조건이름")
name이 참조할 컬럼명인줄;; fk제약조건 이름을 지정하는 것이다.

에러

  	@Column(name = "TP_CD")
    @ColumnDefault("TY01") // syntax error!
    private String cms_tp;
  • 기본값 설정을 @ColumnDefault 어노테이션으로 하려 했는데 저기서 에러가 났다;;

//    @ManyToOne
//    @JoinColumn(name = "CMS_ID") //name은 설정할 fk 이름이다.
//    private CmsApplyDto applyDto;

'com.cms.world.domain.dto.CmsApplyImgDto.cms_id' is a '@ManyToOne' association and may not use '@Column' to specify column mappings

일대다 관계를 설정할 때 @Column이랑 @ManyToOne을 같이 썼더니 안된다고 에러남;
또한 @ManyToOne이 붙은 iv는 should be a container 에러가 뜬다. 일반형이 아니라 객체 타입이야 하는 듯.

1일 이상을 에러에 헌납하면 아래와 같은 결과를 얻는다.

profile
Front-End와 Back-End 경험, 지식을 공유합니다.

0개의 댓글