Skip to content

Latest commit

Β 

History

History
1094 lines (679 loc) Β· 41.5 KB

File metadata and controls

1094 lines (679 loc) Β· 41.5 KB

prepare_frontend_interview

Computer Science

ν”„λ‘ νŠΈμ—”λ“œ 기술 면접을 μœ„ν•œ ν•Έλ“œλΆ λ§Œλ“€κΈ°

기본적으둜 μ œκ°€ 이전에 κ³΅λΆ€ν–ˆλ˜ λ‚΄μš©μ„ μ •λ¦¬ν•˜μ§€λ§Œ,

더 쉽고 이해가 λ˜λŠ” λ°©ν–₯의 μ–‘μ§ˆμ˜ μžλ£Œκ°€ μžˆμ„ 경우 ν•΄λ‹Ή 자료λ₯Ό λŒ€μ‹  넣기도 ν•©λ‹ˆλ‹€

μ œκ°€ λͺ¨λ₯΄λŠ” 뢀뢄인데 정리가 ν•„μš”ν•œ 뢀뢄은 주둜 Interview_Question_for_Beginner πŸ”₯ λ₯Ό μ°Έκ³ ν•©λ‹ˆλ‹€!

정말 두고두고 보기 쒋은 μžλ£Œκ°€ 많으며 기업에 λŒ€ν•œ μ—­ 질문 리슀트 πŸ“Œ λ˜ν•œ μ‘΄μž¬ν•©λ‹ˆλ‹€

λͺ©μ°¨

  • ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ πŸ”₯

    • ν”„λ‘œμ„ΈμŠ€κ°€ λ­”κ°€μš”?
    • μŠ€λ ˆλ“œκ°€ λ­”κ°€μš”?
    • ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œλŠ” μ–΄λ–€ 차이가 μžˆλ‚˜μš”?
  • μ‹±κΈ€ μŠ€λ ˆλ“œμ™€ λ©€ν‹° μŠ€λ ˆλ“œ πŸ”₯

    • μ‹±κΈ€ μŠ€λ ˆλ“œ μž₯점
    • μ‹±κΈ€ μŠ€λ ˆλ“œ 단점
    • λ©€ν‹° μŠ€λ ˆλ“œ μž₯점
    • λ©€ν‹° μŠ€λ ˆλ“œ 단점
  • HTTP πŸ”₯

    • HTTPλž€ λ­”κ°€μš”?
    • HTTP ν”„λ‘œν† μ½œμ˜ κ°€μž₯ 큰 νŠΉμ§•μ€ λ­”κ°€μš”?
    • URL은 λ­”κ°€μš”?
    • HTTP/1.1 κ³Ό HTTP/2.0의 μ°¨μ΄λŠ” λ­”κ°€μš”?
    • HTTPSλŠ” HTTPλž‘ 뭐가 λ‹€λ₯Έκ°€μš”?
    • 심화) κ³΅κ°œν‚€ (λΉ„λŒ€μΉ­ν‚€) 방식이 λ­”κ°€μš”?
  • μΏ ν‚€ μ„Έμ…˜ πŸ”₯

    • μΏ ν‚€, μ„Έμ…˜μ„ μ™œ μ“°λ‚˜μš”?
    • μΏ ν‚€κ°€ λ­”κ°€μš”?
    • μ„Έμ…˜μ΄ λ­”κ°€μš”?
    • 쿠킀와 μ„Έμ…˜μ˜ μ°¨μ΄λŠ” μ–΄λ–€ 점이 μžˆμ„κΉŒμš”?
  • CORS πŸ”₯

    • CORSκ°€ λ­”κ°€μš”?
    • CORSλ₯Ό κ²ͺκ³  직접 ν•΄κ²°ν•΄ λ³Έ κ²½ν—˜μ΄ 있으면 λ§ν•΄μ£Όμ„Έμš”
  • μ›ΉνŒ© πŸ”₯

    • μ›ΉνŒ©μ΄λž€?
    • λͺ¨λ“ˆμ΄λž€?
    • λͺ¨λ“ˆ λ²ˆλ“€λ§μ΄λž€?
    • μ›ΉνŒ©μ΄ λ“±μž₯ν•œ 이유 μ›ΉνŒ© μ‚¬μš© μ‹œμ— 이점
    • λ°”λ²¨μ΄λž€?
    • μ›ΉνŒ©μ˜ μ£Όμš” 속성 4가지
  • νƒ€μž…κ³Ό μΈν„°νŽ˜μ΄μŠ€ πŸ”₯

    • νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ™œ μ“°λ‚˜μš”? (본인이 λŠλ‚€μ )
    • νƒ€μž…κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ 차이λ₯Ό μ•„λ‚˜μš”?
    • μ œλ„€λ¦­μ΄λž€?

ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ

ν”„λ‘œμ„ΈμŠ€κ°€ λ­”κ°€μš”?

ν”„λ‘œμ„ΈμŠ€λŠ” μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° μžμ›μ„ 할당받은 μž‘μ—…μ˜ λ‹¨μœ„μ΄λ‹€

μŠ€λ ˆλ“œκ°€ λ­”κ°€μš”?

μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ 할당받은 μžμ›μ„ μ΄μš©ν•˜λŠ” μ‹€ν–‰ νλ¦„μ˜ λ‹¨μœ„μ΄λ‹€

ν”„λ‘œκ·Έλž¨ > ν”„λ‘œμ„ΈμŠ€ > μŠ€λ ˆλ“œ πŸ“Œ

좜처: Link πŸ”₯

ν”„λ‘œκ·Έλž¨ > ν”„λ‘œμ„ΈμŠ€ πŸ”₯

λ¨Όμ € ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ— λŒ€ν•΄ 본격적으둜 μ„€λͺ…ν•˜κΈ° 전에 ν”„λ‘œκ·Έλž¨μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•˜κ³  κ°€μ•Ό ν•œλ‹€.

ν”„λ‘œκ·Έλž¨μ΄λž€, 파일이 μ €μž₯ μž₯μΉ˜μ— μ €μž₯λ˜μ–΄ μžˆμ§€λ§Œ λ©”λͺ¨λ¦¬μ—λŠ” μ˜¬λΌκ°€μ§€ μ•Šμ€ 정적인 μƒνƒœ λ₯Ό λ§ν•œλ‹€.

  1. λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€ μžˆμ§€ μ•Šμ€ : 아직 μš΄μ˜μ²΄μ œκ°€ ν”„λ‘œκ·Έλž¨μ—κ²Œ 독립적인 λ©”λͺ¨λ¦¬ 곡간을 할당해주지 μ•Šμ•˜λ‹€λŠ” λœ»μ΄λ‹€. λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ€ μš΄μ˜μ²΄μ œκ°€ μ‹€ν–‰λ˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήν•΄ μ€˜μ•Ό 싀행될 수 μžˆλ‹€.

  2. 정적인 μƒνƒœ : μ •μ μ΄λΌλŠ” 단어 κ·ΈλŒ€λ‘œ, 아직 μ‹€ν–‰λ˜μ§€ μ•Šκ³  κ°€λ§Œνžˆ μžˆλ‹€λŠ” λœ»μ΄λ‹€.

ν”„λ‘œκ·Έλž¨μ΄λΌλŠ” λ‹¨μ–΄λŠ” 아직 μ‹€ν–‰λ˜μ§€ μ•Šμ€ 파일 κ·Έ 자체λ₯Ό κ°€λ¦¬ν‚€λŠ” 말이닀. κ·Έλƒ₯ μ½”λ“œ 덩어리닀.

ν”„λ‘œκ·Έλž¨μ—κ²Œ 의미λ₯Ό λΆ€μ—¬ν•˜κΈ° μœ„ν•΄ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•΄ 보자.

ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” μˆœκ°„ ν•΄λ‹Ή νŒŒμΌμ€ 컴퓨터 λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€κ²Œ 되고, 이 μƒνƒœλ₯Ό 동적인 μƒνƒœλΌκ³  ν•˜λ©° 이 μƒνƒœμ˜ ν”„λ‘œκ·Έλž¨μ„ ν”„λ‘œμ„ΈμŠ€ 라고 ν•œλ‹€.

λ”°λΌμ„œ μœ„ν‚€ν”Όλ””μ•„μ—μ„œλŠ” ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•΄ μ •μ˜λ₯Ό 내릴 λ•Œ κ·Έλƒ₯ μ‹€ν–‰λ˜κ³  μžˆλŠ” 컴퓨터 ν”„λ‘œκ·Έλž¨ 이라고 μ •μ˜λ₯Ό 내리고 있으며, μŠ€μΌ€μ€„λ§ λ‹¨κ³„μ—μ„œμ˜ "μž‘μ—…" κ³Ό 같은 단어라고 봐도 λ¬΄λ°©ν•˜λ‹€κ³  ν•˜κ³  μžˆλ‹€.

ν•œ 쀄 μš”μ•½: ν”„λ‘œκ·Έλž¨μ€ μ½”λ“œ 덩어리 파일, κ·Έ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•œ 게 ν”„λ‘œμ„ΈμŠ€

ν”„λ‘œμ„ΈμŠ€ > μŠ€λ ˆλ“œ πŸ”₯

κ³Όκ±°μ—λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ μ‹€ν–‰ μ‹œμž‘λΆ€ν„° μ‹€ν–‰ λκΉŒμ§€ ν”„λ‘œμ„ΈμŠ€ ν•˜λ‚˜λ§Œμ„ μ‚¬μš©ν•΄μ„œ μ§„ν–‰ν–ˆλ‹€κ³  ν•œλ‹€. ν•˜μ§€λ§Œ μ‹œκ°„μ΄ 흐λ₯Όμˆ˜λ‘ ν”„λ‘œκ·Έλž¨μ΄ λ³΅μž‘ν•΄μ§€κ³  ν”„λ‘œμ„ΈμŠ€ ν•˜λ‚˜λ§Œμ„ μ‚¬μš©ν•΄μ„œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ°λŠ” λ²…μ°¨κ²Œ λ˜μ—ˆλ‹€. μ‹€μ œλ‘œ μ΄μ œλŠ” ν”„λ‘œκ·Έλž¨ ν•˜λ‚˜κ°€ λ‹¨μˆœνžˆ ν•œ 가지 μž‘μ—…λ§Œμ„ ν•˜λŠ” κ²½μš°λŠ” μ—†λ‹€. 그러면 이제 μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ?

μ‰½κ²Œ λ– μ˜€λ₯΄λŠ” 방법은, "ν•œ ν”„λ‘œκ·Έλž¨μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ—¬λŸ¬ 개 λ§Œλ“€λ©΄ λ˜μ§€ μ•Šμ„κΉŒ?" 생각이 λ“€μ§€λ§Œ μ΄λŠ” λΆˆκ°€λŠ₯ν•œ μΌμ΄μ—ˆλ‹€. μ™œλƒν•˜λ©΄ μš΄μ˜μ²΄μ œλŠ” μ•ˆμ „μ„±μ„ μœ„ν•΄μ„œ ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ μžμ‹ μ—κ²Œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ λ‚΄μ˜ μ •λ³΄μ—λ§Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ œμ•½μ„ 두고 있고, 이λ₯Ό λ²—μ–΄λ‚˜λŠ” 정보에 μ ‘κ·Όν•˜λ €λ©΄ 였λ₯˜κ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

