λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ‘¨‍πŸ’» web.dev51

ν”„λ‘ νŠΈμ—”λ“œ E2E ν…ŒμŠ€νŒ… (with Cypress) πŸ’‘ 이번 ν¬μŠ€νŠΈλŠ” 사내 μœ„ν΄λ¦¬μ—μ„œ λ°œν‘œν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κ²ƒμž…λ‹ˆλ‹€. πŸ“Œ λ“€μ–΄κ°€λ©° μž‘λ…„ 12μ›”λΆ€ν„° μ•½ 3κ°œμ›”κ°„ 항곡 μ›Ή κ°œλ°œμ„ μ§„ν–‰ν–ˆλŠ”λ°, 생각보닀 λ‹€μ–‘ν•œ 동선이 μžˆμ–΄μ„œ 고생을 ν–ˆλ˜ 기얡이 μžˆμŠ΅λ‹ˆλ‹€. λ”κ΅°λ‹€λ‚˜ μ œκ°€ μ§„ν–‰ν–ˆλ˜ 업무(μ›Ή ν—ˆλΈŒ μ˜€ν”ˆ, TF v12 μ „ν™˜)κ°€ ν•­κ³΅μ˜ 전체적인 동선에 적용이 ν•„μš”ν–ˆλ˜ κ²ƒλ“€μ΄μ–΄μ„œ λ”μš± 그랬던 것 κ°™μ€λ°μš”. 아직 E2E ν…ŒμŠ€νŠΈ μž‘μ„±κ²½ν—˜μ΄ μ—†μ–΄μ„œ 이번 κΈ°νšŒμ— 곡뢀도 ν•΄λ³Ό κ²Έ κ΅­μ œμ„  μ˜ˆμ•½λ™μ„ μ˜ E2E ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•΄λ΄€μŠ΅λ‹ˆλ‹€. πŸ“Œ E2E ν…ŒμŠ€νŠΈλž€? μš°μ„  κ°„λ‹¨ν•˜κ²Œ E2E ν…ŒμŠ€νŠΈκ°€ 무엇인지 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. ν”νžˆ E2E (End to End) ν…ŒμŠ€νŠΈλŠ” λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ μœ μ €κ°€ μ‚¬μš©ν•˜κ³  μžˆλ‹€λŠ” κ°€μ •ν•˜μ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 전체적인 λ™μž‘μ„ κ²€μ¦ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. μœ λ‹› ν…ŒμŠ€νŠΈμ™€ 톡합 ν…ŒμŠ€νŠΈμ—μ„œ.. 2023. 3. 19.
μ™œ index λŠ” 0λΆ€ν„° μ‹œμž‘ν• κΉŒ? μ–Όλ§ˆμ „ ν”„λ‘œκ·Έλž˜λ°μ„ 이제 막 μ‹œμž‘ν•œ 지인뢄이 λ‹€μŒ μ§ˆλ¬Έμ„ μ£Όμ…¨μŠ΅λ‹ˆλ‹€. 이제 막 ν”„λ‘œκ·Έλž˜λ°μ„ μ‹œμž‘ν•œ μ‚¬λžŒμ΄λΌλ©΄ λˆ„κ΅¬λ‚˜ ν•œλ²ˆ μ―€ μ˜λ¬Έμ„ ν’ˆμ„λ§Œν•œ 것이라고 μƒκ°ν•©λ‹ˆλ‹€. μ™œ λ°°μ—΄μ˜ index κ°€ 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” κ²ƒμΈκ°€μš”? μ € λ˜ν•œ 처음 Cμ–Έμ–΄λ‘œ ν”„λ‘œκ·Έλž˜λ°μ— μž…λ¬Έ ν–ˆμ„ λ•Œ 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” 인덱싱 체계가 λ‚―μ„€μ—ˆμ§€λ§Œ κ·Έλ•Œ λ‹Ήμ‹œμ—λŠ” κ·Έλƒ₯ κ·ΈλŸ°κ°€λ³΄λ‹€~ ν•˜κ³  받아듀이고 λ„˜μ–΄κ°”μ—ˆλŠ”λ°, 이번 κΈ°νšŒμ— μ•Œμ•„λ³΄λ©΄ 쒋을 것 κ°™λ‹€λŠ” 생각이 λ“€μ–΄μ„œ 이와 κ΄€λ ¨λœ λͺ‡κ°€μ§€ 배경을 찾아보고 μ •λ¦¬ν•΄λ΄€μŠ΅λ‹ˆλ‹€. πŸ“Œ TL;DR 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” μΈλ±μŠ€λŠ” μžμ—°μŠ€λŸ½κ³  직관적이며, λ°°μ—΄μ˜ 첫 번째 μ›μ†Œκ°€ 항상 0번 μΈλ±μŠ€λΌλŠ” μ μ—μ„œ 이점이 μžˆλ‹€. 또 λ‹€λ₯Έ μ΄μœ λŠ”, 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” μΈλ±μŠ€λŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κ³„μ‚°ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ€€λ‹€. πŸ“Œ μžμ—°μŠ€λŸ½κ³  직관적이닀 0.. 2023. 3. 12.
Next.js styled-component μ„€μ •ν•˜κΈ° (SSR FOUC 이슈) πŸ“Œ Next.js ❀️ styled-component Next.js 와 Styled Component λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•  λ•Œ μ μ ˆν•œ 섀정을 ν•˜μ§€ μ•ŠμœΌλ©΄ SSR μ‹œμ— FOUC (Flash of Unstyled Content) ν˜„μƒμ΄ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€. πŸ€” FOUC? νŽ˜μ΄μ§€μ˜ μŠ€νƒ€μΌμ‹œνŠΈ 정보가 λ‘œλ“œ μ‹œμ μ— ν¬ν•¨λ˜μ§€ μ•Šμ•„ μž μ‹œ μŠ€νƒ€μΌμ΄ μ μš©λ˜μ§€ μ•Šμ€ νŽ˜μ΄μ§€κ°€ λ‚˜νƒ€λ‚˜λŠ” ν˜„μƒμž…λ‹ˆλ‹€. πŸ“Œ FOUC 원인 νŒŒμ•…ν•˜κΈ° Next.js SSR (Pre Rendering) Server-side Rendering κ³Ό Static Generation λͺ¨λ‘ Pre-rendering 방식이며 ν•„μš”ν•œ data fetching κ³Ό HTML λ Œλ”λ§μ΄ client μ—κ²Œ 보내지기 전에 이미 μˆ˜ν–‰λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 client λŠ” non-intera.. 2022. 11. 27.
TypeScript + Jest μœ λ‹› ν…ŒμŠ€νŠΈ μž‘μ„±ν•˜κΈ° 이번 ν¬μŠ€νŠΈμ—μ„œλŠ” TypeScript ν™˜κ²½μ—μ„œ Jest 둜 μœ λ‹› ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ„€μ •λ“€κ³Ό 확인을 μœ„ν•œ κ°„λ‹¨ν•œ μ˜ˆμ‹œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ‚¬μš©ν•  ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬λŠ” κ°€μž₯ λŒ€μ€‘μ μœΌλ‘œ μ‚¬μš©λ˜κ³  μžˆλŠ” Jest μž…λ‹ˆλ‹€. πŸ“Œ Jest μ„€μ • 1️⃣ νŒ¨ν‚€μ§€ μ„€μΉ˜ λ¨Όμ € ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€. npm i -D jest @jest/globals ts-jest πŸ’‘ @jest/globals λͺ…μ‹œμ μΈ import λ₯Ό μ„ ν˜Έν•˜κΈ°μ—, ν•΄λ‹Ή νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•΄μ„œ jest api μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. πŸ’‘ ts-test TS 둜된 λͺ¨λ“ˆ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•  λ•Œ 컴파일 + νƒ€μž… μ²΄ν¬κΉŒμ§€ ν•¨κ»˜ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€. 2️⃣ config 파일 μΆ”κ°€ // jest.config.js /** @type {import('jest').Con.. 2022. 11. 27.
AWS SDK 둜 s3 파일 μ‚¬μ΄μ¦ˆ μ‘°νšŒν•˜κΈ° πŸ“Œ μ—…λ‘œλ“œ ν•  λ°”μš°μ²˜μ— 크기 μ œν•œμ„ μΆ”κ°€ν•  수 μžˆμ„κΉŒμš”? νŠΈλ¦¬ν”Œ TNA νŒŒνŠΈλ„ˆμ›Ή μ—λŠ” νŒŒνŠΈλ„ˆκ°€ κ³ κ°μ—κ²Œ μ˜ˆμ•½ λ°”μš°μ²˜λ₯Ό μ „μ†‘ν•˜λŠ” κΈ°λŠ₯이 μžˆμŠ΅λ‹ˆλ‹€. κΈ°μ‘΄μ—λŠ” 파일 μ‚¬μ΄μ¦ˆμ˜ μ œν•œ 없이 μ „μ†‘ν•˜λ„λ‘ ν–ˆλŠ”λ°, μ‚¬μ΄μ¦ˆκ°€ 컀질 경우 μ΄μŠˆκ°€ μƒκ²¨μ„œ μ΄λ²ˆμ— λ¦¬λ‰΄μ–Όν•˜λ©΄μ„œ μ„œλ²„μ—μ„œ λ°”μš°μ²˜ μ‚¬μ΄μ¦ˆκ°€ 클 경우 이λ₯Ό λΆ„λ¦¬ν•΄μ„œ 전솑 μ²˜λ¦¬ν•˜λŠ” 것 이외에 ν”„λ‘ νŠΈμ—”λ“œμ—μ„œλ„ κ°œλ³„ λ°”μš°μ²˜μ— μš©λŸ‰ μ œν•œ(15MB)을 μΆ”κ°€ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ λΈŒλΌμš°μ €μ—μ„œ μ˜¬λ¦¬λŠ” 파일 μ‚¬μ΄μ¦ˆ 체크 이외에도 S3 에 이미 μ—…λ‘œλ“œ 된 λ°”μš°μ²˜ 파일 μ‚¬μ΄μ¦ˆλ₯Ό μ‘°νšŒν•΄μ„œ 각 λ°”μš°μ²˜ ν•­λͺ©μ— μš©λŸ‰μ •λ³΄λ₯Ό ν•¨κ»˜ λ…ΈμΆœν•΄μ€˜μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ•Ό 고객이 μ–΄λ–€ νŒŒμΌμ— λ¬Έμ œκ°€ μžˆλŠ”μ§€ ν•œλ²ˆμ— 확인이 κ°€λŠ₯ν•  ν…Œλ‹ˆκΉŒμš”. πŸ“Œ S3 파일 μ‚¬μ΄μ¦ˆ (HeadObject) λΈŒλΌμš°μ €μ—μ„œ μ—…λ‘œλ“œν•œ 파일.. 2022. 11. 26.
React 이벀트 μ²˜λ¦¬λ°©μ‹κ³Ό SyntheticEvent React λŠ” W3C λͺ…세에 따라 ν•©μ„± 이벀트λ₯Ό μ •μ˜ν•˜κΈ° λ•Œλ¬Έμ— λΈŒλΌμš°μ € ν˜Έν™˜μ„±μ— λŒ€ν•΄ κ±±μ •ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. ν•©μ„± μ΄λ²€νŠΈλŠ” Synthetic Event 객체둜 μ •μ˜λ˜λ©° λΈŒλΌμš°μ € 고유 μ΄λ²€νŠΈμ™€ μ™„μ „νžˆ λ™μΌν•˜κ²Œ λ™μž‘ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. 이번 ν¬μŠ€νŠΈμ—μ„œλŠ” React 의 λ‚΄λΆ€ 이벀트 μ‹œμŠ€ν…œμ˜ λ™μž‘ 방식에 λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. πŸ˜€ πŸ“Œ SyntheticEvent 래퍼 객체 React 의 이벀트 ν•Έλ“€λŸ¬λŠ” 크둜슀 λΈŒλΌμš°μ§•μ˜ μΌν™˜μœΌλ‘œ λͺ¨λ“  ν”Œλž«νΌμ—μ„œ λ™μΌν•œ 이벀트 처리λ₯Ό μœ„ν•΄ κ΅¬ν˜„λœ μΈν„°νŽ˜μ΄μŠ€μΈSyntheticEvent 객체λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŠ” stopPropagation κ³Ό preventDefault 등을 ν¬ν•¨ν•˜μ—¬ λΈŒλΌμš°μ € 고유 μ΄λ²€νŠΈμ™€ λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ§€μ§€λ§Œ λͺ¨λ“  λΈŒλΌμš°μ €μ—μ„œ λ™μΌν•˜κ²Œ λ™μž‘ν•¨μ„ 보μž₯ν•©λ‹ˆλ‹€. S.. 2022. 10. 17.