๐Ÿ› ๏ธ ํ”„๋กœ์ ํŠธ/[Duckwho] - ์ค‘๊ณ ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ

์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ Dockwho ๐Ÿฅ (์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๊ธฐ๋ก)

yyezzzy 2025. 1. 31. 16:16

๋ฌธ์ œ 1

์•„๋ฌด๋ฆฌํ•ด๋„ 500์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ .. ๋‹จ์ง€ params๋กœ ๊ฐ์‹ธ์„œ ์ƒ๊ธด ๋ฌธ์ œ

URL Parameters (params)

 

  • ๋ชฉ์ : URL Parameters๋Š” ์ฃผ๋กœ ๊ฐ„๋‹จํ•œ ๊ฐ’์ด๋‚˜ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ๊ฒ€์ƒ‰, ํ•„ํ„ฐ๋ง, ์ •๋ ฌ ๋“ฑ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์œ„์น˜: URL์˜ ๋์— ํฌํ•จ๋˜๋ฉฐ, ? ๋’ค์— key=value ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” &๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: /search?name=John&age=30
  • ์ „์†ก ๋ฐฉ๋ฒ•: ์ฃผ๋กœ GET ์š”์ฒญ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์š”์ฒญํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: URL ๊ธธ์ด์— ์ œํ•œ์ด ์žˆ์–ด, ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ๋‹ด์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” URL ๊ธธ์ด์— ์ œํ•œ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ: URL์— ๋…ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

Request Body

 

  • ๋ชฉ์ : Request Body๋Š” ์ฃผ๋กœ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋‚˜ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ํผ์˜ ๋ฐ์ดํ„ฐ, ํŒŒ์ผ ์—…๋กœ๋“œ, JSON ๊ฐ์ฒด ๋“ฑ.
  • ์œ„์น˜: ์š”์ฒญ ๋ณธ๋ฌธ(Body)์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ ํ—ค๋”์˜ Content-Type์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ํ˜•์‹์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: application/json, application/x-www-form-urlencoded, multipart/form-data ๋“ฑ
  • ์ „์†ก ๋ฐฉ๋ฒ•: POST, PUT, PATCH ์š”์ฒญ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: ๋ฐ์ดํ„ฐ ํฌ๊ธฐ ์ œํ•œ์ด ์ƒ๋Œ€์ ์œผ๋กœ ํฌ๋ฉฐ, ์š”์ฒญ ๋ณธ๋ฌธ์— ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ: URL์— ๋…ธ์ถœ๋˜์ง€ ์•Š์•„์„œ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

๋ฌธ์ œ 2

์Šค์›จ๊ฑฐ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ๊ณ„์† 500์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด๊ฒƒ ๋˜ํ•œ API ์š”์ฒญ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์˜€๋‹ค. 500์—๋Ÿฌ๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ค„ ์•Œ์•˜๋‹ค ๐Ÿ˜จ

๋‚ด๊ฐ€ ์ž˜๋ชป ๋ณด๋‚ด๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ ..

https://api-duckwho.xyz/api/chat/rooms?articleId=50211 ๋ผ๋Š” URL๋กœ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•ด์•ผํ•œ๋‹ค. (URL Parameters)

๋ณ€๊ฒฝ ์ „
๋ณ€๊ฒฝ ํ›„

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ˆ˜์ • ํ›„ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต์‹  !!

 

๋ฌธ์ œ 3

๋งˆ์ฃผํ•œ ์—๋Ÿฌ

Uncaught Error: Rendered more hooks than during the previous render ์—๋Ÿฌ๋Š” React์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋กœ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ํ›…(Hook)์˜ ๊ฐœ์ˆ˜๋‚˜ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. React์˜ ํ›…์€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง๋งˆ๋‹ค ํ•ญ์ƒ ๊ฐ™์€ ์ˆœ์„œ๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ์–ด๊ธฐ๋ฉด ์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ๋œ๋‹ค.

ํ›…์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์ง„ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

 

1๏ธโƒฃ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ๋‚ด์—์„œ ํ›… ์‚ฌ์šฉ

React์˜ ํ›…์€ ์กฐ๊ฑด๋ถ€๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, if ๋ฌธ ์•ˆ์—์„œ ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ํ›…์˜ ํ˜ธ์ถœ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ ธ์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ž˜๋ชป๋œ ์˜ˆ
if (someCondition) {
  const [state, setState] = useState(0); // ์กฐ๊ฑด๋ถ€๋กœ ํ›… ํ˜ธ์ถœ
}

