🌼 Spring 기초 β‘  - λ„€νŠΈμ›Œν¬, μš©μ–΄λͺ¨μŒ / TIL - day 19

ν•˜λ¦¬λΉ„Β·2025λ…„ 3μ›” 17일
1

🌼 Spring

λͺ©λ‘ 보기
1/11
post-thumbnail

β–ͺ️ λ„€νŠΈμ›Œν¬ β–ͺ️


πŸ’‘ 컴퓨터듀은 μ–΄λ–»κ²Œ μ„œλ‘œ ν†΅μ‹ ν• κΉŒ?
μ΄ˆκΈ°μ—λŠ” 물리적인 ν˜•νƒœ(usb)μ˜€λ‹€. 톡신할 컴퓨터가 λ©€λ¦¬μžˆλ‹€λ©΄? 인터넷 μ‚¬μš©!

βœ”οΈ 인터넷 (Internet)

  • TCP / IP 기반으둜 μ—°κ²°λœ 컴퓨터 λ„€νŠΈμ›Œν¬ 톡신망
  • ν•΄μ € 광케이블(물리적 μ—°κ²°) / μΈκ³΅μœ„μ„± (무선 톡신)
    ➝ World Wide Web(www)ꡬ좕


πŸ“– IP (Internet Protocol)

πŸ’‘ 데이터 톡신에 λŒ€ν•œ κ·œμ•½ - μˆ«μžλŠ” IP μžμ²΄κ°€ μ•„λ‹Œ μ£Όμ†Œμž„
(데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ „λ‹¬ν•˜κΈ°μœ„ν•΄ μ΅œμ†Œν•œμ˜ 인터넷 ν”„λ‘œν† μ½œμ΄ ν•„μš”ν•˜λ‹€)

πŸ“Œ Packet

  • μ†ŒμŠ€IPμΆœλ°œμ§€ + λŒ€μƒIP도착지λ₯Ό 포함 ➝ μ–΄λ–€ 컴퓨터에 전솑할 μ§€ νŒλ³„ κ°€λŠ₯
  • ꡬ뢄 : 헀더 ,νŽ˜μ΄λ‘œλ“œ, 트레일러(μˆ˜μ‹ μ—¬λΆ€ 포함)
  • 단지 데이터λ₯Ό 주기만 ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ λ°›κ³  μ‘λ‹΅ν•œλ‹€

πŸ“Œ IP λ°©μ‹μ˜ 문제점

  • ❢ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ뢄 (μ–΄λ–€ ν”„λ‘œκ·Έλž¨μ— μ‚¬μš©ν•˜μ§€? ꡬ뢄이 μ–΄λ ΅λ‹€)

  • ❷ λΉ„μ—°κ²°μ„± (μˆ˜μ‹  λŒ€μƒμ˜ μƒνƒœμ— 상관없이 데이터λ₯Ό 전솑 - 컴퓨터가 κΊΌμ Έ μžˆμ–΄λ„)

  • ❸ λΉ„μ‹ λ’°μ„±
    - νŒ¨ν‚·μ΄ μ†Œμ‹€λ˜λŠ” 경우, 손상여뢀λ₯Ό μ–‘μΈ‘ λͺ¨λ‘ μ•Œ 수 μ—†λ‹€.
    - 데이터가 큰 κ²½μš°μ—λŠ” μ—¬λŸ¬κ°œλ‘œ λ‚˜λˆ  μ „μ†‘λ˜κ³ , μˆœμ„œκ°€ μ„žμ—¬λ²„λ¦Ό
    ➝ 이런 κ²½μš°μ—λ„ 데이터λ₯Ό μž¬μ „μ†‘ ν•˜μ§€ μ•ŠλŠ”λ‹€



πŸ“– TCP (Transmission Control Protocol)

πŸ’‘ 데이터λ₯Ό μ‹ λ’°μ„±μžˆκ²Œ 전달 (IPλ°©μ‹μ˜ 문제점 보완)

πŸ“Œ 3 Way HandShake

πŸ“ μ΅œμ†Œν•œμ˜ 논리적 μ—°κ²°λ‘œ μ—°κ²°λ˜μ—ˆλ‹€κ³  κ°€μ •ν•˜λŠ”κ²ƒ !

βœ”οΈ SYN , ACK

