REST-API

랏 뜨·2025λ…„ 1μ›” 2일

πŸ”Ž Overview

Β REST-API κ°œλ°œμ€ μ—¬μ „νžˆ λ°±μ—”λ“œ 개발의 주된 λ°©μ‹μœΌλ‘œ 자리작고 μžˆλ‹€.
μ΄λŠ” λ°±μ—”λ“œμ™€ ν”„λ‘ νŠΈμ—”λ“œλ₯Ό λͺ…ν™•ν•˜κ²Œ λΆ„λ¦¬ν•¨μœΌλ‘œ 각 κ°œλ°œμžλ“€μ˜ λΉ„μš©μ„ μ ˆκ°ν•˜κ³  퀄리티λ₯Ό λ†’μ΄λŠ” 효과λ₯Ό μ œκ³΅ν•΄μ€€λ‹€.

Β  REST-APIλŠ” 무엇이며, μ–΄λ–»κ²Œ λ™μž‘ν•˜κ³  μ–΄λ–€ νŠΉμ§•κ³Ό μž₯점이 μžˆμ„κΉŒ?
μΆ”κ°€λ‘œ, μ΅œκ·Όμ—λŠ” REST-API의 단점을 λ³΄μ™„ν•œ μƒˆλ‘œμš΄ 개발 방식듀도 λ“±μž₯ν•˜κ³  μžˆλ‹€. μ΄λŸ¬ν•œ 개발 방식듀은 μ–΄λ–€ 것듀이 μžˆμ„κΉŒ?


πŸ“• REST

  • μ›Ήμ—μ„œ μžμ›μ„ κ΄€λ¦¬ν•˜κ³  μ ‘κ·Όν•˜κΈ° μœ„ν•œ μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌ
  • Representational State Transfer의 μ•½μž
  • HTTP ν”„λ‘œν† μ½œμ„ 기반으둜 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ μƒν˜Έμž‘μš©μ„ μ„€κ³„ν•˜κΈ° μœ„ν•œ κ°€μ΄λ“œλΌμΈ 제곡
  • 주둜 RESTful μ›Ή μ„œλΉ„μŠ€ κ°œλ°œμ— μ‚¬μš©


πŸ”’ REST의 μ£Όμš” 원칙

1) μžμ› (Resource)

  • URI λ₯Ό 톡해 μžμ›μ„ 식별
  • ex) /post , /member/user1 ...

2) ν‘œν˜„ (Representation)

  • μžμ›μ€ JSON , XML , HTML λ“± λ‹€μ–‘ν•œ ν˜•μ‹μœΌλ‘œ ν‘œν˜„λ¨
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„λ‘œλΆ€ν„° μžμ›μ˜ ν˜„μž¬ μƒνƒœλ₯Ό μš”μ²­ν•˜κ³  ν‘œν˜„λ°›μŒ

3) μƒνƒœ μ—†μŒ (Stateless)

  • μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό μ €μž₯ν•˜μ§€ μ•ŠμŒ
  • μš”μ²­ κ°„ ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœλ₯Ό μœ μ§€ν•˜λ €λ©΄, ν΄λΌμ΄μ–ΈνŠΈκ°€ λͺ¨λ“  정보λ₯Ό μš”μ²­μ— ν¬ν•¨ν•΄μ•Όλ§Œ 함

4) HTTP λ©”μ„œλ“œ ν™œμš©

  • HTTP κΈ°λ³Έ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ—… μˆ˜ν–‰
    • GET : μžμ› 쑰회
    • POST : μžμ› 생성
    • PUT : μžμ› 전체 μˆ˜μ •
    • PATCH : μžμ› 일뢀 μˆ˜μ •
    • DELETE : μžμ› μ‚­μ œ

5) 계측 ꡬ쑰 (Layered System)

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ™€ 직접 ν˜Ήμ€ 쀑간 계측(ν”„λ‘μ‹œ, μΊμ‹œ ...)을 톡해 톡신 κ°€λŠ₯