μ•„λ¬΄νŠΌ ν”„λ‘œμ„ΈμŠ€μ™€λŠ” λ‹€λ₯Έ 더 μž‘μ€ μ‹€ν–‰ λ‹¨μœ„ κ°œλ…μ΄ ν•„μš”ν•˜κ²Œ λ˜μ—ˆκ³ , 이 κ°œλ…μ΄ λ°”λ‘œ μŠ€λ ˆλ“œ λ‹€.

μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ™€ λ‹€λ₯΄κ²Œ μŠ€λ ˆλ“œ κ°„ λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜λ©° μž‘λ™ν•œλ‹€.

μŠ€λ ˆλ“œλΌλ¦¬ ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ„ κ³΅μœ ν•˜λ©΄μ„œ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ νλ¦„μ˜ 일뢀가 λ˜λŠ” 것이닀.

μ•„κΉŒ ν”„λ‘œκ·Έλž¨μ΄ μ½”λ“œ 덩어리라고 ν–ˆλŠ”λ°, μŠ€λ ˆλ“œλ„ μ½”λ“œμ— λΉ„μœ ν•˜μžλ©΄ μŠ€λ ˆλ“œλŠ” μ½”λ“œ 내에 μ„ μ–Έλœ ν•¨μˆ˜λ“€μ΄ 되고 λ”°λΌμ„œ function Add(){} λ˜ν•œ μΌμ’…μ˜ μŠ€λ ˆλ“œλΌκ³  λ³Ό 수 있게 λ˜λŠ” 것이닀.

μŠ€λ ˆλ“œ

ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ μž‘λ™ 방식에 λŒ€ν•œ 더 μžμ„Έν•œ μ„€λͺ…

μš΄μ˜μ²΄μ œλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ, ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ 각각 λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„, Code/Data/Stack/Heap의 ν˜•μ‹μœΌλ‘œ ν• λ‹Ήν•΄ μ€€λ‹€.

각각의 λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν• λ‹Ήν•΄ μ£ΌκΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ λ³€μˆ˜λ‚˜ μžλ£Œμ— μ ‘κ·Όν•  수 μ—†λ‹€.

ν”„λ‘œμ„ΈμŠ€μ™€ OS

이와 λ‹€λ₯΄κ²Œ μŠ€λ ˆλ“œλŠ” 같은 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ„œλ‘œ κ³΅μœ ν•  수 μžˆλ‹€.

ν”„λ‘œμ„ΈμŠ€κ°€ 할당받은 λ©”λͺ¨λ¦¬ μ˜μ—­ λ‚΄μ—μ„œ Stack ν˜•μ‹μœΌλ‘œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ λ”°λ‘œ ν• λ‹Ήλ°›κ³ , λ‚˜λ¨Έμ§€ Code/Data/Head ν˜•μ‹μœΌλ‘œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ κ³΅μœ ν•œλ‹€.

λ”°λΌμ„œ 각각의 μŠ€λ ˆλ“œλŠ” λ³„λ„μ˜ μŠ€νƒμ„ κ°€μ§€κ³ μžˆμ§€λ§Œ νž™ λ©”λͺ¨λ¦¬λŠ” μ„œλ‘œ 읽고 μ“Έ 수 있게 λœλ‹€.

μŠ€λ ˆλ“œ

ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œλŠ” μ–΄λ–€ 차이가 μžˆλ‚˜μš”?

κ·Έλƒ₯ 면접관이 ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ 차이가 κΆκΈˆν•΄μ„œ λ¬Όμ–΄λ³ΌκΉŒ?

μ•„λ‹ˆλ‹€. 기본적인 μ΄μœ λŠ” λ³Έλ¬Έ 맨 μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ“― μ§€μ›μžκ°€ ν”„λ‘œκ·Έλž¨, ν”„λ‘œμ„ΈμŠ€, μŠ€λ ˆλ“œμ— λŒ€ν•œ κΈ°λ³Έ κ°œλ…μ— λŒ€ν•΄ 잘 μ΄ν•΄ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•¨μ΄λ‹€.


ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œλŠ” κ°œλ…μ˜ λ²”μœ„λΆ€ν„° λ‹€λ₯΄λ‹€. μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ μ•ˆμ— ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ΄λ‹€.

ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” μˆœκ°„ ν•΄λ‹Ή 파일이 컴퓨터 λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€κ²Œ 되고, 이 동적인 μƒνƒœμ˜ ν”„λ‘œκ·Έλž¨μ„ ν”„λ‘œμ„ΈμŠ€λΌκ³  ν•œλ‹€.

μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό κ΅¬μ„±ν•˜λŠ” 더 μž‘μ€ μ‹€ν–‰ λ‹¨μœ„μ˜ κ°œλ…μ΄λ‹€.

ν”„λ‘œμ„ΈμŠ€λŠ” λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° λ…μžμ μΈ μ‹œμŠ€ν…œ μžμ›μ„ ν• λ‹Ή λ°›λŠ” 반면, μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄λΆ€μ—μ„œ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ 같은 ν”„λ‘œμ„ΈμŠ€ λ‚΄ λ‹€λ₯Έ μŠ€λ ˆλ“œμ™€ κ³΅μœ ν•œλ‹€.

μ‹±κΈ€ μŠ€λ ˆλ“œμ™€ λ©€ν‹° μŠ€λ ˆλ“œ

좜처: velog, μ€μ§„λ‹˜μ˜ κΈ€ 'μ‹±κΈ€μŠ€λ ˆλ“œ, λ©€ν‹°μŠ€λ ˆλ“œμ˜ 의미'

μ‹±κΈ€ μŠ€λ ˆλ“œμ™€ λ©€ν‹° μŠ€λ ˆλ“œ

μ‹±κΈ€ μŠ€λ ˆλ“œ

ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€μ—μ„œ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œ μ‹€ν–‰

ν•˜λ‚˜μ˜ λ ˆμ§€μŠ€ν„°μ™€ μŠ€νƒμœΌλ‘œ ν‘œν˜„.

μ‹±κΈ€ μŠ€λ ˆλ“œμ˜ μž₯점

μžμ› 접근데 λŒ€ν•œ 동기화λ₯Ό 신경쓰지 μ•Šμ•„λ„ λœλ‹€.

μ—¬λŸ¬κ°œμ˜ μŠ€λ ˆλ“œκ°€ 곡유된 μžμ›μ„ μ‚¬μš©ν•  경우, 각 μŠ€λ ˆλ“œκ°€ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μ–»κ²Œ ν•˜λ €λ©΄ 곡용 μžμ›μ— λŒ€ν•œ 접근이 ν†΅μ œλ˜μ–΄μ•Ό ν•˜λ©°, 이 μž‘μ—…μ€ ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ λ§Žμ€ λ…Έλ ₯을 μš”κ΅¬ν•˜κ³  λ§Žμ€ λΉ„μš©μ„ λ°œμƒμ‹œν‚¨λ‹€. 단일 μŠ€λ ˆλ“œ λͺ¨λΈμ—μ„œλŠ” μ΄λŸ¬ν•œ μž‘μ—…μ΄ ν•„μš”ν•˜μ§€ μ•Šλ‹€.

μž‘μ—…μ „ν™˜ μž‘μ—…μ„ μš”κ΅¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

μž‘μ—…μ „ν™˜μ€ μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€κ°€ ν•˜λ‚˜μ˜ ν”„λ‘œμ„Έμ„œλ₯Ό κ³΅μœ ν•  λ•Œ λ°œμƒν•˜λŠ” μž‘μ—…μœΌλ‘œ λ§Žμ€ λΉ„μš©μ„ ν•„μš”λ‘œ ν•œλ‹€.

μ‹±κΈ€ μŠ€λ ˆλ“œμ˜ 단점

μ—¬λŸ¬ 개의 CPUλ₯Ό ν™œμš©ν•˜μ§€ λͺ»ν•œλ‹€.

ν”„λ‘œμ„Έμ„œλ₯Ό μ΅œλŒ€ν•œ ν™œμš©ν•˜κ²Œ ν•˜λ €λ©΄ cluster λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜κ±°λ‚˜, μ™ΈλΆ€μ—μ„œ μ—¬λŸ¬ 개의 ν”„λ‘œκ·Έλž¨ μΈμŠ€ν„΄μŠ€λ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” 방법을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

두 개의 μž‘μ—…μ„ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ‘œ μ²˜λ¦¬ν•˜λŠ” κ²½μš°μ™€, 두 개의 μŠ€λ ˆλ“œλ‘œ μ²˜λ¦¬ν•˜λŠ” 경우λ₯Ό κ°€μ •ν–ˆμ„ λ•Œ, ν›„μžμ˜ κ²½μš°λŠ” 짧은 μ‹œκ°„ λ™μ•ˆ 2개의 μŠ€λ ˆλ“œκ°€ λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. κ·Έλž˜μ„œ λ™μ‹œμ— 두 μž‘μ—…μ΄ μ²˜λ¦¬λ˜λŠ” 것과 같이 느끼게 λœλ‹€.

ν•˜μ§€λ§Œ μ˜€νžˆμ—¬ 두 개의 μŠ€λ ˆλ“œλ‘œ μž‘μ—…ν•œ μ‹œκ°„μ΄ μ‹±κΈ€μŠ€λ ˆλ“œλ‘œ μž‘μ—…ν•œ μ‹œκ°„λ³΄λ‹€ 더 걸릴 μˆ˜λ„ μžˆλŠ”λ°, κ·Έ μ΄μœ λŠ” μŠ€λ ˆλ“œ κ°„μ˜ μž‘μ—…μ „ν™˜(context switching)에 μ‹œκ°„μ΄ 걸리기 λ•Œλ¬Έμ΄λ‹€.

λ”°λΌμ„œ λ‹¨μˆœνžˆ CPUλ§Œμ„ μ‚¬μš©ν•˜λŠ” κ³„μ‚°μž‘μ—…μ΄λΌλ©΄, 였히렀 λ©€ν‹°μŠ€λ ˆλ“œλ³΄λ‹€ μ‹±κΈ€μŠ€λ ˆλ“œλ‘œ ν”„λ‘œκ·Έλž˜λ°ν•˜λŠ” 것이 더 νš¨μœ¨μ μ΄λ‹€.

λ©€ν‹° μŠ€λ ˆλ“œ

ν”„λ‘œκ·Έλž¨μ„ λ‹€μˆ˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ μ‹€ν–‰.

ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μžμ›μ„ κ³΅μœ ν•˜μ—¬ μžμ› 생성과 κ΄€λ¦¬μ˜ 쀑볡을 μ΅œμ†Œν™”

μ„œλ²„κ°€ λ§Žμ€ μš”μ²­μ„ 효율적으둜 μˆ˜ν–‰ν•  수 μžˆλŠ” ν™˜κ²½μ„ 제곡

각각의 μŠ€λ ˆλ“œκ°€ 고유의 λ ˆμ§€μŠ€ν„°μ™€ μŠ€νƒμœΌλ‘œ ν‘œν˜„λ¨.

λ©€ν‹° μŠ€λ ˆλ“œμ˜ μž₯점

μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것보닀 κΈ°μ‘΄ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜λŠ” 것이 λΉ λ₯΄λ‹€.

ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›κ³Ό μƒνƒœλ₯Ό κ³΅μœ ν•˜μ—¬ 효율적으둜 운영이 κ°€λŠ₯ν•˜λ‹€.

ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—…μ „ν™˜λ³΄λ‹€ μŠ€λ ˆλ“œμ˜ μž‘μ—…μ „ν™˜μ΄ 더 λΉ λ₯΄λ‹€.

