๐ 0. ์ด์ ๊ธ
๐ 1. ์๋ก
์ง๋ ๋ฒ DTO๋ฅผ ๊ฐ๋ฐํ๊ณ ๋์, ์๋ต์ ์ด๋ค ์์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ ์ง ์๊ฐํด๋ดค์ต๋๋ค.
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(JBMBResponseObject.<T>builder()
.resultCode(...)
.resultMessage(...)
.hasError(...)
.errorMessage(...)
.errorSource(...)
.requestURL(...)
.responseAt(...)
.responseBody(...)
.build()
);
์๋ต์ ๋ง๋ค์ด ๋ผ ๋๋ง๋ค ์์ ์๋ ์ฝ๋๋ฅผ ์ํฉ์ ๋ง๊ฒ ๊ณ์ํด์ ์์ฑํด์ผ ํฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ '์ฌ์ฌ์ฉ์ฑ์ด ์ข๊ณ , ๋ค๋ฅธ ๊ฐ๋ฐ์๋ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํ ์๋ต ์์ฑ๊ธฐ๋ฅผ ๋ง๋ค์ด๋ณด์' ๋ผ๋ ์๊ฐํ์ responseCreator๋ฅผ ๋ง๋ค๊ธฐ ์์ํ์ต๋๋ค.
์ ๊ฐ ๊ณ ๋ คํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1) ์๋น์ค์ ํ ๋ฉ์๋์์๋ ๋ณดํต ํ ์๋ต๋ง ๋์ค์ง ์๋๋ค.
: ํ ๋ฉ์๋ ๋ด์ ์ฑ๊ณตํ์ ๋์ ์๋ต, ์คํจํ์ ๋์ ์๋ต, ์ฌ์ฉ์์ ์์ฒญ์ด ์ ํจํ์ง ์์ ์๋ต, ์ผ๋ถ๋ง ์ฑ๊ณตํ์ ๋์ ์๋ต ๋ฑ, ์กฐ๊ฑด ๋ถ๊ธฐ์ ๋ฐ๋ฅธ ๋ค์ํ ์๋ต์ด ๋์ฌ ์ ์์ต๋๋ค. ๊ทธ ๋๋ง๋ค ์ ๋ฐ ๋น๋ ํจํด์ผ๋ก ๊ธธ๊ฒ ์ด์ด์ง ์๋ต์ ๊ณ์ํด์ ์์ฑํ๋ ๊ฒ์ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํน์ ๊ฐ์ ๋ฐ๋ผ responseCreator๊ฐ ๋ง์ถฐ์ ์๋ต์ ๋ณด๋ด์ฃผ๋ฉด ์ด๋จ๊น? ๋ผ๋ ์๊ฐ์ ํ์ต๋๋ค.
2) ์๋น์ค์ ๋ฉ์๋ ๋ง๋ค '๊ฒฐ๊ณผ ์ฝ๋'์ ์ ์์ '๊ฒฐ๊ณผ ๋ฉ์์ง'๊ฐ ๋ค๋ฅด๋ค.
: ๋ฐ๋ผ์ ์ด๋ค ๋ฉ์๋๋ก๋ถํฐ ๋ค์ด์จ ์๋ต์ธ์ง ๊ตฌ๋ถํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋์ผ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ผ๋๊น์.
3) responseBody๋ ๊ฐ์ ์๋น์ค์ ๋ฉ์๋๋ก๋ถํฐ ํธ์ถ๋์ด๋ ๋งค๋ฒ ๋ค๋ฅด๋ค.
: ๋ฐ๋ผ์ responseBody์ ๋ค์ด๊ฐ ๊ฐ์ ์ธ์๋ก ์ ๋ฌํด์ผ๋ง ํฉ๋๋ค.
4) ๋ณด๋ด๋ ์๋ต์ ์ข ๋ฅ๋ ๊ทธ๋ ๊ฒ ๋ง์ง ์๋ค.
: ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ณตํ ์๋ต, ์ฑ๊ณตํ์ง๋ง ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์ถ๊ฐ ์ ๋ฌํด์ผ ํ๋ ์๋ต, ์ผ๋ถ ์ฑ๊ณตํ ์๋ต, ์คํจํ ์๋ต, ์คํจํ์ผ๋ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์ถ๊ฐ ์ ๋ฌํด์ผ ํ๋ ์๋ต ๋ฑ์ผ๋ก ์ขํ ์ ์์์ต๋๋ค.
๐ค 2. ์๋ต ์์ฑ๊ธฐ ๋ง๋ค๊ธฐ : ์ด๋ค ๋ฉ์๋๋ก ๋ค์ด์จ ์๋ต์ธ์ง ๊ตฌ๋ถํ๊ธฐ
์๋ฅผ ๋ค์ด ์๋ต๊ธฐ์ successfulResponse๋ฅผ ๋ง๋ค์๋ค๊ณ ๊ฐ์ ํฉ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด๋ค ์๋น์ค ๋ ์ด์ด์ ์ด๋ค ๋ฉ์๋์์ ํด๋น successfulResponse๋ฅผ ํธ์ถํ๋์ง ์ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น์?
์ด๊ฒ์ ํด๊ฒฐํ๋ ๊ฒ์ด ๊ธ์ ๋ฌด์์ต๋๋ค.
์ฐ์ ์์ ๊ณ ๋ คํ ์ฌํญ 3๋ฒ์ ๋ณด๋ฉด, responseBody๋ฅผ ์ธ๋ถ์์ ๋ง๋ ํ์ successfulResponse์ ์ธ์๋ก ๋์ ธ์ผ ํฉ๋๋ค.
์ด๋ก์จ successfulResponse์ ์ธ์๋ก๋ DTO๊ฐ ๋ค์ด์ค๊ฒ ๋ฉ๋๋ค. DTO์ ํ์ ์ ๋ชจ๋ ๋ค๋ฅด๋ฏ๋ก, ์ ๋ค๋ฆญ์ผ๋ก ํจ์๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
public static <T> ResponseEntity<JBMBResponseObject<T>>
successfulResponse(T responseBody){...}
ํ ๊ฐ์ง ๊ฑธ๋ฆฌ๋ ๊ฒ์ด ์์ต๋๋ค. responseBody๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์๊ฐํ ๊ฒ์, ๋ค์ด์จ responseBody๋ฅผ ๊ฐ์ง๊ณ ๋ฆฌํ๋ ์ (reflection)์ ํตํด ํด๋น T ํ์ ์ ์ค์ ํด๋์ค ์ด๋ฆ์ ์ป์ด์ต๋๋ค.
๊ทธ ํ์, ํด๋์ค ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ์ด๋ค ๋ฉ์๋๋ก๋ถํฐ ๋ค์ด์๋ค๋ ๊ฒ์ ๊ท์ ํ๋ฉด ํด๊ฒฐํ ์ ์์ต๋๋ค.
String className = responseBody.getClass().getName();
// ๋ฉ์๋์ ํด๋์ค ์ด๋ฆ ๋ฆฌ์คํธ๋ฅผ ๋งคํํด๋์ผ๋ฉด, ์ด๋ค ๋ฉ์๋๋ก๋ถํฐ ๋ค์ด์๋์ง ํ์ธํ ์ ์๋ค.
๊ทธ๋ฌ๋ ๋ฆฌํ๋ ์ (reflection)์ ๋จ์ ์ด ์์ต๋๋ค.
getClass๋ฅผ ํธ์ถํ๋ฉด Class ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐ์ ์๊ฐ์ ์๋ชจํ๊ฒ ๋ฉ๋๋ค.
ํด๋น ๊ตฌ๋ฌธ์ด ๋ง์ด ๋ถ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ๋ฉด, ์ข์ ์ ํ์ด์ง๋ง ์ง๋จ ์๋น์ค ๋ ์ด์ด๋ก๋ถํฐ ํ๋ฌ๋ค์ด์จ ๋ชจ๋ ๋ฉ์๋์์ responseCreator๋ฅผ ํธ์ถํ ๊ฒ์ด๊ณ , ๊ทธ๋๋ง๋ค ์๋ ์์ด ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํด DTO ํด๋์ค ์ด๋ฆ์ ์ป์ด์ฌ ๊ฒ์ ๋๋ค.
์ฑ๋ฅ์์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ ์ง์ํ๊ธฐ๋ก ํ์ต๋๋ค.
ํด๋์ค์ ๋ฉํ ๋ฐ์ดํฐ ์ ๋ณด๋ JVM์ Perm ์์ญ์ ์ ์ฅ๋ฉ๋๋ค. ๋ง์ฝ Class ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ๋๊ฒ ๋ง์ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ์ผ์ด ๋ฒ์ด์ง๋ฉด Perm ์์ญ์ด ๋์ด์ ์ฌ์ฉํ ์ ์๊ฒ ๋์ด OutOfMemoryError๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค.
- ์ถ์ฒ : https://12bme.tistory.com/129
๋ ๋ฒ์งธ ์๊ฐํด๋ธ ๋ฐฉ๋ฒ์, ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด DTO์ getIdentifier()๋ผ๋ ๊ฐ DTO๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ๋ฉ์๋๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
@Data
@Builder
@AllArgsConstructor
public static class ResponseForInitDiagnosis implements DiagnosisResponseDTO {
private Long diagnosisID;
@Override
public JBMBDiagnosisServiceIdentifier getIdentifier() {
return JBMBDiagnosisServiceIdentifier.INIT;
}
}
public interface DiagnosisResponseDTO {
JBMBDiagnosisServiceIdentifier getIdentifier();
}
ResponseForInitDiagnosis ํด๋์ค๋ DiagnosisResponseDTO๋ฅผ ๊ตฌํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ getIdentifier() ๋ฉ์๋๋ฅผ ์์ฑ์์ผ์ผ ํฉ๋๋ค.
๋ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ ๋์ ์ฅ์ ์,
/* before */
public static <T> ResponseEntity<JBMBResponseObject<T>>
successfulResponse(T responseBody){...}
/* after */
public static <T extends DiagnosisDTO.DiagnosisResponseDTO> ResponseEntity<JBMBResponseObject<T>>
successfulResponse(T responseBody){...}
์ด๋ ๊ฒ T์ ๋ค์ด์ฌ ์ ์๋ ํ์ ์ ์ ํํ ์ ์์ต๋๋ค. ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ณ ์๋ DTO๋ง ์ธ์๋ก ๋ฃ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ก์จ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ DTO๋ฅผ responseBody์ ์๋ชป ๋ฃ์ ์ผ๋ ์์ต๋๋ค. ๋ฐ๋ก ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ๋ง์ด์ฃ .
JBMBDiagnosisServiceIdentifier serviceIdentifier = responseBody.getIdentifier();
์ด์ ์ด๋ค ๋ฉ์๋๋ก๋ถํฐ ์๋์ง ๋ฐ๋ก ์ป์ ์ ์์ต๋๋ค. getIdentifier์ ๋ฆฌํด๊ฐ์ Enum(JBMBDiagnosisServiceIdentifier)์ผ๋ก ๋ง๋ค์ด ๋์ฑ ํธํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ค 3. ์๋ต ์์ฑ๊ธฐ ๋ง๋ค๊ธฐ : ๋ฉ์๋์ ์ํฉ์ ๋ฐ๋ฅธ ์๋ต ๋งค์นญํ๊ธฐ
์ด์ Enum ๊ฐ์ ํตํด ์ด๋ค ๋ฉ์๋๋ก๋ถํฐ ์๋์ง ์ ์ ์์ต๋๋ค.
successfulResponse๋ก ์๋ต์ ์์ฑํ๋ฉด, '์ฑ๊ณต'ํ์ ๊ฒฝ์ฐ์ ๊ฐ์ ๋ฆฌํดํด์ผ ํฉ๋๋ค.
failedResponse๋ก ์๋ต์ ์์ฑํ๋ฉด, '์คํจ'ํ์ ๊ฒฝ์ฐ์ ๊ฐ์ ๋ฆฌํดํด์ผ ํ์ฃ .
์ด ๋ถ๋ถ์ ๊ตฌํํ๊ธฐ ์ํด์ ์๋ก์ด Enum์ 2๊ฐ ๋ ์ด์ฉํ์ต๋๋ค.
์ด์ ์ ๋ง๋ค์๋ JBMBDiagnosisServiceIdentifier๋, ์๋น์ค๋ฅผ ๊ตฌ๋ถํ๋ Enum ์ ๋๋ค.
JBMBDiagnosisServiceResultCodeIdentifier๋, ์๋น์ค์ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋ถํ๋ Enum์ ๋๋ค.
๊ทธ๋์ JBMBDiagnosisServiceIdentifier์ ์ธ์คํด์ค๋ List<JBMBDiagnosisServiceResultCodeIdentifier>๋ฅผ ํ๋๋ก ๊ฐ์ง๊ณ ์๋๋ก ๋ง๋ค์์ต๋๋ค.
์๋์ ๊ฐ์ ๋ด์ฉ์ ๋ชจ๋ '์ง๋จ ์ด๊ธฐํ'์ ํด๋นํ๋ค๋ ๊ฒ์ Enum์ผ๋ก ํํํ ๊ฒ์ด์ฃ .
- ์ง๋จ ์ด๊ธฐํ ์ ํจํ์ง ์์ ์์ฒญ
- ์ง๋จ ์ด๊ธฐํ ์ฑ๊ณต
- ์ง๋จ ์ด๊ธฐํ ์ฑ๊ณต + ์ผ๋ถ ์ํ Shutdown์ผ๋ก ๋ณ๊ฒฝ
- ์ง๋จ ์ด๊ธฐํ ์ฑ๊ณต + Shutdown ๋์์ ์์ง๋ง ๋ณ๊ฒฝ ์คํจ
- ์ง๋จ ์ด๊ธฐํ ์คํจ
JBMBDiagnosisServiceResultCodeIdentifier๋, JBMBResultCodeLabel์ ๊ฐ์ง๋๋ค.
JBMBResultCodeLabel์, ์์ฑ๊ธฐ์ ๋ฉ์๋์ ๋งค์นญ๋๋ ๊ฒ์ ํํํ Enum์ ๋๋ค.
์๋ฅผ ๋ค์ด DTO๋ก๋ถํฐ 'INIT'์์ ์์๋ด๊ณ successfulResponse๋ฅผ ํธ์ถํ๋ค๋ฉด, INIT์ ํด๋นํ๋ฉด์ JBMBResultCodeLabel.SUCCESS๋ฅผ ๊ฐ์ง๊ณ ์๋ INIT_SUCCESS๋ฅผ ์ป์ ์ ์๋๋ก ์ค๊ณํ์ต๋๋ค.
๊ทธ ์ญํ ์ ํด๋ด๋ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public static JBMBDiagnosisServiceResultCodeIdentifier findResultCodeIdentifierByServiceIdentifierAndTypeLabel
(JBMBDiagnosisServiceIdentifier serviceIdentifier, JBMBResultCodeLabel resultCodeLabel) {
return serviceIdentifier.getResultCodeIdentifierList().stream()
.filter(resultCodeIdentifier -> resultCodeIdentifier.getResultCodeLabel() == resultCodeLabel)
.findAny()
.orElse(JBMBDiagnosisServiceResultCodeIdentifier.NOT_SUPPORTED_TYPE);
}
์ด์ ๊ฐ Enum์ ๋ง๋ resultCode๋, resultCode์ ๋ํ ์ค๋ช , requestURL ๋ฑ์ ํ๋๋ก ๋ง๋ค์ด ์์ฑ์์์ ์ ์ธํด์ฃผ๋ฉด ์์ฑ์ ๋๋ค.
ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํด ์๋ํ ๋๋ก ์๋ํ๋์ง ํ์ธํ๋๋ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ ์คํธ์ฝ๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์์ฑํด ์กฐ๊ธ ๋ ๊ฒ์ฆํด์ผ๊ฒ ์ง๋ง์.
์๋ฌ ๋ฉ์์ง๋ error ๋ฐ์ ์ง์ ์ ๊ดํด์๋ enum์ ๊ณ ์ ๋ ๊ฐ์ผ๋ก ์ง์ ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ด ๋ถ๋ถ์ ๋ํด์๋ ๋์ค์ ๊ฐ๋ฐ์ ์งํํ ํ์ ์ผ์ง๋ฅผ ์ ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.