LearningTS Chapter 1 - YDP-SPLOUNGE-CLUB/typescript-study GitHub Wiki

1.2 바닐라 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 함정

μ€‘μš”ν•œ μ–Έμ–΄ ν™•μž₯μ΄λ‚˜ ν”„λ ˆμž„μ›Œν¬ μ—†μ΄μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 바닐라 라고 λΆ€λ₯Έλ‹€. μˆœμˆ˜ν•œ μžλ°”μŠ€ν΄λΉ„νŠΈλ₯Ό μ˜λ―Έν•œλ‹€. νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ μžλ°”μŠ€ν¬λ¦½νŠΈμ— μžˆλŠ” μ£Όμš” 함정을 κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ μ μ ˆν•œ κΈ°λŠ₯을 μΆ”κ°€ν•œ 이유λ₯Ό 이 μ±…μ—μ„œ μ„€λͺ…ν•œλ‹€.

μ΄λŸ¬ν•œ λͺ¨λ“  약점은 ν”„λ‘œμ νŠΈ 규λͺ¨κ°€ 컀지고 μž₯κΈ°ν™”λ μˆ˜λ‘ λ”μš± λ“œλŸ¬λ‚œλ‹€.

1.2.1 κ°’ λΉ„μ‹Ό 자유

JSλ₯Ό μ‚¬μš©ν•˜λŠ” κ°œλ°œμžλ“€μ˜ 큰 λΆˆλ§Œμ€ 핡심 κΈ°λŠ₯에 μžˆλ‹€. JSλŠ” 사싀상 μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜λŠ” 방법에 μ œν•œμ΄ μ—†λ‹€. μ΄λŸ¬ν•œ 자유 덕뢄에 ν”„λ‘œμ νŠΈλ₯Ό μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μ‹œμž‘ν•˜λ©΄ 맀우 μž¬λ―Έμžˆλ‹€.

κ·ΈλŸ¬λ‚˜ 파일이 λŠ˜μ–΄λ‚ μˆ˜λ‘ κ·Έ μžμœ κ°€ μ–Όλ§ˆλ‚˜ 훼손될 수 μžˆλŠ”μ§€ λͺ…ν™•ν•΄μ§„λ‹€. κ°€μƒμ˜ νŽ˜μΈνŒ… μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ˜ 일뢀뢄이닀.

function paintPating(painter, painting) {
    return painter
        .prepare()
        .paint(painting, painter.ownMaterials)
        .finish();
}

μ•„λ¬΄λŸ° λ§₯락도 없이 μ½”λ“œλ₯Ό 읽게 되면 paintPainting ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 방법에 λŒ€ν•΄ λ§‰μ—°νžˆ μƒκ°λ§Œ ν•˜κ²Œ 될 것이닀.

ν˜Ήμ€ μ½”λ“œλ² μ΄μŠ€μ™€ κ΄€λ ¨λœ μž‘μ—…μ„ ν•œ 적이 μžˆλ‹€λ©΄ μ–΄λ–€ ν•¨μˆ˜λ‘œ λ°˜ν™˜λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ κΈ°μ–΅ν•˜κ³  μžˆμ„μ§€λ„ λͺ¨λ₯Έλ‹€.

κ·ΈλŸ¬λ‚˜ μ•žμ„  가정이 μ •ν™•ν•˜λ”λΌλ„ λ‚˜μ€‘μ— μ½”λ“œλ₯Ό λ³€κ²½ν•˜λ©΄ 이 가정은 λ¬΄νš¨κ°€ 될지도 λͺ¨λ₯Έλ‹€.

λ¬Έμžμ—΄μ΄μ—ˆλ˜ painting이 λ‹€λ₯Έ 데이터 νƒ€μž…μœΌλ‘œ λ³€κ²½λ˜κ±°λ‚˜ ν•˜λ‚˜ μ΄μƒμ˜ painter λ©”μ„œλ“œ 이름이 λ³€κ²½λ˜μ—ˆμ„ μˆ˜λ„ μžˆλ‹€.