λ©€ν‹° μŠ€λ ˆλ“œμ˜ 단점

ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ 싀행쀑일 λ•ŒλŠ” μ‹€ν–‰μ‹œκ°„μ΄ 였히렀 지연될 수 μžˆλ‹€.

λ©€ν‹° μŠ€λ ˆλ”©μ„ μœ„ν•΄ 운영체제의 지원이 ν•„μš”ν•˜λ‹€.

μŠ€λ ˆλ“œ μŠ€μΌ€μ₯΄λ§μ„ 신경써야 ν•œλ‹€.

HTTP

Link πŸ”₯

HTTPλž€ λ­”κ°€μš”?

HTTPλŠ” HyperText Transfer Protocol의 μ•½μžλ‘œ 데이터λ₯Ό μ£Όκ³ λ°›κΈ° μœ„ν•΄ μ •μ˜ν•œ 톡신 ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€

웹을 κΈ°μ€€μœΌλ‘œ λΈŒλΌμš°μ €μ™€ μ„œλ²„ 간에 데이터λ₯Ό μ£Όκ³ λ°›κΈ° μœ„ν•­ λ°©μ‹μœΌλ‘œ HTTP ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.


HTTP ν”„λ‘œν† μ½œμ˜ κ°€μž₯ 큰 νŠΉμ§•μ€ λ­”κ°€μš”?

HTTP ν”„λ‘œν† μ½œμ€ μƒνƒœκ°€ μ—†λŠ” (stateless) ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μƒνƒœκ°€ μ—†λ‹€λŠ” 말은 데이터λ₯Ό μ£Όκ³  λ°›κΈ° μœ„ν•œ 각각의 데이터 μš”μ²­μ΄ μ„œλ‘œ λ…λ¦½μ μœΌλ‘œ 관리가 λœλ‹€λŠ” λ§μž…λ‹ˆλ‹€.

이전에 λ³΄λƒˆλ˜ 데이터 μš”μ²­κ³Ό λ‹€μŒμ— 보낼 데이터 μš”μ²­μ΄ μ„œλ‘œ 관련이 μ—†λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ νŠΉμ§• 덕뢄에 μ„œλ²„λŠ” μ„Έμ…˜κ³Ό 같은 λ³„λ„μ˜ μΆ”κ°€ 정보λ₯Ό κ΄€λ¦¬ν•˜μ§€ μ•Šμ•„λ„ 되고, λ‹€μˆ˜μ˜ μš”μ²­ 처리 및 μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό 쀄일 수 μžˆλŠ” μ„±λŠ₯ μƒμ˜ 이점이 μƒκΉλ‹ˆλ‹€.

HTTP ν”„λ‘œν† μ½œμ€ 일반적으둜 TCP/IP 톡신 μœ„μ—μ„œ λ™μž‘ν•˜λ©° κΈ°λ³Έ ν¬νŠΈλŠ” 80λ²ˆμž…λ‹ˆλ‹€


URL은 λ­”κ°€μš”?

URL(Uniform Resource Locators)은 μ„œλ²„μ— μžμ›(resource)λ₯Ό μš”μ²­ν•˜κΈ° μœ„ν•΄ μž…λ ₯ν•˜λŠ” 영문 μ£Όμ†Œμž…λ‹ˆλ‹€.

숫자둜 λ˜μ–΄μžˆλŠ” IPμ£Όμ†Œλ³΄λ‹€λŠ” 훨씬 κΈ°μ–΅ν•˜κΈ° μ‰½λ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

λΈŒλΌμš°μ €μ—μ„œλŠ” μ΄λ ‡κ²Œ url둜 λ˜μ–΄μžˆλŠ” HTTP μš”μ²­μ„ DNS(Domain Name System)λ₯Ό 톡해 host에 ν•΄λ‹Ήν•˜λŠ” μ‹€μ œ IP μ£Όμ†Œλ‘œ λ³€ν™˜ν•˜μ—¬ μ„œλ²„μ— μš”μ²­(Request)을 λ³΄λƒ…λ‹ˆλ‹€

URL의 κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€

URL ꡬ쑰


HTTP/1.1 κ³Ό HTTP/2.0의 μ°¨μ΄λŠ” λ­”κ°€μš”?

HTTP/1.1은 기본적으둜 컀λ„₯μ…˜ λ‹Ή ν•˜λ‚˜μ˜ μš”μ²­κ³Ό μ‘λ‹΅λ§Œ μ²˜λ¦¬ν•œλ‹€.

즉, μ—¬λŸ¬ 개의 μš”μ²­μ„ ν•œ λ²ˆμ— 전솑할 수 μ—†κ³  응닡 λ˜ν•œ λ§ˆμ°¬κ°€μ§€λ‹€.

λ”°λΌμ„œ HTML λ¬Έμ„œ 내에 ν¬ν•¨λœ μ—¬λŸ¬ 개의 λ¦¬μ†ŒμŠ€ μš”μ²­, 즉 CSS νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” link νƒœκ·Έ, 이미지 νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” img νƒœκ·Έ, μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό λ‘œλ“œν•˜λŠ” script νƒœκ·Έ 등에 μ˜ν•œ λ¦¬μ†ŒμŠ€ μš”μ²­μ΄ κ°œλ³„μ μœΌλ‘œ μ „μ†‘λ˜κ³  응닡 λ˜ν•œ κ°œλ³„μ μœΌλ‘œ μ „μ†‘λœλ‹€.

이처럼 HTTP/1.1은 λ¦¬μ†ŒμŠ€μ˜ λ™μ‹œ 전솑이 λΆˆκ°€λŠ₯ν•œ κ΅¬μ‘°μ΄λ―€λ‘œ μš”μ²­ν•  λ¦¬μ†ŒμŠ€μ˜ κ°œμˆ˜μ— λΉ„λ‘€ν•˜μ—¬ 응닡 μ‹œκ°„λ„ μ¦κ°€ν•˜λŠ” 단점이 μžˆλ‹€.

HTTP 1.1

HTTP/2λŠ” 컀λ„₯μ…˜λ‹Ή μ—¬λŸ¬ 개의 μš”μ²­κ³Ό 응닡, 즉 닀쀑 μš”μ²­/응닡이 κ°€λŠ₯ν•˜λ‹€.

μ—¬λŸ¬ λ¦¬μ†ŒμŠ€μ˜ λ™μ‹œ 전솑이 κ°€λŠ₯ν•˜λ―€λ‘œ HTTP/1.1에 λΉ„ν•΄ νŽ˜μ΄μ§€ λ‘œλ“œ 속도가 μ•½ 50% 정도 λΉ λ₯΄λ‹€κ³  μ•Œλ €μ Έ μžˆλ‹€.

HTTP 2.0


HTTPSλŠ” HTTPλž‘ 뭐가 λ‹€λ₯Έκ°€μš”?

Link πŸ”₯ Youtube Link πŸ”₯

HTTPSλŠ” HTTP에 데이터 μ•”ν˜Έν™”κ°€ μΆ”κ°€λœ ν”„λ‘œν† μ½œμ΄λ‹€.

HTTPSλŠ” HTTP(80번)와 λ‹€λ₯΄κ²Œ 443번 포트λ₯Ό μ‚¬μš©ν•˜λ©°, λ„€νŠΈμ›Œν¬ μƒμ—μ„œ 쀑간에 제3μžκ°€ 정보λ₯Ό λ³Ό 수 없도둝 κ³΅κ°œν‚€ μ•”ν˜Έν™”λ₯Ό μ§€μ›ν•˜κ³  μžˆλ‹€.

HTTPSλ₯Ό μ‚¬μš©ν•  경우 λ‚΄κ°€ λΈŒλΌμš°μ €λ₯Ό 톡해 μž…λ ₯ν•˜λŠ” 정보λ₯Ό (ex: form data) λ‹€λ₯Έ λˆ„κ΅°κ°€κ°€ 훔쳐보지 λͺ»ν•˜κ²Œ λ§Œλ“œλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

HTTP ν˜•μ‹μœΌλ‘œ μž…λ ₯ν•œ 정보λ₯Ό 보낼 경우, μž…λ ₯ν•œ ν˜•νƒœ κ·ΈλŒ€λ‘œ λ³΄λ‚΄μ§€κ²Œ λœλ‹€

id: my_naver_id
pw: my_naver_pw

λ”°λΌμ„œ λˆ„κ΅°κ°€κ°€ μ•…μ˜μ μœΌλ‘œ 이 μš”μ²­μ„ μΊμΉ˜ν•΄μ„œ λ‚΄ 정보λ₯Ό λ“€μ—¬λ‹€ λ³Έλ‹€λ©΄, κ·ΈλŒ€λ‘œ 아이디와 λΉ„λ°€λ²ˆν˜Έκ°€ λ…ΈμΆœλ  수 μžˆλ‹€.

ν•˜μ§€λ§Œ HTTPSλ₯Ό μ‚¬μš©ν•  경우, 이 톡신 μš”μ²­(request)을 보낼 λ•Œ 응닡(response)을 ν•΄μ£ΌλŠ” μ„œλ²„λ§Œ μ•Œμ•„λ³Ό 수 μžˆλ„λ‘ 정보λ₯Ό μ•”ν˜Έν™”ν•΄μ„œ λ³΄λ‚΄κ²Œ λœλ‹€

μ‹€μ œλ‘œ μ΄λ ‡λ‹€λŠ” 것은 μ•„λ‹ˆκ³  이해λ₯Ό λ•κΈ°μœ„ν•΄ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ 😁

id: ^!@$!A_!@E!@#(_a*&@)
pw: !@#%_+#$%_!#@!$

λ˜ν•œ HTTPSλŠ” κΈ°κ΄€μœΌλ‘œλΆ€ν„° κ²€μ¦λœ μ‚¬μ΄νŠΈλ§Œ μ£Όμ†Œμ— HTTPS μ‚¬μš©μ΄ ν—ˆκ°€λ˜κΈ° λ•Œλ¬Έμ—, λ‚΄κ°€ μ ‘μ†ν•œ μ‚¬μ΄νŠΈκ°€ μƒλŒ€μ μœΌλ‘œ μ•ˆμ „ν•œ μ£Όμ†Œλ₯Ό κ°€μ‘ŒμŒμ„ 증λͺ…ν•˜λŠ” 것이기도 ν•˜λ‹€


심화) κ³΅κ°œν‚€ (λΉ„λŒ€μΉ­ν‚€) 방식이 λ­”κ°€μš”?

HTTPSλŠ” κ³΅κ°œν‚€/κ°œμΈν‚€ μ•”ν˜Έν™” 방식을 μ΄μš©ν•΄ 데이터λ₯Ό μ•”ν˜Έν™”ν•˜κ³  μžˆλ‹€. κ³΅κ°œν‚€μ™€ κ°œμΈν‚€λŠ” μ„œλ‘œλ₯Ό μœ„ν•œ 1쌍의 킀이닀.

  • κ³΅κ°œν‚€: λͺ¨λ‘μ—κ²Œ 곡개된, λ˜λŠ” κ³΅κ°œκ°€ κ°€λŠ₯ν•œ ν‚€
  • κ°œμΈν‚€: λ‚˜λ§Œ 가지고 μ•Œκ³  μžˆμ–΄μ•Ό ν•˜λŠ” ν‚€