6) μΊμ‹œ κ°€λŠ₯ (Cacheable)

  • HTTP 응닡은 μΊμ‹œ κ°€λŠ₯ν•΄μ•Ό ν•˜λ©°, ν΄λΌμ΄μ–ΈνŠΈλŠ” 이λ₯Ό μ΄μš©ν•΄ μ„±λŠ₯ μ΅œμ ν™” κ°€λŠ₯

πŸ“• REST-API

  • REST 원칙을 λ”°λ₯΄λŠ” API
  • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„ 데이터λ₯Ό μ£Όκ³ λ°›κΈ° μœ„ν•΄ RESTfulν•œ λ°©μ‹μœΌλ‘œ μ„€κ³„λœ μΈν„°νŽ˜μ΄μŠ€


πŸ“‚ REST-API의 ꡬ성 μš”μ†Œ

1) μžμ› (Resource)

  • URI 둜 ν‘œν˜„
  • ex) /post , /member/user ...

2) ν–‰μœ„ (HTTP λ©”μ„œλ“œ)

  • HTTP λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ μžμ›μ— λŒ€ν•œ ν–‰μœ„ μ •μ˜
  • μœ„μ—μ„œ μ„€λͺ…ν•œ λ©”μ„œλ“œ ν™œμš©

3) ν‘œν˜„ (Representation)

  • μžμ›μ˜ 데이터λ₯Ό JSON , XML λ“±μ˜ ν˜•νƒœλ‘œ ν΄λΌμ΄μ–ΈνŠΈμ— 전달
  • ex) JSON 방식은 μ•„λž˜μ™€ κ°™μŒ
{
  "id": 1,
  "author": "μž‘κ°€1",
  "content": "λͺ…μ–Έ1"
}

πŸ”— 일반 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ³Ό REST-API

1) 일반 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜

  • @Controller λ₯Ό μ‚¬μš©ν•˜μ—¬ Viewλ₯Ό λ°˜ν™˜
  • HTML νŒŒμΌμ„ λ°˜ν™˜ν•˜μ—¬ λΈŒλΌμš°μ €μ— ν‘œμ‹œν•  μ›Ή νŽ˜μ΄μ§€ 제곡
  • 일반적으둜 ModelAndView λ‚˜ String 을 λ°˜ν™˜
  • Thymeleaf λ“± ν…œν”Œλ¦Ώ 엔진을 μ‚¬μš©ν•˜μ—¬ HTML 을 λ™μ μœΌλ‘œ μƒμ„±ν•˜κ³ , 이λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ— 전달
  • 개인 ν”„λ‘œμ νŠΈ μ‹œ λ°±μ—”λ“œ 개발과 ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ„ λͺ¨λ‘ μ§„ν–‰ν•΄μ•Ό 함

ex)

@Controller
@RequestMapping("/")
public class AppController {
	@GetMapping
    public String printHello(Model model) {
    	model.addAttribute("msg", "Hello!");
        return "hello";
    }
}
  • src/main/resources/templates/hello.html 을 미리 μž‘μ„±ν•΄λ‘μ—ˆλ‹€κ³  κ°€μ •
  • 동적 데이터 처리λ₯Ό μœ„ν•΄ Thymeleaf λ₯Ό μ„€μ •ν•΄λ‘μ—ˆλ‹€κ³  κ°€μ •
  • model.addAttribute() λ₯Ό μ‚¬μš©ν•˜μ—¬, λ·° ν…œν”Œλ¦Ώμ— 동적인 데이터λ₯Ό 전달할 수 있게 ν•΄μ€Œ
  • 루트 νŽ˜μ΄μ§€λ₯Ό ν˜ΈμΆœν•˜λ©΄, hello.html λ·° νŽ˜μ΄μ§€λ₯Ό λ°˜ν™˜

