4. HTTP λ©”μ„œλ“œ

2021. 1. 3. 10:48γ†πŸŒ Web

λ³Έ ν¬μŠ€νŒ…μ€ μš°μ•„ν•œ ν˜•μ œλ“€, κΉ€μ˜ν•œ λ‹˜μ˜ 'λͺ¨λ“  개발자λ₯Ό μœ„ν•œ HTTP μ›Ή κΈ°λ³Έ 지식' κ°•μ˜λ₯Ό μˆ˜κ°• ν›„ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

 

 

 

μš”κ΅¬μ‚¬ν•­

ex) νšŒμ› 정보 관리 APIλ₯Ό λ§Œλ“€μ–΄λΌ

  • νšŒμ› λͺ©λ‘ 쑰회 / read-member-list
  • νšŒμ› 쑰회 / read-member-by-id
  • νšŒμ› 등둝 / create-member
  • νšŒμ› μˆ˜μ • / update-member
  • νšŒμ› μ‚­μ œ / delete-member

 

1. μš°μ„  API URI 섀계 (URL 섀계)

-> URI μ„€κ³„μ˜ μ€‘μš”ν•œ 점은 λ¦¬μ†ŒμŠ€ 식별

 

2. κ·Έλ ‡λ‹€λ©΄ λ¦¬μ†ŒμŠ€λŠ” 무엇인가?

-> νšŒμ›μ„ λ“±λ‘ν•˜κ³  μˆ˜μ •ν•˜κ³  μ‘°νšŒν•˜λŠ” ν–‰μœ„λ₯Ό λ¦¬μ†ŒμŠ€μ†Œ 보지 μ•ŠλŠ”λ‹€.

-> ex) νšŒμ›μ„ λ“±λ‘ν•˜λΌ ≠ λ¦¬μ†ŒμŠ€.  νšŒμ› = λ¦¬μ†ŒμŠ€

 

3. 'νšŒμ›' 이 곧 λ¦¬μ†ŒμŠ€λ‹€.

-> νšŒμ› 정보 관리 μ‹œμŠ€ν…œμ— μ‘΄μž¬ν•˜λŠ” μˆ˜λ§Žμ€ κ°œλ³„μ μΈ 'νšŒμ›'듀이 λ¦¬μ†ŒμŠ€

-> νšŒμ› λ¦¬μ†ŒμŠ€λ₯Ό URI에 맀핑

 

4. νšŒμ› λ¦¬μ†ŒμŠ€λ₯Ό URI에 식별해야 ν•˜λ―€λ‘œ, μ•„λž˜μ²˜λŸΌ μž‘μ„±ν•΄μ•Όν•œλ‹€.

  • νšŒμ› λͺ©λ‘ 쑰회 / members/{id}
  • νšŒμ› 쑰회 / members/{id}
  • νšŒμ› 등둝 / members/{id}
  • νšŒμ› μˆ˜μ • / members/{id}
  • νšŒμ› μ‚­μ œ / members/{id}

-> 문제: μ–΄λ–»κ²Œ κ΅¬λ³„ν•˜μ§€?.? (λ‹€ 같은 κΌ΄μ΄λ‹ˆ)

 

5. URIλŠ” λ¦¬μ†ŒμŠ€λ§Œ μ‹λ³„ν•˜κΈ°μ—, λ¦¬μ†ŒμŠ€λ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” ν–‰μœ„λ₯Ό λΆ„λ¦¬ν•΄μ•Όν•œλ‹€.

-> λ¦¬μ†ŒμŠ€: λͺ…사(νšŒμ›) / ν–‰μœ„: 동사(쑰회, 등둝, μ‚­μ œ, λ³€κ²½)

 

6. ν–‰μœ„λŠ” 곧 λ©”μ„œλ“œμ΄λ©°, μ΄λŠ” HTTP message의 μ‹œμž‘λΌμΈμ— 기재 λ˜μ–΄μžˆλ‹€.

 

7. HTTP λ©”μ„œλ“œ μ’…λ₯˜

 

μ£Όμš” λ©”μ„œλ“œ

  • GET: λ¦¬μ†ŒμŠ€ 쑰회
  • POST: μš”μ²­ 데이터 처리, 주둜 등둝에 μ‚¬μš© (dataλ₯Ό μ€„ν…Œλ‹ˆ μ²˜λ¦¬ν•΄λ‹¬λΌ)
  • PUT: λ¦¬μ†ŒμŠ€λ₯Ό λŒ€μ²΄, ν•΄λ‹Ή λ¦¬μ†ŒμŠ€κ°€ μ—†μœΌλ©΄ 생성
  • PATCH: λ¦¬μ†ŒμŠ€ λΆ€λΆ„ λ³€κ²½
  • DELETE: λ¦¬μ†ŒμŠ€ μ‚­μ œ

