Skip to content

Commit

Permalink
Merge pull request #31 from Wannabe-Woowa-Article/llqqssttyy
Browse files Browse the repository at this point in the history
μš°λ¦¬λŠ” ν”„λ‘ νŠΈμ—”λ“œμ˜ 기초λ₯Ό μžŠμ–΄λ²„λ¦¬κ³  λ§μ•˜μŠ΅λ‹ˆλ‹€.
  • Loading branch information
brgndyy authored Jul 28, 2024
2 parents 8a3ea14 + b093c03 commit c6d7ee3
Showing 1 changed file with 156 additions and 0 deletions.
156 changes: 156 additions & 0 deletions July/article/We-Forgot-Frontend-Basics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
## πŸ”— [We Forgot Frontend Basics](https://blog.stackademic.com/we-forgot-frontend-basics-2f9a1c4dabaa)

### πŸ—“οΈ λ²ˆμ—­ λ‚ μ§œ: 2024.07.22

### 🧚 λ²ˆμ—­ν•œ 크루: λ ›μ„œ(김닀은)

---

## μš°λ¦¬λŠ” ν”„λ‘ νŠΈμ—”λ“œμ˜ 기초λ₯Ό μžŠμ–΄λ²„λ¦¬κ³  λ§μ•˜μŠ΅λ‹ˆλ‹€.

> λͺ¨λ“  μ΅œμ‹  νŠΈλ Œλ“œμ™€ λμ—†λŠ” νŒ¨λŸ¬λ‹€μž„ μ†μ—μ„œ μš°λ¦¬λŠ” ν”„λ‘ νŠΈμ—”λ“œ 개발의 기본을 μžŠμ–΄λ²„λ¦° 것 κ°™μŠ΅λ‹ˆλ‹€.
보톡 μ €λŠ” μ΄λ ‡κ²Œ λ§ν•©λ‹ˆλ‹€. "κ·Έλ ‡κ²Œ λ‚˜μ˜μ§€ μ•Šμ•„. λŠ₯μˆ™ν•œ μ‚¬λžŒμ΄λΌλ©΄ 거의 λͺ¨λ“  κ±Έ ν•  수 μžˆμ–΄." ν•˜μ§€λ§Œ 졜근 ν”„λ‘ νŠΈμ—”λ“œ 산업에 λŒ€ν•œ λ‚΄ μ‹œκ°μ„ λ°”κΏ€ λͺ‡ 가지λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. λμ—†λŠ” νŠΈλ Œλ“œ, νŒ¨λŸ¬λ‹€μž„, 이 λͺ¨λ“  μ‹ κΈ°ν•œ 것듀 μ†μ—μ„œ μš°λ¦¬λŠ” ν”„λ‘ νŠΈμ—”λ“œ 개발의 근간을 μžŠμ€ 것 κ°™μŠ΅λ‹ˆλ‹€.

이 κΈ€μ—μ„œλŠ” 졜근 ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•œ λͺ‡ 가지 μ½”λ“œ κ³΅μœ ν•˜κ³ , 이에 λŒ€ν•œ λ‚˜μ˜ 생각을 μ„€λͺ…ν•΄ 보렀고 ν•©λ‹ˆλ‹€. 그럼 λ°”λ‘œ μ‹œμž‘ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€!

<br/>

![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*XYgHgQF-AbS5YVa2-WE8kg.png)

<br/>

### λͺ©μ°¨

- 끝없이 λŠ˜μ–΄λ‚˜λŠ” λ³΅μž‘λ„
- 1993λ…„λΆ€ν„° μ‹œμž‘λœ μ‹€μˆ˜
- λͺ¨λ“  μ•…μ˜ 근원
- λͺ‡ 가지 μ€‘μš”ν•œ 팁

<br/>

## 끝없이 λŠ˜μ–΄λ‚˜λŠ” λ³΅μž‘λ„

μ—¬κΈ° κ°€μž₯ 기본적인 Card μ»΄ν¬λ„ŒνŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 μ»΄ν¬λ„ŒνŠΈλŠ” 선택적인 헀더 속성을 가지고 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 이 속성이 μ‘΄μž¬ν•œλ‹€λ©΄, νŠΉμ • 클래슀λ₯Ό 가진 λž˜ν•‘ div μ•ˆμ— λ Œλ”λ§λ©λ‹ˆλ‹€.