λ‹€λ₯Έ μ–Έμ–΄λŠ” μ»΄νŒŒμΌλŸ¬κ°€ μΆ©λŒν•  수 μžˆλ‹€κ³  νŒλ‹¨ν•˜λ©΄ μ½”λ“œ 싀행을 κ±°λΆ€ν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 좩돌 κ°€λŠ₯성을 λ¨Όμ € ν™•μΈν•˜μ§€ μ•Šκ³  μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 동적 νƒ€μž… μ–Έμ–΄λŠ” κ·Έλ ‡μ§€ μ•Šλ‹€.

μ½”λ“œμ˜ μžμœ λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 재미있게 λ§Œλ“€κΈ°λ„ ν•˜μ§€λ§Œ μ½”λ“œλ₯Ό μ•ˆμ „ν•˜κ²Œ μ‹€ν–‰ν•˜λ €κ³  ν•  λ–„λŠ” μƒλ‹Ήν•œ 고톡을 μ•ˆκ²¨μ€€λ‹€.

1.2.2 λΆ€μ‘±ν•œ λ¬Έμ„œ

μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄ μ‚¬μ–‘μ—λŠ” ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜, ν•¨μˆ˜ λ°˜ν™˜, λ³€μˆ˜ λ˜λŠ” λ‹€λ₯Έ ꡬ성 μš”μ†Œμ˜ 의미λ₯Ό μ„€λͺ…ν•˜λŠ” ν‘œμ€€ν™”λœ λ‚΄μš©μ΄ μ—†λ‹€.

κ°œλ°œμžκ°€ 블둝 μ£Όμ„μœΌλ‘œ ν•¨μˆ˜μ™€ λ³€μˆ˜λ₯Ό μ„€λͺ…ν•˜λŠ” JSDoc ν‘œμ€€μ„ μ±„νƒν•œλ‹€.

/**
 * @param {Painting} painter
 * @param {string} painting
 */

JSDoc μ—λŠ” λ‹€μŒκ³Ό 같은 μ£Όμš” 문제둜 인해 규λͺ¨κ°€ μžˆλŠ” μ½”λ“œλ² μ΄μŠ€μ—μ„œ μ‚¬μš©ν•˜κΈ° λΆˆνŽΈν•˜λ‹€.

  • JSDoc μ„€λͺ…이 μ½”λ“œκ°€ 잘λͺ»λ˜λŠ” 것을 막을 수 μ—†λ‹€.
  • μ„€λͺ…이 μ΄μ „μ—λŠ” μ •ν™•ν–ˆλ”λΌλ„ μ½”λ“œ λ¦¬νŒ©ν„°λ§ 쀑에 생긴 λ³€κ²½ 사항과 κ΄€λ ¨λœ ν˜„μž¬ μœ νš¨ν•˜μ§€ μ•Šμ€ JSDoc 주석을 λͺ¨λ‘ μ°ΎκΈ° μ–΄λ ΅λ‹€.
  • λ³΅μž‘ν•œ 객체λ₯Ό μ„€λͺ…ν•  λ•ŒλŠ” 닀루기 μ–΄λ ΅κ³  μž₯ν™©ν•΄μ„œ λ‹€μˆ˜μ˜ 주석이 ν•„μš”ν•˜λ‹€.

μˆ˜μ‹­ 개의 νŒŒμΌμ—μ„œ JSDoc 주석을 μœ μ§€ κ΄€λ¦¬λŠ” λ§Žμ€ μ‹œκ°„μ΄ 걸리지 μ•Šκ² μ§€λ§Œ 수백 λ˜λŠ” 수천 개의 νŒŒμΌμ„ κΎΈμ€€νžˆ μ—…λ°μ΄νŠΈ ν•˜λ €λ©΄ 쉽지 μ•Šλ‹€.

1.2.3 λΆ€μ‘±ν•œ 개발자 도ꡬ

