μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[HTTP] REST / GET / POST 방식

MK_____ 2021. 11. 24. 17:57

TTPλ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 데이터λ₯Ό μ£Όκ³  λ°›λŠ” 방식을 ν”νžˆ REST api λ₯Ό μ΄μš©ν•œ 데이터 κ΅ν™˜ 방식이라고 λ§ν•œλ‹€. ν˜„λŒ€ λ„€νŠΈμ›Œν¬ μ‹œμž₯μ—μ„œ κ°€μž₯ λ§Žμ€ ν¬μ…˜μ„ μ°¨μ§€ν•˜κ³  μžˆλŠ” 방식이기 λ•Œλ¬Έμ— ν•΄λ‹Ή 방식을 잘 μ•Œκ³  μžˆμ–΄μ•Ό ν•œλ‹€.

REST λž€?

REST λŠ” Representational State Transfer μ˜ μ€„μž„λ§μ΄λ‹€. ν•΄μ„ν•˜λ©΄ "ν‘œν˜„μ„ ν†΅ν•œ μƒνƒœ 전달" μ •λ„λ‘œ λ³Ό 수 μžˆλ‹€. RESTλ₯Ό 잘 μ„€λͺ…ν•  수 μžˆλŠ” 해석은 "ν‘œν˜„(μžμ›, 결과의 ν‘œν˜„λ°©μ‹)에 λ”°λ₯Έ μƒνƒœμ˜ 전달" μ΄ 더 μ •ν™•ν•  것 κ°™λ‹€.

HTTP URI(Uniform Resource Identifier)λ₯Ό 톡해 μžμ›μ„ λͺ…μ‹œ(μžμ›) ν•˜κ³ , HTTP Method(POST, GET, PUT, DELETE)λ₯Ό 톡해 ν•΄λ‹Ή μžμ›μ— λŒ€ν•œ CRUD Operation(μƒνƒœμ˜ 전달) μ„ μ μš©ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. request κ°€ μ™„λ£Œλ˜λ©΄ μ„œλ²„λŠ” νŠΉμ • representation(ν‘œν˜„λ°©μ‹) μ˜ˆλ₯Ό λ“€μ–΄, json, xml 등을 톡해 responseλ₯Ό 보내쀀닀.
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

apiλž€?

api λŠ” application programming interface 의 μ€„μž„λ§μ΄λ‹€. 즉 μ‘μš©ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•  수 있게 μš΄μ˜μ²΄μ œμ—μ„œ μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λœ»ν•œλ‹€. 운영체제라고 ν•˜λ©΄ λ­”κ°€ κ±°μ°½ν•œ κ°œλ…μ΄ λ˜λŠ” 것 κ°™μ•„, 쑰금 더 κ°€λ³κ²Œ μ—¬κΈΈ 수 있게 μ„€λͺ…ν•˜μžλ©΄, κ·Έλƒ₯ λ‚΄κ°€ λ§Œλ“  μ½”λ“œλ₯Ό λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•  수 있게 λ§Œλ“€μ–΄λ†“μ€ μ†μž‘μ΄ 같은 κ°œλ…μ΄λ‹€.

https://apis.map.kakao.com/web/guide/
μœ„ μ›Ήμ‚¬μ΄νŠΈλ₯Ό 보면 카카였맡 apiλΌλŠ” μ›Ήμ‚¬μ΄νŠΈμ΄λ‹€. μΉ΄μΉ΄μ˜€κ°€ λ§Œλ“€μ–΄λ†“μ€ λ§΅ ν”„λ‘œκ·Έλž¨μ„ λ‹€λ₯Έ μ‘μš©ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λˆμ„ λ˜μ Έμ€€ 것이닀. ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 이 apiλ₯Ό μ΄μš©ν•΄μ„œ λ‚΄ μ‘μš©ν”„λ‘œκ·Έλž¨μ— μΉ΄μΉ΄μ˜€λ§΅μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

REST apiλž€ 이 apiκ°€ REST ν•œ ν˜•μ‹μ„ λ”°λ₯΄κ³  μžˆλŠ” 것을 λ§ν•œλ‹€. 즉 HTTP URI λ₯Ό 톡해 μžμ›μ„ λͺ…μ‹œν•˜κ³ , HTTP λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μžμ› 데이터λ₯Ό κ΅ν™˜ν•˜λŠ” ν˜•μ‹μ„ λ”°λ₯΄λŠ” apiλ₯Ό REST api라고 λΆ€λ₯Έλ‹€.

HTTP λ©”μ„œλ“œ