κ³΅κ°œν‚€μ™€ κ°œμΈν‚€λ‘œ μ•”ν˜Έν™”ν•˜λ©΄ λ‹€μŒκ³Ό 같은 효과λ₯Ό 얻을 수 μžˆλ‹€.

  • κ³΅κ°œν‚€ μ•”ν˜Έν™”: κ³΅κ°œν‚€λ‘œ μ•”ν˜Έν™”λ₯Ό ν•˜λ©΄ κ°œμΈν‚€λ‘œλ§Œ λ³΅ν˜Έν™”ν•  수 μžˆλ‹€. -> κ°œμΈν‚€λŠ” λ‚˜λ§Œ 가지고 μžˆμœΌλ―€λ‘œ, λ‚˜λ§Œ λ³Ό 수 μžˆλ‹€.
  • κ°œμΈν‚€ μ•”ν˜Έν™”: κ°œμΈν‚€λ‘œ μ•”ν˜Έν™”ν•˜λ©΄ κ³΅κ°œν‚€λ‘œλ§Œ λ³΅ν˜Έν™”ν•  수 μžˆλ‹€. -> κ³΅κ°œν‚€λŠ” λͺ¨λ‘μ—κ²Œ κ³΅κ°œλ˜μ–΄ μžˆμœΌλ―€λ‘œ, λ‚΄κ°€ μΈμ¦ν•œ μ •λ³΄μž„μ„ μ•Œλ € 신뒰성을 보μž₯ν•  수 μžˆλ‹€.

HTTPSλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 인증된 κΈ°κ΄€ CA(Certificate Authority)에 κ³΅κ°œν‚€λ₯Ό μ „μ†‘ν•˜μ—¬ μΈμ¦μ„œλ₯Ό λ°œκΈ‰λ°›μ•„μ•Ό ν•œλ‹€.

μΏ ν‚€ μ„Έμ…˜

Link πŸ”₯

μΏ ν‚€, μ„Έμ…˜μ„ μ™œ μ“°λ‚˜μš”?

HTTPλŠ” 항상 μ—°κ²°λ˜μ–΄μžˆλŠ” 것이 μ•„λ‹Œ ν•„μš”ν•  λ•Œλ§ˆλ‹€ μš”μ²­μ„ 보내고 응닡을 λ°˜λŠ” λΉ„μ—°κ²°μ„±μ΄λΌλŠ” νŠΉμ§•μ„ 가지고 μžˆλ‹€.

μ΄λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 응닡을 λ°›μœΌλ©΄ μ„œλ²„λŠ” 접속을 λŠλŠ”λ‹€λŠ” 것인데, 연결이 λλ‚˜λ©΄ μƒνƒœ 정보가 μœ μ§€λ˜μ§€ μ•ŠλŠ” νŠΉμ„±μ΄ μžˆλ‹€.

λ‘œκ·ΈμΈμ„ ν•œ λ’€, λ‹€λ₯Έ λ„λ©”μΈμœΌλ‘œ μ΄λ™ν–ˆλ‹€ κΈ°μ‘΄ μ‚¬μ΄νŠΈλ‘œ λŒμ•„μ˜€λ©΄ 둜그인 정보가 μœ μ§€λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것

μ΄λ ‡κ²Œ μœ μ§€λ˜μ§€ μ•ŠλŠ” 둜그인 정보λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•œ 방법이 쿠킀와 μ„Έμ…˜μ΄λ‹€.


μΏ ν‚€κ°€ λ­”κ°€μš”?

HTTP의 μΌμ’…μœΌλ‘œ μ‚¬μš©μžκ°€ μ–΄λ– ν•œ μ›Ή μ‚¬μ΄νŠΈλ₯Ό λ°©λ¬Έν•  경우, κ·Έ μ‚¬μ΄νŠΈκ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ” μ„œλ²„μ—μ„œ μ‚¬μš©μžμ˜ 컴퓨터에 μ €μž₯ν•˜λŠ” μž‘μ€ 기둝 정보 νŒŒμΌμ΄λ‹€.

HTTPμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœ 정보λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ˜ PC에 μ €μž₯ν•˜μ˜€λ‹€κ°€ ν•„μš”μ‹œ 정보λ₯Ό μ°Έμ‘°ν•˜κ±°λ‚˜ μž¬μ‚¬μš©ν•  수 μžˆλ‹€.


μΏ ν‚€μ˜ νŠΉμ§•

  • 이름, κ°’, 만료일(μ €μž₯ κΈ°κ°„ μ„€μ •), 경둜 μ •λ³΄λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈμ— 총 300개의 μΏ ν‚€λ₯Ό μ €μž₯ν•  수 μžˆλ‹€.
  • ν•˜λ‚˜μ˜ 도메인 λ‹Ή 20개의 μΏ ν‚€λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€
  • ν•˜λ‚˜μ˜ μΏ ν‚€λŠ” 4KB(=4096byte)κΉŒμ§€ μ €μž₯ κ°€λŠ₯ν•˜λ‹€.

μΏ ν‚€μ˜ λ™μž‘ μˆœμ„œ4

cookie

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•œλ‹€ (μ‚¬μš©μžκ°€ μ›Ήμ‚¬μ΄νŠΈ μ ‘κ·Ό) μ›Ή μ„œλ²„λŠ” μΏ ν‚€λ₯Ό μƒμ„±ν•œλ‹€
  2. μƒμ„±ν•œ 쿠킀에 정보λ₯Ό λ‹΄μ•„ HTTP 화면을 λŒλ €μ€„ λ•Œ, 같이 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λŒλ €μ€€λ‹€
  3. λ„˜κ²¨ 받은 μΏ ν‚€λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 가지고 μžˆλ‹€κ°€(둜컬 PC에 μ €μž₯) λ‹€μ‹œ μ„œλ²„μ— μš”μ²­ν•  λ•Œ μš”μ²­κ³Ό ν•¨κ»˜ μΏ ν‚€λ₯Ό μ „μ†‘ν•œλ‹€
  4. 동일 μ‚¬μ΄νŠΈ μž¬λ°©λ¬Έμ‹œ ν΄λΌμ΄μ–ΈνŠΈμ˜ PC에 ν•΄λ‹Ή μΏ ν‚€κ°€ μžˆλŠ” 경우, μš”μ²­ νŽ˜μ΄μ§€μ™€ ν•¨κ»˜ μΏ ν‚€λ₯Ό μ „μ†‘ν•œλ‹€

μ‚¬μš© μ˜ˆμ‹œ

  1. λ°©λ¬Έν–ˆλ˜ μ‚¬μ΄νŠΈμ— λ‹€μ‹œ λ°©λ¬Έ ν•˜μ˜€μ„ λ•Œ 아이디와 λΉ„λ°€λ²ˆν˜Έ μžλ™ μž…λ ₯
  2. νŒμ—…μ°½μ„ 톡해 "였늘 이 창을 λ‹€μ‹œ 보지 μ•ŠκΈ°" 체크

μΏ ν‚€μ˜ 약점

  1. μΏ ν‚€μ˜ νŠΉμ§•μœΌλ‘œλŠ” ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)단에 μ €μž₯λœλ‹€λŠ” 것이닀
  2. 즉 λ³΄μ•ˆμ— μ•½ν•  수 μžˆλ‹€
  3. μΏ ν‚€λ₯Ό ν›”μ³μ„œ 계정 μ ‘κ·Ό κΆŒν•œ 등을 νƒˆμ·¨ν•˜μ—¬ μœ μ €μ˜ 정보λ₯Ό μ•…μš©ν•  수 μžˆλ‹€
document.cookie λ₯Ό 톡해 μΏ ν‚€ μŠ€ν† λ¦¬μ§€μ— μ €μž₯된 μ‚¬μš©μž κΆŒν•œμ΄ μžˆλŠ” 쿠킀에 μ ‘κ·Ό

μ„Έμ…˜μ΄ λ­”κ°€μš”?

HTTP μ„Έμ…˜μ΄λž€ ν΄λΌμ΄μ΄μ–ΈνŠΈκ°€ μ›Ήμ„œλ²„μ— μ—°κ²°λœ μˆœκ°„λΆ€ν„° μ›Ή λΈŒλΌμš°μ €λ₯Ό λ‹«μ•„ μ„œλ²„μ™€μ˜ HTTP 톡신을 끝낼 λ•Œ κΉŒμ§€μ˜ κΈ°κ°„ 이닀.

ν•˜μ§€λ§Œ 보톡 μ„Έμ…˜μ΄λΌκ³  말할 λ•Œμ—λŠ” μ„œλ²„μ— μ„Έμ…˜μ— λŒ€ν•œ 정보(μ„Έμ…˜ μƒνƒœ, ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœ, μ„Έμ…˜ 데이터 λ“±)λ₯Ό μ €μž₯ν•΄ 놓고 μ„Έμ…˜ μΏ ν‚€( κ³ μœ ν•œ μ„Έμ…˜ ID κ°’ )λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ£Όμ–΄ μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό 식별할 수 μžˆλ„λ‘ ν•˜λŠ” λ°©μ‹μžμ²΄λ₯Ό μ˜λ―Έν•˜λŠ” 경우 κ°€ λ§Žλ‹€.


μ„Έμ…˜μ˜ νŠΉμ§•

  • λ”°λ‘œ μš©λŸ‰μ˜ μ œν•œμ΄ μ—†λ‹€ (μ„œλ²„μ˜ λŠ₯λ ₯에 따라 λ‹€λ₯Ό 수 μžˆλ‹€)
  • μ„œλ²„μ— μ„Έμ…˜ 객체λ₯Ό μƒμ„±ν•˜λ©° 각 ν΄λΌμ΄μ–ΈνŠΈ λ§ˆλ‹€ κ³ μœ ν•œ μ„Έμ…˜ ID 값을 λΆ€μ—¬ν•œλ‹€
  • μΏ ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„Έμ…˜ ID 값을 ν΄λΌμ΄μ–ΈνŠΈμ— 보낸닀
  • μ›Ή λΈŒλΌμš°μ €κ°€ μ’…λ£Œλ˜λ©΄ μ„Έμ…˜ μΏ ν‚€λŠ” μ‚­μ œλœλ‹€

μ„Έμ…˜μ˜ λ™μž‘ 방식

μ„Έμ…˜

  1. ν΄λΌμ΄μ–ΈνŠΈ νŽ˜μ΄μ§€κ°€ μš”μ²­ν•œλ‹€
  2. μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈλ§ˆλ‹€ κ°œλ³„μ˜ μ„Έμ…˜ IDλ₯Ό λΆ€μ—¬ν•œλ‹€
  3. ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­ν•  λ•Œλ§ˆλ‹€ μ„Έμ…˜ IDλ₯Ό μ„œλ²„μ— μ „λ‹¬ν•œλ‹€
  4. μ„œλ²„λŠ” 받은 μ„Έμ…˜ ID둜 ν΄λΌμ΄μ–ΈνŠΈ 정보λ₯Ό 가져와 ν™œμš©ν•œλ‹€

