JPA Create And Update Value - redutan/redutan.github.io GitHub Wiki

Create And Update 비ꡐ

상속

  • λ„λ©”μΈμ—μ„œ 핡심 관심사λ₯Ό κ΄€ν†΅ν•˜λŠ” μš©λ„λ‘œ μƒμ†μ΄λΌλŠ” κ·€μ€‘ν•œ 기회λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€κ³  λ΄„.
  • ν•˜μ§€λ§Œ νŒ€μ˜ ν•©μ˜κ°€ μžˆλ‹€λ©΄ κ΅¬ν˜„ 편의λ₯Ό μœ„ν•΄μ„œ 상속을 μ‚¬μš©ν•˜λŠ” 것도 ν•˜λ‚˜μ˜ λ°©λ²•μž„.
    • κ°œμΈμ μœΌλ‘œλŠ” ꢌμž₯ν•˜μ§€ μ•ŠμŒ
    • ν•˜μ§€λ§Œ λŒ€μ€‘μ μœΌλ‘œ κ°€μž₯ 많이 쓰이고 있고 개발 μ‹œ νŽΈν•¨
@Getter
@ToString
@EqualsAndHashCode
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
class BaseEntity {
    @CreatedBy
    private Long createdUserId
    @CreatedDate
    private Date createdAt;
    @LastModifiedBy
    private Long lastModifiedUserId
    @LastModifiedDate
    private Date lastModified;
}
@Configuration
@EnableJpaAuditing // 이 섀정이 μžˆμ–΄μ•Όμ§€ μœ„ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ •μƒμž‘λ™
class JpaConfig {
    @Bean
    public AuditorAware<AuditableUser> auditorProvider() {
        return new MyAuditorAware(); // μ‚¬μš©μž 쑰회 용
    }
}

CreateAndUpdate

  • 등둝과 μˆ˜μ •μ •λ³΄κ³Ό ν†΅ν•©λœ ν˜•νƒœμ˜ 값객체
@Embeddable
@Getter
@ToString
@EqualsAndHashCode
@AllArgsConstructor
public class CreateAndUpdate {
    public static final String CN_CREATE_USER_NO = "CREATE_USER_NO";
    public static final String CN_CREATED_AT = "CREATED_AT";
    public static final String CN_UPDATE_USER_NO = "UPDATE_USER_NO";
    public static final String CN_UPDATED_AT = "UPDATED_AT";

    public static final String DB_CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";
    /**
     * 등둝 νšŒμ›λ²ˆν˜Έ
     */
    @Column(name = CN_CREATE_USER_NO, nullable = false, updatable = false)
    private final Long createUserNo;
    /**
     * λ“±λ‘μΌμ‹œ
     */
    @ColumnDefault(DB_CURRENT_TIMESTAMP)
    @Generated(GenerationTime.INSERT)
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = CN_CREATED_AT, nullable = false, insertable = false, updatable = false)
    private final Date createdAt;
    /**
     * μˆ˜μ • νšŒμ›λ²ˆν˜Έ
     */
    @Column(name = CN_UPDATE_USER_NO, insertable = false)
    private Long updateUserNo;
    /**
     * μˆ˜μ •μΌμ‹œ
     */
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = CN_UPDATED_AT, insertable = false)
    private Date updatedAt;

    protected CreateAndUpdate() {
        this.createUserNo = null;
        this.createdAt = null;
    }
    private CreateAndUpdate(Long createUserNo) {
        this.createUserNo = createUserNo;
        this.createdAt = null;
        this.updateUserNo = null;
        this.updatedAt = null;
    }

    public static CreateAndUpdate create(@NonNull Long createUserNo) {
        return new CreateAndUpdate(createUserNo);
    }

    public void update(@NonNull Long updateUserNo) {
        this.updateUserNo = updateUserNo;
        this.updatedAt = new Date();
    }

    public void checkPreInsert() {
        if (createUserNo == null) {
            throw new IllegalStateException("'createUserNo' not exist when create");
        }
    }

    public void checkPreUpdate() {
        if (createUserNo == null) {
            throw new IllegalStateException("'createUserNo' not exist when update");
        }
        if (updateUserNo == null) {
            throw new IllegalStateException("'updateUserNo' not exist when update");
        }
    }
}

Register, Modify

  • 등둝과 μˆ˜μ •μ •λ³΄κ³Ό λΆ„λ¦¬λœ ν˜•νƒœμ˜ 값객체

Storeable

public interface Storeable {
    String getMemberId();
    ZonedDateTime getTs();
}

Register

@Value
@Embeddable
@AllArgsConstructor
public class Register implements Storeable, Serializable {
    private static final long serialVersionUID = 6901279822511498217L;
    @Column(name = "register_member_id", length = 100, nullable = false, updatable = false)
    private final String memberId;

    @Generated(GenerationTime.INSERT)
    @ColumnDefault(DB_CURRENT_TIMESTAMP)
    @Column(name = "register_ts", nullable = false, insertable = false, updatable = false)
    private final ZonedDateTime ts;

    // for JPA
    protected Register() {
        this.memberId = null;
        this.ts = null;
    }

    public static Register create(String registerMemberId) {
        if (StringUtils.isBlank(registerMemberId)) {
            throw new IllegalArgumentException("'registerMemberId' is blank");
        }
        return new Register(registerMemberId, ZonedDateTime.now());
    }

    public boolean isEmpty() {
        return memberId == null && ts == null;
    }
}

Modify

@Value
@Embeddable
@AllArgsConstructor
public class Modify implements Storeable, Serializable {
    public static final String DB_CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";
    private static final long serialVersionUID = -1206032844696773181L;

    @Column(name = "modify_member_id", length = 100, nullable = false)
    private String memberId;

    //    @Generated(GenerationTime.INSERT) // 이 뢀뢄은 κ³ λ―Ό 쀑
    @ColumnDefault(DB_CURRENT_TIMESTAMP)
    @Column(name = "modify_ts", insertable = false, nullable = false)
    private ZonedDateTime ts;

    // for JPA
    protected Modify() {
        this.memberId = null;
        this.ts = null;
    }

    public static Modify create(String modifyMemberId) {
        if (StringUtils.isBlank(modifyMemberId)) {
            throw new IllegalArgumentException("'modifyMemberId' is blank");
        }
        return new Modify(modifyMemberId, ZonedDateTime.now());
    }
}