๐Ÿ™†โ€โ™€๏ธ API ์‘๋‹ต์‹œ ์ปค์Šคํ…€Code๋ฅผ ์ฃผ๋Š”๊ฒƒ์˜ ์ด์ 

๋ฐ•์ค€ํ˜•ยท2025๋…„ 5์›” 31์ผ

์Šคํ”„๋ง ๊ฐœ๋ฐœ

๋ชฉ๋ก ๋ณด๊ธฐ
6/20
post-thumbnail

API ์„ค๊ณ„๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ํ•œ ๊ฐ€์ง€ ๊ณ ๋ฏผ์ด ์ƒ๊ธด๋‹ค.

์—๋Ÿฌ ์‘๋‹ต ์‹œ HttpStatus๋งŒ ์ฃผ๋ฉด ๋ ํ…๋ฐ ์™œ ๊ตณ์ด code(์ปค์Šคํ…€ ์—๋Ÿฌ ์ฝ”๋“œ)๋ฅผ ์ถ”๊ฐ€๋กœ ์ฃผ๋Š” ๊ฑธ๊นŒ?

๋‚˜๋„ ์ด์ „ ํ”„๋กœ์ ํŠธ ์ตœ์ข… ๋ฐœํ‘œ ์ค‘์— ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๊ณ , ์—ฌ๋Ÿฌ ์‹ค๋ฌด ์‚ฌ๋ก€์™€ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ณด๋ฉฐ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

๐Ÿš€ ์™œ code ๋ฅผ ์ฃผ๋ƒ? โ†’ ์ฃผ๋œ ๋ชฉ์ ์€ "ํ”„๋ก ํŠธ ๋‹จ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๊ทœ์น™ํ™” + ์ถ”์ ์„ฑ ํ™•๋ณด"

1๏ธโƒฃ ํ”„๋ก ํŠธ ํ•ธ๋“ค๋ง ์‹œ ์•ˆ์ •์„ฑ

ํ”„๋ก ํŠธ๊ฐ€ "message" (ํ•œ๊ตญ์–ด ๋ฉ”์‹œ์ง€) ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ธ๋“ค๋ง ํ•˜๋ฉด โ†’ ๋‚˜์ค‘์— ๋‹ค๊ตญ์–ด, ๋ฉ”์‹œ์ง€ ๋ณ€๊ฒฝ ์‹œ ์œ„ํ—˜.

{
  "code": "USER-001",
  "message": "์ธ์ฆ ์ฝ”๋“œ๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
  "httpStatus": 401
}

์œ„์™€ ๊ฐ™์ด ์‘๋‹ต์ด ์˜ค๊ฒŒ๋˜๋ฉด
โ†’ ํ”„๋ก ํŠธ์—์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ code๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ถ„๊ธฐ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