μœ„μ—μ„œ REST api 방식은 HTTP λ©”μ„œλ“œλ₯Ό 톡해 μžμ›μ„ κ΅ν™˜ν•œλ‹€κ³  κΈ°μˆ ν–ˆλ‹€. HTTP λ©”μ„œλ“œμ—λŠ” GET, POST, PUT, DELETE λ„€ κ°€μ§€ 방식이 μžˆλŠ”λ°, 각 λ©”μ„œλ“œμ˜ νŠΉμ„±μ„ 잘 μ•Œκ³  κ΅¬λΆ„ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ‚΄κ°€ μ›ν–ˆλ˜ ν”„λ‘œκ·Έλž¨ 방식과 λ‹€λ₯Έ κ²°κ³Όλ₯Ό 낳을 수 μžˆλ‹€. HTTPλŠ” μœ μ—°ν•œ ν”„λ‘œν† μ½œμ΄κΈ° λ•Œλ¬Έμ—, ν•œ κ°€μ§€ λ©”μ„œλ“œκ°€ ν•œ κ°€μ§€ λ°©μ‹μœΌλ‘œλ§Œ λ™μž‘ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. 예λ₯Ό λ“€μ–΄μ„œ POST 방식은 데이터λ₯Ό 넣을 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œμ΄μ§€λ§Œ ν•΄λ‹Ή λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ‘°νšŒν•˜λŠ” 데에 μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

GET / POST

GET λ©”μ„œλ“œλŠ” 기본적으둜 μ„œλ²„μ—μ„œ 데이터λ₯Ό λ°›μ•„μ˜€κΈ° μœ„ν•΄μ„œ μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œμ΄λ‹€. λ°μ΄ν„°λ² μ΄μŠ€μ˜ SELECT 쿼리문과 같은 역할을 ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€. POST λ©”μ„œλ“œλŠ” μ„œλ²„μ—μ„œ 데이터λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ μƒˆλ‘œ μΆ”κ°€ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€.

λ‘˜μ˜ κ°€μž₯ 큰 차이점 쀑 ν•˜λ‚˜κ°€ 데이터λ₯Ό μ „μ†‘ν•˜λŠ” 방식이닀. GET κ³Ό POST λ©”μ„œλ“œ λͺ¨λ‘ 데이터λ₯Ό μ„œλ²„λ‘œ 보내야 ν•œλ‹€. POST의 κ²½μš°λŠ” μ„œλ²„μ˜ 데이터λ₯Ό λ³€κ²½ν•˜κ²Œ 되기 λ•Œλ¬Έμ— λ‹Ήμ—°νžˆ λ°”κΏ€ 데이터λ₯Ό 보내주어야 ν•˜μ§€λ§Œ, GET의 κ²½μš°μ—λŠ”?
GET λ©”μ„œλ“œ λ˜ν•œ λ‚΄κ°€ λ°›μ•„μ˜¬ μžμ›μ„ λͺ…ν™•νžˆ μ§€μ •ν•΄μ£Όμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, μžμ›μ˜ 경둜λ₯Ό μ§€μ •ν•΄μ£ΌλŠ” 데이터λ₯Ό 보내주어야 ν•œλ‹€. 이 λ°©μ‹μ—μ„œ λ‘˜μ˜ 차이가 μžˆλŠ”λ°, GET 방식은 query 문에 데이터λ₯Ό λ„£μ–΄μ„œ URL에 μ§μ ‘μ μœΌλ‘œ 데이터가 ν¬ν•¨λ˜κ²Œ λœλ‹€.

www.example.com?id=mommoo&pass=1234

μœ„ 처럼 URL이 μž‘μ„±λ˜κ²Œ 되고, 이 쿼리문이 헀더에 ν¬ν•¨λ˜μ–΄ μ„œλ²„λ‘œ μ „μ†‘λœλ‹€.
반면 POSTλŠ” body 내뢀에 이 데이터λ₯Ό λ„£μ–΄μ„œ 보낸닀. body 내뢀에 ν•΄λ‹Ή 데이터λ₯Ό λ„£μ–΄μ„œ 보내기 λ•Œλ¬Έμ— κ²‰μœΌλ‘œλŠ” μ–΄λ–€ 데이터가 μ „μ†‘λ˜μ—ˆλŠ”μ§€ λ³΄μ΄μ§€λŠ” μ•ŠλŠ”λ‹€.

μž₯단점

POSTλŠ” λ³΄μ•ˆμ μœΌλ‘œ μš°μˆ˜ν•˜λ‹€?

POSTκ°€ κ²‰μœΌλ‘œ 데이터가 λ…ΈμΆœλ˜μ§€ μ•ŠλŠ” νŠΉμ„± λ•Œλ¬Έμ—, POSTκ°€ GETλ³΄λ‹€λŠ” λ³΄μ•ˆμ μœΌλ‘œ μš°μˆ˜ν•˜λ‹€κ³  λ§ν•˜λŠ”λ°, 사싀 상 μ˜λ―ΈλŠ” μ—†λ‹€. url에 λ…ΈμΆœλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ§μ ‘μ μœΌλ‘œ 와닿지 μ•ŠλŠ” 것 뿐이지, 컴퓨터λ₯Ό 쑰금만 λ‹€λ£° 수 μžˆλ‹€λ©΄ λ³΄μ•ˆμ μœΌλ‘œ 큰 μ˜λ―Έκ°€ μ—†λ‹€. λ•Œλ¬Έμ—, POSTλ₯Ό λ³΄μ•ˆμ μœΌλ‘œ μš°μˆ˜ν•˜λ‹€λŠ” 이유둜 원리에 λ§žμ§€ μ•Šκ²Œ μ‚¬μš©ν•˜λŠ” 일은 μ§€μ–‘ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•œλ‹€.