SYN (Synchronize)ACK (Acknowledge)
ν΄λΌμ΄μ–ΈνŠΈ ➝ μ„œλ²„μ„œλ²„ ➝ ν΄λΌμ΄μ–ΈνŠΈ
접속 μš”μ²­μš”μ²­ 수락
SYN ν”Œλž˜κ·Έ + μ‹œν€€μŠ€ 번호SYN ν”Œλž˜κ·Έ + ACK ν”Œλž˜κ·Έ + (μ‹œν€€μŠ€ 번호+1)
데이터 전솑 κ°€λŠ₯

βœ”οΈ νŠΉμ§•

  • IP λ°©μ‹μ˜ 단점 보완 (데이터가 잘 μ „μ†‘λ˜μ—ˆλŠ”μ§€ 응닡 λ°˜ν™˜)
  • νŒ¨ν‚·μ΄ λ‚˜λ‰˜μ–΄μ Έ μ˜€λ”λΌλ„ μˆœμ„œλ₯Ό 보μž₯ν•œλ‹€ ➝ λŠλ¦¬λ‹€


πŸ“– UDP (User Datagram Protocol)

πŸ’‘ λΉ„μ—°κ²°ν˜•μ΄κ³  신뒰성이 μ—†λŠ” ν”„λ‘œν† μ½œ ➝ 증말둜 λΉ λ₯΄λ‹Ή ( μ‹€μ‹œκ°„μ„± 보μž₯ )
( 인터넷 μ „ν™”, 슀트리밍, 온라인 κ²Œμž„ λ“± )

πŸ“Œ UDP의 νŠΉμ§•

  1. IP 방식과 λΉ„μŠ·ν•˜λ‹€ - 3 way handshake ν•˜μ§€ μ•ŠλŠ”λ‹€ (λΉ„μ‹ λ’°μ„±)
  2. 좔가적인 κΈ°λŠ₯이 거의 μ—†λ‹€ - ν•˜μ§€λ§Œ 빨랐죠?
  3. PORTκ°€ μ‘΄μž¬ν•œλ‹€
  4. 잘λͺ»λœ 데이터가 μ „μ†‘λ˜μ§€ μ•Šλ„λ‘ 체크섬(Checksum)을 포함

πŸ“Œ PORT

  • 같은 IP λ‚΄μ—μ„œ ν”„λ‘œμ„ΈμŠ€ ꡬ뢄을 함
    ➝ IP의 단점 (μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ뢄)을 보완

  • Packet에 ν¬ν•¨λ˜μ–΄ μžˆλ‹€

    βœ”οΈ 자주 μ‚¬μš©λ˜λŠ” PORT

    1. 0~65535 κΉŒμ§€ ν• λ‹Ή κ°€λŠ₯
    2. 0~1023 : 이미 μ‚¬μš©λ˜κ³  μžˆλŠ” 포트 μ• μ§€κ°„ν•˜λ©΄ μ“°μ§€λ§μž
      πŸ’‘ HTTP 80 (TCP) / HTTPS 443 (TCP)


β–ͺ️ Web 기초 β–ͺ️


πŸ“– DNS(Domain Name System)

IPμ£Όμ†ŒλŠ” μœ λ™μ μ΄κΈ°λ„ ν•˜κ³ , 변경될 μˆ˜λ„ 있고, μ™Έμš°κΈ°κ°€ νž˜λ“€λ‹€
πŸ’‘ μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” 도메인 μ£Όμ†Œλ₯Ό 컴퓨터가 읽을 수 μžˆλŠ” IP μ£Όμ†Œλ‘œ λ³€ν™˜ν•œλ‹€

πŸ“Œ DNS λ™μž‘ μˆœμ„œ

  1. μ›ν•˜λŠ” 도메인 ꡬ맀후 DNS μ„œλ²„μ— λ“±λ‘ν•œλ‹€
  2. 도메인 λͺ…을 μž…λ ₯ν•˜λ©΄ DNSλŠ” IPμ£Όμ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€
  3. IPκ°€ λ³€κ²½λ˜λ©΄ DNSλŠ” κ·ΈλŒ€λ‘œ, dns에 λ“±λ‘λœ IPμ£Όμ†Œλ§Œ λ°”κΎΈλ©΄ 댐
    ➝ λŒ€ν‘œμ μΈ μ˜ˆμ‹œ : URL


πŸ“– URI (Uniform Resource Identifier)

πŸ’‘ 인터넷 μžμ›(데이터)을 λ‚˜νƒ€λ‚΄λŠ” κ³ μœ μ‹λ³„μž

  • μžμ› : νŽ˜μ΄μ§€, ν…μŠ€νŠΈ, 이미지, λ™μ˜μƒ, 파일 λ“±
    ➝ URIλŠ” URL, URN을 ν¬ν•¨ν•˜λŠ” κ°œλ…