쿠킀와 μ„Έμ…˜μ˜ μ°¨μ΄λŠ” μ–΄λ–€ 점이 μžˆμ„κΉŒμš”?

  1. μ €μž₯ μœ„μΉ˜

    μΏ ν‚€: ν΄λΌμ΄μ–ΈνŠΈμ— 파일둜 μ €μž₯λ˜μ–΄ μžˆλ‹€

    μ„Έμ…˜: μ„œλ²„μ— μ €μž₯λ˜μ–΄ μžˆλ‹€

  2. λ³΄μ•ˆ

    μΏ ν‚€: ν΄λΌμ΄μ–ΈνŠΈμ˜ λΈŒλΌμš°μ € λ‘œμ»¬μ— μ €μž₯되기 λ•Œλ¬Έμ— λ³€μ§ˆλ˜κ±°λ‚˜ HTTP request μš”μ²­ μ‹œμ— 이λ₯Ό κ°ˆμ·¨λ‹Ήν•  수 μžˆμ–΄μ„œ λ³΄μ•ˆμ— μ·¨μ•½ν•˜λ‹€

    μ„Έμ…˜: μΏ ν‚€λ₯Ό μ΄μš©ν•΄μ„œ μ„Έμ…˜id만 μ €μž₯ν•˜κ³  κ·Έκ²ƒμœΌλ‘œ κ΅¬λΆ„ν•΄μ„œ μ„œλ²„μ—μ„œ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— λΉ„κ΅μ μœΌλ‘œ μ•ˆμ „ν•˜λ‹€

  3. 라이프 사이클

    μΏ ν‚€: λ§Œλ£Œμ‹œκ°„μ€ μžˆμ§€λ§Œ 파일둜 μ €μž₯되기 λ•Œλ¬Έμ— λΈŒλΌμš°μ €λ₯Ό μ’…λ£Œν•΄λ„ κ³„μ†ν•΄μ„œ 정보가 λ‚¨μ•„μžˆλ‹€. λ§Œλ£ŒκΈ°κ°„μ— 따라 μƒλŒ€μ μœΌλ‘œ λ„‰λ„‰ν•˜κ²Œ μΏ ν‚€λ₯Ό μ‚­μ œν•  λ•ŒκΉŒμ§€ μœ μ§€λœλ‹€

    μ„Έμ…˜: λ§Œλ£ŒκΈ°κ°„μ„ μ •ν•  μˆ˜λŠ” μžˆμ§€λ§Œ λΈŒλΌμš°μ €κ°€ μ’…λ£Œλ˜λ©΄ 그에 상관없이 μ‚­μ œλœλ‹€

  4. 속도

    μΏ ν‚€: 쿠킀에 정보가 있기 λ•Œλ¬Έμ— μ„œλ²„μ— μš”μ²­μ‹œ 속도가 λΉ λ₯΄λ‹€

    μ„Έμ…˜: 정보가 μ„œλ²„μ— 있기 λ•Œλ¬Έμ— μ²˜λ¦¬κ°€ μš”κ΅¬λ˜μ–΄ λΉ„κ΅μ μœΌλ‘œ λŠλ¦¬λ‹€

CORS

Link πŸ”₯

CORSκ°€ λ­”κ°€μš”?

CORSλŠ” Cross Origin Resource Sharing의 μ•½μžλ‘œ, ꡐ차 좜처 κ³΅μœ λΌλŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

Origin은 β‘  scheme, β‘‘ host, β‘’ port 둜 이루어진 도메인을 μ˜λ―Έν•©λ‹ˆλ‹€. (IE의 경우 portλ₯Ό λΉ„κ΅ν•˜μ§€ μ•ŠμŒ)

https://www.naver.com/

β‘  scheme : https
β‘‘ host: www.naver.com
β‘’ port: null (κ³΅κ°œλ˜μ§€ μ•ŠμŒ)

ν˜„μž¬ β‘  μžμ‹ μ΄ μ†ν•œ 좜처(Origin)λ₯Ό κΈ°μ€€μœΌλ‘œ β‘‘ λ‹€λ₯Έ 좜처(Origin)에 APIλ₯Ό μš”μ²­ν•˜κ²Œ 되면 λΈŒλΌμš°μ €μ—μ„œ 이 μš”μ²­μœΌλ‘œ λ„˜μ–΄μ˜€λŠ” κ²½κ³Όκ°€ μ•ˆμ „ν•œμ§€ νŒλ‹¨ν•˜κ²Œ λ˜λŠ”λ°,

응닡을 λ³΄λ‚΄λŠ” μΆœμ²˜κ°€ β‘  μžμ‹ μ΄ μ†ν•œ μΆœμ²˜κ°€ μ•„λ‹Œ, β‘‘ λ‹€λ₯Έ μΆœμ²˜μ—¬λ„ μ„œλ‘œ μ˜ˆμƒλ˜λŠ” 좜처라면 μš”μ²­μ— λŒ€ν•΄ ν—ˆμš©ν•΄μ£ΌλŠ” 응닡 헀더λ₯Ό 보내, λΈŒλΌμš°μ €κ°€ 응닡 κ²°κ³Όλ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

이λ₯Ό CORS(Cross Origin Resource Sharing)이라 ν•©λ‹ˆλ‹€.


μ™œ λΈŒλΌμš°μ €κ°€ CORS μš”μ²­μ„ μ²˜λ¦¬ν•˜λ‚˜μš”?

λͺ¨λ“  μ„œλ²„λ“€μ΄ λ‹€ CORSλ₯Ό μΈμ§€ν•˜μ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

결과적으둜 λΈŒλΌμš°μ €λŠ” κ±°λΆ€ν–ˆλ‹€κ³  ν•˜λ”λΌλ„, μ„œλ²„λŠ” μ²˜λ¦¬ν•΄λ²„λ¦¬λŠ” κ²°κ³Όκ°€ 생길 수 있기 λ•Œλ¬Έμ—

μ„œλ²„κ°€ μ•ˆμ „ν•˜κ²Œ μš”μ²­μ„ 주고받을 수 μžˆλ„λ‘ λΈŒλΌμš°μ €μ—μ„œ ν•΄λ‹Ή μš”μ²­(CORS)을 μ²˜λ¦¬ν•œλ‹€


μ‹€μ œ μš”μ²­μ—μ„œλŠ” μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λ‚˜μš”?

CORSλŠ” λ‹€λ₯Έ Origin에 λŒ€ν•œ μš”μ²­μ„ ν—ˆμš©ν•˜λŠ” μ •μ±…μž…λ‹ˆλ‹€.

같은 Originμ—μ„œ http 톡신을 ν•˜λŠ” 경우 μ•Œμ•„μ„œ cookieκ°€ request header에 λ“€μ–΄κ°€μ§€λ§Œ, ꡐ차 좜처둜 μš”μ²­ν•˜λŠ” μƒν™©μ—μ„œλŠ” 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€.

Origin이 λ‹€λ₯Έ http ν†΅μ‹ μ—μ„œλŠ” request header에 μΏ ν‚€κ°€ μžλ™μœΌλ‘œ λ“€μ–΄κ°€κΈ° μ•ŠκΈ° λ•Œλ¬Έμ— μ„œλ²„μ—κ²Œ λ˜λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ‚΄κ°€ μ–΄λ–€ μš”μ²­μ„ λ³΄λ‚΄λŠ” 지 μ•Œλ €μ€„ ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘ νŠΈ > WithCredentials: true

μ„œλ²„ > Access-Control-Allow-Credentials: true

CORSλ₯Ό κ²ͺκ³  직접 ν•΄κ²°ν•΄ λ³Έ κ²½ν—˜μ΄ 있으면 λ§ν•΄μ£Όμ„Έμš”

  1. μ„œλ²„ κ°œλ°œμžμ™€ λΉ λ₯΄κ²Œ μ†Œν†΅ν•œλ‹€

λ§Œμ•½ ν”„λ‘ νŠΈμ—μ„œ CORSκ΄€λ ¨ 섀정이 λ‹€ λλ‚œ 이후에 HTTP μš”μ²­μ„ λ³΄λƒˆμ„ λ•Œ CORS 였λ₯˜κ°€ 뜰 경우 ν•΄λ‹Ή 였λ₯˜λ₯Ό μΊ‘μ³ν•΄μ„œ 같이 ν™•μΈν•΄λ³΄λŠ” 방법

λ¨Όμ € ν”„λ‘ νŠΈμ—μ„œ 응닡 헀더에 μ œλŒ€λ‘œ 된 정보λ₯Ό λ„£μ–΄λŠ” 지 확신을 κ°€μ§€λŠ” 것이 μ€‘μš”ν•˜λ‹€ (credentials κ΄€λ ¨ 섀정을 ν–ˆλŠ”μ§€?)

  1. 개발 ν™˜κ²½μ— ν”„λ‘μ‹œ 섀정을 ν•΄λ‘”λ‹€

λ§Œμ•½ 개발 ν™˜κ²½μ— μžˆμ–΄μ„œ μ„ΈνŒ…μ„ 잘 해놓은 μƒνƒœμ΄κ³  μ„œλ²„μ˜ μ„ΈνŒ…μ΄ 완벽함에도 λ¬Έμ œκ°€ 생긴닀면, 개발 ν™˜κ²½μ—μ„œμ˜ ν”„λ‘μ‹œ 섀정도 λŒ€μ•ˆμ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή ν”„λ‘μ‹œ 섀정은 ν™˜κ²½μ— 따라 (CRAλ©΄ CRA) 방법이 λ‹€λ₯΄λ―€λ‘œ 확인해보고 λ„£μœΌμ‹œλ©΄ λ©λ‹ˆλ‹€!

μ›ΉνŒ©

Link πŸ”₯

μ›ΉνŒ©μ΄λž€?

μ›ΉνŒ©μ΄λž€ μ΅œμ‹  ν”„λŸ°νŠΈμ—”λ“œ ν”„λ ˆμž„μ›Œν¬μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” λͺ¨λ“ˆ λ²ˆλ“€λŸ¬(Module Bundler)μž…λ‹ˆλ‹€.

λͺ¨λ“ˆ λ²ˆλ“€λŸ¬λž€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” μžμ›(HTML, CSS, Javscript, Images λ“±)을 λͺ¨λ‘ 각각의 λͺ¨λ“ˆλ‘œ 보고 이λ₯Ό μ‘°ν•©ν•΄μ„œ λ³‘ν•©λœ ν•˜λ‚˜μ˜ 결과물을 λ§Œλ“œλŠ” 도ꡬλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

bundle

λͺ¨λ“ˆμ΄λž€?

λͺ¨λ“ˆμ΄λž€ ν”„λ‘œκ·Έλž˜λ° κ΄€μ μ—μ„œ νŠΉμ • κΈ°λŠ₯을 κ°–λŠ” μž‘μ€ μ½”λ“œ λ‹¨μœ„λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 치면 μ•„λž˜μ™€ 같은 μ½”λ“œκ°€ λͺ¨λ“ˆμž…λ‹ˆλ‹€.

// πŸ“ math.js

function sum(a, b) {
  return a + b;
}

function substract(a, b) {
  return a - b;
}

const PI = 3.14;

export { sum, substract, PI };

이 math.js νŒŒμΌμ€ μ•„λž˜μ™€ 같이 3가지 κΈ°λŠ₯을 κ°–κ³  μžˆλŠ” λͺ¨λ“ˆμž…λ‹ˆλ‹€.

  • 두 숫자의 합을 κ΅¬ν•˜λŠ” sum() ν•¨μˆ˜
  • 두 숫자의 μ°¨λ₯Ό κ΅¬ν•˜λŠ” substract() ν•¨μˆ˜
  • μ›μ£Όμœ¨ 값을 κ°–λŠ” PI μƒμˆ˜