2) REST-API

  • @RestController λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터가 ν‘œν˜„λœ ν˜•μ‹μœΌλ‘œ λ°˜ν™˜
    • @RestController : @Controller 와 @ResponseBody 의 μ‘°ν•©μœΌλ‘œ, λ°˜ν™˜κ°’μ„ μžλ™μœΌλ‘œ JSON ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 전달
  • 일반적으둜 JSON , XML λ₯Ό 주둜 λ°˜ν™˜ν•˜λ©°, λ‹€μ–‘ν•œ ν˜•μ‹μ˜ 데이터λ₯Ό λ°˜ν™˜ν•  수 있음
  • 일반 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό 달리 λ·° 파일, 즉 HTML 을 λ°˜ν™˜ν•˜μ§€ μ•ŠμŒ

ex)

@RestController
@RequestMapping("/")
public class AppController {
	@GetMapping
    public ResponseEntity<?> printHello() {
    	return ResponseEntity.ok("Hello!");
    }
}
  • μƒνƒœμ½”λ“œλŠ” HTTPStatus.OK κ°€ λ°˜ν™˜λ˜κ³ , κ°’μœΌλ‘œ "Hello!" κ°€ λ„˜μ–΄κ°
  • 이 μ½”λ“œλ‘œ "Hello!"κ°€ 잘 λ„˜μ–΄μ˜€λŠ”μ§€ ν™•μΈν•˜λŠ” ν…ŒμŠ€νŠΈμ½”λ“œλŠ” μ•„λž˜μ™€ κ°™μŒ
@SpringBootTest
@AutoConfigureMockMvc
public class AppControllerTest {
	@Autowired
    private MockMvc mvc;
    
    @Test
    void t1() throws Exception {
        ResultActions resultActions = mvc.perform(get("/"))
                .andDo(print());

        resultActions.andExpect(handler().handlerType(AppController.class))
                .andExpect(handler().methodName("printHello"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$").value("Hello!"));
    }
}
  • MockMvc λ₯Ό μ‚¬μš©ν•˜μ—¬ 컨트둀러 ν…ŒμŠ€νŠΈ μ§„ν–‰
  • status().isOk() 둜 HttpStatus.OK κ°€ 잘 λ„˜μ–΄μ˜€λŠ”μ§€ 확인
  • λ°˜ν™˜λ˜λŠ” 값이 "Hello!" κ°€ λ§žλŠ”μ§€ 확인

⭐ REST-API의 μž₯점

1) ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œμ˜ 뢄리

  • REST-API λŠ” ν”„λ‘ νŠΈμ—”λ“œ(React, Vue, Angular λ“±)와 __λ°±μ—”λ“œ(Spring, Django, Node.js λ“±)λ₯Ό λΆ„λ¦¬ν•˜λŠ” 데 이상적
  • 각 κ°œλ°œνŒ€μ΄ λ…λ¦½μ μœΌλ‘œ μž‘μ—…μ— 집쀑할 수 있음

2) ν΄λΌμ΄μ–ΈνŠΈ λ‹€μ–‘μ„± 지원

  • μ›Ή, λͺ¨λ°”일 μ•±, λ°μŠ€ν¬ν†± μ•± λ“± λ‹€μ–‘ν•œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ™μΌν•œ APIλ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄ μž¬μ‚¬μš©μ„±μ΄ 뛰어남

3) HTTP ν”„λ‘œν† μ½œ 기반

  • HTTP ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— κΈ°μ‘΄ μ›Ή 기술과 ν˜Έν™˜μ„±μ΄ μ’‹μŒ
  • Postman λ“± λ‹€μ–‘ν•œ λ„κ΅¬λ‘œ μ‰½κ²Œ ν…ŒμŠ€νŠΈν•˜κ³  μ‚¬μš©ν•  수 있음

4) λ¬Έμ„œν™” 및 ν‘œμ€€ν™”

  • Swagger λ“±μœΌλ‘œ API λ¬Έμ„œλ₯Ό μ‰½κ²Œ μž‘μ„±ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈμ™€ λͺ…μ‹œμ μΈ μ†Œν†΅μ΄ κ°€λŠ₯

πŸ“Ί λ°±μ—”λ“œ ν”„λ‘œμ νŠΈμ—μ„œ REST-APIλ₯Ό λ³΄μ—¬μ£ΌλŠ” 법