πŸ“Œ URL(Uniform Resource Locator)

πŸ’‘ μžμ›μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€

βœ”οΈ URL의 ꡬ쑰

πŸ’‘ μ˜ˆμ‹œ
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
https://www.google.com:443/search?q=슀파λ₯΄νƒ€+μ½”λ”©ν΄λŸ½

schemeuser[:password]host[:port][/path][?query][#fragment]
ν”„λ‘œν† μ½œμ‚¬μš©μž 정보도메인 or IPμ£Όμ†Œλ¦¬μ†ŒμŠ€μ˜ 경둜key=valuehtml λ‚΄λΆ€ 뢁마크
주둜 http, https, ftp μ‚¬μš©URL은 μ‚¬μš© X일반적으둜 μƒλž΅κ³„μΈ΅ ꡬ쑰?둜 μ‹œμž‘λ˜κ³  &둜 κ΅¬λΆ„νŠΉμ •μœ„μΉ˜λ‘œ 이동

πŸ’‘ URL, URN 비ꡐ (μ˜ˆμ‹œ μ°Έκ³ )

URL(Locator)URN(Name)
μžμ›μ˜ μœ„μΉ˜μžμ›μ˜ 이름
ν”„λ‘œν† μ½œ Oν”„λ‘œν† μ½œ X
μœ„μΉ˜ λ³€κ²½μ‹œ μ‚¬μš©λΆˆκ°€μœ„μΉ˜ λ³€κ²½μ‹œμ—λ„ μ‚¬μš© κ°€λŠ₯
(μ΄λ¦„μœΌλ‘œ κ²€μƒ‰ν•˜κΈ° λ•Œλ¬Έμ—)
λŒ€μ€‘ν™” OλŒ€μ€‘ν™” X


β–ͺ️ μš©μ–΄ λͺ¨μŒμ§‘ β–ͺ️


πŸ“– ν”„λ‘œκ·Έλž¨ λͺ…λͺ… κ·œμΉ™ (casing)

1️⃣ snake_case

  • 데이터 λ² μ΄μŠ€μ—μ„œ 주둜 μ‚¬μš©
    - μ‚¬μš©λ²• : μ†Œλ¬Έμž or λŒ€λ¬Έμž
    - 단어연결 : 언더바 _ μ‚¬μš©

2️⃣ camelCase

  • Java, JavaScript, TypeScriptμ—μ„œ λ³€μˆ˜, ν•¨μˆ˜, λ©”μ„œλ“œ 이름
    - μ‚¬μš©λ²• : 첫 κΈ€μž μ†Œλ¬Έμž
    - 단어연결 : μ—°κ²°μ‹œμ—λ§Œ λŒ€λ¬Έμž

3️⃣ PascalCase

  • 클래슀 이름
    - μ‚¬μš©λ²• : 첫 κΈ€μž λŒ€λ¬Έμž
    - 단어연결 : λŒ€λ¬Έμžλ‘œ μ—°κ²°

4️⃣ kebab-case

  • 거의 μ‚¬μš© μ•ˆν•¨
    - μ‚¬μš©λ²• : λͺ¨λ“  단어 μ†Œλ¬Έμž
    - 단어연결 : λŒ€μ‹œ - 둜 μ—°κ²°

πŸ“– JSON

πŸ’‘ ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„κ°€ 톡신할 λ•Œ μ‚¬μš©ν•˜λŠ” 데이터 양식

  • ν†΅μΌλœ 양식 : 언어와 관계없이 데이터λ₯Ό μ£Όκ³  받을 수 μžˆλ‹€
  • 이해가 쉽고 μš©λŸ‰μ΄ μž‘λ‹€ ➝ XML λŒ€μ²΄
  • ν΄λΌμ΄μ–ΈνŠΈ to μ„œλ²„ μ„œλ²„ to ν΄λΌμ΄μ–ΈνŠΈ μ„œλ²„ to μ„œλ²„ λͺ¨λ‘ μ‚¬μš©
  • μ˜ˆμ‹œ - MSA(MicroService Architecture)
    : JSON ν˜•νƒœλ‘œ 데이터 톡신을 ν•˜κΈ° λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 별 μ–Έμ–΄κ°€ 달라도 μ„œλ‘œ 톡신가λŠ₯

πŸ“Œ JSON의 ꡬ쑰

{
  "user": [
    {
      "first_name": "wonuk",
      "last_name": "Hwang",
      "age": 100,
      "phone_agree": false,
      "hobby": ["Java", "Spring"]
    },
    {
      "firstName": "sparta",
      "lastName": "Team",
      "age": 200,
      "phone_agree": true,
      "hobby": ["React", "Spring", "Node"]
    },
  ]
}
  • snake_case, camelCase λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯
  • key - value ν˜•νƒœ


πŸ“– μ„œλ²„ μ„±λŠ₯ν–₯상

πŸ’‘ μ„œλ²„μ˜ μ„±λŠ₯ν–₯상을 μœ„ν•œ 두가지 방법


πŸ“Œ Scale Up (수직적 ν™•μž₯)

  • 단일 μ„œλ²„μ˜ ν•˜λ“œμ›¨μ–΄μ˜ μ‚¬μš©μ„ 높인닀 ➝ λΉ„μš© 증가
    (cpuλ‚˜ λ©”λͺ¨λ¦¬μ˜ μŠ€νŽ™μ„ μ˜¬λ¦°λ‹€)

  • μš”μ²­μ— λŒ€ν•œ μ²˜λ¦¬κ°€ 빨라진닀


πŸ“Œ Scale Out (μˆ˜ν‰μ  ν™•μž₯)

  • 같은 μ‚¬μ–‘μ˜ μ„œλ²„λ₯Ό μ—¬λŸ¬λŒ€ λ°°μΉ˜ν•œλ‹€ ➝ λΉ„μš© 증가 크지 μ•ŠμŒ
  • λ™μ‹œμ— 더 λ§Žμ€ μ‚¬μš©μž μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€


πŸ“– ν†΅μ‹ μƒνƒœ μœ μ§€ μ—¬λΆ€

πŸ’‘ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°„μ˜ ν†΅μ‹ μƒνƒœ μœ μ§€ 여뢀에 따라 λ‚˜λ‰˜λŠ” νŠΉμ„±
*μ˜ˆμ‹œ - μˆ˜κ°•μƒ (ν΄λΌμ΄μ–ΈνŠΈ) / 상담원 (μ„œλ²„)


πŸ“Œ Stateful(μƒνƒœ μœ μ§€)

  • μˆ˜κ°•μƒ 1λͺ… : 상담원 1λͺ… ➝ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ κΈ°μ–΅(μƒνƒœ μœ μ§€)ν•œλ‹€

βœ”οΈ 문제점

  • β‘  같은 μ„œλ²„κ°€ μœ μ§€λ˜μ–΄μ•Ό ν•œλ‹€ (같은 μƒλ‹΄μ›μ—κ²Œ μš”μ²­ν•΄μ•Ό~)

  • β‘‘ μ„œλ²„λŠ” λ‹€μ–‘ν•œ 이유둜 λ™μž‘ν•˜μ§€ μ•Šμ„ 수 있음

  • β‘’ μš”μ²­ νŠΈλž˜ν”½μ΄ λ§Žμ•„μ§€λ©΄ μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ”λ°μ— λ¦¬μ†ŒμŠ€κ°€ μ†Œλͺ¨λœλ‹€


πŸ“Œ Stateless (λ¬΄μƒνƒœ)

- μˆ˜κ°•μƒ 1λͺ… : μ—¬λŸ¬λͺ…μ˜ 상담원 ➝ **μš”μ²­ κΈ°μ–΅ λΆˆκ°€!** - **μˆ˜κ°•μƒμ΄ 이전 μš”μ²­μ„ ν•¨κ»˜ μ „λ‹¬ν•œλ‹€ ➑︎ 상담원이 κΈ°μ–΅ν•  ν•„μš”κ°€ μ—†μŒ**

βœ”οΈ μž₯점

  • λͺ¨λ“  μš”μ²­μ„ ν•˜λ‚˜μ˜ μ„œλ²„μ— 보낼 ν•„μš”κ°€ μ—†μŒ ➝ μˆ˜ν‰μ  ν™•μž₯ Scale Out

βœ”οΈ 단점

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ 데이터λ₯Ό μΆ”κ°€λ‘œ μ „μ†‘ν•΄μ•Όν•œλ‹€ ➝ 데이터양 증가 (λΉ„μš©μ΄ 증가될 μˆ˜λ„)

βœ”οΈ 🌟 ν•œκ³„μ 

  • 원칙
    : 항상 μ„œλ²„μ˜ ν™•μž₯성을 κ³ λ €ν•΄ μ΅œλŒ€ν•œ Statelessν•˜κ²Œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€
  • ν•œκ³„
    : but μ „λΆ€ λ‹€ Statelessν•˜κ²Œ λ§Œλ“€ μˆ˜λŠ” μ—†λ‹€ (μƒνƒœμœ μ§€κ°€ ν•„μš”ν•œ 둜그인)
  • ν•œκ³„ 극볡
    : Cookie, Session, Tokenλ“±μœΌλ‘œ κ·Ήλ³΅ν•˜λ©° μƒνƒœμœ μ§€λŠ” μ΅œμ†Œν™” ν•˜λ©΄ λœλ‹€


πŸ“– μ—°κ²° μœ μ§€ μ—¬λΆ€

πŸ’‘ ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„κ°„ μ—°κ²° μœ μ§€ 여뢀에 λ”°λ₯Έ νŠΉμ„±


πŸ“Œ Connection (μ—°κ²°)

  • ν΄λΌμ΄μ–ΈνŠΈ 수만큼 μ—°κ²°νšŸμˆ˜κ°€ λŠ˜μ–΄λ‚¨ ➝ μžμ› μ†Œλͺ¨λœλ‹€
  • ν΄λΌμ΄μ–ΈνŠΈκ°€ 아무 μš”μ²­μ΄ 없어도 연결은 μœ μ§€ν•œλ‹€
    (μˆ˜λ§Žμ€ μ‚¬λžŒλ“€μ΄ μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•΄λ„ μ‹€μ œ μ„œλ²„μ—μ„œ λ™μ‹œμ— μš”μ²­μ΄ λ“€μ–΄μ˜¬ κ²½μš°λŠ” 적닀!)

βœ”οΈ μž₯점

  • μƒˆλ‘œμš΄ 연결을 μ•ˆν•΄λ„ λœλ‹€, 그만큼 응닡속도가 빨라진닀

βœ”οΈ 단점

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μ§€μ†μ μœΌλ‘œ μš”μ²­μ„ 보낸단 보μž₯이 μ—†λŠ”λ°λ„ 해야함,, μžμ› λ‚­λΉ„!


πŸ“Œ Connectionless (λΉ„μ—°κ²°)

  • TCP/IP μ—°κ²° ➝ μš”μ²­-응닡 ➝ μ—°κ²° ν•΄μ œ
    🌟 μ„œλ²„λŠ” μ΅œμ†Œν•œμ˜ μžμ›λ§Œ μ‚¬μš©ν•˜κ²Œ λœλ‹€
    ( 예λ₯Όλ“€μ–΄,, 인터넷이 λŠκ²¨λ„ 보던 νŽ˜μ΄μ§€λŠ” κ·ΈλŒ€λ‘œ 보인닀!)

βœ”οΈ μž₯점

  • λ‹Ήμ—°! μžμ› 효율적 μ‚¬μš©λœλ‹€

βœ”οΈ 단점

  • μš”μ²­μ΄ 좔가될 λ•Œλ§ˆλ‹€ μ—°κ²°(3 Way Handshake)을 μƒˆλ‘œ ν•΄μ•Όν•œλ‹€ ➝ μ‘λ‹΅μ‹œκ°„ 증가
  • μ—°κ²°ν•  λ•Œλ§ˆλ‹€ μ›ΉνŽ˜μ΄μ§€μ˜ μ •μ μžμ›μ„ μ „λΆ€! λ‹€μ‹œ λ‹€μš΄λ‘œλ“œν•΄μ•Όν•œλ‹€
    βžμΊμ‹œ, λΈŒλΌμš°μ € μΊμ‹±μœΌλ‘œ ν•΄κ²° (μ‰½κ²Œλ§ν•΄ μž„μ‹œμ €μž₯)
    πŸŒŸν•΄κ²°λ°©λ²• : ν˜„μž¬λŠ” HTTP 지속연결(Persistent Connections)둜 문제λ₯Ό ν•΄κ²°ν•œλ‹€.

πŸ’‘ HTTP 지속연결(Persistent Connections)

  • λͺ¨λ“  μš”μ²­μ„ μ „λΆ€ μ‘λ‹΅ν•œ 후에 연결을 ν•΄μ œν•œλ‹€
  • μ—°κ²° νšŸμˆ˜λŠ” Connectionless보닀 적고, μ†λ„λŠ” 더 λΉ λ₯΄λ‹€!

0개의 λŒ“κΈ€