ν•˜μ§€λ§Œ νšŒμ‚¬ μž…μž₯μ—μ„œ(개발자 μ™Έμ˜ μ‚¬λžŒμ΄) μ€‘μš”ν•œ 데이터가 url에 κ³ μŠ€λž€νžˆ λ…ΈμΆœλ˜λŠ” 게 λˆˆμ— 보이면 λ‹Ήμ—°νžˆ 기뢄이 μ•ˆ 쒋을 것이닀. κ°œλ°œμžκ°€ 이건 μ‹€μ§ˆμ μœΌλ‘œ λ³΄μ•ˆ 상 μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€! 라고 μ£Όμž₯해도 μ˜λ―Έκ°€ μ—†λ‹€. λ•Œλ¬Έμ— 데이터λ₯Ό μ‘°νšŒν•˜λŠ” request라 해도 νŒŒλΌλ―Έν„°λ‘œ μ€‘μš”ν•œ 데이터(κ°œμΈμ •λ³΄)κ°€ λ„˜μ–΄κ°€μ•Ό ν•œλ‹€λ©΄ POST 방식을 μ‚¬μš©ν•˜λŠ” 것이 μ΅œμ†Œν•œμ˜ κ°œλ…λ„ μžƒμ€ 개발자둜 λΉ„μΆ°μ§€μ§€ μ•ŠλŠ” 방식이닀. REST 원칙을 μ§€ν‚€λŠ” 것이 우리의 λ°₯쀄을 μ§€ν‚€λŠ” 것보닀 μ€‘μš”ν•˜μ§€λŠ” μ•Šμ„ 것이닀.

GET은 POST보닀 λΉ λ₯΄λ‹€.

λΈŒλΌμš°μ €λŠ” GET으둜 λ°›μ•„μ˜¨ 데이터λ₯Ό μΊμ‹±ν•œλ‹€. GET은 URL에 λ‚΄κ°€ λ°›μ•„μ˜¬ 데이터λ₯Ό λͺ…ν™•ν•˜κ²Œ 적어주기 λ•Œλ¬Έμ—, μ •ν™•ν•œ 캐싱이 κ°€λŠ₯ν•΄, GET λ°©μ‹λ§Œ 캐싱을 ν•œλ‹€. λ•Œλ¬Έμ— λ‹€λ₯Έ HTTP λ©”μ„œλ“œμ— λΉ„ν•΄ 더 λΉ λ₯΄κ²Œ μž‘λ™ν•  수 μžˆλ‹€.

GET은 URL κ³΅μœ κ°€ νŽΈλ¦¬ν•˜λ‹€.

GET 방식은 URL에 λͺ¨λ“  μžμ› 경둜λ₯Ό λ‹΄μ•„μ„œ μ „μ†‘ν•˜κΈ° λ•Œλ¬Έμ—, λ‹€λ₯Έ μ‚¬λžŒμ—κ²Œ url 곡유 λ§ŒμœΌλ‘œλ„ ν•΄λ‹Ή μžμ›μ„ κ³΅μœ ν•  수 μžˆλ‹€. 반면 POST 방식은 λ°”λ”” 뢀뢄에 데이터λ₯Ό λ„£μ–΄μ„œ μ„œλ²„μ— 전솑해야 ν•˜κΈ° λ•Œλ¬Έμ— url 곡유 λ§ŒμœΌλ‘œλŠ” μ›ν•˜λŠ” μžμ›μ„ κ³΅μœ ν•  수 μ—†λ‹€.

POSTλŠ” GET보닀 λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό 담을 수 μžˆλ‹€?

GET 방식은 url 길이의 μ œν•œμ΄ 있기 λ•Œλ¬Έμ— 데이터 μ œν•œμ΄ μžˆλ‹€κ³  μ•Œλ €μ Έ μžˆλ‹€. ν•˜μ§€λ§Œ 이건 μ˜›λ‚  λΈŒλΌμš°μ €μ—μ„œ μ œν•œν•˜κ³  있던 사항이고 μ§€κΈˆμ€ λŒ€λ‹€μˆ˜ λ²„μ „μ˜ λΈŒλΌμš°μ €μ— ν•΄λ‹Ή 사항이 μ—†λ‹€.
μ΅μŠ€ν”Œλ‘œλŸ¬λ§Œ url 길이 μ œν•œμ΄ 4000μžκ°€ μžˆλ‹€κ³  ν•œλ‹€.
https://uiandwe.tistory.com/1133