1) Postman

  • REST-API ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ 도ꡬ
  • 직접 HTTP μš”μ²­μ„ 보내고 응닡을 확인할 수 있음
  • 이λ₯Ό 톡해 API λ™μž‘μ„ μ‹œμ—°ν•˜κ±°λ‚˜ κ²°κ³Όλ₯Ό μΊ‘μ²˜ν•˜λ©° REST-API κ°€ μ œλŒ€λ‘œ λ™μž‘ν•˜λŠ” 것을 보여쀄 수 있음

2) Swagger

  • REST-API 의 λ””μžμΈ, λ¬Έμ„œν™”, 개발, ν…ŒμŠ€νŠΈ 등을 μœ„ν•œ μ˜€ν”ˆμ†ŒμŠ€ ν”„λ‘œμ νŠΈ
  • API λ₯Ό μ •μ˜ν•˜κ³  ν…ŒμŠ€νŠΈν•˜λ©° λ¬Έμ„œν™”μ— ν•„μš”ν•œ μ—¬λŸ¬ 도ꡬ 제곡
  • ν”„λ‘œμ νŠΈμ— ν†΅ν•©ν•˜μ—¬ API μ„€λͺ…μ„œμ™€ ν•¨κ»˜ μ‹€μ œλ‘œ API λ₯Ό μ‹€ν–‰ν•˜λŠ” 것도 κ°€λŠ₯
  • /swagger-ui.html μ—μ„œ API μ‹€ν–‰ 및 확인 κ°€λŠ₯

βœ”οΈ REST-API μ™Έμ˜ 기술 μΆ”μ„Έ

1) GraphQL

  • REST-API 의 단점을 λ³΄μ™„ν•œ 데이터 쿼리 μ–Έμ–΄
  • Facebookμ—μ„œ κ°œλ°œν–ˆμœΌλ©°, ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•„μš”ν•œ λ°μ΄ν„°λ§Œ μ„ νƒν•΄μ„œ μš”μ²­ κ°€λŠ₯
  • REST-API μ™€μ˜ 차이점
    • ν•˜λ‚˜μ˜ μ—”λ“œν¬μΈνŠΈλ‘œ λ‹€μ–‘ν•œ 데이터 μš”μ²­ κ°€λŠ₯
    • λΆˆν•„μš”ν•œ 데이터λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ 데이터 λΆ€μ‘± ν˜„μƒμ΄ λ°œμƒν•˜λŠ” 것을 λ°©μ§€

2) gRPC

  • Google μ—μ„œ κ°œλ°œν•œ 원격 ν”„λ‘œμ‹œμ € 호좜 ν”„λ ˆμž„μ›Œν¬
  • REST 보닀 κ³ μ„±λŠ₯
  • HTTP/2 λ₯Ό 기반으둜 ν•˜λ©° λΉ λ₯΄κ³  효율적
  • 주둜 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ°„ ν†΅μ‹ μ΄λ‚˜ κ³ μ„±λŠ₯ μš”κ΅¬μ‚¬ν•­μ˜ μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©

3) WebSocket

  • μ–‘λ°©ν–₯ 톡신 지원
  • 주둜 μ‹€μ‹œκ°„ 데이터 전솑이 ν•„μš”ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©
    • ex) μ‹€μ‹œκ°„ μ±„νŒ…, κ²Œμž„, 주식 데이터 슀트리밍 ...

4) Serverless 및 BaaS(Backend as a Service)

  • μ„œλ²„λ¦¬μŠ€ ν™˜κ²½μ—μ„œλŠ” REST_API 보닀 ν΄λΌμš°λ“œ ν”Œλž«νΌμ˜ μ„œλΉ„μŠ€ κΈ°λŠ₯을 더 많이 ν™œμš©
  • AWS Lambda, Firebase λ“±μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ νŠΉμ • μš”μ²­ 없이 μ„œλ²„ λ‘œμ§μ„ μžλ™μœΌλ‘œ μ‹€ν–‰ν•˜λŠ” 방식도 κ°€λŠ₯

μ°Έκ³ ) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/

profile
기둝

0개의 λŒ“κΈ€