이처럼 성격이 λΉ„μŠ·ν•œ κΈ°λŠ₯듀을 ν•˜λ‚˜μ˜ μ˜λ―ΈμžˆλŠ” 파일둜 κ΄€λ¦¬ν•˜λ©΄ λͺ¨λ“ˆμ΄ λ©λ‹ˆλ‹€.

μ›ΉνŒ©μ—μ„œ μ§€μΉ­ν•˜λŠ” λͺ¨λ“ˆμ΄λΌλŠ” κ°œλ…μ€ μœ„μ™€ 같이 μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆμ—λ§Œ κ΅­ν•œλ˜μ§€ μ•Šκ³  μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” λͺ¨λ“  μžμ›μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ œμž‘ν•˜λ €λ©΄ HTML, CSS, Javascript, Images, Font λ“± λ§Žμ€ νŒŒμΌλ“€μ΄ ν•„μš”ν•˜μ£ . 이 파일 ν•˜λ‚˜ν•˜λ‚˜κ°€ λͺ¨λ‘ λͺ¨λ“ˆμž…λ‹ˆλ‹€.

λͺ¨λ“ˆ λ²ˆλ“€λ§μ΄λž€?

μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” λͺ‡μ‹­, λͺ‡λ°±κ°œμ˜ μžμ›λ“€μ„ ν•˜λ‚˜μ˜ 파일둜 병합 및 μ••μΆ• ν•΄μ£ΌλŠ” λ™μž‘μ„ λͺ¨λ“ˆ λ²ˆλ“€λ§μ΄λΌκ³  ν•©λ‹ˆλ‹€.

νŒŒμΌλ“€μ˜ μ—°κ΄€λœ 관계λ₯Ό νŒŒμ•…ν•˜μ—¬ νŒŒμΌλ“€μ„ ν•˜λ‚˜μ˜ 파일둜 μ••μΆ•μ‹œμΌœμ£ΌλŠ” 과정을 λ²ˆλ“€λ§ 과정이라 ν•©λ‹ˆλ‹€.

λͺ¨λ“ˆ λ²ˆλ“€λ§

μ›ΉνŒ©μ΄ λ“±μž₯ν•œ 이유 μ›ΉνŒ© μ‚¬μš© μ‹œμ— 이점

  1. 파일 λ‹¨μœ„μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆ κ΄€λ¦¬μ˜ ν•„μš”μ„±
  2. μ›Ή 개발 μž‘μ—… μžλ™ν™” 도ꡬ
  3. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ λ₯Έ λ‘œλ”© 속도와 높은 μ„±λŠ₯
μžμ„Ένžˆ 보기

파일 λ‹¨μœ„μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆ κ΄€λ¦¬μ˜ ν•„μš”μ„±

μž…λ¬Έμž κ΄€μ μ—μ„œ κ³ μ•ˆλœ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ•„λž˜μ™€ 같이 νŽΈλ¦¬ν•œ 유효 λ²”μœ„λ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

var window = 10;
console.log(window); // 10

function logText() {
  console.log(window); // 10
}

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ³€μˆ˜ 유효 λ²”μœ„λŠ” 기본적으둜 μ „μ—­ λ²”μœ„λ₯Ό κ°–μŠ΅λ‹ˆλ‹€. μ΅œλŒ€ν•œ 넓은 λ³€μˆ˜ λ²”μœ„λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— μ–΄λ””μ—μ„œλ„ μ ‘κ·Όν•˜κΈ°κ°€ νŽΈλ¦¬ν•˜μ£ .

그런데 μ΄λŸ¬ν•œ μž₯점이 μ‹€μ œλ‘œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  λ•ŒλŠ” μ•„λž˜μ™€ 같은 문제점으둜 λ³€ν•©λ‹ˆλ‹€.

<!-- index.html -->
<html>
  <head>
    <!-- ... -->
  </head>
  <body>
    <!-- ... -->
    <script src="./app.js"></script>
    <script src="./main.js"></script>
    <script>
      getNum(); // ??
    </script>
  </body>
</html>

각각 λ‹€λ₯Έ 파일(app, main)μ—μ„œ μ˜λ„μΉ˜ μ•Šκ²Œ 같은 ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  ν˜ΈμΆœν–ˆμ„ λ•Œ, index.htmlμ—μ„œλŠ” μ–΄λ–€ ν•¨μˆ˜λ₯Ό 뢈러였게 λ κΉŒμš”?

// app.js
var num = 10;
function getNum() {
  console.log(num);
}
// main.js
var num = 20;
function getNum() {
  console.log(num);
}

κ²°κ³ΌλŠ” κ°€μž₯ λ‚˜μ€‘μ— 뢈러였게 λ˜λŠ” script 파일인 main.js에 μ„ μ–Έλœ κ°’ 20μž…λ‹ˆλ‹€.

app.jsμ—μ„œ μ„ μ–Έν•œ num λ³€μˆ˜λŠ” main.jsμ—μ„œ λ‹€μ‹œ μ„ μ–Έν•˜κ³  20을 ν• λ‹Ήν–ˆκΈ° λ•Œλ¬Έμ΄μ£ .

μ΄λŸ¬ν•œ λ¬Έμ œμ μ€ μ‹€μ œλ‘œ λ³΅μž‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€.

λ³€μˆ˜μ˜ 이름을 λͺ¨λ‘ κΈ°μ–΅ν•˜μ§€ μ•Šμ€ 이상 λ³€μˆ˜λ₯Ό 쀑볡 μ„ μ–Έν•˜κ±°λ‚˜ μ˜λ„μΉ˜ μ•Šμ€ 값을 ν• λ‹Ήν•  수 있죠.

이처럼 파일 λ‹¨μœ„λ‘œ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•˜κ³  싢은 μš•κ΅¬, μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆν™”에 λŒ€ν•œ μš•κ΅¬λ₯Ό μ˜ˆμ „κΉŒμ§„ AMD, Common.js와 같은 라이브러리둜 ν’€μ–΄μ™”μŠ΅λ‹ˆλ‹€.

μ›Ή 개발 μž‘μ—… μžλ™ν™” 도ꡬ

이전뢀터 ν”„λŸ°νŠΈμ—”λ“œ 개발 업무λ₯Ό ν•  λ•Œ κ°€μž₯ 많이 λ°˜λ³΅ν•˜λŠ” μž‘μ—…μ€ ν…μŠ€νŠΈ νŽΈμ§‘κΈ°μ—μ„œ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜κ³  μ €μž₯ν•œ λ’€ λΈŒλΌμš°μ €μ—μ„œ μƒˆλ‘œ 고침을 λˆ„λ₯΄λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ•Ό 화면에 λ³€κ²½λœ λ‚΄μš©μ„ λ³Ό 수 μžˆμ—ˆμ£ .

이외에도 μ›Ή μ„œλΉ„μŠ€λ₯Ό κ°œλ°œν•˜κ³  μ›Ή μ„œλ²„μ— 배포할 λ•Œ μ•„λž˜μ™€ 같은 μž‘μ—…λ“€μ„ ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

  • HTML, CSS, JS μ••μΆ•
  • 이미지 μ••μΆ•
  • CSS μ „μ²˜λ¦¬κΈ° λ³€ν™˜

μ΄λŸ¬ν•œ 일듀을 μžλ™ν™” ν•΄μ£ΌλŠ” 도ꡬ듀이 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ Grunt와 Gulp 같은 도ꡬ듀이 λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€.

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ λ₯Έ λ‘œλ”© 속도와 높은 μ„±λŠ₯

일반적으둜 νŠΉμ • μ›Ή μ‚¬μ΄νŠΈλ₯Ό μ ‘κ·Όν•  λ•Œ 5초 μ΄λ‚΄λ‘œ μ›Ή μ‚¬μ΄νŠΈκ°€ ν‘œμ‹œλ˜μ§€ μ•ŠμœΌλ©΄ λŒ€λΆ€λΆ„μ˜ μ‚¬μš©μžλ“€μ€ ν•΄λ‹Ή μ‚¬μ΄νŠΈλ₯Ό λ²—μ–΄λ‚˜κ±°λ‚˜ 집쀑λ ₯을 μžƒκ²Œ λ©λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ›Ή μ‚¬μ΄νŠΈμ˜ λ‘œλ”© 속도λ₯Ό 높이기 μœ„ν•΄ λ§Žμ€ λ…Έλ ₯듀이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. κ·Έ 쀑 λŒ€ν‘œμ μΈ λ…Έλ ₯이 λΈŒλΌμš°μ €μ—μ„œ μ„œλ²„λ‘œ μš”μ²­ν•˜λŠ” 파일 숫자λ₯Ό μ€„μ΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄ μ•žμ—μ„œ μ‚΄νŽ΄λ³Έ μ›Ή νƒœμŠ€ν¬ λ§€λ‹ˆμ €λ₯Ό μ΄μš©ν•΄ νŒŒμΌλ“€μ„ μ••μΆ•ν•˜κ³  λ³‘ν•©ν•˜λŠ” μž‘μ—…λ“€μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

뿐만 μ•„λ‹ˆλΌ 초기 νŽ˜μ΄μ§€ λ‘œλ”© 속도λ₯Ό 높이기 μœ„ν•΄ λ‚˜μ€‘μ— ν•„μš”ν•œ μžμ›λ“€μ€ λ‚˜μ€‘μ— μš”μ²­ν•˜λŠ” λ ˆμ΄μ§€ λ‘œλ”©(Lazy Loading)이 λ“±μž₯ν–ˆμ£ .

μ›ΉνŒ©μ€ 기본적으둜 ν•„μš”ν•œ μžμ›μ€ 미리 λ‘œλ”©ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ κ·Έ λ•Œ κ·Έ λ•Œ μš”μ²­ν•˜μžλŠ” 철학을 κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ›ΉνŒ©μ„ 톡해 λͺ¨λ“ˆμ„ λ²ˆλ“€λ§ν•˜λ©΄, ν•΄λ‹Ή 파일 듀을 ν•˜λ‚˜λ‘œ λ¬ΆκΈ° λ•Œλ¬Έμ— 적은 HTTP μš”μ²­μœΌλ‘œλ„ λ²ˆλ“€λ§ 된 νŒŒμΌμ„ 뢈러올 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 이유 λ•Œλ¬Έμ— μš°λ¦¬λŠ” μ›ΉνŒ©μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

λ°”λ²¨μ΄λž€?

바벨은 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ§€μ›ν•˜λŠ” μ΅œμ‹  문법 (ES6, ES7, ES8, ES9, ...) 듀을 μ΅œλŒ€ν•œ λ§Žμ€ λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ ν˜Έν™˜μ΄ κ°€λŠ₯ν•˜λ„λ‘ λ³€ν™˜ν•΄μ£ΌλŠ”(νŠΈλžœμŠ€νŒŒμΌλ§ν•΄μ£ΌλŠ”) μ–Έμ–΄μž…λ‹ˆλ‹€.

트랜슀파일(transpile)

transpile

바벨 λ³€ν™˜