기타 λ©”μ„œλ“œ

  • HEAD: GETκ³Ό λ™μΌν•˜μ§€λ§Œ λ©”μ‹œμ§€ 뢀뢄을 μ œμ™Έν•˜κ³ , μƒνƒœ 쀄과 ν—€λ”λ§Œ λ°˜ν™˜
  • OPTIONS: λŒ€μƒ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 톡신 κ°€λŠ₯ μ˜΅μ…˜(λ©”μ„œλ“œ)을 μ„€λͺ…
  • CONNECT: λŒ€μƒ μžμ›μœΌλ‘œ μ‹λ³„λ˜λŠ” μ„œλ²„μ— λŒ€ν•œ 터널을 μ„ μ •
  • TRACE: λŒ€μƒ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 경둜λ₯Ό 따라 λ©”μ‹œμ§€ 루프백 ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰

8. GET λ©”μ„œλ“œ :  μ„œλ²„λ‘œλΆ€ν„° 정보λ₯Ό μ‘°νšŒν•˜κΈ° μœ„ν•΄ μ„€κ³„λœ λ©”μ„œλ“œ

-> λ¦¬μ†ŒμŠ€ 쑰회 μ—­ν• (ν–‰μœ„)

-> λ©”μ‹œμ§€ λ°”λ””λ₯Ό μ‚¬μš©ν•΄μ„œ 데이터λ₯Ό 전달할 수 μžˆμ§€λ§Œ, μ§€μ›ν•˜μ§€ μ•ŠλŠ” μ„œλ²„λ„ 많기 λ•Œλ¬Έμ— ꢌμž₯ν•˜μ§€ μ•ŠμŒ.

-> 즉, μ „λ‹¬ν•˜κ³  싢은 λ°μ΄ν„°λŠ” query(쿼리 νŒŒλΌλ―Έν„°, 쿼리 슀트링)둜 전달 (μ•„λž˜ κ·Έλ¦Όμ—μ„œ, message bodyκ°€ μ—†μŒμ„ μ•Œ 수 μžˆλ‹€)

this is start line of HTTP

 

9. GET λ©”μ„œλ“œ λ™μž‘ λ©”μ»€λ‹ˆμ¦˜

 

10. POST λ©”μ„œλ“œ : λ¦¬μ†ŒμŠ€λ₯Ό 생성/λ³€κ²½ν•˜κΈ° μœ„ν•΄ μ„€κ³„λœ λ©”μ„œλ“œ

-> μš”μ²­ 데이터 처리

-> GET λ©”μ„œλ“œλŠ” (λ©”μ‹œμ§€ λ°”λ””λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ ) μ›ν•˜λŠ” 데이터λ₯Ό κ·Έμ € μ„œλ²„ μ‚¬μ΄λ“œμ—μ„œ κ°€μ Έμ˜¬ 뿐이닀.

-> POST λ©”μ„œλ“œλŠ” λ©”μ‹œμ§€ λ°”λ””λ₯Ό 톡해 μ„œλ²„λ‘œ μš”μ²­ 데이터λ₯Ό μ „λ‹¬ν•œλ‹€.

 

11. POST λ©”μ„œλ“œ (μ‹ κ·œ 데이터λ₯Ό 생성할 λ•Œ)

-> json ν˜•μ‹μœΌλ‘œ username: 'young', age: 20 μ΄λΌλŠ” 데이터λ₯Ό μ„œλ²„μ— λ“±λ‘μ‹œν‚€κ³  싢을 λ•Œ

-> (예λ₯Ό λ“€μ–΄, django formλ¬Έμ—μ„œ κ°„λ‹¨ν•˜κ²Œ 이름과 λ‚˜μ΄λ₯Ό 적고 submit λˆ„λ₯Ό λ•Œμ˜ λ©”μ»€λ‹ˆμ¦˜μ΄λΌ μƒκ°ν•˜μž)

-> 201 Created 응닡 -> Location을 λ§Œλ“€μ–΄ λ‚Έλ‹€ -> μ„±κ³΅μ μœΌλ‘œ μ„œλ²„μ— 데이터 등둝(생성)이 λμŒμ„ μ‘λ‹΅λ©”μ‹œμ§€λ‘œ 보낸 것

 

