πŸ’¬ Q&A λͺ¨μŒ #02

BOOaΒ·2024λ…„ 12μ›” 8일

Q&A

λͺ©λ‘ 보기
2/5
post-thumbnail

πŸ”— 2024λ…„ 12μ›” 첫째 μ£Ό ( 12.02 ~ 12.08 ) - μ€‘μš” Q&A λͺ¨μŒ


Q. ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ μ€‘κ΄„ν˜Έλ₯Ό μ“°λ©΄ λ°˜λ“œμ‹œ return ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€?

"ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ μ€‘κ΄„ν˜Έ {}λ₯Ό μ“°λ©΄ undefinedκ°€ λ°˜ν™˜λ˜λŠ” μ΄μœ λŠ” 뭘까?"

πŸ“ κ²°λ‘ 

"ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ {}을 μ‚¬μš©ν•˜λ©΄ λͺ…μ‹œμ μœΌλ‘œ ν•¨μˆ˜μ˜ 본문을 μ •μ˜ν•˜λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όλœλ‹€. λ”°λΌμ„œ λ°˜ν™˜κ°’μ΄ ν•„μš”ν•˜λ©΄ return ν‚€μ›Œλ“œλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€. JSX μ½”λ“œ μž‘μ„± μ‹œ, 이λ₯Ό μ œλŒ€λ‘œ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λ©΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€."

genres.map((g) => (
  <li key={g}>{g}</li> // μ•”λ¬΅μ μœΌλ‘œ JSX λ°˜ν™˜
));
//
genres.map((g) => {
  return <li key={g}>{g}</li>; // λͺ…μ‹œμ μœΌλ‘œ JSX λ°˜ν™˜
});
//
genres.map((g) => {
  <li key={g}>{g}</li>; // undefined λ°˜ν™˜
});
  • μ—¬κΈ°μ„œ () 은 JSX 블둝을 κ·Έλ£Ήν™”ν•˜λŠ” 역할이닀. 이 μ•ˆμ— JSX μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄, 이 전체가 ν•˜λ‚˜μ˜ ν‘œν˜„μ‹μœΌλ‘œ κ°„μ£Όλœλ‹€.

"그런데 useEffect μ—μ„œμ˜ 콜백 ν•¨μˆ˜μ—μ„œλŠ” μ™œ return 을 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„κΉŒ?"

πŸ“ κ²°λ‘ 

"useEffect의 콜백 ν•¨μˆ˜λŠ” 일반적인 κ°’ λ°˜ν™˜μ„ μœ„ν•œ ν•¨μˆ˜κ°€ μ•„λ‹ˆλ‹€. Reactμ—μ„œ λΆ€μˆ˜ 효과(Side Effect)λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ κ³΅κ°„μœΌλ‘œ, λ°˜ν™˜κ°’μ΄ 없어도 μž‘λ™ν•œλ‹€. νŠΉμ • κ²½μš°μ—λ§Œ 정리 ν•¨μˆ˜(Cleanup Function)λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€."

  • λ°˜ν™˜κ°’μ΄ ν•„μš”ν•œ μœ μΌν•œ κ²½μš°λŠ” μ»΄ν¬λ„ŒνŠΈ μ–Έλ§ˆμš΄νŠΈ μ‹œ λ˜λŠ” μ˜μ‘΄μ„± 배열이 변경될 λ•Œ 호좜될 정리 ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ 이닀.

(1) λ°˜ν™˜κ°’μ΄ ν•„μš”ν•˜μ§€ μ•Šμ€ 경우

useEffect(() => {
  fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
    .then((response) => response.json())
    .then((data) => console.log(data));
}, []);
  • 이 콜백 ν•¨μˆ˜λŠ” 데이터λ₯Ό κ°€μ Έμ˜€λŠ” λΆ€μˆ˜ 효과λ₯Ό μ‹€ν–‰ν•  뿐, λ°˜ν™˜κ°’μ΄ ν•„μš”ν•˜μ§€ μ•ŠλŠ”λ‹€.

(2) λ°˜ν™˜κ°’μ΄ ν•„μš”ν•œ 경우 : 정리 ν•¨μˆ˜

