
API ์ค๊ณ๋ฅผ ํ๋ค ๋ณด๋ฉด ํ ๊ฐ์ง ๊ณ ๋ฏผ์ด ์๊ธด๋ค.
์๋ฌ ์๋ต ์ HttpStatus๋ง ์ฃผ๋ฉด ๋ ํ ๋ฐ ์ ๊ตณ์ด code(์ปค์คํ ์๋ฌ ์ฝ๋)๋ฅผ ์ถ๊ฐ๋ก ์ฃผ๋ ๊ฑธ๊น?
๋๋ ์ด์ ํ๋ก์ ํธ ์ต์ข ๋ฐํ ์ค์ ์ด ๋ถ๋ถ์ ๋ํด ํผ๋๋ฐฑ์ ๋ฐ์๊ณ , ์ฌ๋ฌ ์ค๋ฌด ์ฌ๋ก์ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋ฉฐ ์ ๋ฆฌํด๋ณด์๋ค.
ํ๋ก ํธ๊ฐ "message" (ํ๊ตญ์ด ๋ฉ์์ง) ๊ธฐ๋ฐ์ผ๋ก ํธ๋ค๋ง ํ๋ฉด โ ๋์ค์ ๋ค๊ตญ์ด, ๋ฉ์์ง ๋ณ๊ฒฝ ์ ์ํ.
{
"code": "USER-001",
"message": "์ธ์ฆ ์ฝ๋๊ฐ ๋ง๋ฃ๋์์ต๋๋ค.",
"httpStatus": 401
}
์์ ๊ฐ์ด ์๋ต์ด ์ค๊ฒ๋๋ฉด
โ ํ๋ก ํธ์์๋ ์๋์ฒ๋ผ code๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ฌ ์ฒ๋ฆฌ ๋ถ๊ธฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ์ ์ฉํ ์ ์๊ฒ ๋๋ค.
if (error.code === 'USER-001') {
showToast("์ธ์ฆ ์ฝ๋๋ฅผ ๋ค์ ์
๋ ฅํด ์ฃผ์ธ์.");
} else if (error.code === 'USER-002') {
showToast("์ธ์ฆ ์ฝ๋๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.");
}
โ ์์ ์ โ message ๋ณ๊ฒฝ๋ผ๋ ํ๋ก ํธ๋ ๊นจ์ง์ง ์์
์๋ฒ ๋ก๊ทธ๋ ๋ชจ๋ํฐ๋ง ์์คํ ์์ code ๊ธฐ๋ฐ์ผ๋ก ์๋ฌ๋ฅผ ๋ชจ๋ํฐ๋ง ํ ์ ์๋ค.
๋ก๊น ์์ :
[ERROR] USER-001 ๋ฐ์ โ ์๋ ์ ์ก
[ERROR] ORDER-005 ๋ฐ์ โ ์ฌ๊ณ ์์
โ ์ ํํ ์ด๋ค ์๋ฌ์ธ์ง ์ถ์ ๊ฐ๋ฅ (message๋ ๋ค๊ตญ์ด/๋ฒ์ ๋ณ๋ก ๋ฐ๋ ์ ์์)
API ๋ช ์ธ์์ Error Spec ๋ณ๋ ๊ด๋ฆฌํ๋ฉด ํ์๋ค๊ณผ api ์๋ต์ ๊ดํ์ฌ ํจ๊ป ์ดํดํ ์ ์๊ฒ ๋๋ค.
| Code | Message | HttpStatus | Description |
|---|---|---|---|
| USER-001 | ์ธ์ฆ ์ฝ๋๊ฐ ๋ง๋ฃ๋์์ต๋๋ค. | 401 | ์ธ์ฆ์ฝ๋ ๋ง๋ฃ ์ ๋ฐ์ |
| ORDER-001 | ์ฌ๊ณ ๊ฐ ๋ถ์กฑํฉ๋๋ค. | 400 | ์ฃผ๋ฌธ ์ ์ฌ๊ณ ๋ถ์กฑ ๋ฐ์ |
-> ํด๋ผ์ด์ธํธํ + QAํ + ์๋ฒํ ๋ค ๊ณต์
-> ํด๋ผ์ด์ธํธ๋ ์ด ๋ฌธ์๋ฅผ ๋ณด๊ณ "์ USER-001์ ์ธ์ฆ ์ฝ๋ ๋ง๋ฃ๊ตฌ๋" ๋ผ๊ณ ์ดํด
-> ๋ฌธ์๋ก ์์ฑํ๋ฉฐ ๊ณ์ํด์ ์ถ๊ฐํด๋๋ ๊ฒ์ด ์ข๋ค.
@Getter
@RequiredArgsConstructor
public enum UserErrorStatus implements BaseErrorCode {
EXPIRED_AUTH_CODE("USER-401", "์ธ์ฆ ์ฝ๋๊ฐ ๋ง๋ฃ๋์์ต๋๋ค.", HttpStatus.UNAUTHORIZED),
MISS_MATCH_AUTH_CODE("USER-403", "์ธ์ฆ ์ฝ๋๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.", HttpStatus.BAD_REQUEST);
private final String code;
private final String message;
private final HttpStatus httpStatus;
}
๊ธฐ์กด์๋ ์ปค์คํ ์ฝ๋๋ฅผ ์ ๊ณตํ์ง ์์์๊ณ , HttpStatus์ ๋ง๊ฒ ๋๋ฉ์ธ๋ช ์ ๋ค์ ์ถ๊ฐ์ ์ผ๋ก ์ํ์ฝ๋๋ฅผ ๋ถ์ฌ์ฃผ๋ ค๊ณ ํ์๋ค.
@Getter
@RequiredArgsConstructor
public enum UserErrorStatus implements BaseErrorCode {
EXPIRED_AUTH_CODE("USER-001", "์ธ์ฆ ์ฝ๋๊ฐ ๋ง๋ฃ๋์์ต๋๋ค.", HttpStatus.UNAUTHORIZED),
MISS_MATCH_AUTH_CODE("USER-002", "์ธ์ฆ ์ฝ๋๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.", HttpStatus.BAD_REQUEST);
private final String code;
private final String message;
private final HttpStatus httpStatus;
}
"USER" โ ๋๋ฉ์ธ prefix
"001","002" โ ์ปค์คํ ์ซ์
HttpStatus.UNAUTHORIZED (401) โ ํต์ ์์ค ์ํ ์ฝ๋
USER-001 โ ๋น์ฆ๋์ค ๋ก์ง์์ ๋ฐ์ํ ๊ณ ์ ์๋ฌ ์ฝ๋
โ ๋์ ์๋ชป ์์ผ๋ฉด ๊ฐ๋ ์ ์ผ๋ก ํผ๋์ด ๋ฐ์ํ๋ฏ๋ก USER-400, 401์ด ์๋ ์ฐจ๊ทผ์ฐจ๊ทผ ์ปค์คํ ์ฝ๋๋ฅผ ์ค๋ค.
๐ฉ ํผ์ฉ๋ ์ฝ๋๋ช โ ์ ์ง๋ณด์ ๋ฆฌ์คํฌ ๋ฐ์
ํ๋ก ํธ์์ ํท๊ฐ๋ฆผ
code = USER-401 โ ์ด๊ฒ USER-001๋ถํฐ ์ฐจ๋ก๋๋ก ์ฌ๋ผ๊ฐ USER-401์ ์๋ฏธํ๋ ๊ฑด์ง, ๊ทธ๋ฅ 401 UNAUTHORIZED ์๋ฌ ์ฝ๋์ธ์ง ๋ชจํธํ๋ค.
์ ์ง๋ณด์ ์ํ
๋์ค์ HttpStatus ๋ณ๊ฒฝ ์ code ๊ฐ๋ ๋ฐ๊ฟ์ผ ํ ๊น?
์: USER-401 โ 403์ผ๋ก ๋ฐ๊พธ๋ฉด USER-403?
โ ์ ์ง๋ณด์๊ฐ ๋ชจํธํ๋ค.
USER-401 ์ฒ๋ผ HttpStatus์ ์์ ์ฝ๋ : โ ๋น์ถ์ฒ, ์ฝ๋ ๊ฐ๊ฒฐํฉ ๋ฐ์, ์ ์ง๋ณด์ ์ด๋ ค์
USER-001 ์ฒ๋ผ ๊ณ ์ ๋น์ฆ๋์ค ์ฝ๋ ์ฌ์ฉ : โ
์ถ์ฒ, ๋น์ฆ๋์ค ์ฝ๋ ๋
๋ฆฝ์ , HttpStatus์ ๋ถ๋ฆฌ, ์ ์ง๋ณด์ ์ฉ์ด
HttpStatus๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ์์ (Ex. 401 โ 403 ๋ณ๊ฒฝ ๊ฐ๋ฅ)
๋น์ฆ๋์ค ์ปค์คํ
์ฝ๋๋ ๊ณ ์ /๋ถ๋ณ! API ๋ช
์ธ์์ "์ ์๋ ์ฝ๋"๋ก ๋์ํด์ผ ํจ
-> ํ๋ก ํธ์์๋ ๋ณดํต code ๊ธฐ์ค์ผ๋ก ์๋ฌ ํธ๋ค๋ง ๋ก์ง์ ์์ฑํ ์ ์๋ค.
-> ํ์๋ค ๋ชจ๋ ํ์ธํ ์ ์๋๋ก ์๋ฌ ๋ช
์ธ์๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค!!