12. POST λ©”μ„œλ“œ 정리

  1. μƒˆ λ¦¬μ†ŒμŠ€ 등둝(생성) -> μ„œλ²„κ°€ 아직 μ‹λ³„ν•˜μ§€ μ•Šμ€ μƒˆ λ¦¬μ†ŒμŠ€ 생성
  2. μš”μ²­ 데이터 처리 -> λ‹¨μˆœ 데이터 생성, 변경을 λ„˜μ–΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” 경우
  3. λ‹€λ₯Έ λ©”μ„œλ“œλ‘œ μ²˜λ¦¬ν•˜κΈ° μ• λ§€ν•œ 경우 -> 쑰회 데이터λ₯Ό λ„˜κ²¨μ•Όν•˜λŠ”λ° GET λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μ–΄λ €μš΄ 경우

13. POST μš”μ²­ 데이터 처리

-> ex) μ£Όλ¬Έμ—μ„œ κ²°μ œμ™„λ£Œ - 배달 μ‹œμž‘ -λ°°λ‹¬μ™„λ£Œ 처럼 λ‹¨μˆœ κ°’ 변경을 λ„˜μ–΄ ν”„λ‘œμ„ΈμŠ€ μƒνƒœκ°€ λ³€κ²½λ˜λŠ” κ²½μš°λ„ λͺ¨λ‘ POST λ©”μ„œλ“œλ‘œ 처리

 

14. HTTP λ©”μ„œλ“œμ˜ 속성

  • μ•ˆμ „ (safe methods)
  • λ©±λ“± (idempotent methods)
  • μΊμ‹œ κ°€λŠ₯ (cacheable methods)

15. μ•ˆμ „

-> ν˜ΈμΆœν•΄λ„ λ¦¬μ†ŒμŠ€λŠ”  λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€. (GET, HEAD: λ‹¨μˆœ 쑰회이기 λ•Œλ¬Έμ—)

Q: 연속 호좜둜 μΈν•œ, λ‘œκ·Έκ°€ μŒ“μ΄λ©΄ μž₯μ•  λ°œμƒν•˜μ§€ μ•Šλ‚˜μš”?

A: μ•ˆμ „μ€ ν•΄λ‹Ή λ¦¬μ†ŒμŠ€ 자체만 κ³ λ €ν•œλ‹€. (λ‘œκ·Έκ°€ μŒ“μ΄λŠ” 것은 λ¦¬μ†ŒμŠ€μ™€λŠ” λ³„κ°œ). 즉 μž₯μ•  λ°œμƒ X (μ•ˆμ „ν•˜λ‹€!)

 

16. λ©±λ“±: μˆ˜ν•™μ—μ„œ, 연산을 μ—¬λŸ¬ 번 μ μš©ν•˜λ”λΌλ„ κ²°κ³Όκ°€ 달라지지 μ•ŠλŠ” μ„±μ§ˆμ„ μ˜λ―Έν•œλ‹€.

-> f(f(x)) = f(x) 

-> 즉, μž¬κ·€λ₯Ό 쳐도 자기 μžμ‹ μ΄ λœλ‹€. ν•œλ²ˆ ν˜ΈμΆœν•˜λ“ , 100번 ν˜ΈμΆœν•˜λ“  κ²°κ³ΌλŠ” κ°™λ‹€. 이것이 멱등이닀.

-> POSTλŠ” 멱등이 μ•„λ‹ˆλ‹€! 두 번 ν˜ΈμΆœν•˜λ©΄ 같은 κ²°μ œκ°€ μ€‘λ³΅ν•΄μ„œ λ°œμƒν•  수 μžˆλŠ”λ° μ΄λŠ” 같은 κ²°κ³Όκ°€ 달라지기 λ•Œλ¬Έμ΄λ‹€. f(f(x)) ≠ f(x) 

-> 반면 GET은 'λ©±λ“±'을 μœ μ§€ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆλ‹€ => λ™μΌν•œ μš”μ²­μ„ λ°˜λ³΅ν•˜λ©΄ λ™μΌν•œ κ²°κ³Όκ°€ λ‚˜μ™€μ•Όν•œλ‹€.

 

17. λ©±λ“±μ˜ ν™œμš©

-> μžλ™ 볡ꡬ λ©”μ»€λ‹ˆμ¦˜ : μ„œλ²„κ°€ TIMEOUTλ“± 으둜 정상 응닡을 주지 λͺ»ν•  λ•Œ, ν΄λΌμ΄μ–ΈνŠΈκ°€ 같은 μš”μ²­μ„ 계속해도 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ”κ°€?