JS νƒ€μž…μ„ μ‹λ²½ν•˜λŠ” λ‚΄μž₯된 방법을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ½”λ“œκ°€ JSDoc μ£Όμ„μ—μ„œ μ‰½κ²Œ λΆ„λ¦¬λ˜κΈ° 떄문에 μ½”λ“œλ² μ΄μŠ€μ— λŒ€ν•œ λŒ€κ·œλͺ¨ 변경을 μžλ™ν™”ν•˜κ±°λ‚˜ 톡찰λ ₯을얻기가 μ–΄λ ΅λ‹€.

1.3 νƒ€μž…μŠ€ν¬λ¦½νŠΈ

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 2010λ…„λŒ€ μ΄ˆμ— λ§ˆμ΄ν¬λ‘œμ†Œν”„νŠΈ λ‚΄λΆ€μ—μ„œ λ§Œλ“€μ–΄μ§„ ν›„ 2012년에 μΆœμ‹œ 및 μ˜€ν”ˆ μ†ŒμŠ€ν™” λ˜μ—ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” λ„€ κ°€μ§€λ‘œ μ„€λͺ…λœλ‹€.

  • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  ꡬ문과 νƒ€μž…μ„ μ •μ˜ν•˜κ³  μ‚¬μš©ν•˜κΈ° μœ„ν•œ μƒˆλ‘œμš΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈ 고유 ꡬ문이 ν¬ν•¨λœ μ–Έμ–΄
  • νƒ€μž… 검사기: JS, TS 둜 μž‘μ„±λœ 일련의 νŒŒμΌμ—μ„œ μƒμ„±λœ λͺ¨λ“  ꡬ성 μš”μ†Œλ₯Ό μ΄ν•΄ν•˜κ³  잘λͺ» κ΅¬μ„±λœ 뢀뢄을 μ•Œλ €μ£ΌλŠ” ν”„λ‘œκ·Έλž¨
  • 컴파일러: νƒ€μž… 검사기λ₯Ό μ‹€ν–‰ν•˜κ³  문제λ₯Ό λ³΄κ³ ν•œ ν›„ 이에 λŒ€μ‘λ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μƒμ„±ν•˜λŠ” ν”„λ‘œκ·Έλž¨
  • μ–Έμ–΄ μ„œλΉ„μŠ€: νƒ€μž… 검사기λ₯Ό μ‚¬μš©ν•΄ VS Code 와 같은 νŽΈμ§‘κΈ°μ— κ°œλ°œμžμ—κ²Œ μœ μš©ν•œ μœ ν‹Έλ¦¬ν‹° μ œκ³΅λ²•μ„ μ•Œλ €μ£ΌλŠ” ν”„λ‘œκ·Έλž¨

1.4 νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν”Œλ ˆμ΄κ·ΈλΌμš΄λ“œ

μƒλž΅

1.5 λ‘œμ»¬μ—μ„œ μ‹€ν–‰ν•˜κΈ°

μƒλž΅

1.6 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ— λŒ€ν•œ μ˜€ν•΄

TSκ°€ μ–Όλ§ˆλ‚˜ ν›Œλ₯­ν•œμ§€λŠ” μ•Œμ§€λ§Œ μ œμ•½μ΄ μžˆλ‹€.

1.6.1 잘λͺ»λœ μ½”λ“œ ν•΄κ²°μ±…

TSλŠ” JSμ½”λ“œλ₯Ό κ΅¬μ‘°ν™”ν•˜λŠ” 데 도움이 λ˜μ§€λ§Œ, νƒ€μž… μ•ˆμ •μ„± κ°•ν™”λ₯Ό μ œμ™Έν•˜κ³ λŠ” ν•΄λ‹Ή ꡬ쑰가 μ–΄λ–»κ²Œ 보여야 ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” μ–΄λ–€ 것도 κ°•μš”ν•˜μ§€ μ•ŠλŠ”λ‹€. 맀우 쒋은 νŠΉμ§•μ΄λ‹€.

λͺ¨λ“  κ°œλ°œμžκ°€ μ‚¬μš©ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž˜λ° 언어이닀. JS 의 μ•„ν‚€ν…μ²˜ νŒ¨ν„΄ 쀑 γ…μ›Ÿμ΄λ“  μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 이λ₯Ό μ§€μ›ν•œλ‹€.

