v2_exceptionhandling - 100-hours-a-week/KTB4-8th-BE GitHub Wiki
μμΈ μ²λ¦¬
νμ¬ μ΄ μλΉμ€μμ λ°μν μ μλ μ΄μ λ λ€μκ³Ό κ°λ€.
- μνλ¦¬ν° κ³μΈ΅
401 μμ²μ μΈμ¦ μ¬λΆ: AT κ²μ¦ μ€ν¨, RT κ²μ¦ μ€ν¨, ...?
403 μμ²μ μΈκ° μ¬λΆ: μΌλ¨ v2κΉμ§ λ°μν μΌ μ§μ§ κ±°μ μμ.
- 컨νΈλ‘€λ¬ κ³μΈ΅
400 μμ²μ μ¨μ μ±?: λλΆλΆ μ ν΄μ Έ μμΌλ©°, μΈλΆλ‘λ κ΅³μ΄ μΈλΆμ μΌλ‘ λλ μ΄μ μμ. λ‘κ·Έλ§ μνμ
405 μμ² λ©μλμ μ§μ μ¬λΆ: YES or NOλ§μ΄ μ€μνλ€. λλ νμ μ
422 μμ² νλκ° κ²μ¦ κ²°κ³Ό μ ν¨ν κ°μ κ°μ‘λμ§: λλ μΌ λ¨...
413 μμ² λ³Έλ¬Έμ νμΌ νμμ μ§μνλ μ§: YES or NOλ§μ΄ μ€μνλ€. λλ νμ μ
415 μμ² λ³Έλ¬Έμ νμΌμ΄ μ ν λ²μ μ΄λ΄μΈμ§: YES or NOλ§μ΄ μ€μνλ€. λλ νμ μ
429 μμ²μ΄ Rate Limitμ λμ§ μμλμ§: YES or NOλ§μ΄ μ€μνλ€. λλ νμ μ
- μλΉμ€ κ³μΈ΅
404 리μμ€μ μ‘΄μ¬μ±: λλ μΌ λ¨
409 μμ²μ λ΄μ©κ³Ό μλ²μ μνκ° μΆ©λνλ μ§: λλ μΌ λ¨
500 μλ² μ€λ₯: μ΄κ²λ λ΄λΆ λ‘κΉ μ μν΄μΌ ν¨
502 μΈλΆ API μ€λ₯ (κ·Έ μΈ)
503 λ΄λΆ API μ€λ₯ (AI μλ²)
μμΈ ν΄λμ€ κ΅¬μ‘° κ΅¬μ± (+ messageSource μ°κ²°)
base class
messageSource κ΄λ ¨ μ€μ
2λ¨κ³
HTTP μν μ½λλ³ λΆκΈ° μ μ©, κΈ°λ³Έ λ©μΈμ§ μμ±, μν μ½λ λ³ ProblemDetail νμ μ μ
κΈ°λ³Έ νμ
{
"trace_id": String,
"code": String,
"type": URI,
"title": String,
"instance": URI,
}
3λ¨κ³
μν μ½λμμ λ μΈλΆμ μΌλ‘ λΆκΈ°κ° νμν λ³Έλ¬Έλ€
- 401, 404, 409, 502?λ μΈλΆμ μΌλ‘ λλ νμκ° μμ
422
{
"trace_id": String,
"code": String,
"type": URI,
"title": String,
"instance": URI,
"errors": [
{
"code": "String",
"detail": String,
"pointer": JSON Pointer
},
...
]
}
@Valid @RequestBodyλ¨λ ->MethodArgumentNotValidException(λ©μλ νλΌλ―Έν°μ λν μ§μ μ μΈ μ ν¨μ± κ²μ¦μ΄ λ°μνμ§ μμμ κ²½μ°)- λλ¨Έμ§ (μ΄λ ν κ²½μ°λ κ°μ
@NotNull,@Positiveλ± λ©μλ νλΌλ―Έν°μ μ ν¨μ± κ²μ¦ μ΄λ Έν μ΄μ μ μν μ§μ μ μΈ μ ν¨μ± κ²μ¦μ΄ λ°μν κ²½μ°) ->HandlerMethodValidationException
-
νλ¦
-
HandlerMethodValidationException-
HandlerMethodValidationException.getParameterValidationResults().methodParameter.parameterName(λ³Έλ¬Έμ΄ μλ κ²½μ° =result.type = ParameterValidationResult) λλHandlerMethodValidationException.getParameterValidationResults().fieldErrors.field(λ³Έλ¬ΈμΈ κ²½μ° =result.type = ParameterErrors)μμ νλ μ΄λ¦μ μΆμΆν΄ μ€λ₯ μ½λλ₯Ό λ§€ν ->code,detail,pointer -
νλΌλ―Έν° μ ν¨μ± κ²μ¦μ©
messageSourceμ κ° μ½λλ³detailνμ- μ΄ λλ½μ μ»΄νμΌ μμΈλ‘ μλ°©νλ€λ©΄?
pointerλfieldκ° μ 체 κ²½λ‘λ₯Ό κ°μ§κΈ° λλ¬Έμ, κ·Έλλ‘ μ°κ±°λ μ‘°κΈ λ³ννλ©΄ λ λ―
-
FieldErrorsμμλfieldκ° μ 체 κ²½λ‘λ₯Ό κ°μ§κΈ° λλ¬Έμ, λ§€ν μsplit(".")λ±μΌλ‘ μ¬λΌμ΄μ±μ΄ νμν λ―
-
-
MethodArgumentNotValidExceptiongetFieldErrorsλ‘ νλλ³ μ€λ₯μ μ κ·Όν μ μλ€κ³ ν¨
-
-
ꡬν
-
@RestControllerAdvice@ExceptionHandling(HandlerMethodValidationException.class),@ExceptionHandling(MethodArgumentNotValidException.class)- νλ μ΄λ¦κ³Ό μ€λ₯ μ½λλ₯Ό λ§€ν
FieldErrorsμ κ° νλ μ€λ₯λ₯Όcode,detail,pointerλ₯Ό κ°μ§ DTOλ‘ λ§€ννμ¬errors컬λ μ μΌλ‘ λ³νerrorsλ₯Ό λ΄μ 422 μ€λ₯λ‘ λ³ν
-
message.properties- μ€λ₯ μ½λμ λμνλ
detailμμ±
- μ€λ₯ μ½λμ λμνλ
-
TO-BE
3λ¨κ³ μμΈ
μμΈ ν΄λμ€: 2λ¨κ³ μμΈ extend, μμΈ λ³ code μ μΈ
message.properties: μ€λ₯μ type, titleλ§ μ μΈ
2λ¨κ³ μμΈ
κ° μν μ½λ λ³ fallbackμ© code, type, title μ μΈ
base class
codeλ₯Ό μ΄μ©ν΄ message.propertiesμμ μ€λ₯μ ν΄λΉνλ type, title μ‘°ν, ProblemDetail μμ±
getTypeMessageCode(),getTitleMessageCode()
new ErrorResponseException(status, body, cause, messageDetailCode, null)