useEffect(() => {
  const handleResize = () => console.log("Window resized");
  window.addEventListener("resize", handleResize);

  // 정리 ν•¨μˆ˜ λ°˜ν™˜
  return () => {
    window.removeEventListener("resize", handleResize);
  };
}, []);
  • 정리 ν•¨μˆ˜κ°€ μ»΄ν¬λ„ŒνŠΈκ°€ μ–Έλ§ˆμš΄νŠΈλ˜κ±°λ‚˜ μ˜μ‘΄μ„± 배열이 변경될 λ•Œ ν˜ΈμΆœλœλ‹€.
  • 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό ν•΄μ œν•˜κ±°λ‚˜ λ¦¬μ†ŒμŠ€λ₯Ό 정리할 λ•Œ μœ μš©ν•˜λ‹€.

Q. JWTλž€ 무엇인가?

πŸ“ κ²°λ‘ 

"JSON ν˜•μ‹μ˜ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ „μ†‘ν•˜κΈ° μœ„ν•œ 토큰 기반 인증 방식이닀."

  • JWT(JSON Web Token)
  • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ 인증 정보λ₯Ό μ €μž₯ν•˜κ³  μ „λ‹¬ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.
  • 주둜 둜그인, νšŒμ›κ°€μž…, μ„Έμ…˜ 관리 등에 μ‚¬μš©λ˜λ©°, μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ” 인증 μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•  λ•Œ μœ μš©ν•˜λ‹€.

βœ”γ…€JWT ꡬ쑰

  • Header : ν† ν°μ˜ νƒ€μž…κ³Ό ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜μ„ λͺ…μ‹œν•œλ‹€.
{
  "alg": "HS256",
  "typ": "JWT"
}
  • Payload : 인증과 κ΄€λ ¨λœ 정보λ₯Ό λ‹΄κ³  μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μ‚¬μš©μž ID, κΆŒν•œ, 토큰 만료 μ‹œκ°„ λ“±μ˜ 데이터
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "exp": 1672531199
}
  • Signature : 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό νŠΉμ • λΉ„λ°€ ν‚€λ‘œ μ•”ν˜Έν™”ν•˜μ—¬ μƒμ„±ν•œ μ„œλͺ…이닀. 이 μ„œλͺ… 덕뢄에 JWTκ°€ λ³€μ‘°λ˜μ§€ μ•Šμ•˜μŒμ„ 검증할 수 μžˆλ‹€.
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

βœ”γ…€μž‘λ™ 원리

1. 둜그인 μ‹œ 토큰 λ°œκΈ‰

  • μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν•˜λ©΄ μ„œλ²„λŠ” μ‚¬μš©μžμ˜ 인증 정보λ₯Ό ν™•μΈν•œ λ’€, JWTλ₯Ό μƒμ„±ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ— λ°˜ν™˜ν•œλ‹€.

2. 토큰 μ €μž₯ 및 μ‚¬μš©

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” 받은 JWTλ₯Ό 둜컬 μŠ€ν† λ¦¬μ§€λ‚˜ 쿠킀에 μ €μž₯ν•œλ‹€.
  • 이후 ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­ 헀더 (ex. Authorization: Bearer <JWT> 에 토큰을 ν¬ν•¨ν•˜μ—¬ μ„œλ²„λ‘œ μš”μ²­μ„ 보낸닀.)

3. 토큰 검증 및 처리

  • μ„œλ²„λŠ” 받은 JWT의 μ„œλͺ…을 확인해 λ³€μ‘° μ—¬λΆ€λ₯Ό κ²€μ¦ν•œ ν›„, νŽ˜μ΄λ‘œλ“œμ˜ 정보λ₯Ό μ‚¬μš©ν•΄ μš”μ²­μ„ μ²˜λ¦¬ν•œλ‹€.

πŸ’¬γ…€JWT μž₯점

  • μƒνƒœ λΉ„μœ μ§€ : μ„œλ²„λŠ” μ„Έμ…˜ 정보λ₯Ό μ €μž₯ν•˜μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ μ„œλ²„ λΆ€ν•˜κ°€ 적닀.
  • κ°„νŽΈ ν™•μž₯μ„± : μ—¬λŸ¬ μ„œλΉ„μŠ€ κ°„ 인증 정보λ₯Ό κ³΅μœ ν•˜κΈ° μ‰¬μ›Œ, λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ μœ μš©ν•˜λ‹€.
  • μ•ˆμ „ν•œ 데이터 전솑 : μ„œλͺ…을 톡해 λ³€μ‘° μ—¬λΆ€λ₯Ό 검증할 수 μžˆμ–΄ λ³΄μ•ˆμ΄ κ°•ν™”λœλ‹€.