=> if yes: 멱등이닀. => if no: 멱등이 μ•„λ‹ˆλ‹€.

-> μ„œλ²„κ°€ 정상 응닡을 주지 λͺ»ν•˜λŠ” μƒν™©μ—μ„œ 같은 μš”μ²­μ΄ 계속 λ“€μ–΄μ˜¨λ‹€ => 같은 μš”μ²­μ΄ λ“€μ–΄μ˜€κΈ° λ•Œλ¬Έμ— 같은 κ²°κ³Όλ₯Ό λ³΄μ—¬μ€˜μ•Ό ν•œλ‹€(λ©±λ“±)

=> 그렇지 λͺ»ν•˜λ‹€λ©΄(λ‹€λ₯Έ κ²°κ³Όλ₯Ό 보여쀀닀면) 멱등이 μ•„λ‹ˆλ‹€

μ™ΈλΆ€μš”μΈ: PUT으둜 인해 데이터가 λ³€κ²½λœκ²ƒμ΄μ§€, GET으둜 인해 λ³€κ²½λœ 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έ

18. μΊμ‹œ κ°€λŠ₯

-> 응닡 κ²°κ³Ό λ¦¬μ†ŒμŠ€λ₯Ό μΊμ‹œν•΄μ„œ μ‚¬μš©ν•΄λ„ λ˜λŠ”κ°€?

-> GET, HEAD, POST, PATCH λ©”μ„œλ“œλŠ” μΊμ‹œκ°€λŠ₯ -> μ‹€μ œλ‘œλŠ” GET, HEAD μ •λ„λ§Œ μΊμ‹œλ‘œ μ‚¬μš© (κ΅¬ν˜„μ΄ μ‰½μ§€μ•Šμ•„~)

 

-> GET은 λΆˆν•„μš”ν•œ μš”μ²­μ„ μ œν•œν•˜κΈ° μœ„ν•΄ λ™μΌν•œ (GET) μš”μ²­μ— λŒ€ν•΄ μΊμ‹œ 처리 될 수 μžˆλ‹€.

-> js, css, 이미지 같은 정적 μ»¨ν…μΈ λŠ” 데이터양이 크고, 변경될 일이 적어 λ°˜λ³΅ν•΄μ„œ λ™μΌν•œ μš”μ²­μ„ 보낼 ν•„μš”κ°€ μ—†λ‹€.

-> 정적 컨텐츠λ₯Ό μš”μ²­ν•˜κ³  λ‚˜λ©΄ λΈŒλΌμš°μ €μ—μ„œλŠ” μš”μ²­μ„ μΊμ‹œν•΄λ‘κ³ , λ™μΌν•œ μš”μ²­μ΄ λ°œμƒν•  λ•Œ μ„œλ²„λ‘œ μš”μ²­μ„ 보내지 μ•Šκ³  μΊμ‹œλœ 데이터λ₯Ό μ‚¬μš©. κ·Έλž˜μ„œ ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ„ ν•˜λ‹€λ³΄λ©΄ 정적 컨텐츠가 μΊμ‹œλΌ 컨텐츠λ₯Ό 변경해도 λ‚΄μš©μ΄ λ°”λ€Œμ§€ μ•ŠλŠ” κ²½μš°κ°€ μ’…μ’… λ°œμƒν•œλ‹€.

(λΈŒλΌμš°μ €μ˜ μΊμ‹œλ₯Ό μ§€μ›Œμ£Όλ©΄ λ‹€μ‹œ 컨텐츠λ₯Ό μ‘°νšŒν•˜κΈ° μœ„ν•΄ μ„œλ²„λ‘œ μš”μ²­μ„ λ³΄λ‚΄κ²Œ λœλ‹€.)

 

 

 

 

 

 

μ°Έκ³ 

hongsii.github.io/2017/08/02/what-is-the-difference-get-and-post/

'🌐 Web' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

7. HTTP 헀더 1 - 일반 헀더  (0) 2021.01.11
5. HTTP λ©”μ„œλ“œ ν™œμš©  (0) 2021.01.03
3. HTTP  (0) 2020.12.31
2. URI와 μ›Ή λΈŒλΌμš°μ € μš”μ²­ 흐름  (0) 2020.12.26
1. 인터넷 λ„€νŠΈμ›Œν¬  (0) 2020.12.26