🌿 RestFul 섀계λ₯Ό μ§€ν‚€λŠ” API, 그렇지 μ•Šμ€ API

μ½”λ¦°μ΄μ„œν˜„μ΄Β·2024λ…„ 8μ›” 6일
0

λ°±μ—”λ“œ 곡뢀

λͺ©λ‘ 보기
9/9

곡뢀 계기

Rest Fulν•œ 섀계 λΌλŠ” ν‘œν˜„μ„ 정말 많이 λ“€μ–΄λ΄€μ§€λ§Œ λͺ…ν™•ν•˜κ²Œ μ„€λͺ…ν•  수 μ—†μ—ˆλ‹€.
μ •ν™•νžˆ λͺ¨λ₯Έ μ±„λ‘œ APIλ₯Ό λ§Œλ“€λ‹€λ³΄λ‹ˆ 결과물둜 받은 API λ¬Έμ„œκ°€ μ—‰λ§μ΄μ—ˆλ‹€.
이번 글을 톡해 κ°œλ…μ„ μ •λ¦½ν•˜κ³  λ‚΄κ°€ μ„€κ³„ν•œ APIλ₯Ό μˆ˜μ •ν•΄λ³΄λ©΄ 쒋을 것 κ°™λ‹€.

ν˜„μž¬ API λ¬Έμ„œ

제λͺ©λ©”μ„œλ“œURL
νŠΉμ • μ œν’ˆμ˜ μ˜΅μ…˜ λͺ©λ‘ 쑰회GET/api/options/{product_id}
μƒˆλ‘œμš΄ μ˜΅μ…˜ μΆ”κ°€POST/api/options/{product_id}
μ˜΅μ…˜ μ‚­μ œDELETE/api/options/{option_id}

APIλž€?

APIλŠ” Application Programming Interface, 즉 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œκ·Έλž˜λ° μΈν„°νŽ˜μ΄μŠ€λ‹€.
μΈν„°νŽ˜μ΄μŠ€λŠ” μ–΄λ–€ μž₯μΉ˜μ™€ μž₯치λ₯Ό μ—°κ²°ν•΄μ£ΌλŠ” μž₯치λ₯Ό λ§ν•œλ‹€.
λ”°λΌμ„œ APIλŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œκ·Έλž¨λΌλ¦¬ 톡신할 수 μžˆλ„λ‘ ν•˜λŠ” μž₯치,μ•„ν‚€ν…μ²˜μ΄λ‹€.

그러면 ν•¨μˆ˜λ„ μΈν„°νŽ˜μ΄μŠ€μΈκ°€μš”?

πŸ™…β€β™‚οΈ ν•¨μˆ˜λŠ” ν”„λ‘œκ·Έλž¨ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•˜λŠ” μ½”λ“œμ΄λ‹€.
일반적으둜 APIλ₯Ό 이야기 ν• λ•ŒλŠ” μ™ΈλΆ€μ˜ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ΄λ‚˜ λͺ¨λ“ˆμ΄ μ‚¬μš©ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§ν•œλ‹€.

APIλŠ” μ›Ή API만 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€.

APIλŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜λΌλ¦¬ ν†΅μ‹ ν•˜λ„λ‘ ν•˜λŠ” 것이닀. λ”°λΌμ„œ 웹이 μ•„λ‹Œ API도 μ‘΄μž¬ν•œλ‹€.

  • ν”„λ ˆμž„μ›Œν¬ API : μŠ€ν”„λ§κ³Ό 같은 ν”„λ ˆμž„μ›Œν¬μ˜ λΌμ΄λΈŒλŸ¬λ¦¬λ„ API의 일쒅이닀.
  • λ©€ν‹°λ―Έλ””μ–΄ API : λ©€ν‹°λ―Έλ””μ–΄λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ λ©€ν‹°λ―Έλ””μ–΄ API도 μ‘΄μž¬ν•œλ‹€.

μ›Ή API

웹을 톡해 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°„μ˜ 톡신을 ν•  수 있게 ν•˜λŠ” API이닀.

μ›Ή APIλŠ” λͺ¨λ‘ HTTP API일까?

πŸ™…β€β™‚οΈ λ„€νŠΈμ›Œν¬ μͺ½ κ°œλ…μ΄μ§€λ§Œ, λ‹€μ–‘ν•œ 톡신 방법이 μ‘΄μž¬ν•œλ‹€.
μ–‘λ°©ν–₯ 톡신을 ν•  수 μžˆλŠ” WebSocket은 μ΄ˆκΈ°μ—°κ²°μ—λ§Œ httpλ₯Ό μ‚¬μš©ν•œ ν›„ 연결을 λŠμ§€ μ•ŠλŠ”λ‹€.

HTTPλž€
주둜 μ›Ή ν™˜κ²½μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°„μ˜ 톡신을 κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” λ„€νŠΈμ›Œν¬ ν”„λ‘œν† μ½œμ΄λ‹€.