if (error.code === 'USER-001') {
    showToast("์ธ์ฆ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.");
} else if (error.code === 'USER-002') {
    showToast("์ธ์ฆ ์ฝ”๋“œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
}
โ†’ ์•ˆ์ •์  โ†’ message ๋ณ€๊ฒฝ๋ผ๋„ ํ”„๋ก ํŠธ๋Š” ๊นจ์ง€์ง€ ์•Š์Œ

2๏ธโƒฃ ๋กœ๊ทธ ์ถ”์ ์„ฑ / ๋ชจ๋‹ˆํ„ฐ๋ง

์„œ๋ฒ„ ๋กœ๊ทธ๋‚˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์—์„œ code ๊ธฐ๋ฐ˜์œผ๋กœ ์—๋Ÿฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋กœ๊น… ์˜ˆ์‹œ :

[ERROR] USER-001 ๋ฐœ์ƒ โ†’ ์•Œ๋žŒ ์ „์†ก
[ERROR] ORDER-005 ๋ฐœ์ƒ โ†’ ์žฌ๊ณ  ์—†์Œ

โ†’ ์ •ํ™•ํžˆ ์–ด๋–ค ์—๋Ÿฌ์ธ์ง€ ์ถ”์  ๊ฐ€๋Šฅ (message๋Š” ๋‹ค๊ตญ์–ด/๋ฒ„์ „๋ณ„๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ)

3๏ธโƒฃ ์—๋Ÿฌ ๋ช…์„ธ์„œ ๊ด€๋ฆฌ (Error Spec)

API ๋ช…์„ธ์„œ์— Error Spec ๋ณ„๋„ ๊ด€๋ฆฌํ•˜๋ฉด ํŒ€์›๋“ค๊ณผ api ์‘๋‹ต์— ๊ด€ํ•˜์—ฌ ํ•จ๊ป˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

CodeMessageHttpStatusDescription
USER-001์ธ์ฆ ์ฝ”๋“œ๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.401์ธ์ฆ์ฝ”๋“œ ๋งŒ๋ฃŒ ์‹œ ๋ฐœ์ƒ
ORDER-001์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.400์ฃผ๋ฌธ ์‹œ ์žฌ๊ณ  ๋ถ€์กฑ ๋ฐœ์ƒ

-> ํด๋ผ์ด์–ธํŠธํŒ€ + QAํŒ€ + ์„œ๋ฒ„ํŒ€ ๋‹ค ๊ณต์œ 
-> ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  "์•„ USER-001์€ ์ธ์ฆ ์ฝ”๋“œ ๋งŒ๋ฃŒ๊ตฌ๋‚˜" ๋ผ๊ณ  ์ดํ•ด
-> ๋ฌธ์„œ๋กœ ์ž‘์„ฑํ•˜๋ฉฐ ๊ณ„์†ํ•ด์„œ ์ถ”๊ฐ€ํ•ด๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.



Enum ๊ตฌ์กฐ ์„ค์ •

โœ… ๊ธฐ์กด ๊ตฌ์กฐ

@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" โ†’ ์ปค์Šคํ…€ ์ˆซ์ž



โŒ ์‹ค๋ฌด์—์„œ ๋ฌธ์ œ๋กœ ์ง€์ ๋˜๋Š” ๋ถ€๋ถ„

1๏ธโƒฃ HTTP ์ƒํƒœ์ฝ”๋“œ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ์ปค์Šคํ…€ ์—๋Ÿฌ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ๋ ˆ์ด์–ด

HttpStatus.UNAUTHORIZED (401) โ†’ ํ†ต์‹  ์ˆ˜์ค€ ์ƒํƒœ ์ฝ”๋“œ

USER-001 โ†’ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋ฐœ์ƒํ•œ ๊ณ ์œ  ์—๋Ÿฌ ์ฝ”๋“œ

โ†’ ๋‘˜์„ ์ž˜๋ชป ์„ž์œผ๋ฉด ๊ฐœ๋…์ ์œผ๋กœ ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ USER-400, 401์ด ์•„๋‹Œ ์ฐจ๊ทผ์ฐจ๊ทผ ์ปค์Šคํ…€ ์ฝ”๋“œ๋ฅผ ์ค€๋‹ค.

2๏ธโƒฃ ๋ฌธ์ œ์ 

๐Ÿšฉ ํ˜ผ์šฉ๋œ ์ฝ”๋“œ๋ช… โ†’ ์œ ์ง€๋ณด์ˆ˜ ๋ฆฌ์Šคํฌ ๋ฐœ์ƒ

  1. ํ”„๋ก ํŠธ์—์„œ ํ—ท๊ฐˆ๋ฆผ
    code = USER-401 โ†’ ์ด๊ฒŒ USER-001๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์˜ฌ๋ผ๊ฐ„ USER-401์„ ์˜๋ฏธํ•˜๋Š” ๊ฑด์ง€, ๊ทธ๋ƒฅ 401 UNAUTHORIZED ์—๋Ÿฌ ์ฝ”๋“œ์ธ์ง€ ๋ชจํ˜ธํ•˜๋‹ค.

  2. ์œ ์ง€๋ณด์ˆ˜ ์œ„ํ—˜
    ๋‚˜์ค‘์— HttpStatus ๋ณ€๊ฒฝ ์‹œ code ๊ฐ’๋„ ๋ฐ”๊ฟ”์•ผ ํ• ๊นŒ?

์˜ˆ: USER-401 โ†’ 403์œผ๋กœ ๋ฐ”๊พธ๋ฉด USER-403?
โ†’ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋ชจํ˜ธํ•˜๋‹ค.



๐Ÿš€ ์‹ค๋ฌด์—์„œ ์ถ”์ฒœํ•˜๋Š” ํŒจํ„ด

โœ… ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ์™€ HttpStatus ์™„์ „ ๋ถ„๋ฆฌ

USER-401 ์ฒ˜๋Ÿผ HttpStatus์™€ ์„ž์€ ์ฝ”๋“œ : โŒ ๋น„์ถ”์ฒœ, ์ฝ”๋“œ ๊ฐ•๊ฒฐํ•ฉ ๋ฐœ์ƒ, ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€
USER-001 ์ฒ˜๋Ÿผ ๊ณ ์œ  ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ ์‚ฌ์šฉ : โœ… ์ถ”์ฒœ, ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ ๋…๋ฆฝ์ , HttpStatus์™€ ๋ถ„๋ฆฌ, ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด

โœ… ์™œ ์ด๋ ‡๊ฒŒ ํ• ๊นŒ?

HttpStatus๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ (Ex. 401 โ†’ 403 ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
๋น„์ฆˆ๋‹ˆ์Šค ์ปค์Šคํ…€ ์ฝ”๋“œ๋Š” ๊ณ ์œ /๋ถˆ๋ณ€! API ๋ช…์„ธ์„œ์— "์ •์˜๋œ ์ฝ”๋“œ"๋กœ ๋™์ž‘ํ•ด์•ผ ํ•จ
-> ํ”„๋ก ํŠธ์—์„œ๋Š” ๋ณดํ†ต code ๊ธฐ์ค€์œผ๋กœ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋กœ์ง์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
-> ํŒ€์›๋“ค ๋ชจ๋‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์—๋Ÿฌ ๋ช…์„ธ์„œ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค!!



profile
๋งค์ผ ๋งค์ผ ์„ฑ์žฅํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€