바벨을 μ‚¬μš©ν•˜λ©΄ κ±°λŒ€ν•œ λ³€ν™”κ°€ 생기기 μ‹œμž‘ν•œ 기점인 ES6 (ECMAScript 2015) μ΄ν›„μ˜ 문법을 λΈŒλΌμš°μ €μ—μ„œ λ²”μš©μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” 문법 λ‹¨κ³„λ‘œ λ³€ν™˜ν•΄μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

// Babel Input: ES2015 arrow function
[1, 2, 3].map((n) => n + 1);

// Babel Output: ES5 equivalent
[1, 2, 3].map(function (n) {
  return n + 1;
});

μ›ΉνŒ©μ˜ μ£Όμš” 속성 4가지

  1. entry
  2. output
  3. loader
  4. plugin

entry

entry 속성은 μ›ΉνŒ©μ—μ„œ μ›Ή μžμ›μ„ λ³€ν™˜ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 졜초 μ§„μž…μ μ΄μž μžλ°”μŠ€ν¬λ¦½νŠΈ 파일 κ²½λ‘œμž…λ‹ˆλ‹€.

λΉŒλ“œλ₯Ό ν•  λŒ€μƒ 파일의 μœ„μΉ˜ 라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€

// webpack.config.js
module.exports = {
  entry: "./src/index.js",
};

entry 속성에 μ§€μ •λœ νŒŒμΌμ—λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ „λ°˜μ μΈ ꡬ쑰와 λ‚΄μš©μ΄ 담겨져 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ›ΉνŒ©μ΄ ν•΄λ‹Ή νŒŒμΌμ„ 가지고 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©λ˜λŠ” λͺ¨λ“ˆλ“€μ˜ μ—°κ΄€ 관계λ₯Ό μ΄ν•΄ν•˜κ³  λΆ„μ„ν•˜κΈ° λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ™μž‘μ‹œν‚¬ 수 μžˆλŠ” λ‚΄μš©λ“€μ΄ 담겨져 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

// index.js
import LoginView from "./LoginView.js";
import HomeView from "./HomeView.js";
import PostView from "./PostView.js";

function initApp() {
  LoginView.init();
  HomeView.init();
  PostView.init();
}

initApp();

μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ μž‘μ„±λœ index.jsλ₯Ό 예둜 λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 3개의 μ»΄ν¬λ„ŒνŠΈλ₯Ό index.js에 λΆˆλŸ¬μ™€μ„œ 싀행을 ν•˜κ³ μžˆλŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

μ‚¬μš©μžμ˜ 둜그인 ν™”λ©΄, 둜그인 ν›„ μ§„μž…ν•˜λŠ” 메인 ν™”λ©΄, 그리고 κ²Œμ‹œκΈ€μ„ μž‘μ„±ν•˜λŠ” ν™”λ©΄ λ“± μ›Ή μ„œλΉ„μŠ€μ— ν•„μš”ν•œ 화면듀이 λͺ¨λ‘ index.js νŒŒμΌμ—μ„œ 뢈렀져 μ‚¬μš©λ˜κ³  있기 λ•Œλ¬Έμ— μ›ΉνŒ©μ„ μ‹€ν–‰ν•˜λ©΄ ν•΄λ‹Ή νŒŒμΌλ“€μ˜ λ‚΄μš©κΉŒμ§€ ν•΄μ„ν•˜μ—¬ νŒŒμΌμ„ λΉŒλ“œν•΄μ€„ κ²ƒμž…λ‹ˆλ‹€.

entry

options

ν•˜μ§€λ§Œ entry의 경우 μ—”νŠΈλ¦¬ ν¬μΈνŠΈκ°€ 1κ°œκ°€ 될 μˆ˜λ„ μžˆμ§€λ§Œ μ•„λž˜μ™€ 같이 μ—¬λŸ¬ κ°œκ°€ 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

entry: {
  login: './src/LoginView.js',
  main: './src/MainView.js'
}

μœ„μ™€ 같이 μ—”νŠΈλ¦¬ 포인트λ₯Ό λΆ„λ¦¬ν•˜λŠ” κ²½μš°λŠ” μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ•„λ‹Œ νŠΉμ • νŽ˜μ΄μ§€λ‘œ μ§„μž…ν–ˆμ„ λ•Œ μ„œλ²„μ—μ„œ ν•΄λ‹Ή 정보λ₯Ό λ‚΄λ €μ£ΌλŠ” ν˜•νƒœμ˜ λ©€ν‹° νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ ν•©ν•©λ‹ˆλ‹€.

output

output 속성은 μ›ΉνŒ©μ„ 돌리고 λ‚œ 결과물의 파일 경둜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

// webpack.config.js
module.exports = {
  output: {
    filename: "bundle.js",
  },
};

μ•žμ—μ„œ 배운 entry μ†μ„±κ³ΌλŠ” λ‹€λ₯΄κ²Œ 객체 ν˜•νƒœλ‘œ μ˜΅μ…˜λ“€μ„ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ΅œμ†Œν•œ filename은 μ§€μ •ν•΄μ€˜μ•Ό ν•˜λ©° 일반적으둜 μ•„λž˜μ™€ 같이 path 속성을 ν•¨κ»˜ μ •μ˜ν•©λ‹ˆλ‹€.

// webpack.config.js
var path = require("path");

module.exports = {
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
};
  • filename 속성은 μ›ΉνŒ©μœΌλ‘œ λΉŒλ“œ(λ²ˆλ“€λ§)ν•œ 파일의 이름을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • path 속성은 ν•΄λ‹Ή 파일의 경둜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • path μ†μ„±μ—μ„œ μ‚¬μš©λœ path.resolve() μ½”λ“œλŠ” 인자둜 λ„˜μ–΄μ˜¨ κ²½λ‘œλ“€μ„ μ‘°ν•©ν•˜μ—¬ μœ νš¨ν•œ 파일 경둜λ₯Ό λ§Œλ“€μ–΄μ£ΌλŠ” Node.js APIμž…λ‹ˆλ‹€.

λ”°λΌμ„œ dist λΌλŠ” 폴더 μ•ˆμ— μžˆλŠ” bundle.jsλΌλŠ” 파일 μ΄λ¦„μœΌλ‘œ μ—”νŠΈλ¦¬μ— λ“€μ–΄μ˜¨ νŒŒμΌμ„ λΉŒλ“œ(λ²ˆλ“€λ§)ν•˜μ—¬ 결과물둜 κ°€μ Έμ˜¬ κ²ƒμž…λ‹ˆλ‹€.


options

μ•žμ—μ„œ μ‚΄νŽ΄λ³Έ filename 속성에 μ—¬λŸ¬ 가지 μ˜΅μ…˜μ„ 넣을 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. κ²°κ³Ό 파일 이름에 entry 속성을 ν¬ν•¨ν•˜λŠ” μ˜΅μ…˜
module.exports = {
  output: {
    filename: "[name].bundle.js",
  },
};
  1. κ²°κ³Ό 파일 이름에 μ›ΉνŒ© λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λͺ¨λ“ˆ IDλ₯Ό ν¬ν•¨ν•˜λŠ” μ˜΅μ…˜
module.exports = {
  output: {
    filename: "[id].bundle.js",
  },
};
  1. κ·Έ λ°–μ˜ μ˜΅μ…˜

loader

λ‘œλ”(Loader)λŠ” μ›ΉνŒ©μ΄ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 해석할 λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 μ•„λ‹Œ μ›Ή μžμ›(HTML, CSS, Images, 폰트 λ“±)듀을 λΉŒλ“œ μ‹œμ—, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ output(μ‚°μΆœλ¬Ό) νŒŒμΌμ— 포함될 수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” μ†μ„±μž…λ‹ˆλ‹€.

// webpack.config.js
module.exports = {
  module: {
    rules: [],
  },
};

μ—”νŠΈλ¦¬λ‚˜ 아웃풋 μ†μ„±κ³ΌλŠ” λ‹€λ₯΄κ²Œ moduleλΌλŠ” 이름을 μ‚¬μš©ν•©λ‹ˆλ‹€.

πŸ”₯ λ‘œλ”κ°€ μ—†λŠ” 경우

λ‘œλ”λŠ” μ•žμ„œ λ§ν•œλŒ€λ‘œ js 이외 ν˜•μ‹μ˜ νŒŒμΌλ“€μ„ λΉŒλ“œν•  λ•Œ μΆ”κ°€ν•˜λŠ” 속성이라고 λ³Ό 수 μžˆλ‹€.

λ§Œμ•½ js 파일 내에 css 파일이 import 된 μƒν™©μ—μ„œ loaderκ°€ μ—†λ‹€λ©΄ μ–΄λ–»κ²Œ 될까?

λΉŒλ“œκ°€ μ œλŒ€λ‘œ λ˜λŠ” 지 ν™•μΈν•΄λ³΄μž

πŸ“ index.js

import "./base.css";

λΉŒλ“œλ₯Ό ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같은 μ—λŸ¬λ₯Ό λ³Ό 수 μžˆμ„ 것이닀.

loader_error

λΉŒλ“œ μ‹œμ—, μ—”νŠΈλ¦¬λ‘œ μ„€μ •ν•œ index.js 파일 내에 μ›ΉνŒ©μ΄ μ•Œμ•„λ³Ό 수 μ—†λŠ” 파일 ν˜•μ‹μžμΈ cssκ°€ ν¬ν•¨λ˜μ–΄μ„œ 이λ₯Ό 해석할 수 μ—†λ‹€λŠ” μ—λŸ¬λ₯Ό λ°œμƒμ‹œμΌ°λ‹€.

μœ„μ™€ 같이 μ›λž˜ λͺ©μ μΈ jsλ₯Ό λ³€ν™˜ν•˜λŠ” 것이 μ•„λ‹ˆλΌλ©΄ loaderλ₯Ό 톡해 같이 λΉŒλ“œν•  수 μžˆλŠ” 여건을 λ§Œλ“€μ–΄ μ€˜μ•Ό ν•œλ‹€

μ—μ‹œ μ½”λ“œ 보기
πŸ“ webpack.config.js

var path = require("path");

module.exports = {
  mode: "none", // production, development, none >> 배포 μ‹œμ—λŠ” production으둜 μ„€μ •ν•΄μ•Ό ν•œλ‹€
  entry: "./index.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "dist"),
  },
  module: {
    rules: [
      {
        // 'test'λŠ” ν™•μž₯자λ₯Ό μ˜λ―Έν•œλ‹€
        test: /\.css$/,
        // 'use'λŠ” ν•΄λ‹Ή νŒŒμΌλ“€μ„ μ–΄λ–€ λ°©ν–₯으둜 λ‘œλ”©ν•˜λŠ”μ§€ μ„€μ •ν•΄μ£ΌλŠ” 것이닀

        // css-loaderλŠ” μ›ΉνŒ© μ•ˆμ— css νŒŒμΌμ„ 같이 λ²ˆλ“€λ§ν•  수 μžˆλ„λ‘ λ§Œλ“œλŠ” μš©λ„μ΄λ‹€
        // style-loaderλŠ” ν•΄λ‹Ή cssλ₯Ό html 파일 내에 인라인 μ½”λ“œλ‘œ μ‹€μ œ μŠ€νƒ€μΌμ— μ μš©ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λœλ‹€

        // πŸ”₯ μˆœμ„œ(였λ₯Έμͺ½ to μ™Όμͺ½μœΌλ‘œ 적용) λ˜ν•œ 영ν–₯이 μžˆμœΌλ‹ˆ, λ¨Όμ € μ μš©λ˜μ•Ό ν•˜λŠ” λ‘œλ”λ₯Ό 였λ₯Έμͺ½μ— μž‘μ„±ν•΄μ•Ό ν•œλ‹€
        use: ["style-loader", "css-loader"],
      },
      // λ§Œλ“  바벨 λ‘œλ” μ˜ˆμ‹œ
      // {
      //   test: /\.js$/, test > ν™•μž₯자
      //   use: ["babel-loader"], use > μ‚¬μš©ν•  라이브러리
      // },
    ],
  },
};