HTTP APIλŠ” λͺ¨λ‘ REST API일까?

HTTP APIλŠ” HTTP ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•΄μ„œ 데이터λ₯Ό κ΅ν™˜ν•˜λŠ” APIλ₯Ό μ˜λ―Έν•œλ‹€.
또 Rest APIλŠ” REST μ•„ν‚€ν…μ²˜λ₯Ό λ”°λ₯΄λŠ” APIλ₯Ό λ§ν•œλ‹€. λ”°λΌμ„œ λ™μ˜μ–΄λŠ” μ•„λ‹ˆμ§€λ§Œ 거의 REST μ•„ν‚€ν…μ²˜λ₯Ό λ”°λ₯΄λ„둝 APIλ₯Ό μ„€κ³„ν•˜κΈ° λ•Œλ¬Έμ— λΉ„μŠ·ν•œ 의미둜 μ“°μ΄λŠ” 쀑이닀.


REST API

REST APIλ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄μ„œ HTTP API > μ›Ή API > API κΉŒμ§€ μ•Œμ•„λ³΄μ•˜λ‹€. λ‹€μ‹œ REST API λ‚΄μš©μœΌλ‘œ λŒμ•„μ˜€μž! ✈️

REST APIλž€?

REST μ•„ν‚€ν…μ²˜λž€ HTTP ν”„λ‘œν† μ½œμ˜ μž₯점을 ν™œμš©ν•  수 있게 ν•˜λŠ” μΌμ’…μ˜ 섀계방법,μ§€μΉ¨μ„œμ΄λ‹€.

REST APIλž€,이런 REST μ§€μΉ¨μ„œλ₯Ό 잘 지킀킨 API라고 ν•  수 μžˆλ‹€.

λ˜ν•œ REST FULν•˜λ‹€λŠ” ν‘œν˜„μ€ REST의 섀계도λ₯Ό 잘 μ§€μΌ°λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

RESTν•˜κΈ° μœ„ν•΄μ„œλŠ”

1) 일관적인 μΈν„°νŽ˜μ΄μŠ€

2) λ¬΄μƒνƒœ : ν΄λΌμ΄μ–ΈνŠΈμ˜ 이전 μš”μ²­ μƒμƒνƒœλ₯Ό μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. μ„œλ²„λŠ” λ“€μ–΄μ˜€λŠ” μš”μ²­μ—λ§Œ μ‘λ‹΅ν•˜κ³  μ²˜λ¦¬ν•œλ‹€. 이λ₯Ό ν†΅ν•΄μ„œ κ΅¬ν˜„μ΄ λ‹¨μˆœν•΄μ§€κ³  μžμœ λ„κ°€ 높아진닀.

3) μΊμ‹œ 처리 κ°€λŠ₯ : ν΄λΌμ΄μ–ΈνŠΈλ‚˜ 쀑간 μΊμ‹œμ„œλ²„μ— μ €μž₯된 응닡 데이터λ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ μ„œλ²„κ°€ λ°˜λ³΅μˆ˜ν–‰μ„ ν•˜λŠ” 것을 막아쀀닀.

4) 계측화 : REST μ„œλ²„λŠ” 닀쀑 κ³„μΈ΅μœΌλ‘œ ꡬ성될 수 μžˆλ‹€.

5) 자체둜 이해가λŠ₯ν•΄μ•Όν•œλ‹€. : μ μ ˆν•œ URI 섀계와 http λ©”μ„œλ“œμ˜ ν™œμš©μ„ ν†΅ν•΄μ„œ 이룰 수 μžˆλ‹€.

6) ν΄λΌμ΄μ–ΈνŠΈ - μ„œλ²„ ꡬ쑰 : ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ 역할을 λͺ…ν™•ν•˜κ²Œ ꡬ뢄할 수 μž‡λ‹€.

이건 λΆˆμΆ©λΆ„ν•˜λ‹ˆ REST APIλ₯Ό μ„€κ³„ν•˜κΈ° μœ„ν•œ κ·œμΉ™κ³Ό 예제λ₯Ό μ΄μ•ΌκΈ°ν•˜κ² λ‹€.
κ·Έ 전에 μ•„λž˜ 두가지 κ·œμΉ™μ€ ν•„μˆ˜λ‘œ μ§€μΌœμ•Όν•˜λŠ” κ·œμΉ™μ΄λΌκ³  ν•œλ‹€.


REST API 섀계 κ·œμΉ™

(1) URI둜 μ •λ³΄μ˜ μžμ›μ„ ν‘œν˜„ν•΄μ•Όν•œλ‹€.