```jsx
const Card = ({ children, header }) => {
return (
<div className="card">
{header && <div className="card__header">{header}</div>}
{children}
</div>
);
};
```

κ°„λ‹¨ν•œ κ²½μš°μ—λŠ” λͺ¨λ“  것이 잘 μž‘λ™ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, `<Card />`의 경우 ν—€λ”λŠ” λ Œλ”λ§λ˜μ§€ μ•Šμ§€λ§Œ, `<Card header={"I am header"} />`의 κ²½μš°μ—λŠ” 헀더가 λ Œλ”λ§λ©λ‹ˆλ‹€. λ¬Έμ œλŠ” 헀더가 동적일 λ•Œ λ°œμƒν•©λ‹ˆλ‹€. 헀더가 동적일 경우 μ‹€μ œ μ½˜ν…μΈ  λ˜λŠ” null을 λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ β€” `<Card header={<CardHeader />} />`. 이 경우 쑰건문 `{header && <div />}`λŠ” 이λ₯Ό κ°μ§€ν•˜μ§€ λͺ»ν•˜κ³  빈 divλ₯Ό λ Œλ”λ§ν•˜κ²Œ λ©λ‹ˆλ‹€.

ν•œ κ°œλ°œμžκ°€ κ·Έ 문제λ₯Ό ν•΄κ²°ν•˜λ €κ³  μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŠ” "잠깐, div의 λ‚΄μš©μ„ ν™•μΈν•˜κ³  λΉ„μ–΄ 있으면 숨기면 λ˜μž–μ•„!"라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έκ°€ μž‘μ„±ν•œ λŒ€λž΅μ μΈ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