βœ”γ…€μ£Όμ˜μ 

  • 만료 μ‹œκ°„ μ„€μ • : JWTλŠ” 기본적으둜 만료 μ „κΉŒμ§€ μœ νš¨ν•˜λ―€λ‘œ, 만료 μ‹œκ°„μ„ λ°˜λ“œμ‹œ μ„€μ •ν•΄μ•Ό λ³΄μ•ˆμ„ μœ μ§€ν•  수 μžˆλ‹€.
  • 토큰 νƒˆμ·¨ λ°©μ§€ : HTTPSλ₯Ό μ‚¬μš©ν•˜μ—¬ λ„€νŠΈμ›Œν¬ μƒμ˜ 토큰 νƒˆμ·¨λ₯Ό 막고, 민간함 정보λ₯Ό νŽ˜μ΄λ‘œλ“œμ— ν¬ν•¨ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

Q. μ™œ console에 같은 logκ°€ 2번 좜λ ₯될까?

πŸ“ κ²°λ‘ 

"React 개발 λͺ¨λ“œμ—μ„œ React.StrictMode κ°€ ν™œμ„±ν™”λ˜μ–΄ 있기 λ•Œλ¬Έμ΄λ‹€. "

  • React.StrictMode μ—μ„œλŠ” νŠΉμ • μ½”λ“œκ°€ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ React μ»΄ν¬λ„ŒνŠΈμ˜ λΌμ΄ν”Œ 사이클 λ©”μ„œλ“œμ™€ 일뢀 λ™μž‘μ„ μ˜λ„μ μœΌλ‘œ 2번 ν˜ΈμΆœν•œλ‹€.
  • 이둜 인해 console log도 2번 좜λ ₯λœλ‹€.

βœ”γ…€React.StrictMode λž€?

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 잠재적인 문제λ₯Ό κ°μ§€ν•˜κ³  κ²½κ³ ν•˜κΈ° μœ„ν•œ 개발 도ꡬ이닀. 배포 ν™˜κ²½μ—μ„œλŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.

  • μ»΄ν¬λ„ŒνŠΈμ˜ λΆ€μž‘μš©μ„ 감지
  • 였래된 API μ‚¬μš© κ²½κ³ 
  • μ˜ˆμƒμΉ˜ λͺ»ν•œ λ™μž‘ λ°©μ§€

βœ”γ…€λ‘ 번 ν˜ΈμΆœλ˜λŠ” 원리

  1. Mount / Unmount
  • μ»΄ν¬λ„ŒνŠΈλ₯Ό 초기 λ§ˆμš΄νŠΈν•œ ν›„ κ³§λ°”λ‘œ μ–Έλ§ˆμš΄νŠΈν–ˆλ‹€κ°€ λ‹€μ‹œ λ§ˆμš΄νŠΈν•œλ‹€. 이λ₯Ό 톡해 κΉ¨λ—ν•˜κ²Œ μ •λ¦¬λ˜μ§€ μ•Šμ€ λΆ€μž‘μš©μ„ κ°μ§€ν•œλ‹€.
  1. ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈ 호좜
  • ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ λΆ€μž‘μš©μ΄ λ°œμƒν•˜λ©΄ μ‰½κ²Œ 감지할 수 μžˆλ„λ‘ ν•¨μˆ˜κ°€ 2번 ν˜ΈμΆœλœλ‹€.

πŸ’¬ StrictModeλ₯Ό μ™œ μ‚¬μš©ν•΄μ•Ό ν•˜λ‚˜?

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ•ˆμ •μ„±κ³Ό μ½”λ“œ ν’ˆμ§ˆμ„ λ†’μ΄λŠ” 데 μœ λ¦¬ν•˜λ‹€. 참고둜 StrictMode λŠ” 개발 κ³Όμ •μ—μ„œλ§Œ λ™μž‘ν•œλ‹€.

0개의 λŒ“κΈ€