URIμ—λŠ” CRUD와 같은 μžμ›μ— λŒ€ν•œ ν–‰μœ„λ₯Ό 담지 μ•Šκ³ , μžμ›μ„ λ‚˜νƒ€λ‚΄λŠ” μˆ˜λ‹¨μœΌλ‘œλ§Œ μ‚¬μš©ν•œλ‹€.

λ˜ν•œ URI의 μžμ›μ€ κ°μ²΄λ³΄λ‹€λŠ” μ—”ν‹°ν‹°λ₯Ό λœ»ν•œλ‹€. 쑰금 더 μ§‘ν•©μ˜ κ°œλ…μœΌλ‘œ 쓰이기 λ•Œλ¬Έμ—λ‹¨μˆ˜ν˜•λ³΄λ‹€λŠ” λ³΅μˆ˜ν˜•μœΌλ‘œ λ‚˜νƒ€λ‚Έλ‹€.

(2) μžμ›μ— λŒ€ν•œ ν–‰μœ„λŠ” HTTP λ©”μ†Œλ“œλ‘œ ν‘œν˜„ν•œλ‹€.

HTTP λ©”μ„œλ“œλŠ” GET, POST, PUT, DELETE , PATCH 등이 μžˆλ‹€.
URI둜 ν‘œν˜„ν•œ μžμ›μ— λŒ€ν•œ ν–‰μœ„λŠ” HTTP λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ ν‘œν˜„ν•˜λŠ” 것이닀.

 GET /members/1 : -> 1번 μœ μ €μ˜ 정보λ₯Ό κ°€μ Έμ˜¨λ‹€.
 DELETE /members/1 : -> 1번 μœ μ €μ˜ 정보λ₯Ό μ‚­μ œν•œλ‹€.

μœ„μ²˜λŸΌ ν–‰μœ„μ„€λͺ…은 HTTP λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.

μ μ ˆν•œ μžμ› ν‘œν˜„λ²•μ„ μ•Œμ•„λ³΄μž.

볡수λͺ…(μ»¬λ ‰μ…˜)을 μ‚¬μš©ν•˜μž.

URIμ—μ„œ μžμ›μ€ 볡수둜 ν‘œν˜„λ˜κ³ , 단일 μžμ›(document) 에 μ ‘κ·Όν•  λ•ŒλŠ” μžμ› μ»¬λ ‰μ…˜μ— 고유 μ‹λ³„μžλ₯Ό μΆ”κ°€ν•΄μ„œ ν‘œν˜„ν•œλ‹€.

/users : μ‚¬μš©μž μ»¬λ ‰μ…˜
/users/1 : μ‹λ³„μžκ°€ 1인 단일 μ‚¬μš©μž

/sports/soccer 
/sports/soccer/players/13 

URIμ—μ„œ μžμ›μ„ ν‘œν˜„ν•  λ•ŒλŠ” μ‹€μ œ μžμ›μ˜ 관계λ₯Ό κ³ λ €ν•œλ‹€.

(ex) GET /cars/811/drivers/ 		> μ°¨811 의 λ“œλΌμ΄λ²„ 리슀트λ₯Ό λ°˜ν™˜ν•œλ‹€.
(ex) GET /cars/811/drivers/4		> μ°¨ 811의 4번 λ“œλΌμ΄λ²„ 정보λ₯Ό λ°˜ν™˜.

* 계측 관계λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ μŠ¬λž˜μ‹œ(`/`)λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 

쿼리 νŒŒλΌλ―Έν„°λŠ” νŠΉμ • 쑰건을 ν‘œν˜„ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.

쿼리 νŒŒλΌλ―Έν„°λ‘œ κ²€μƒ‰μ˜ 쑰건, νŽ˜μ΄μ§€λ„€μ΄μ…˜, μ •λ ¬κΈ°μ€€ 등등을 ν‘œν˜„ν•  수 μžˆλ‹€.

GET /users?fields=id,name,email : μ‚¬μš©μž λͺ©λ‘μ—μ„œ id, name, email ν•„λ“œλ§Œ λ°˜ν™˜

더 μƒμ„Έν•œ REST API κ·œμΉ™μ„ μ•Œμ•„λ³΄μž.

  • μ—λŸ¬λŠ” HTTP의 μƒνƒœμ½”λ“œμ™€ λ©”μ‹œμ§€λ₯Ό μ‚¬μš©ν•΄μ„œ μ²˜λ¦¬ν•œλ‹€.
  • 버전을 λͺ…μ‹œν•  μˆ˜λ„ μžˆλ‹€.
  • URI λ§ˆμ§€λ§‰ 문자둜 μŠ¬λž˜μ‹œ(/)λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 밑쀄을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν•˜μ΄ν”ˆμ„ μ‚¬μš©ν•œλ‹€.
  • λŒ€λ¬Έμžκ°€ μ•„λ‹Œ μ†Œλ¬Έμžλ₯Ό μƒκ°ν•œλ‹€.
  • 파일 ν™•μž₯μžλŠ” URI에 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ¦¬νŒ©ν† λ§ν•˜κΈ°

