π 0. μ§λ κΈ
μ§λ κΈμμ Optionalμ νμ©κ³Ό Enumμ νμ©μμλ₯Ό λ³Ό μ μμ΅λλ€.
π€ 1. μ§λ μ½λμμμ μ½κ°μ μ¬μμ
μ§λ μ½λ μ€, μ§λ¨ ννΈμ μνλ₯Ό λνλ΄λ Enumμ μ½λμ λλ€.
@Getter
@AllArgsConstructor
public enum JBMBDiagnosisStateIdentifier {
OPEN(1, "μ§λ¨ μμ", true),
SURVEY(2, "μ€λ¬Έμ‘°μ¬ μ§ν", true),
UPLOAD(3, "μ΄λ―Έμ§ μ
λ‘λ", true),
DIAGNOSE(4, "μ§λ¨ μ€", true),
DONE(5, "μ§λ¨ μλ£",false),
ERROR(6, "μλ¬ λ°μ", false),
SHUTDOWN(7, "μ§λ¨ μ€λ¨", false);
private int stateCode;
private String stateDescription;
private boolean interruptible;
public static boolean isShutDownAble(JBMBDiagnosisStateIdentifier diagnosisState){
return diagnosisState.isInterruptible;
}
}
μλμ staticμΌλ‘ μμ±ν λ©μλμ νμμ±μ΄ μλ€λ κ²μ κΉ¨λ¬μμ΅λλ€. μ μ ν©ν 리 λ©μλλ‘ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²λ μλκ³ , μ΄λ―Έ enum κ°μ²΄μ interruptibleμ΄λΌλ νλκ° μλλ° λ€μ ν λ² κ°λ°ν κΌ΄μ΄ λμμ΅λλ€.
κ·Έλμ, ν΄λΉ λ©μλλ₯Ό μμ νκ³ interruptibleμ μ΄λ¦μ shutDownAbleλ‘ λ³κ²½νμ΅λλ€.
@Getter
@AllArgsConstructor
public enum JBMBDiagnosisStateIdentifier {
OPEN(1, "μ§λ¨ μμ", true),
SURVEY(2, "μ€λ¬Έμ‘°μ¬ μ§ν", true),
UPLOAD(3, "μ΄λ―Έμ§ μ
λ‘λ", true),
DIAGNOSE(4, "μ§λ¨ μ€", true),
DONE(5, "μ§λ¨ μλ£",false),
ERROR(6, "μλ¬ λ°μ", false),
SHUTDOWN(7, "μ§λ¨ μ€λ¨", false);
private int stateCode;
private String stateDescription;
private boolean shutDownAble;
}
λ, shutDownAbleμ ν΅ν΄ νν°λ§μ νλ λ‘μ§λ μΌλΆ μμ νμ΅λλ€.
// κΈ°μ‘΄ μ½λ
.filter(diagnosisInfo -> JBMBDiagnosisStateIdentifier
.isShutDownAble(diagnosisInfo.getDiagnosisState()))
// λ³κ²½ μ½λ
.filter(diagnosisInfo -> Optional.ofNullable(diagnosisInfo)
.map(JBMBDiagnosisInfoEntity::getDiagnosisState)
.map(JBMBDiagnosisStateIdentifier::isShutDownAble)
.orElse(false))
κΈ°μ‘΄μ μμ±νλ λΆνμν λ©μλλ₯Ό μμ νκ³ , NPE λ°μμ μ μ§νκΈ° μν΄ Optionalμ μ¬μ©ν ꡬ문μΌλ‘ λ³κ²½νμ΅λλ€.
λ€μ μν λ³κ²½ ν save νλ λ‘μ§μ΄ μκΈ° λλ¬Έμ, Optional λ΄λΆκ° λΉμ΄μλ€λ©΄ false μ²λ¦¬λ₯Ό ν΄ save λλ λΆλΆμ λΏμ§ μλλ‘ λ§λ€μμ΅λλ€.
π€ 2. μλ΅μ 곡ν΅νλκ° λ§λ€! : DTO μ μ
κΈ°μ‘΄μ responseDTOλ€μ 보면, νμ λ΄λΆ λ‘μ§μ μ±κ³΅/μ€ν¨ μ¬λΆλ₯Ό νμΈνκΈ° μν΄ resultCodeλ₯Ό λͺ μνμ΅λλ€.
μ΄λ¬ν resultCodeλ μ΄λ ν μλ΅μ΄λΌλ λͺ¨λ νκΈ°κ° λμ΄μμκ³ , ν΄λΉ resultCodeκ° μ΄λ€ μλ―Έλ₯Ό λνλ΄λμ§, resultMessageλ 곡ν΅μ μΌλ‘ νμνμ΅λλ€.
κ·Έ μΈμλ error μ¬λΆ, error λ©μμ§, errorκ° λ°μν μμ², μλ΅ λ°μ μκ° λ±λ± λ€μν μμλ₯Ό 곡ν΅νλλ‘ λ¬Άμ΄μ 보λ΄κ³ μΆμμ΅λλ€.
곡ν΅νλλ‘ λ¬Άμ΄μ λ³΄λΌ μ μλ λ°©λ²μ, μ λ€λ¦ / μμ / κ΅¬μ± μ€ νλλ₯Ό μ ννλ λ°©λ²μ λλ€.
λ λ§μ DTO ν΄λμ€ νμΌμ΄ μκΈ°λ κ²μ 보μνκΈ° μν λ°©λ²μΌλ‘λ μ΄λν΄λμ€λ₯Ό μ¬μ©νλ λ°©λ²μ΄ μμ΅λλ€.
μ΅μ’ μ μΌλ‘ μ κ° μ νν λ°©λ²μ, μ λ€λ¦μ μ¬μ©νλ©΄μ λ΄λΆμ λ€μ΄κ° DTOλ μ΄λν΄λμ€ λ΄λΆμ staticμΌλ‘ μμ±νλ λ°©λ²μ μ ννμ΅λλ€.
- 곡ν΅νλκ° μ¨κ²¨μ§ μμκ³Ό ꡬμ±λ³΄λ€λ κ°λ ₯νκ² νμ μ λͺ μν μ μκ³ , νμ μ 보λ κ²λ§μΌλ‘λ κ΄κ³λ₯Ό νμΈν μ μλ μ λ€λ¦μ μ ν
- μλ΅λ§λ€ μλ‘ λ€λ₯Έ DTOλ₯Ό μμ±νλ κ²μ νμ°μ , DTO ν΄λμ€ νμΌμ΄ νλ‘μ νΈ ν΄λμ κ³Όνκ² λ§μμ§λ κ²μ λ§κΈ° μν΄ μ΄λν΄λμ€λ₯Ό μ¬μ©.
- 곡ν΅νλμ κ°μ depthμ κ°λ³ DTO νλλ₯Ό νμ₯νλ κ²μ΄ μλλΌ, responseBodyκΉμ§ κ³΅ν΅ νλκ³ , ν λ¨κ³ λ κΉμ depthμ κ°λ³DTOλ₯Ό λ£κ³ μΆμ.
+ λ€λ₯Έ λ°©λ²μΌλ‘ λ§λλ κ²μ λν΄μλ κ³ λ €ν νμ μ λ€λ₯Έ κΈμμ μμ±νλλ‘ νκ² μ΅λλ€.
@Builder
@Getter
public class JBMBResponseObject<T>{
/* Http Status */
/* μμ νμ, μ΄λ―Έ ResponseEntityμ μμ. */
private final Integer statusCode;
/* μμ²μ λΉμ¦λμ€ λ‘μ§ μ²λ¦¬ μ½λ */
private final Integer resultCode;
/* μμ² μ²λ¦¬ μ½λμ λ©μμ§ */
private final String resultMessage;
/* λΉμ¦λμ€ λ‘μ§ μ²λ¦¬ μ€, μλ¬ μ¬λΆ */
private final Boolean hasError;
/* μλ¬ λ©μμ§, μλ€λ©΄ None */
private final String errorMessage;
/* μλ¬ κ·Όμμ§, μλ€λ©΄ None */
private final String errorSource;
/* μλ΅ μμ */
private final String responseAt;
/* μμ² μ μ κ·Όν APIμ URL */
private final String requestURL;
/* μμ² κ²°κ³Ό */
private final T responseBody;
}
public class DiagnosisDTO {
@Data
@Builder
@AllArgsConstructor
public static class ResponseForInitDiagnosis {
private Long diagnosisID;
}
... μλ΅
@Getter
@Builder
public static class RequestForInitDiagnosis {
private String userID;
private Boolean isThermal;
}
... μλ΅
}
μ λ€λ¦ νμ μΌλ‘ μ μλ JBMBResponseObject<T>λ₯Ό λ΄ μλ€.
ν΄λΉ λΆλΆμλ λͺ¨λ 곡ν΅μ μΌλ‘ κ°μ§λ νλμ λν΄ λ€ λͺ μν μ μμ΅λλ€.
λ responseBodyκΉμ§ 곡ν΅μΌλ‘ κ°κ³ , κ·Έ λ΄λΆμ λ€μ΄κ°λ κ°λ³μ μΈ κ°λ€λ§ ν λ¨κ³ λ κΉμ depthμ ννν μ μμΌλ―λ‘ μ κ° μνλ κΌ΄κ³Ό λμΌν©λλ€.
μ λ€λ¦ νμ μλ μ΄λ ν Custom DTOλ λ€ λ€μ΄κ° μ μκΈ° λλ¬Έμ μμΌλ‘ λ€λ₯Έ λλ©μΈμμ λ€λ₯Έ DTOλ₯Ό λ§λ€λλΌλ μ¬μ ν μ¬νμ©ν΄μ μ¬μ©ν μ μμ κ²μ λλ€.
μλ΅ λ³ DTOλ μ΄λν΄λμ€λ‘ λ§λ€μμ΅λλ€. static ν΄λμ€λ‘ λ§λ€μ΄μ DiagnosisDTO μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ μ κ·Όμ΄ κ°λ₯νλλ‘ λ§λ€μμ΅λλ€.
μ΄λν΄λμ€λ‘ λ§λ€μκΈ° λλ¬Έμ λλ©μΈ λ³λ‘ λ¬Άμ μ μμμ΅λλ€. μ§λ¨ μ΄κΈ°ν μλ΅, μ€λ¬Έ μ‘°μ¬ μλ΅, μ΄λ―Έμ§ μ μΆ μλ΅ λ± νλ‘μ νΈ ν΄λ λ΄μ μ¬λ¬ νμΌμ΄ μκΈ°λ κ²μ μννκ³ λ΄λΆμ λ£μ΄ κ΄λ¦¬ν μ μμμ΅λλ€.
μ΅μ’ μ μΌλ‘ return λλ νμ μ μμλ₯Ό 보면,
public ResponseEntity<JBMBResponseObject<DiagnosisDTO.ResponseForInitDiagnosis>> forInitDiagnosis
(final JBMBRequestObject<DiagnosisDTO.RequestForInitDiagnosis> requestForInitDiagnosis) {
... μλ΅
}
ResponseEntityκΉμ§ λν΄μ§λ κΈΈμ΄λ κ΅μ₯ν κΈΈμ΄μ‘μ§λ§, μ΄λ€ νμ μ 리ν΄νλμ§ λ΄λΆλ₯Ό μ 보μ¬μ€λλ€.
1) ResponseEntity : statusμ headerμ bodyλ₯Ό ν¬ν¨ν μλ΅ κ°μ²΄
2) JBMBResponseObject : JBMBμμ λ§λ κ³΅ν΅ μλ΅ κ°μ²΄
3) DiagnosisDTO.ResponseForInitDiagnosis : μ§λ¨ DTO μ€μμ μ§λ¨ μ΄κΈ°νμ κ΄ν μλ΅
μμ§ ν μΌμ΄ λ λ¨μμ΅λλ€.
ν΄λΉ DTOλ₯Ό μμ±νκ³ λμ, μλ΅μ μμ±ν λ λΉλ ν¨ν΄μ μ¬μ©ν μμμ λλ€.
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(JBMBResponseObject.<T>builder()
.statusCode(...)
.resultCode(...)
.resultMessage(...)
.hasError(...)
.errorMessage(...)
.errorSource(...)
.requestURL(...)
.responseAt(...)
.responseBody(...)
.build()
);
μ΄λ¬ν μλ΅μ μμ±νλ κ²μ λͺ¨λ μλΉμ€μ λ©μλμμ μ μ΄λ νλμ© μμ±λ κ²μ λλ€.
κ²½μ°μ λ°λΌ λ€λ₯Έ μλ΅μ ννν΄μΌ νλ―λ‘ νΉμ μλΉμ€μ ν λ©μλμμ μ¬λ¬λ² λ±μ₯ν μλ μμ΅λλ€.
μλΉμ€μ μλ΅λ§λ€ 'μ±κ³΅'κ³Ό 'μ€ν¨'λ 무쑰건 μμ΅λλ€. λ 'μ ν¨νμ§ μμ μμ²'λ μμ£ .
μ΄λ΄ λλ§λ€ λ§€λ² μμ±νλ κ²μ μ½λ κΈΈμ΄κ° κΈΈμ΄μ§ μλ μκ³ , λΆνΈν©λλ€.
λ°λΌμ μ¬νμ©μ±μ΄ λμ μλ΅μ μμ±νλ responseCreatorλ₯Ό λ§λ€μ΄λ³΄κΈ°λ‘ νμ΅λλ€.
λ€μ μκ°μλ Enumκ³Ό μ λ€λ¦, μΈν°νμ΄μ€μ μ μ ν©ν 리 λ©μλ λ±μ ν΅ν΄ responseCreatorλ₯Ό λ§λ€μλ λ΄μ©μ μ μ΄λ³΄λλ‘ νκ² μ΅λλ€.