현재 아래와 같이 오픈카톡 또는 크레페를 이용해서 커미션 신청을 받고 있다.
이걸 공통으로 관리하기 위해서 커미션 신청 기능을 만들려고 한다.
위 신청서를 정리해 보면 사용자 입력과 어드민 입력으로 나뉜다.
사용자가 신청서를 보내면 내가 금액과 마감 날짜를 책정해서 코멘트와 함께 보낸다.
또한 신청할 때 이미지를 여러 장 첨부하기 때문에 이미지들은 별도 테이블로 관리하려고 한다.
또 아래와 같이 결제부터 완료까지 상태를 타임라인으로 저장해서 사용자가 건별로 상태리스트를 조회하게 하고 싶다.
이러한 사항들을 반영해서 아래와 같이 설계했다.
먼저 상태코드 먼저 정의한다.
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일 이상을 에러에 헌납하면 아래와 같은 결과를 얻는다.