REST Fulν•œ μ„€κ³„μ—μ„œ λ³Έ λ‚΄ API의 문제점

μ•„λž˜ API λ¬Έμ„œλŠ” μ–΄λ–€ 문제점이 μžˆμ„κΉŒ?? πŸ€”

제λͺ©λ©”μ„œλ“œURL
νŠΉμ • μ œν’ˆμ˜ μ˜΅μ…˜ λͺ©λ‘ 쑰회GET/api/options/{product_id}
μƒˆλ‘œμš΄ μ˜΅μ…˜ μΆ”κ°€POST/api/options/{product_id}
μ˜΅μ…˜ μ‚­μ œDELETE/api/options/{option_id}
  • κ³„μΈ΅ν˜• ꡬ쑰λ₯Ό κ³ λ €ν•œλ‹€λ©΄ ν¬ν•¨λ˜λŠ” μ»¬λ ‰μ…˜μ΄ 뒀에 μ˜¨λ‹€.
    products > options μˆœμ„œκ°€ 더 μ μ ˆν•  것이닀.

  • μ»¬λ ‰μ…˜ 뒀에 μ˜€λŠ” 값은 κ·Έ μ»¬λ ‰μ…˜μ˜ λ„νλ¨ΌνŠΈλ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
    options뒀에 μ˜€λŠ” μ‹λ³„μž 값은 {option_id}이 μ μ ˆν•  것이닀.

  • 톡일성을 지킀지 λͺ»ν–ˆλ‹€λŠ” λ¬Έμ œμ λ„ μžˆλ‹€.

μ μ ˆν•˜κ²Œ λ°”κΎΌ API

제λͺ©λ©”μ„œλ“œURL
νŠΉμ • μ œν’ˆμ˜ μ˜΅μ…˜ λͺ©λ‘ 쑰회GET/api/products/{product_id}/options
μƒˆλ‘œμš΄ μ˜΅μ…˜ μΆ”κ°€POST`/api/products/{product_id}/options
μ˜΅μ…˜ μ‚­μ œDELETE/api/products/{product_id}/options/{option_id}

톡일성을 κ°€μ§€κ²Œ λ˜μ—ˆκ³  μ»¬λ ‰μ…˜>λ„νλ¨ΌνŠΈμ˜ κ·œμΉ™κ³Ό μ μ ˆν•œ 계측 ꡬ쑰λ₯Ό κ°€μ§€κ²Œ λ˜μ—ˆλ‹€ πŸ‘πŸ‘


ν•˜μ§€λ§Œ 이런 REST APIλ₯Ό 늘 지킬 수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€.

λ‚΄ 상황

  • λ‚΄ μ„œλ²„μ—μ„œ 카카였 APIλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©μžλ³„ 토큰을 μ‚¬μš©ν•΄μ•Όν–ˆλ‹€.
    REST APIλ₯Ό μœ„ν•΄μ„œλŠ” λ¬΄μƒνƒœλ₯Ό μœ„ν•΄ μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ‚˜ 정보λ₯Ό μ €μž₯ν•˜μ§€ μ•Šλ„λ‘ ν•˜μ§€λ§Œ λ³΄μ•ˆ 상 이 토큰은 주고받지 μ•Šκ³  μ„œλ²„ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©ν•΄μ•Όν•œλ‹€.

μœ„ κ²½μš°μ—λŠ” λ³΄μ•ˆμ„ μœ„ν•΄μ„œ λ¬΄μƒνƒœμ„±μ„ κΉ¨λŠ” 것이 더 μ μ ˆν•  것이닀. 이처럼 λͺ¨λ“  REST APIλ₯Ό μ—„κ²©ν•˜κ²Œ μ§€ν‚€λŠ” 것이 μ•„λ‹ˆλΌ 싀무 운영 λ³„λ‘œ μ μ ˆν•œ λ„μž…μ„ κ³ λ €ν•΄μ•Όν•œλ‹€.


참고자료

AWS RestFul API
https://meetup.nhncloud.com/posts/92
https://jins-dev.tistory.com/entry/Rest-API-%EC%84%A4%EA%B3%84%EB%A5%BC-%EC%9C%84%ED%95%B4-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EC%95%8C%EC%95%84%EC%95%BC%ED%95%A0-10%EA%B0%80%EC%A7%80-%EC%B2%B4%ED%81%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8

profile
24λ…„λ„κΉŒμ§€ ν”„λ‘œμ νŠΈ λ‘κ°œλ₯Ό 마치고 25λ…„μ—λŠ” 개발 νŒ€μž₯을 ν•  수 μžˆλŠ” μ‹€λ ₯이 되자!

0개의 λŒ“κΈ€