๐ 0. ์ด์ ๊ธ
๐ค 1. createdAt๊ณผ updatedAt
๋ชจ๋ ์ํฐํฐ๋ ์ผ๋ฐ์ ์ผ๋ก createdAt๊ณผ updatedAt์ ๊ฐ์ง๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ '์์ฑ๋ ์๊ฐ ์ ๋ณด'์ '์์ ๋ ์๊ฐ ์ ๋ณด'๋ ์ฌ๋ฌ๋ชจ๋ก ๋ง์ด ์ฌ์ฉ๋๊ณ ๋ ์ค์ํฉ๋๋ค.
JPA๋ฅผ ์ฌ์ฉํ๋ฉด์ @CreatedDate, @LastModifiedDate๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์๊ฐ ์ ๋ณด, ์์ ๋ ์๊ฐ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class JBMBCommonTimeEntity {
@Column(name = "created_at")
@CreatedDate
private LocalDateTime createdAt;
@Column(name = "updated_at")
@LastModifiedDate
private LocalDateTime updatedAt;
}
๋๋ถ๋ถ์ ์ํฐํฐ ํด๋์ค์์ ์ฌ์ฉ๋๋ ํ๋๋ค์ด๋ฏ๋ก, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ์ฌ ์ด ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์์๋ฐ๋ ํ์์ผ๋ก ๊ตฌํํ๊ธฐ๋ก ํ์ต๋๋ค.
abstract class : ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ์๊ฐ ์ ๋ณด๋, ์๊ธฐ ์์ ๋ง์ผ๋ก๋ ์ํฐํฐ๊ฐ ๋์ง ์์ต๋๋ค. ์ค๋ก์ง ๋ค๋ฅธ ์ํฐํฐ์ ์์ํ๋ ๊ฒ์ผ๋ก attribute๋ฅผ ๋ถ์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋๋ก ์ถ์ ํด๋์ค๋ก ์ฒ๋ฆฌํฉ๋๋ค.
@MappedSuperclass : ๋ค๋ฅธ JPA Entity ํด๋์ค๋ค์ด ์ด ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ์์๋ฐ์ผ๋ฉด, ํ๋์ธ createdAt๊ณผ updatedAt์ ์ธ์ํฉ๋๋ค.
@EntityListeners(AuditingEntityLIstener.class) : JPA Entity ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ํน์ ๋ก์ง์ ์คํ ๊ฐ๋ฅ
์ด๋ ๊ฒ ๋ฉ์ธ ์ดํ๋ฆฌ์ผ์ด์ ํด๋์ค์ @EnableJpaAuditing ์ด๋ ธํ ์ด์ ๊น์ง ๋ฌ์์ค์ผ, JPA Auditing๊ธฐ๋ฅ์ด ํ์ฑํ๋์ด ์๋์ผ๋ก createdAt๊ณผ updatedAt์ด ์์ฑ๋ ์ ์์ต๋๋ค.
์์ฑํ ํ ์คํธ ์ฝ๋์ ๋๋ค. JBMBDiagnosisInfoEntity๋ JBMBCommonTimeEntity๋ฅผ ์์๋ฐ์์ต๋๋ค.
๋น๋ ํจํด์ ํตํด JBMBDiagnosisInfoEntity๋ฅผ ์์ฑํ๊ณ , createdAt๊ณผ updatedAt์ ์ฝ์ ํ์ง ์์์ต๋๋ค.
repository๋ฅผ ํตํด save๋ฅผ ํ ํ, createdAt๊ณผ updatedAt์ ๊ฐ์ด notNull์ธ์ง ํ์ธํ๋ ๋ก์ง์ผ๋ก ๊ตฌ์ฑํ์ต๋๋ค.
๋ํ ๊ฐ๋จํ ํ ์คํธ๊ฐ ๋๋๊ณ ํด๋น ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋จ์์๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด @Transactional์ ์ค์ ํ์ต๋๋ค.
ํ ์คํธ ๊ฒฐ๊ณผ๋ ์ฑ๊ณต์ ์ ๋๋ค. ๋ด๋ถ ์์๋ฅผ ํ๋ฆฐํธ ํ์ ๋๋ saveํ๊ธฐ ์ ๊ณผ ํ๋ก null -> not null ์์ ํ์ธํ ์ ์์์ต๋๋ค.
2022-12-27 10:40:38.303 INFO 2597 --- [ Test worker] o.m.j.i.logging.ProtocolLoggingProxy : conn=4266(M) - 3.634 ms - Query:
insert into jbmb_diagnosis_info (created_at, updated_at, diagnosis_state, diagnosis_type, user_num)
values (?, ?, ?, ?, ?), parameters ['2022-12-27 10:40:38.285','2022-12-27 10:40:38.285','OPEN',false,0]
๋ก๊ทธ์์๋ insert๋ฌธ์ด ๋ค์ด๊ฐ ๋, createdAt๊ณผ updatedAt๊ฐ์ด ์์ฑ๋์ด ๋ค์ด๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
๐ค 2. Enum๊ณผ JPA AttributeConverter
๊ธฐ์กด DB๋ฅผ ์ฐ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
-- jbmb.diagnosis_log definition
CREATE TABLE `diagnosis_log` (
`diagnosis_id` int NOT NULL AUTO_INCREMENT,
`active` tinyint NOT NULL,
`created_at` datetime NOT NULL,
`user_num` int NOT NULL,
PRIMARY KEY (`diagnosis_id`)
);
'์ง๋จ ์์ด๋'๋ฅผ PK๋ก ๊ฐ์ง๊ณ ์๋ ์ง๋จ ๊ธฐ๋ก ํ ์ด๋ธ์ ๋๋ค.
์ง๋ ๊ธ์์, active์ ๋ํ column์ state๋ก ๋ณ๊ฒฝํ๊ฒ ๋ค๊ณ ํ์ผ๋ฏ๋ก, ์ด ๋ถ๋ถ์ ๋ํด์ ์์ ํ ์์ ์ ๋๋ค.
๋ํ, ํ ์ด๋ธ ๋ด์ ์์ฑ๋ ์์ ์ ํ์ํ๋ 'created_at'์ ์์ง๋ง, ์์ ๋ ์์ ์ธ 'updated_at'์ ์์ด ๋ฐฉ๊ธ ๋ง๋ ๊ณตํต ์ํฐํฐ ํด๋์ค๋ฅผ ํตํด ์ถ๊ฐํ ์์ ์ ๋๋ค.
ํ ์ด๋ธ ์์ฒด๋ฅผ ์์ ํ์ง ์๊ณ , ์๋ก์ด ํ ์ด๋ธ์ ๊ตฌ์ฑํ ๋ค ๋ฐฑ์๋์์ v1 ํ ์ด๋ธ๊ณผ v2 ํ ์ด๋ธ ๋ชจ๋ ๊ฐ์ด ์ฑ์์ง๋๋ก ์ค๊ณํด ์ดํ๋ฆฌ์ผ์ด์ ์์ API ๊ต์ฒด ์์ ์ ์งํํ๋๋ผ๋ ๋ฌธ์ ์์ด ์งํํด ๋ณผ ์๊ฐ์ ๋๋ค.
๋ ์ง๋จ ์ ํ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ด์ ๋ '์ดํ์' ์ง๋จ์ ๋ํด์๋ ๊ตฌ๋ถ์ด ๊ฐ๋ฅํด์ผ ํ๋ ๋ง์ด์ฃ .
๋ณ๊ฒฝํ ์์ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-- create new table : jbmb_diagnosis_info
create table jbmb_diagnosis_info(
diagnosis_id long not null auto_increment,
user_id long not null,
diagnosis_type bit not null,
diagnosis_state VARCHAR(50) not null,
created_at timestamp not null default current_timestamp,
updated_at timestamp not null default current_timestamp on update current_timestamp,
primary key(diagnosis_id)
);
DB ์์๋ ์ง๋จ ํ์ ๊ณผ ์ํ๋ ํ ์คํธ ํํ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ์ผ ๊ตฌ๋ถํ๊ธฐ๊ฐ ์ฝ์ต๋๋ค. ์๋ฅผ ๋ค์ด, diagnosis_type์ด 1์ด๊ฑฐ๋ 0์ด๋ผ๋ฉด, ์ด๊ฒ์ ์ ๋ฆฌํด๋์ ๋ฌธ์๊ฐ ์๋ค๋ฉด 1์ด ๋ฌด์์ ๋ปํ๋์ง, 0์ ๋ฌด์์ ๋ปํ๋์ง ์ ์๊ฐ ์์ต๋๋ค.
๋ฐฑ์๋ ์ํฐํฐ์์๋ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. DB์์๋ ํด๋น ํ์ ํน์ ์ํ๋ฅผ ํ ์คํธ์ ํํ๋ก ์ ์ฅํ์ง๋ง, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ Enum์ผ๋ก ์ ์ํ์ต๋๋ค. ๋ฐ๋ผ์ DB์์ ์ํฐํฐ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋ ๋๋ VARCHAR ๊ฐ์ด Enum์ผ๋ก, ์ํฐํฐ์์ DB์ ์ ์ฅ๋ ๋์๋ Enum์์ VARCHAR๋ก ๋ณํ์ด ๋์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ญํ ์ ๋์์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก AttributeConverter์ ๋๋ค.
@Enumerated์ AttributeConverter์ ์์ธํ ๋ด์ฉ์ ์๋์ ๊ธ์ ์ฐธ์กฐํ๋ฉด ๋ฉ๋๋ค.
/* JBMBDiagnosisStateIdentifierConverter.java */
public class JBMBDiagnosisStateIdentifierConverter implements AttributeConverter<JBMBDiagnosisStateIdentifier, String> {
@Override
public String convertToDatabaseColumn(JBMBDiagnosisStateIdentifier attribute) {
return attribute.name();
}
@Override
public JBMBDiagnosisStateIdentifier convertToEntityAttribute(String dbData) {
return JBMBDiagnosisStateIdentifier.valueOf(dbData);
}
}
/* JBMBDiagnosisTypeIdentifierConverter.java */
public class JBMBDiagnosisTypeIdentifierConverter implements AttributeConverter<JBMBDiagnosisTypeIdentifier, Boolean> {
@Override
public Boolean convertToDatabaseColumn(JBMBDiagnosisTypeIdentifier attribute) {
return attribute.isThermal();
}
@Override
public JBMBDiagnosisTypeIdentifier convertToEntityAttribute(Boolean dbData) {
return JBMBDiagnosisTypeIdentifier.getJBMBDiagnosisTypeWhetherIsThermal(dbData);
}
}
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Table(name = "jbmb_diagnosis_info")
public class JBMBDiagnosisInfoEntity extends JBMBCommonTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "diagnosis_id")
/* ์ง๋จ ์์ด๋ */
private Long diagnosisID;
@Column(name = "diagnosis_type", nullable = false)
@Convert(converter = JBMBDiagnosisTypeIdentifierConverter.class)
/* ์ง๋จ ์ ํ (๊ธฐ๋ณธ / ์ดํ์) */
private JBMBDiagnosisTypeIdentifier diagnosisType;
@Column(name = "diagnosis_state", nullable = false)
@Convert(converter = JBMBDiagnosisStateIdentifierConverter.class)
/* ์ง๋จ ์ํ (OPEN~CLOSE) */
private JBMBDiagnosisStateIdentifier diagnosisState;
@Column(name = "user_num", nullable = false)
/* ์ฌ์ฉ์ ์๋ณ ๋ฒํธ */
private int userNum;
}
๋ค์์ ์คํ๊ฒฐ๊ณผ์ ๋๋ค.
2022-12-26 20:09:06.121 INFO 30282 --- [ restartedMain] o.m.j.i.logging.ProtocolLoggingProxy : conn=4057(M) - 160.911 ms - Query:
create table jbmb_diagnosis_info (
diagnosis_id bigint not null auto_increment,
created_at datetime(6),
updated_at datetime(6),
diagnosis_state varchar(255) not null,
diagnosis_type bit not null,
user_num integer not null,
primary key (diagnosis_id)
) engine=InnoDB
diagnosis_state๋ ๋ฌธ์์ด์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ varchar๋ก, diagnosis_type์ db์๋ boolean ๊ฐ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ bit๋ก ์์ฑ๋ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์์์ต๋๋ค.