π 0. μλ‘
μ‘Έμ μνμΌλ‘ νλͺ¨ μ§λ¨ μ΄ν리μΌμ΄μ μΈ 'μ λ°λͺ¨λ°'μ κ°λ°νκ³ , 'ν΄λΉ νλ«νΌμ μμ μ νμ¬μ μ΄μ ν΄ μ¬μ©νκ³ μΆλ€'λΌλ μ΄λ κ΅μλμ λ§λ AWS μνκ³μμ μ¬λ΄ μλ² μ»΄ν¨ν°λ‘ μ΄μ μ μ§ννμ΅λλ€.
μ΄μ μ μ§ννλ©΄μ μ΄λ―Έμ§ μ μ₯ λ±μ κΈ°λ₯μ AWS μνκ³μ μμ‘΄νμκΈ° λλ¬Έμ ν΄λΉ μμ‘΄μ λμ΄λ΄κΈ° μν΄μ μ΄λ―Έμ§ μ λ‘λ λ° λ€μ΄λ‘λ APIλ₯Ό λ§λ€ μΌμ΄ μμμ΅λλ€. κ·Έλ¬λ©΄μ λ°±μλ λ κ±°μ μ½λλ₯Ό νμΈνλλ°, μκ°λ³΄λ€ λ¬Έμ κ° λ§μ 리ν©ν λ§ & κ°μ μ νκΈ°λ‘ λ§μλ¨Ήμμ΅λλ€.
ν리ν°μλ κ΄κ³ μμ΄ ν΄λΉ λ°±μλ μλ²λ₯Ό μ΄μ νκ³ μ ν리μΌμ΄μ μ μ 곡νλ κ²μ΄ κ³μ½μ μ λΆμ§λ§, ν λ² λ³Έ μ΄μ κ·Έλ₯ μ§λμΉ μλ μμμ΅λλ€. κ·Έλμ μμΌλ‘ μ¬λ¬λͺ¨λ‘ λ¬Έμ κ° λ§μ μ½λλ₯Ό, μμ보기 μ¬μ΄ μ½λ / μ¬μ¬μ©μ±μ΄ μ’μ μ½λ / μ μ°ν μ½λ / μ€μλ₯Ό μ€μΌ μ μλ μ½λλ‘ λ³κ²½νλ κ³Όμ μ νλμ© κΈ°λ‘ν΄λ³΄λ €κ³ ν©λλ€.
μ‘Έμ μν κ°λ° λΉμ μ ν리μΌμ΄μ μ μ λ΄μΌλ‘ 맑μκ³ , κ°μ 맑μ μν μ μ§μ€νκ³ λ°λλΌμΈ μ§ν€κΈ°λ₯Ό μ°μ μμλ₯Ό λκ² λμμ΅λλ€.
κ·Έλ¬λ λ°±μλ ννΈμ μ½λ리뷰λ₯Ό μμ£Ό νμ§ μκ³ μ£Όλ νΌλλ°± μμ΄, κΈ°λ₯μ λν κ²μ¦μ΄ μ΄λμ λ λλ©΄ 무μ¬μ½ λ겨λ²λ Έλκ² ν° μ°μ΄ λμ΄ λμμλ€μ. λ€μκΈ ν λ² μ½λ리뷰μ μ€μμ±μ κΉ¨λ«μ΅λλ€.
μ°μ μ μΌλ‘ μ λ³Ό κ³³μ 'μ§λ¨' ννΈμ λλ€. κΈ°μ‘΄μ μ€λ¬Έ + AI Mμ νλͺ¨ μ΄λ―Έμ§λ₯Ό μ μΆνλ μ§λ¨ κΈ°λ₯λ§ μμμΌλ, μ΄νμ μ΄λ―Έμ§λ‘ μ§λ¨νλ κΈ°λ₯μ΄ μΆκ°λ κ²μΌλ‘ 보μ λλ€. μ΄μ κΈ°μ‘΄μ ꡬ쑰 νΉμ λμλλ μ½λλ₯Ό μ κ±°νκ³ , μλ‘κ² κ°νΈμ νλ €κ³ ν©λλ€.
π§ 1. κΈ°μ‘΄ API μ΄ν΄λ³΄κΈ°
AS-IS
ν΄λΉ λΆλΆμ μλΉμ€ λ μ΄μ΄μ μλ μ§λ¨ μμ μ μ΄κΈ°ν μμ μ νλ μ½λμ λλ€.
μ§λ¨ λμ€ κ°μ μ μΌλ‘ μ’ λ£ν κ²½μ°μλ, μ§λ¨ μλ£λ κ²½μ°κ° μλκΈ° λλ¬Έμ ν΄λΉ κΈ°λ‘μ νκΈ°νλ €λ λͺ©μ μΌλ‘ DBμλ activeλΌλ attributeλ‘ κ΄λ¦¬λμμ΅λλ€.
λ°λΌμ ν΄λΉ active μ¬λΆμ λ°λΌ κΈ°λ‘ νκΈ° μ§ν + μλ‘μ΄ μ§λ¨ κΈ°λ‘μ μμ±νκ³ μ§λ¨ λ²νΈλ₯Ό μ»μ΄μ€λ κ²μ΄ μ΄ μ΄κΈ°ν μμ μ νλ λΆλΆμ λλ€.
μΈλ» λ΄λ λ¬Έμ κ° κ΅μ₯ν λ§μ보μ λλ€.
1. λ©μλ λͺ©μ μ μ ννκ² νμ νκΈ° μ΄λ €μ΄ μ΄λ¦
2. findByIdλ₯Ό ν΅ν΄ μ»μ κ°μ Optional μ΄μ§λ§, Optionalμ μ¬μ©ν μλ―Έκ° ν΄μλλ μ½λ
3. κΈ°λ‘ μμ 3κ°μ§λ₯Ό μ λΆ ν νΈλμμ μ λ£μ§ μμ.
4. "createLog" λΌλ λ©μλκ° λΉλ ν¨ν΄ λ΄λΆμ μΈλΌμΈμΌλ‘ λ€μ΄κ° ν΄λΉ μλΉμ€μμ μλ‘μ΄ κΈ°λ‘μ μμ±νλμ§ μμ보기 μ΄λ €μ. λ±λ±.
λν μΆκ°μ μΈ κ°μ μ¬νμ λ€μκ³Ό κ°μ΅λλ€.
1. λ λ§μ μ 보λ₯Ό λ΄μ response + ResponseEntityλ₯Ό νμ©ν μλ΅.
2. μμ² λ΄λΆμ κ°μ΄ μ ν¨νμ§ μλ κ²½μ°μλ, Bad Requestλ₯Ό 보λ΄μΌ ν¨.
3. κΈ°μ‘΄μλ activeλ₯Ό κΈ°μ€μΌλ‘ λ‘κ·Έλ₯Ό 'μμ ' νμΌλ, μ΄ activeλ₯Ό stateλ‘ λ°κΏ 7κ°μ§μ μνλ‘ νν. μμ κ° μλ 'SHUTDOWN'μΌλ‘ λ³κ²½
4. κ° μλΉμ€λ§λ€ νΉμ μ건μ λ°λ₯Έ responseλ₯Ό 리ν΄νκ² λλλ°, μλ΅μ λν΄ μ μ°ν μ¬μ© + μ¬μ¬μ©μ±μ΄ λμ ꡬ쑰 λ§λ€κΈ°
π§ 2. λ©μλ / λ³μ μ΄λ¦ λ³κ²½
disabledServiceλ, μλΉμ€ μ체μ μ₯μ κ° μλ€λ κ²μΈμ§, μ₯μ κ° μλ 무μΈκ°λ₯Ό μ²λ¦¬νλ μμ μΈμ§ λͺ ννμ§ μμ΅λλ€.
λν ν΄λΉ λ©μλλ non-activeν μμλ₯Ό μ κ±°νλ κ²μ΄ ν΅μ¬ λͺ©νκ° μλλΌ, "μ§λ¨ μμ±"νλ κ²μ΄ μ΅μ°μ μμ μ΄λ©° μ΄ λ κ°μ§λ₯Ό λ¬Άμ΄μ μ§λ¨ μ΄κΈ°νλΌκ³ ννν μ μμ΅λλ€.
λ°λΌμ μ‘°κΈ λ λͺ μμ μΈ μ΄λ¦μΌλ‘ λ³κ²½νμ΅λλ€.
disabledService → forInitDiagnosis
μ¬μ€, λ©μλ λͺ μ λλΆλΆ 'λμ¬'μ ννλ‘ κΈ°μ νλ κ²μ΄ μΌλ°μ μ λλ€.
λ€λ§, 컨νΈλ‘€λ¬μ λ°λ‘ λ§λΏμ μλ μλΉμ€μ λ©μλμ λν΄μλ§ μμ 'for'μ λΆμΈ λ€μ΄λ°μ μ§ννλλ‘ νμ΅λλ€.
κ·Έ μ΄ν, λ©μλ λͺ λ§ λ³΄κ³ μ΄ ν¨μκ° μ΄λ λ μ΄μ΄μ μμΉν λ©μλμΈμ§ ν λ²μ νμΈν μ μκ² λμμ΅λλ€.
return diagnosisService.disabledService(request)
→ return diagnosisService.forInitDiagnosis(requestForInitDiagnosis);
μ΄ μΈμλ κΈ°ν λ³μμ λν΄μ ν΄λΉ μ½λλ₯Ό μ²μ 보λ κ°λ°μλ μ½κ² μ΄ν΄ν μ μλλ‘ νμ΄μ μμ±νκ³ , μΉ΄λ©μΌμ΄μ€λ₯Ό μ΄μ©ν΄ μμ±νμ΅λλ€.
π€ 3. Optionalμ μ¬μ©νλ λͺ©μ μ NPE λ°©μ΄
λ€μ보λ λμ μ½λ
κΈ°μ‘΄μ μ½λλ₯Ό 보면,
userNum = memberRepository.findById(disabled.getId()).get().getUserNum();
μ΄ λΆλΆμλ λ§μ λ¬Έμ κ° μμ΅λλ€.
1) disabled.getId()μμ NPE λ°μ κ°λ₯μ± μ‘΄μ¬
2) findByIdλ₯Ό ν΅ν΄ μ»μ΄μ¨ κ°μ, Optional<T>μΈλ°, get() λ©μλλ₯Ό ν΅ν΄μ μ»μ΄μ€κ² λλ©΄ λ΄λΆκ° λΉμ΄μλ κ²½μ° λκ°μ΄ NPEκ° λ°μν¨. Optionalμ μ¬μ©ν μ΄μ κ° μμ.
3) μ΅μ’ getUserNumμμλ NPEκ° λ°μν κ°λ₯μ±μ΄ μ‘΄μ¬ν¨.
λ¬Όλ‘ try-catch λ¬ΈμΌλ‘ λ§μμ νλ‘κ·Έλ¨μ΄ μ€λ¨λ μν©μ λͺ¨λ©΄νκ² μ§λ§, μ΄ μ€ νλλΌλ NPEκ° λ° κ²½μ°μλ€λ©΄, μ¬μ©μμ μμ²μ΄ λΆμ€ν κ²½μ°μ΄λ―λ‘ bad requestλ₯Ό 보λ΄λ κ²μ΄ λ§λ€κ³ νλ¨νμ΅λλ€.
κΈ°μ‘΄μ μ½λλ₯Ό μμ ν κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€.
/* λΆλ³ κ° μ μ */
final String REQUEST_HAVE_NULL = "REQUEST_HAVE_NULL";
final int NO_REQUEST_USER_IN_DB = -1;
/* requestBody μμ userID κ²μΆ */
String userIDFromRequest = Optional.ofNullable(requestForInitDiagnosis)
.map(JBMBRequestObject::getRequestBody)
.map(DiagnosisDTO.RequestForInitDiagnosis::getUserID)
.orElse(REQUEST_HAVE_NULL);
/* BAD REQUEST => Null κ°μ ν¬ν¨ν REQUEST */
if (userIDFromRequest.equals(REQUEST_HAVE_NULL)) {
return μλ΅ μλ΅;
}
/* READ => userID κΈ°λ°μΌλ‘, λ©€λ² μλ³ λ²νΈ κ²μ */
int userNumFromRequest = memberRepository.findById(userIDFromRequest)
.map(Member::getUserNum)
.orElse(NO_REQUEST_USER_IN_DB);
/* INTERNAL ERROR => DBμ ν΄λΉ μ μ κ° μμ. νμ©λμ§ μμ μ κ·Ό μ²λ¦¬ */
if (userNumFromRequest == NO_REQUEST_USER_IN_DB) {
return μλ΅ μλ΅;
}
λ¬Έμ κ° λ§μ ν μ€μ΄μλ μ½λκ°, κ½€ λμ΄λ¬μ΅λλ€.
Optionalμ λ΄λΆμ κ°μ΄ λΉμ΄μλ μνλΌλ©΄, "orElse" ꡬ문 μ리μ¦λ‘ ν΄λΉ λΉμ΄μλ κ°μ NPEλ₯Ό λ°μμν€μ§ μκ³ λ체ν©λλ€.
public T orElse(T other)
public T orElseGet(Supplier<? extends T> other)
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
orElseμ orElseGetμ Optional κ°μ²΄μ κ°μ΄ Optional.empty()μ κ°μΈ κ²½μ° otherμ κ°μ λ체ν΄μ λ³΄λΌ μ μμ΅λλ€.
λ§μ½ Optional κ°μ²΄μ κ°μ΄ λΉμ΄μμ§ μλ€λ©΄, Optional<> κ»μ§μ΄ λ²κ²¨μ§κ³ λ΄λΆμ κ° κ·Έλλ‘λ₯Ό κ°μ§κ² λ©λλ€.
orElseμ orElseGetμ λ€λ₯Έ μ μ ν¬κ² λ κ°μ§μ λλ€.
1. orElseμ μΈμκ°μ Tμ΄κΈ° λλ¬Έμ, ν΄λΉ μ€λΈμ νΈλ₯Ό κ·Έλ₯ λ£μ΄μ£Όλ©΄ λ©λλ€. (νΉμ ν΄λΉ μ€λΈμ νΈλ₯Ό 리ν΄νλ ν¨μ)
orElseGetμ μΈμκ°μ Supplierμ λλ€. λλ€μμ μ΄μ©ν΄μ κ°μ λ£μ΄μ£Όμ΄μΌ ν©λλ€.
2. λ λ€λ₯Έ μ νλλ, orElseλ Optional λ΄λΆκ° λΉμ΄μλ μλλ, μΌλ¨ μ€νλκ³ λμ€μ κ°μ΄ κ²°μ λ©λλ€.
orElseGetμ Optional λ΄λΆκ° λΉμ΄μλ€λ©΄, λ΄λΆμ κ°μ΄ μ€νλμ§ μμ΅λλ€.
λ§μ½ orElseμ μΈμμ Tλ₯Ό 리ν΄νλ λ©μλμ§λ§, λ΄λΆμμ DB μ‘°μλ±μ κΈ°λ₯μ΄ λμκ°λ€λ©΄ μλμλ λ€λ₯΄κ² μΈμ λ΄λΆκ° μ€νλκΈ° λλ¬Έμ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€. μ΄λ° κ²½μ°μλ orElseGetμ μ¬μ©ν΄μΌ ν©λλ€.
orElseThrowλ λ§μ°¬κ°μ§λ‘ Optional.empty()μΈ κ²½μ° λ΄κ° μ§μ Exceptionμ μΌμΌν¬ μ μμ΅λλ€. 컀μ€ν ν Exception νΉμ μλ¬ λ©μμ§λ₯Ό μ§μ μμ±ν μ μλ€λ μ μμ μ₯μ μ΄ μμ΅λλ€.
Optional κ°μ²΄μ λν΄ .get() λ©μλλ₯Ό μ¬μ©νλ©΄, λ΄λΆμ κ°μ΄ λΉμ΄μλ€λ©΄ NPEλ₯Ό λ°μμν€λ―λ‘ Optionalμ μ΄ μλ―Έκ° μμ΅λλ€.
μμ κ°μ λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ κΆμ₯λλ λ°©λ²μ λλ€.
μ΄λ¬ν Optional κ°μ²΄μ λν΄ map λ©μλλ‘ λ΄λΆμ κ°μ νΉμ λ©μλλ₯Ό μ μ©μν¬ λ λ§λ€ μλμΌλ‘ Optionalμ΄ μμμ§κ² λ©λλ€.
μλ₯Ό λ€μ΄, λ€μκ³Ό κ°μ ν΄λμ€κ° μλ€κ³ ν΄λ΄ μλ€.
@AllArgsConstructor
@Getter
class Example{
private String test;
}
Example example = new Example("hi");
Optional.ofNullable(example)
.map(Example::getTest) // μ΄λ, Optional<String>μ΄ λ¨.
... μλ΅
Exampleμ getterμΈ getTestλ String νμ μ 리ν΄ν©λλ€. κ·Έλ¬λ mapμ ν΅ν΄ νΈμΆμ΄ λλ©΄, μλμΌλ‘ Optionalμ΄ μμμ§κ² λλ€λ κ²μ λλ€. μ΄ μ μ μ΄μ©ν΄ μ°μμ μΈ NPE μνμμλ λ²μ΄λ μ μμ΅λλ€.
Nμ€μΌλ‘ if λ¬Έμ μ¬μ©ν΄ null 체ν¬λ₯Ό ν΄μΌ νλ κ²μ΄ μμ΄μ§κ³ mapμ μ¬μ©ν¨μΌλ‘μ¨ κ°λ μ±μ λμ΄κ³ μ°μ° μμλ₯Ό λμ± μ§κ΄μ μΌλ‘ λ³Ό μ μμ΅λλ€.
κΈ°μ‘΄μ try-catch λ¬Έμ λͺ¨λ λ‘μ§μ΄ λ€ λ€μ΄μμμ§λ§, try-catchλ₯Ό μ κ±°νκ³ λΆλ³ κ°μ μ μν΄ ν΄λΉ κ°κ³Ό λΉκ΅ν΄ μλ΅μ 보λ΄λ λ‘μ§μΌλ‘ λ³κ²½νμ΅λλ€.
try-catch λ¬Έ λ΄λΆμμ μ μΈν μ§μλ³μλ λ°μμ μ¬μ©ν μ μμ΄ λ―Έλ¦¬ μ μΈν ν κ°μ λ³κ²½ν΄μΌ νλ€λ μ μ νΌν μ μμΌλ©°, μ΄λ λΆλΆμμ returnμ΄ λ°μνκ² λλμ§ κ°λ°μκ° λμ± μ§κ΄μ μΌλ‘ νμΈν μ μλ€κ³ νλ¨νμ΅λλ€. 미리 Exception νμ μ λͺ¨λ μμΈ‘ν΄ catchλ¬Έμ μ¬λ¬κ° μλ κ² λ³΄λ€ λ§μ΄μ£ .
π€ 4. Enumμ νμ©ν΄λ³΄μ.
Enumμ νμ©ν΄λ³΄μλ λ§μμ λ¨Ήμ λ°μλ μ¬λ¬ μ΄μ κ° μμ΅λλ€.
1) resultCodeμ int κ°μ λ£κ³ μλλ°, λ°±μλ / νλ‘ νΈμλ λͺ¨λ μ΄λ€ κ²°κ³Όκ°μΈμ§ μ ννκ² νμ νκΈ° μ΄λ ΅λ€.
2) active(0 νΉμ 1)μμ → state(OPEN, SURVEY, IMAGE_UPLOAD, DIAGNOSE, DONE, ERROR, SHUTDOWN)μ μ¬λ¬ μνλ‘ λλ μΌ νλλ°, μ΄λ₯Ό μ«μ(λΆκ°νκΈ° μ΄λ €μ) νΉμ λ¬Έμ(κ°λ°μμ μ€μ μ¬μ§κ° λ§μ)λ‘ νννλλ°μλ νκ³κ° μμ.
3) μ΄λ κ³³μμλ 0κ³Ό 1λ‘ νν, μ΄λ κ³³μμλ ν΄λΉ 0κ³Ό 1μ΄ λνλ΄λ λ¬Έμ μ½λ κ°μ κ°μ΄ λ¬Άκ³ μΆμ λ±.
javaμμμ Enumμ classμ΄κΈ° λλ¬Έμ λμ± λ§μ νμ©μ΄ κ°λ₯νλ€κΈΈλ, μ κ·Ήμ μΌλ‘ νλ‘μ νΈ κ°μ μ νλ©΄μ νμ©ν΄λ³΄κ³ μ 곡λΆλ₯Ό νμ΅λλ€.
λ΄λΆμμ μ¬μ©ν Enumμ μμ μ€, μ§λ¨ νμ μ κΈ°λ³Έν / μ΄νμνμ μ μνλ μ½λμ λλ€.
@Getter
@AllArgsConstructor
public enum JBMBDiagnosisTypeIdentifier {
DEFAULT(false),
THERMAL(true);
private boolean isThermal;
public static JBMBDiagnosisTypeIdentifier getJBMBDiagnosisTypeWhetherIsThermal(Boolean isThermal){
return Optional.ofNullable(isThermal)
.filter(bl -> bl)
.map(bl -> JBMBDiagnosisTypeIdentifier.THERMAL)
.orElse(JBMBDiagnosisTypeIdentifier.DEFAULT);
}
}
/* requestBody μ 'isThermal' μ μ¬μ©ν΄ diagnosisType κ²μΆ */
/* 'request' μ isThermal κ°μ 보λ΄μ§ μμΌλ©΄, κΈ°λ³Έ μ§λ¨μΌλ‘ μ€μ . */
JBMBDiagnosisTypeIdentifier diagnosisTypeFromRequest = Optional.of(requestForInitDiagnosis)
.map(JBMBRequestObject::getRequestBody)
.map(DiagnosisDTO.RequestForInitDiagnosis::getIsThermal)
.map(JBMBDiagnosisTypeIdentifier::getJBMBDiagnosisTypeWhetherIsThermal)
.orElse(JBMBDiagnosisTypeIdentifier.DEFAULT);
'μ§λ¨ μ ν μλ³μ'λΌλ μ΄λ¦μ κ°μ§ Enumμ μμ±νμ΅λλ€.
JBMBDiagnosisTypeIdentifier.DEFAULTμ JBMBDiagnosisTypeIdentifier.THERMAL λ κ°μ§ μ νμ΄ μμ΅λλ€.
javaμ enumμ ν΄λμ€μ΄κΈ° λλ¬Έμ λ΄λΆμ νλμ λ©μλλ₯Ό κ°μ§ μ μμ΅λλ€.
DEFAULT μΈμ€ν΄μ€λ false κ°μΌλ‘, THERMAL μΈμ€ν΄μ€λ true κ°μ μμ±μλ₯Ό ν΅ν΄ μμ±νμ΅λλ€.
λν λ©μλλ‘λ μ μ ν©ν 리 λ©μλλ₯Ό μμ±ν΄, 쑰건μ λ§λ Enum μΈμ€ν΄μ€λ₯Ό boolean νμ μ μΈμκ°μ λ°μ μ»μ μ μλλ‘ λ§λ€μμ΅λλ€.
μλΉμ€μμλ μμ μ½λ μμμ²λΌ 'diagnosisTypeFromRequest'λ₯Ό λ°μμ¨λ€λ©΄, .name()μ ν΅ν΄μ 'THERMAL' νΉμ 'DEFAULT' κ°μ μ»μ μ μμ΅λλ€.
/* ShutDown λμμ ννν Enum */
public enum ShutDownTarget {
EXIST, NOT_EXIST, ERROR;
public static ShutDownTarget getShutDownTargetByCount(long countOfShutDown) {
return countOfShutDown > 0L ? ShutDownTarget.EXIST : (countOfShutDown == 0L ? ShutDownTarget.NOT_EXIST : ShutDownTarget.ERROR);
}
}
@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 nowState) {
return nowState.isInterruptible();
}
}
/* CommonDiagnosisService.java */
@Transactional
public long updateStateToShutDown(String requestUserID, int requestUserNum) {
// UPDATE => SHUTDOWN μΌλ‘ μν λ³κ²½ λ°, λ³κ²½ λμ μ 리ν΄
try {
Stream<String> shutDownedDiagnosisInfoIDList = diagnosisInfoRepository.findAllByUserNum(requestUserNum)
.stream()
/* SHUTDOWN μΌλ‘ μνλ₯Ό λ³κ²½ν΄μΌ ν λμλ§ νν°λ§ */
.filter(diagnosisInfo -> JBMBDiagnosisStateIdentifier.isShutDownAble(diagnosisInfo.getDiagnosisState()))
/* state SHUTDOWN μΌλ‘ λ³κ²½ ν μ μ₯ */
.map(JBMBDiagnosisInfoEntity::setDiagnosisStateToShutDown)
.map(diagnosisInfoRepository::save)
/* λ³κ²½ λμ μ§λ¨ μμ΄λ λͺ©λ‘μΌλ‘ λ³κ²½ */
.map(JBMBDiagnosisInfoEntity::getDiagnosisID)
.map(Object::toString);
log.info("=> Member [{}]'s diagnosis log is shut down, count : {} / changed ID : [{}]",
requestUserID,
shutDownedDiagnosisInfoIDList.count(),
shutDownedDiagnosisInfoIDList.collect(Collectors.joining(", ")));
return shutDownedDiagnosisInfoIDList.count();
} catch (Exception e) {
log.error(e.getMessage());
return -1L;
}
}
/* UPDATE => SHUTDOWN μΌλ‘ μν λ³κ²½ λ°, λ³κ²½ λμ μ λ¦¬ν΄ */
/* SHUTDOWN λ³κ²½κ³Ό κ°μ κ²½μ°, μ€ν¨ν΄λ ν¬κ² νκ²©μ΄ μμ. λ€μμ λ€μ μλν΄λ λ¨. */
ShutDownTarget shutDownTarget = ShutDownTarget.getShutDownTargetByCount(
commonDiagnosisService.updateStateToShutDown(userIDFromRequest, userNumFromRequest));
7κ°μ§μ μ§λ¨ μνλ₯Ό EnumμΌλ‘ ννν κ²κ³Ό, SHUTDOWN λμ μ‘΄μ¬ μ¬λΆλ₯Ό EnumμΌλ‘ ννν κ²μ μμμ λλ€.
Enumμ μ¬μ©ν¨μΌλ‘μ¨ μ΄μ μ λ§μμ΅λλ€.
1) λμμ μ¬λ¬ κ°μ ν¬ν¨ν μ μμμ΅λλ€. μ΄ν΄ν μ μλ μ«μμ½λλ§ λλ μλ μ΄μ κ³Όλ λ€λ₯΄κ², ν΄λΉ μ«μμ½λκ° λνλ΄λ λ©μμ§, μ΄λ¦, λ±λ±μ κ°μ΄ ν κ°μ²΄ λ΄μ ννν μ μμμ΅λλ€.
2) λ¨μν μ«μ, λ¬Έμμ ννμ΄ μλ Enum νμ μ κ°μ²΄λ₯Ό μ¬μ©νκΈ° λλ¬Έμ κ°λ°μμ μ΄ν΄κ° λ μ½κ³ , μ§κ΄μ μ λλ€. λν String λ¬Έμλ₯Ό μ λͺ» μ λ ₯νλ μ¬κ³ λ₯Ό νΌν μ μμ΅λλ€.
3) μλ‘μ΄ μ§λ¨ μνκ° μκΈ΄λ€νλλΌλ, Enumμ μμ±μ λΆλΆλ§ λ§μ§λ€λ©΄ λ€λ₯Έ λ‘μ§μ μμ μμ΄ μ μ°ν νμ₯μ΄ κ°λ₯ν©λλ€.
λ€μ μΌμ§μμλ DTOμ κ΄λ ¨λ λ΄μ©κ³Ό, κ³΅ν΅ μλ΅μ λν μ²λ¦¬, μ¬νμ©μ±μ΄ λμ ResponseCreatorλ₯Ό λ§λ λ΄μ©μ λν΄ μμ νλλ‘ νκ² μ΅λλ€.