plugin

μš°λ¦¬κ°€ μ„€μ •ν•œ output인 bundle.js에 css νŒŒμΌμ„ 같이 λ²ˆλ“€λ§ν•˜λŠ” 것이 μ•„λ‹Œ λ³„λ„μ˜ css 파일둜 λ§Œλ“€μ–΄μ£ΌκΈ° μœ„ν•΄μ„œλŠ” ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•  ν•„μš”κ°€ μžˆλ‹€

plugin

ν•΄λ‹Ή 적용이 μ™„λ£Œλœ 후에 λΉŒλ“œλ₯Ό ν•˜λ©΄ λ‹€μŒκ³Ό 같이 λ²ˆλ“€λ§ μ‹œμ— css 파일이 λ³„λ„λ‘œ λΆ„λ¦¬λœ 것을 λ³Ό 수 μžˆλ‹€

plugin_result

ν”ŒλŸ¬κ·ΈμΈ(plugin)은 μ›ΉνŒ©μ˜ 기본적인 λ™μž‘μ— 좔가적인 κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€.

λ‘œλ”λž‘ λΉ„κ΅ν•˜λ©΄ λ‘œλ”λŠ” νŒŒμΌμ„ ν•΄μ„ν•˜κ³  λ³€ν™˜ν•˜λŠ” 과정에 κ΄€μ—¬ν•˜λŠ” 반면, ν”ŒλŸ¬κ·ΈμΈμ€ ν•΄λ‹Ή 결과물의 ν˜•νƒœλ₯Ό λ°”κΎΈλŠ” 역할을 ν•œλ‹€κ³  보면 λ©λ‹ˆλ‹€.

ν”ŒλŸ¬κ·ΈμΈμ€ μ•„λž˜μ™€ 같이 μ„ μ–Έν•©λ‹ˆλ‹€.

// webpack.config.js
module.exports = {
  plugins: [],
};

ν”ŒλŸ¬κ·ΈμΈμ˜ λ°°μ—΄μ—λŠ” μƒμ„±μž ν•¨μˆ˜λ‘œ μƒμ„±ν•œ 객체 μΈμŠ€ν„΄μŠ€λ§Œ 좔가될 수 μžˆμŠ΅λ‹ˆλ‹€.

// webpack.config.js
var webpack = require("webpack");
var HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  plugins: [new HtmlWebpackPlugin(), new webpack.ProgressPlugin()],
};

νƒ€μž…κ³Ό μΈν„°νŽ˜μ΄μŠ€

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ™œ μ“°λ‚˜μš”? (본인이 λŠλ‚€μ )

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” κ°€μž₯ 큰 μ΄μœ λŠ” 정적 타이핑을 μ§€μ›ν•œλ‹€λŠ” 것이닀.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŠΉμ§•μΈ 동적 타이핑은 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μžλ™μœΌλ‘œ ν•΄μ„λ˜κΈ° λ•Œλ¬Έμ— μ˜λ„μ— 따라 λ°›κ³  μ „λ‹¬ν•˜λŠ” λ°μ΄ν„°μ˜ νƒ€μž…μ΄ 뢈 λΆ„λͺ…ν•΄μ§ˆ 수 μžˆλ‹€.

νƒ€μž…μ„ μ§€μ •ν•˜κ³  λ¨Όμ € νƒ€μž…μ„ μ„ μ–Έν•¨μœΌλ‘œμ¨, ν”„λ‘œκ·Έλž˜λ° 단계, HTTP 톡신을 ν†΅ν•œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” κ³Όμ •μ—μ„œ μƒκΈ°λŠ” 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ£Όκ³  받을 수 μžˆλ‹€.

λ˜ν•œ νƒ€μž…μ„ 미리 μ„ μ–Έν•΄μ£ΌκΈ° λ•Œλ¬Έμ— νƒ€μž…μ— κ΄€λ ¨λœ ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ₯Ό μ†μ‰½κ²Œ μ°Ύμ•„ μ“Έ 수 μžˆλ‹€λŠ” μž₯점 λ˜ν•œ μ‘΄μž¬ν•œλ‹€.

이미지λ₯Ό 보며 차이점 μ•Œμ•„λ³΄κΈ°

νƒ€μž…μ΄ 없을 λ•Œ

νƒ€μž…μ΄ 없을 λ•Œ

νƒ€μž…μ΄ μžˆμ„ λ•Œ

νƒ€μž…μ΄ 없을 λ•Œ

νƒ€μž…κ³Ό μΈν„°νŽ˜μ΄μŠ€μ˜ 차이λ₯Ό μ•„λ‚˜μš”?

링크(μ°Έκ³ λ¬Έν—Œ)

νƒ€μž…κ³Ό μΈν„°νŽ˜μ΄μŠ€λŠ” λͺ¨λ‘ 객체의 νƒ€μž…μ˜ 이름을 μ§€μ •ν•˜λŠ” 방법듀 쀑 ν•˜λ‚˜μ΄λ‹€

// interface
interface PeopleInterface {
  name: string;
  age: number;
}

const me1: PeopleInterface = {
  name: "yc",
  age: 34,
};

// type
type PeopleType = {
  name: string;
  age: number;
};

const me2: PeopleType = {
  name: "yc",
  age: 31,
};

ν•˜μ§€λ§Œ 일정 뢀뢄에 μžˆμ–΄μ„œ νƒ€μž…κ³Ό μΈν„°νŽ˜μ΄μŠ€λŠ” 차이점이 μ‘΄μž¬ν•œλ‹€

  1. ν™•μž₯ν•˜λŠ” 방법

μΈν„°νŽ˜μ΄μŠ€λŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν™•μž₯이 κ°€λŠ₯ν•˜κ³ , νƒ€μž…μ€ & μ—°μ‚°μžλ₯Ό 톡해 ν™•μž₯이 κ°€λŠ₯ν•˜λ‹€

// interface
interface PeopleInterface {
  name: string;
  age: number;
}

interface StudentInterface extends PeopleInterface {
  school: string;
}

// type
type PeopleType = {
  name: string;
  age: number;
};

type StudentType = PeopleType & {
  school: string;
};
  1. 선언적 ν™•μž₯

μΈν„°νŽ˜μ΄μŠ€λŠ” λ™μΌν•œ 이름을 톡해 μž¬μ •μ˜ν•¨μœΌλ‘œμ¨ 선언적 ν™•μž₯이 κ°€λŠ₯ν•˜μ§€λ§Œ, νƒ€μž…μ€ λΆˆκ°€λŠ₯ν•˜λ‹€

// interface
interface Window {
  title: string;
}

interface Window {
  ts: TypeScriptAPI;
}

// 같은 interface λͺ…μœΌλ‘œ Windowλ₯Ό λ‹€μ‹œ λ§Œλ“ λ‹€λ©΄, μžλ™μœΌλ‘œ ν™•μž₯이 λœλ‹€.

const src = 'const a = "Hello World"';
window.ts.transpileModule(src, {});

// type
type Window = {
  title: string;
};

type Window = {
  ts: TypeScriptAPI;
};

// Error: Duplicate identifier 'Window'.
// νƒ€μž…μ€ μ•ˆλœλ‹€.

μ—¬λŸ¬ νƒ€μž… ν˜Ήμ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 병합할 λ•Œ (& or extends), μΈν„°νŽ˜μ΄μŠ€λŠ” μ†μ„±κ°„μ˜ μΆ©λŒμ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‹¨μˆœν•œ 객체 νƒ€μž…μ„ λ§Œλ“ λ‹€.

μΈν„°νŽ˜μ΄μŠ€λŠ” μ˜€λ‘œμ§€ 객체의 νƒ€μž…μ„ λ§Œλ“€κΈ° μœ„ν•œ 것이기 λ•Œλ¬Έμ΄λ‹€.

νƒ€μž…μ€ μž¬κ·€μ μœΌλ‘œ μˆœνšŒν•˜λ©΄μ„œ 속성을 λ³‘ν•©ν•˜λŠ”λ°, 이 κ²½μš°μ— 일뢀 neverκ°€ λ‚˜μ˜€λ©΄μ„œ μ œλŒ€λ‘œ λ¨Έμ§€λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€μ™€λŠ” λ‹€λ₯΄κ²Œ νƒ€μž…μ—λŠ” μ›μ‹œ νƒ€μž…μ΄ 올 μˆ˜λ„ μžˆμœΌλ―€λ‘œ, 좩돌이 λ‚˜μ„œ 병합이 μ•ˆλ˜λŠ” κ²½μš°κ°€ λ°œμƒν•œλ‹€.

κ°μ²΄μ—λ§Œ μ“°λŠ” μš©λ„λΌλ©΄ interfaceλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 쒋을 것이닀.

ν”„λ‘œμ νŠΈ 진행 μ‹œμ— μ–΄λ–€ μƒν™©μ—μ„œ νƒ€μž…μ„ μ“°κ³  μ–΄λ–€ μƒν™©μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μΌλ‚˜μš”?

μ œλ„€λ¦­μ΄λž€?

μ œλ„€λ¦­μ€ 클래슀, ν•¨μˆ˜, μΈν„°νŽ˜μ΄μŠ€ 등을 λ‹€μ–‘ν•œ νƒ€μž…μœΌλ‘œ μž¬μ‚¬μš©κ°€λŠ₯ν•˜κ²Œ ν•΄μ£ΌλŠ” λ¬Έλ²•μž…λ‹ˆλ‹€

function getSize(arr: number[] | string[] | boolean[]): number {
  return arr.length;
}

const arr = [1, 2, 3];

getSize(arr); // 3

const arr2 = ["a", "b", "c"];

getSize(arr2); // 3

const arr3 = [true, false, true];
getSize(arr3); // 3

μœ„μ™€ 같이 ν•œκ°€μ§€ ν•¨μˆ˜μ—μ„œ λ‹€μ–‘ν•œ νƒ€μž…μ˜ 데이터λ₯Ό λ°›μ•„μ€˜μ•Όν•œλ‹€κ³  κ°€μ •ν•  λ•Œ μ˜¬λ°”λ₯Έ νƒ€μž…μ„ μ§€μ •ν•˜κΈ° μœ„ν•΄μ„œλŠ” νƒ€μž…μ„ ν™•μž₯μ‹œμΌœμ€˜μ•Ό ν•©λ‹ˆλ‹€.

이런 μƒν™©μ—μ„œ μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— λŒ€ν•œ νƒ€μž… <T>λ₯Ό λͺ…μ‹œν•΄μ€ŒμœΌλ‘œμ¨ λ‹€μ–‘ν•œ νƒ€μž…μ— λŒ€μ‘ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

function getSize<T>(arr: T[]): number {
  return arr.length;
}

const arr = [1, 2, 3];

getSize<number>(arr); // 3

const arr2 = ["a", "b", "c"];

getSize<string>(arr2); // 3