```jsx
const Card = ({ children, header }) => {
const headerRef = useRef();

useEffect(() => {
const hasContent = headerRef.current?.childNodes.length > 0;
headerRef.current.style.display = hasContent ? 'block' : 'none';
});

return (
<div className="card">
{header && (
<div ref={headerRef} className="card__header">
{header}
</div>
)}
{children}
</div>
);
};
```
또 λ‹€λ₯Έ μ‚¬λžŒμ΄ μ½”λ“œ 리뷰 쀑에 이 μ½”λ“œκ°€ 초기 λ Œλ”λ§μ—μ„œλ§Œ μž‘λ™ν•œλ‹€λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ Footerκ°€ λΉ„λ™κΈ°μ μœΌλ‘œ μ—…λ°μ΄νŠΈλ˜λ©΄, useEffectλŠ” ν˜ΈμΆœλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κΈ΄ λ…ΌμŸ 끝에 κ°œλ°œμžλ“€μ€ MutationObserver에 μ£Όλͺ©ν•˜κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€.
κ·Έλ“€μ˜ λ…Όμ˜ 쀑에 μ €μ—κ²Œλ„ 쑰언을 κ΅¬ν–ˆμŠ΅λ‹ˆλ‹€. μ†”μ§νžˆ 말해, 제 방법을 λ³΄μ—¬μ£ΌλŠ” 것은 정말 μž¬λ―Έμžˆμ—ˆμŠ΅λ‹ˆλ‹€. κ·Έ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 일반적인 CSS만 μ‚¬μš©ν•˜λ©΄ μΆ©λΆ„ν–ˆμŠ΅λ‹ˆλ‹€.
```css
.card__header:empty {
display: none;
}
```
κ°œλ°œμžλ“€μ€ μžμ‹ μ˜ μž‘μ—…μ„ λ„ˆλ¬΄ λ³΅μž‘ν•˜κ²Œ λ§Œλ“œλŠ” 것에 μ΅μˆ™ν•΄μ Έ μžˆμ–΄μ„œ CSS의 κΈ°λ³Έ κΈ°λŠ₯μ‘°μ°¨ ν™•μΈν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
<br/>
## 1993λ…„λΆ€ν„° μ‹œμž‘λœ μ‹€μˆ˜
이전 ν”„λ‘œμ νŠΈμ—μ„œ μš°λ¦¬λŠ” μ‚¬μ΄λ“œ νŒ¨λ„ μœ„μ ―μ„ λ§Œλ“€μ—ˆλŠ”λ°, 이 μœ„μ ―μ€ 전체 λ†’μ΄λ‘œ ν™•μž₯λ˜μ§€λ§Œ 헀더와 ν‘Έν„°λ₯Ό κ²ΉμΉ˜μ§€ μ•Šμ•„μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. λŒ€λž΅μ μΈ 곡식은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€: `100% - headerHeight - footerHeight`.
이 해결책은 λͺ¨λ“  νŽ˜μ΄μ§€μ—μ„œ μ›ν™œν•˜κ²Œ μž‘λ™ν–ˆμ§€λ§Œ, ν•œ νŽ˜μ΄μ§€μ—μ„œλŠ” 그렇지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€. κ·Έ νŽ˜μ΄μ§€μ—μ„œ footerHeightκ°€ 0이 λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 이 버그λ₯Ό 맑은 κ°œλ°œμžλŠ” 더 깊이 νŒŒκ³ λ“€μ–΄ document.querySelector('footer')κ°€ null을 λ°˜ν™˜ν•˜μ§€λ§Œ, ν‘Έν„°λŠ” μ—¬μ „νžˆ νŽ˜μ΄μ§€μ— λ Œλ”λ§λœλ‹€λŠ” 것을 μ•Œμ•„λƒˆμŠ΅λ‹ˆλ‹€. κ·Έκ°€ 무엇을 ν–ˆμ„κΉŒμš”? κ·Έλ ‡μŠ΅λ‹ˆλ‹€, λ‹€μ‹œ MutationObserverλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.
그것이 μ΄μƒν•˜κ²Œ λ³΄μ˜€κ³ , μ €λŠ” λŒ€μ•ˆμ„ 찾기둜 κ²°μ‹¬ν–ˆμŠ΅λ‹ˆλ‹€. 그리고 κ²°κ΅­ λŒ€μ•ˆμ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. μ œκ°€ ν•΄μ•Ό ν•  일은 μ½”λ“œμ˜ λͺ‡ 쀄을 κ΅μ²΄ν•˜λŠ” κ²ƒλΏμ΄μ—ˆμŠ΅λ‹ˆλ‹€...
```html
<html>
<head></head>
<body>
<header></header>
<main id="root"></main>
<script src="index.js"></script>
<footer></footer>
</body>
</html>
```
μ–΄λ–»κ²Œ 된 일인지, `<script />`κ°€ 푸터보닀 νŽ˜μ΄μ§€μ— λ¨Όμ € λ‘œλ“œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. `<script />`λŠ” λ™κΈ°μ μœΌλ‘œ μ‹€ν–‰λ˜λ©°, κ·Έ μˆœκ°„ ν‘Έν„°λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν‘Έν„°μ˜ 높이λ₯Ό μΈ‘μ •ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
λ‹¨μˆœνžˆ 이 μ½”λ“œλ₯Ό κ΅μ²΄ν–ˆλ”λ‹ˆ λͺ¨λ“  것이 μ œλŒ€λ‘œ μž‘λ™ν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.
μš”μ¦˜ κ°œλ°œμžλ“€μ€ webpack-plugin 같은 ν˜„λŒ€μ μΈ 도ꡬ에 크게 μ˜μ‘΄ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ 직접 HTML을 μž‘μ„±ν•΄μ•Ό ν•  λ•ŒλŠ” λ°”λ‘œ ν”Όν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 그것이 κ·Έλ ‡κ²Œ μ–΄λ €μš΄ μΌμΌκΉŒμš”?
<br/>
## λͺ¨λ“  μ•…μ˜ 근원
λ¦¬μ•‘νŠΈ 훅은 λ™μ‹œμ— λ¦¬μ•‘νŠΈμ—μ„œ 졜고의 λ„κ΅¬μž„κ³Ό λ™μ‹œμ˜ μ΅œμ•…μ˜ λ„κ΅¬μž…λ‹ˆλ‹€. μƒνƒœλ₯Ό μ²˜λ¦¬ν•˜λŠ” μœ μ—°ν•˜κ³  μš°μ•„ν•œ 방법을 μ œκ³΅ν•˜μ§€λ§Œ, λ‹€λ₯Έ ν•œνŽΈμœΌλ‘œλŠ” μ½”λ“œ λ³΅μž‘μ„±μ„ 크게 μ¦κ°€μ‹œν‚€κ³  μ‹€μˆ˜λ₯Ό 저지λ₯΄κΈ° μ‰½κ²Œ λ§Œλ“­λ‹ˆλ‹€.
λ¬Έμ„œλ₯Ό 주의 깊게 읽고 μ˜¬λ°”λ₯΄κ²Œ μ‚¬μš©ν•˜λŠ” 방법을 μ΄ν•΄ν•˜λŠ” 것이 μ–΄λ €μ›Œ λ³΄μ΄μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 일뢀 κ°œλ°œμžλ“€μ€ 이 λͺ…λ°±ν•œ 단계λ₯Ό κ±΄λ„ˆλ›°κ³  훅을 μ™„μ „νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•œ 채 μ‚¬μš©ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€. 특히, μ΅œμ ν™”μ™€ μ•…λͺ… 높은 useMemo 및 useCallback에 λŒ€ν•΄μ„œ κ·Έλ ‡μŠ΅λ‹ˆλ‹€. 이제 λͺ¨λ“  κ°œλ°œμžκ°€ λͺ…ν™•ν•œ 이유 없이 전체 앱을 μ΅œμ ν™”ν•˜λ €κ³  ν•©λ‹ˆλ‹€.
이 "μ€‘μš”ν•œ" μ΅œμ ν™”λ₯Ό ν•¨κ»˜ μ‚΄νŽ΄λ΄…μ‹œλ‹€. 이 μ½”λ“œλŠ” 이 글을 μœ„ν•΄ μƒμƒμœΌλ‘œ μž‘μ„±ν•œ 것이 μ•„λ‹™λ‹ˆλ‹€. μ‹€μ œλ‘œ 제 ν”„λ‘œμ νŠΈ 쀑 ν•˜λ‚˜μ—μ„œ κ°€μ Έμ˜¨ μ½”λ“œ μ‘°κ°μž…λ‹ˆλ‹€.
```jsx
const loaded = useMemo(() => {
return submitted && !loading && !error;
}, [submitted, error, loading]);
}
```
이 μ΅œμ ν™” μ΄ν›„λ‘œ μ•± μ„±λŠ₯이 "κΈ‰μƒμŠΉ"ν–ˆμ£ ! μ΄ν•΄ν•˜μ‹€ 수 μžˆλ“―μ΄, μ΄λŠ” μ™„μ „νžˆ μ“Έλͺ¨μ—†κ³  였히렀 μ•±μ˜ 첫 λ‘œλ”©μ— μ•½κ°„μ˜ 영ν–₯을 μ€λ‹ˆλ‹€. μ†”μ§νžˆ λ§ν•΄μ„œ, 이 μ½”λ“œλ₯Ό μž‘μ„±ν•œ μ§„μ§œ μ˜λ„λ₯Ό 아직도 μ΄ν•΄ν•˜μ§€ λͺ»ν•˜κ² μŠ΅λ‹ˆλ‹€.
무엇이든 λ‹Ήμ—°ν•˜κ²Œ 받아듀이고 λ‹€λ₯Έ 것을 μƒκ°ν•˜μ§€ μ•ŠλŠ” 것이 항상 훨씬 더 μ‰½μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 슀슀둜 쑰금만 연ꡬ해 λ³΄λŠ” 것도 κ·Έλ ‡κ²Œ μ–΄λ ΅μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
<br/>
## λͺ‡ 가지 μ€‘μš”ν•œ 팁
이 상황은 정말 μ•ˆνƒ€κΉμŠ΅λ‹ˆλ‹€. κ°œλ°œμžλ“€μ΄ κΈ°λ³Έ κΈ°μˆ μ„ 잊기 μ‹œμž‘ν•˜κ³ , μƒˆλ‘œμš΄ 기술과 μ ‘κ·Ό 방식 μ†μ—μ„œ λΉ„νŒμ  사고λ₯Ό μžƒμ–΄κ°€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 제 μƒκ°μ—λŠ” 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 것이 그리 어렡지 μ•ŠμŠ΅λ‹ˆλ‹€. μœ„μ—μ„œ μ–ΈκΈ‰ν•œ λͺ¨λ“  λ‚΄μš©μ„ 결둠짓기 μœ„ν•΄, 이 κ°„λ‹¨ν•œ μš”μ λ“€μ„ λ³΄μ—¬λ“œλ¦¬κ³ μž ν•©λ‹ˆλ‹€. (ν”Όλ“œλ°±μ„ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€!)
- **μ‹œκ°„μ„ λ‚΄μ–΄ 바닐라 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ΄ν•΄ν•˜μ„Έμš”.** κΈ°μ΄ˆκ°€ νŠΌνŠΌν•˜λ©΄ λ²„κ·Έμ˜ μ‹€μ œ 원인을 더 μ‰½κ²Œ μ°Ύμ•„λ‚΄κ³  그에 맞게 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- **HTMLκ³Ό CSSλ₯Ό 깊이 있게 λ°°μš°μ„Έμš”.** λ§Žμ€ μœ μš©ν•œ 속성, μ„ νƒμž 등을 λ°œκ²¬ν•  수 있으며, 이λ₯Ό 톡해 λ§Žμ€ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό λŒ€μ²΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄,
μ„ νƒμžλ₯Ό μ‚¬μš©ν•œ μ˜ˆμ‹œλ₯Ό κΈ°μ–΅ν•΄ λ³΄μ„Έμš”.
- **λΉ„νŒμ  사고 λŠ₯λ ₯을 κ°œλ°œν•˜μ„Έμš”.** λ¬Όλ‘  νŒ€ 리더가 쒋은 μ‹€μ²œ 방법과 원칙을 κ°€λ₯΄μ³μ£Όμ—ˆμ§€λ§Œ, λ¬΄μž‘μ • λ”°λΌκ°€κΈ°λ§Œ ν•˜λ©΄ 잘λͺ»λœ λ°©ν–₯으둜 갈 수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€μ‹ , μ™œ 무언가가 κ·Έλ ‡κ²Œ λ˜μ–΄ μžˆλŠ”μ§€ μ΄ν•΄ν•˜λ €κ³  λ…Έλ ₯ν•˜μ„Έμš”.
- **SOLID, YAGNI, KISS λ“±μ˜ 원칙을 κΈ°μ–΅ν•˜μ„Έμš”.** κ°„λ‹¨ν•œ μž‘μ—…μ΄ ν˜Όλž€μŠ€λŸ¬μš΄ ν•΄κ²°μ±…μœΌλ‘œ μ•…λͺ½μ΄ 될 경우, μž μ‹œ λ©ˆμΆ”κ³  λ‹€λ₯Έ κ΄€μ μ—μ„œ λ‹€μ‹œ 생각해 λ³΄μ„Έμš”. μ•„λ§ˆλ„ ν•œ 가지 해결책에 λ„ˆλ¬΄ 깊이 λΉ μ Έμ„œ λͺ…λ°±ν•œ 무언가λ₯Ό μžŠμ–΄λ²„λ Έμ„ κ°€λŠ₯성이 ν½λ‹ˆλ‹€.
이 μš”μ λ“€μ— λŒ€ν•œ ν”Όλ“œλ°±μ„ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€!
---
μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!
이 글이 μœ μš©ν•˜μ…¨κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. μ§ˆλ¬Έμ΄λ‚˜ μ œμ•ˆμ΄ μžˆμœΌμ‹œλ©΄ λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ„Έμš”. μ—¬λŸ¬λΆ„μ˜ ν”Όλ“œλ°±μ€ μ œκ°€ 더 λ‚˜μ•„μ§€λŠ” 데 도움이 λ©λ‹ˆλ‹€.
κ΅¬λ…ν•˜λŠ” 것도 μžŠμ§€ λ§ˆμ„Έμš”β­οΈ

0 comments on commit c6d7ee3

Please sign in to comment.