// ํ•ด๊ฒฐ๋ฐฉ๋ฒ•
//์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•˜๋Š” ๋Œ€์‹ , ํ›…์„ ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ์œ„์—์„œ ํ•ญ์ƒ ๋™์ผํ•˜๊ฒŒ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
const [state, setState] = useState(0); // ํ•ญ์ƒ ํ˜ธ์ถœ๋˜๋„๋ก ์ตœ์ƒ์œ„์—์„œ ์‚ฌ์šฉ

if (someCondition) {
  return <div>Condition is true</div>;
} else {
  return <div>Condition is false</div>;
}

 

2๏ธโƒฃ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ์ค‘ ํ›… ์‚ฌ์šฉ

๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด์„œ ํ›…์„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค

// ์ž˜๋ชป๋œ ์˜ˆ
{items.map(item => {
  if (item.someCondition) {
    const [state, setState] = useState(0); // ํ›…์„ ๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ
  }
  return <div>{item.name}</div>;
})}

// ํ•ด๊ฒฐ๋ฐฉ๋ฒ•
// ๋ฆฌ์ŠคํŠธ ์•ˆ์—์„œ ํ›…์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ , ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ๋“ค์„ ๋ถ„๋ฆฌํ•ด์„œ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ ํ›…์€ ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ์œ„์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
const [state, setState] = useState(0);

return items.map(item => (
  <div key={item.id}>{item.name}</div>
));

๋‚ด๊ฐ€ ์ ‘ํ–ˆ๋˜ ๋ฌธ์ œ

 

3๏ธโƒฃ ํ›…์„ ์กฐ๊ฑด๋ถ€๋กœ ์„ค์ •ํ•˜๋Š” ๋‹ค๋ฅธ ๋กœ์ง

์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ํ›…์˜ ๊ฐœ์ˆ˜๋‚˜ ํ˜ธ์ถœ ์ˆœ์„œ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ž˜๋ชป๋œ ์˜ˆ
const [state, setState] = useState(0);

if (someCondition) {
  const [anotherState, setAnotherState] = useState(0); // ์กฐ๊ฑด์— ๋”ฐ๋ผ ํ›…์ด ๋‹ค๋ฅด๊ฒŒ ํ˜ธ์ถœ๋จ
}

// ํ•ด๊ฒฐ๋ฐฉ๋ฒ•
// ํ›…์€ ํ•ญ์ƒ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ, ํ›… ํ˜ธ์ถœ์„ ์กฐ๊ฑด๋ฌธ ๋ฐ–์œผ๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
const [state, setState] = useState(0);
const [anotherState, setAnotherState] = useState(0); // ํ•ญ์ƒ ๋™์ผํ•˜๊ฒŒ ํ˜ธ์ถœ

if (someCondition) {
  // ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋ Œ๋”๋ง๋งŒ ์ฒ˜๋ฆฌ
}

 

4๏ธโƒฃ React ๋ฒ„์ „ ๋ฌธ์ œ

React์˜ ํ›… ๊ธฐ๋Šฅ์€ React 16.8 ๋ฒ„์ „ ์ด์ƒ์—์„œ ๋„์ž…๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ตฌ ๋ฒ„์ „์˜ React๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ›… ๊ด€๋ จ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์˜ React๋กœ ์—…๋ฐ์ดํŠธ ๊ถŒ์žฅ.

 

5๏ธโƒฃ useEffect๋‚˜ useCallback ์•ˆ์—์„œ ํ›… ์‚ฌ์šฉ

useEffect, useCallback, useMemo์™€ ๊ฐ™์€ ํ›… ์•ˆ์—์„œ ๋˜ ๋‹ค๋ฅธ ํ›…์„ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ํ›…์€ ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ์œ„์—์„œ๋งŒ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

// ์ž˜๋ชป๋œ ์˜ˆ
useEffect(() => {
  const [state, setState] = useState(0); // useEffect ์•ˆ์—์„œ ํ›… ํ˜ธ์ถœ
}, []);

// ํ•ด๊ฒฐ๋ฐฉ๋ฒ•
// useEffect ์•ˆ์—์„œ๋Š” ์ƒํƒœ๋‚˜ ๋‹ค๋ฅธ ํ›…์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋Œ€์‹  ์™ธ๋ถ€์—์„œ ํ›…์„ ๋จผ์ € ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ ํ›„์— useEffect ๋‚ด์—์„œ ํ•„์š”ํ•œ ์ž‘์—…์„ ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
const [state, setState] = useState(0);

useEffect(() => {
  // side effect ์ฒ˜๋ฆฌ
}, [state]);