2025. 12. 12. 00:30γTrouble Shooting & Issues/Linkiving

βοΈ FetchError : μλ΅ λ°λ μ€ λ°μν μλ¬ ν΄λμ€ μμ±
βοΈ TimeoutError : μ§μ λ μκ° λ΄ μλ΅μ λ°μ§ λͺ»νμ λ λ°μνλ μλ¬ ν΄λμ€ μμ±
βοΈ ParseError : μλ΅μ λ°μμΌλ, νμ± μ€ λ°μν μλ¬ ν΄λμ€ μμ±
βοΈ Errorλ₯Ό μμλ°μΌλ©°, constructor μμ±μ ν¨μλ‘ super(message)λ‘ νμ€ μλ¬ μ΄κΈ°ν, κ° ν΄λμ€μ λ§λ μΈμ€ν΄μ€ μ§μ μ νλ€.
λͺ©μ°¨
1. safeFetch: μλ²μ© μμ ν fetch ν¨μ
2. FetchError : μλ΅ λ°λ μ€ λ°μν μλ¬
3. TimeoutError : μλ΅μ΄ μ§μ λ μκ° λ΄μ μ€μ§ μμμ λμ μλ¬
4. ParseError : μλ΅μ λ°μμΌλ, νμ± μ€ λ°μν μλ¬
1. safeFetch: μλ²μ© μμ ν fetch ν¨μ
μ΄κ±΄ μ¬μ€ μ¬κΈ°μ κΈ° μμ보기보λ€λ μ΄μ μ μ£Όλ¨Ήκ΅¬κ΅¬λ‘ μμ±νλ κΈ°μ΅μ λ°νμΌλ‘ ai κΈ°λ°μΌλ‘ μλν΄λ³΄λ κ²μ΄λ€.
μ°μ λΉμ₯ apiμ μ½νκΈ°λ νκ³ .. μΈλͺ¨κ° μμμ§λΌλ νλνλ μμΈνκ² μμ보면μ μμ νκ±°λ μμ κ±°λ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νκ±°λ μΆκ°νκ±°λ ν μ μμ κ²μ΄λ€.
μ°μ μλ¬κ° λ°μνμ κ²½μ°, μλ¬ λ°λλ₯Ό μΈν νλ Error ν΄λμ€λ€μ μμ±ν΄λ³΄μ.
2. FetchError : μλ΅ λ°λ μ€ λ°μν μλ¬
HTTP μλ΅μ΄ okκ° μλκ±°λ(200~299 λ²μκ° μλ) λ€νΈμν¬ μλ¬λ₯Ό λ²μ£Όνν λ μ¬μ©νλ μ€λ₯μ΄λ€.
μν μ½λ(status), μλ΅ λ³Έλ¬Έ μΌλΆ(body), Content-Type(contentType)κ³Ό κ°μ μΆκ° λ©νλ₯Ό λ΄λλ€.
FetchErrorκ° μ‘λ μμ μν©μΌλ‘λ μλμ κ°μ κ²½μ°λ€μ΄ μμ κ²μ΄λ€.
- λ°±μλ(μΈλΆ API)μμ μ€λ₯ μν μ½λκ° μμ κ²½μ°
→ 404 Not Found (μμ² μ€λ₯)
→ 500 Internal Server Error (μλ² μ€λ₯)
→ 429 (μμ² κ³Όλ€) - μλ΅ Content-Typeμ΄ μμν νμμ΄ μλ λ
→ JSON νμ μλ΅μ κΈ°λνλλ° text/htmlμ΄ μ€λ μ€λ₯
β HTMLμ΄ λ¨μ΄μ§λ μ€λ₯
API μλ²μ JSONμ μμ²νλλ°, λΉμ μμ μΌλ‘ HTML λ¬Έμ μλ΅μ λ°μ μλ μλ€.
⋅ API μλ² λ΄λΆ μ€λ₯λ‘ 500 Error Page(HTML)μ΄ λ°νλ¨
⋅ μΈμ¦ μ€ν¨ μ λ‘κ·ΈμΈ νμ΄μ§(HTML)μ κ°μ λ‘ λ¦¬λ€μ΄λ νΈνμ¬ λ°ν
⋅ nginx λ± μ€κ° νλ‘μ μλ²κ° HTML μλ¬ νμ΄μ§λ₯Ό λ°ν
μ΄λ° κ²½μ° ν΄λΌμ΄μΈνΈλ μλμ κ°μ HTMLμ λ°μ μ μλ€.
<!DOCTYPE html>
<html>
<body>500 Internal Server Error</body>
</html>
μ΄λ΄ κ²½μ° res.json()μ μννλ©΄ νμ± μ€λ₯κ° λ°μν μ μκ³ , Content-Typeμ΄ text/htmlλ‘, μλͺ»λ μλ΅μμ νμΈν μ μλ€.
μ½λ
export class FetchError extends Error {
public status?: number;
public body?: string;
public contentType?: string | null;
constructor(message: string, opts?: { status?: number; body?: string; contentType?: string | null }) {
super(message);
this.name = 'FetchError';
this.status = opts?.status;
this.body = opts?.body;
this.contentType = opts?.contentType ?? null;
}
}
- Error : Errorλ₯Ό μμλ°μ νμ€ μλ¬ κ΄λ ¨ 00μ μ¬μ©ν μ μλ€.
- status, body, contentType : μΈμ€ν΄μ€ νλλ₯Ό μ μΈνλ€.
μλ΅μ λ°μμ€λ λμ€ μλ¬κ° λ°μνλ€λ©΄ 그건 μνμ½λ, μλ΅ λ³Έλ¬Έ, content typeμΌλ‘λΆν° μ λ°μνλμ§ νμΈν μ μκΈ° λλ¬Έμ μΈ κ°μ§λ₯Ό μ μΈνλ€. - constructor(...) {... : μλ¬ μμ±μλ₯Ό μ μνλ€.
message : Errorμ κΈ°λ³Έ λ©μΈμ§
opts : μμμ μ μν μΈμ€ν΄μ€ - super(message) : λΆλͺ¨ ν΄λμ€μΈ Errorμ μμ±μλ₯Ό νΈμΆνμ¬ message, μ€ν νΈλ μ΄μ€ λ±μ νμ€ μλ¬ μ΄κΈ°νλ₯Ό νλ€.
- this.name : Error.nameμ λͺ
μμ μΌλ‘ μ€μ νλ€. λ‘κΉ
/λΆκΈ°μμ err.nameμΌλ‘ μλ¬ νμ
μ νλ³ν λ μ¬μ©νλ€.
μΆν handleErrorμ κ°μ μ νΈ ν¨μλ₯Ό μμ±ν λ (err instanceof FetchError)μ κ°μ μμΌλ‘ μ¬μ©ν μ μλ€. - this.status : optsκ° μμ κ²½μ° status κ°μ ν λΉνκ³ , μμΌλ©΄ undefinedλ‘ λ¨λλ€.
- this.body : μλ¬ μλ΅ λ³Έλ¬Έμ ν λΉνλ€. (λλ²κΉ , λͺ¨λν°λ§μ μ¬μ©νλ€)
- this.contentType : contentTypeμ ν λΉνλ, μμ κ²½μ° nullμ λͺ μμ μΌλ‘ λ£μ΄ ν€λκ° μμμ νμνλ€.
β JS ν΄λμ€ λ¬Έλ² μμ±μ
μ΄ FetchErrorλΌλ ν΄λμ€κ° μ²μ λ§λ€μ΄μ§ λ νΈμΆλλ ν¨μ(μ¦, μ΄κΈ° μΈν μ νλ ν¨μ)κ° μμ±μμ΄λ€.
ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ λ°©μμ μ μνλ€.
μ΄ μμ±μλ μΈμλ‘ message, optsλ₯Ό λ°μμ μ΄κΈ° μΈν μ μ§ννλ€.
* super() : λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνλ κΈ°λ₯μ νλ€.
FetchErrorλ Errorλ₯Ό μμνλ―λ‘ Errorμ κΈ°λ³Έ κΈ°λ₯μΈ stack trace, message μ μ₯ λ±μ Error μ΄κΈ°ν κ³Όμ μ λ¨Όμ μννλ€.
* this : νμ¬ λ§λ€κ³ μλ ν΄λΉ μλ¬ μΈμ€ν΄μ€μΈ μκΈ° μμ μ κ°λ¦¬ν¨λ€.
μλ‘ μμ±ν μ΄ κ°μ²΄μ name, status, body, contentTypeμ μ§μ νλ κ²μ΄λ€.
3. TimeoutError : μλ΅μ΄ μ§μ λ μκ° λ΄μ μ€μ§ μμμ λμ μλ¬
μμ²μ΄ AbortController λ±μ μν΄ μ·¨μλμμ λ λμ§λ μ€λ₯μ΄λ€.
fetchλ κΈ°λ³Έμ μΌλ‘ νμμμμ΄ μκΈ°λλ¬Έμ μ§μ ν μκ° μμ μλ΅μ λ°μ§ λͺ»νλ©΄ AbortControllerλ‘ κ°μ μ’ λ£νκ³ , κ·Έ λ λ°μν μ€λ₯λ₯Ό μ‘λ κ²μ΄λ€.
β AbortControllerλ?
λΈλΌμ°μ μ Node νκ²½μμ μ§μλλ μμ² μ·¨μ APIμ΄λ€.
fetch μμ²μ μ°κ²°νλ©΄ AbortControllerκ° νΉμ μμ μ μμ²μ κ°μ λ‘ μ€λ¨ν μ μλ€.
λνμ μ©λλ‘λ μλμ κ°μ΄ μλ€.
⋅ νμμμ : μΌμ μκ° λ΄ μλ΅μ΄ μμΌλ©΄ μμ² μ·¨μ
⋅ μ€λ³΅ μμ² μ·¨μ : κ²μ μλμμ±μ²λΌ μ΄μ μμ²μ μ·¨μ
⋅ μ»΄ν¬λνΈ μΈλ§μ΄νΈ(cleanup) μ λ€νΈμν¬ μμ² μ·¨μ
μ½λ
export class TimeoutError extends Error {
constructor(message = 'Request timed out') {
super(message);
this.name = 'TimeoutError';
}
}
- constructor: μμ±μλ λ©μΈμ§λ₯Ό μ νμ μΌλ‘ λ°μΌλ©°, κΈ°λ³Έκ°μ 'Request timed out'μ΄λ€.
- super(message) : λΆλͺ¨μΈ Errorμ μμ±μλ₯Ό νΈμΆν΄ messageμ μ€νμ μ΄κΈ°ννλ€.
- this.name : nameμ μ€μ νμ¬ νμ
νλ³μ μ½κ² νλλ‘ νλ€.
instanceof κ²μ¬λ‘λ ν΄λΉ μλ¬κ° TimeoutErrorμμ ꡬλΆν μ μλ€.
μλ₯Ό λ€μ΄ μλμ κ°μ΄ νμ©ν μ μλ€.
if (err.name === 'TimeoutError')
4. ParseError : μλ΅μ λ°μμΌλ, νμ± μ€ λ°μν μλ¬
μλ΅μ μ μμ μΌλ‘ λ°μμμΌλ, JSONμΌλ‘ νμ±νλ λ¨κ³μμ μ€ν¨νμ λ λμ§λ μ€λ₯μ΄λ€.
νμ± μ€ν¨ μμΈ μΆμ μ μν΄ μλ³Έλ¬Έ μΌλΆλ₯Ό ν¬ν¨ν μ μλ€.
- JSON νμμ΄ κΉ¨μ Έμλ κ²½μ°
- μλ΅μ΄ λΉ λ¬Έμμ΄μΈ κ²½μ°
- μλ²κ° μλͺ»λ ν¬λ§·μ λ°νν κ²½μ°
export class ParseError extends Error {
public raw?: string;
constructor(message = 'Failed to parse response', raw?: string) {
super(message);
this.name = 'ParseError';
this.raw = raw;
}
}
- public raw? : νμ± μ€ν¨ μ μμ μλ΅ ν μ€νΈλ₯Ό λ΄λ νλλ‘, λλ²κΉ μ μν΄ μ μνλ€.
- κΈ°λ³Έ λ©μΈμ§λ 'Failed to parse response'μ΄λ©°, λλ²μ§Έ μΈμλ‘ μλ³Έλ¬Έμ μΌλΆλ₯Ό λ°μ μ μλ€.
- super(message) : κΈ°λ³Έ Error μ΄κΈ°νλ₯Ό μννλ€.
- this.name : 'ParseError'λ‘ μλ¬ λ€μμ μ€μ ν΄ μλ¬ νλ³ λ° λ‘κΉ νμ€νλ₯Ό λλλ€.
- this.raw : μλ³Έλ¬Έμ μΈμ€ν΄μ€μ 보κ΄νμ¬ νΈμΆλΆκ° μμΈ λ΄μ©μ νμΈν μ μλλ‘ νλ€.
5. λ Έμ λ¬Έμν
μμ±ν΄λ³΄λ λ¬Έμνλ₯Ό ν΄λλ©΄ μ’κ² λ€λ μκ°μ΄ λ€μ΄, λ Έμ νμ΄μ§λ₯Ό μμ±νκ³ μ μ΄λ΄€λ€.




'Trouble Shooting & Issues > Linkiving' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| Docker μ€μΉν΄μ λ°±μλ λ‘μ»¬λ‘ λ‘κ·ΈμΈ ν μ€νΈνκΈ° [Linkiving] (0) | 2026.02.27 |
|---|---|
| safeFetch μ νΈν¨μ λ§λ€κΈ°(2): safeFetch ν¨μ μμ± (0) | 2025.12.12 |
| Next.js app routerλ‘ api ν¨μ μμ±νκΈ° (0) | 2025.11.27 |
| [Next.js] μ¬μ©μκ° μ λ ₯ν λ§ν¬μ μΈλ€μΌ κ°μ Έμ€κΈ° (0) | 2025.11.17 |
| μΈν°λ μ μ΄ κ°λ₯ν νκ·Έ μ€μ²© μμν€κΈ° (0) | 2025.11.05 |
GitHub