1.6.2 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œμ˜ ν™•μž₯

TS 섀계 λͺ©ν‘œλŠ” 이렇닀.

  • ν˜„μž¬μ™€ 미래의 ECMA 슀크립트 μ œμ•ˆμ— λ§žμΆ˜λ‹€.
  • λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ˜ λŸ°νƒ€μž„ λ™μž‘μ„ μœ μ§€ν•œλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μž‘λ™ 방식을 μ „ν˜€ λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€.

1.6.3 μžλ°”μŠ€ν¬λ¦½νŠΈλ³΄λ‹€ 느림

λ–„λ‘œλŠ” 인터넷 속 읡λͺ…μ˜ κ°œλ°œμžκ°€ λŸ°νƒ€μž„μ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλ³΄λ‹€ λŠλ¦¬λ‹€κ³  λΆˆν‰ν•˜λŠ” κ±Έ λ“£κ²Œ 될지도 λͺ¨λ₯Έλ‹€. 이 μ£Όμž₯은 λΆ€μ •ν™•ν•˜κ³  μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆλ‹€.

νƒ€μž…μŠ€ν΄λΉ„νŠΈκ°€ μ½”λ“œμ— μ μš©ν•˜λŠ” μœ μΌν•œ λ³€κ²½ 사항은 인터넷 μ΅μŠ€ν”Œλ‘œμ–΄ 11κ³Ό 같이 였래된 λŸ°νƒ€μž„ ν™˜κ²½μ„ μ§€μ›ν•˜κΈ° μœ„ν•΄ 이전 λ²„μ „μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜λ„λ‘ μš”μ²­ν•˜λŠ” κ²½μš°μ΄λ‹€.

운영 ν”„λ ˆμž„μ›Œν¬ λŒ€λ‹€μˆ˜λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ 컴파일러λ₯Ό μ „ν˜€ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. λŒ€μ‹  νŠΈλžœμŠ€νŒŒμΌμ„ μœ„ν•œ λ³„λ„μ˜ 도ꡬλ₯Ό μ‚¬μš©ν•˜κ³  νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” νƒ€μž… κ²€μ‚¬μš©μœΌλ‘œλ§Œ μ‚¬μš©ν•œλ‹€.

κ·ΈλŸ¬λ‚˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μ½”λ“œλ₯Ό λΉŒλ“œν•˜λŠ” 데 μ‹œκ°„μ΄ 쑰금 더 κ±Έλ¦°λ‹€. νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” λΈŒλΌμš°μ €λ‚˜ Node.js 와 같은 ν™˜κ²½μ—μ„œ μ‹€ν–‰λ˜κΈ° 전에 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μ»΄νŒŒμΌλ˜μ–΄μ•Ό ν•œλ‹€.

λΉŒλ“œ νŒŒμ΄ν”„λΌμΈμ€ λŒ€λΆ€λΆ„ μ„±λŠ₯ μ €ν•˜λ₯Ό λ¬΄μ‹œν•˜λ„λ‘ μ„€μ •λœλ‹€. μ½”λ“œμ—μ„œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό λΆ„μ„ν•˜λŠ” 느린 νƒ€μž…μŠ€ν¬λ¦½νŠΈ κΈ°λŠ₯은 μ‹€ν–‰ κ°€λŠ₯ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ νŒŒμΌμ„ μƒμ„±ν•˜λŠ” κ²ƒκ³ΌλŠ” λΆ„λ¦¬λœ μ±„λ‘œ μˆ˜ν–‰λœλ‹€.

1.6.4 μ§„ν™”κ°€ 끝남?

μ›Ήμ˜ μ§„ν™˜λŠ λλ‚˜μ§€ μ•Šμ•˜κ³  νƒ€μž…μŠ€ν¬λ¦½νŠΈλ„ λ§ˆμ°¬κ°€μ§€λ‹€. νƒ€μž…μŠ€ν¬λ¦½νŠΈ 버그 μˆ˜μ •κ³Ό κΈ°λŠ₯ μΆ”κ°€λŠ” μ§€μ†μ μœΌλ‘œ 이루어진닀.