REST API

0taetaeยท2024๋…„ 10์›” 31์ผ
0
post-thumbnail

๐Ÿ“™REST

๐Ÿ’กOpen API (Application Programming Interface)

  • ํฌํ„ธ ์„œ๋น„์Šค ์‚ฌ์ดํŠธ๋‚˜ ๊ด€๊ณต์„œ, ๊ณต๊ณต ๋ฐ์ดํ„ฐ ํฌํ„ธ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ(Java, Python ๋“ฑ)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Open API๋ฅผ ์ œ๊ณต
  • ๋Œ€๋ถ€๋ถ„์˜ Open API๋Š” REST ๋ฐฉ์‹์œผ๋กœ ์ง€์›

๐Ÿ’กREST(Representational State Transfer)

  • URI(๋ฆฌ์†Œ์Šค, ๋ฐ์ดํ„ฐ) + ์ „์†ก๋ฐฉ์‹(GET/POST/PUT/DELETE) โ†’ ์›ํ•˜๋Š” ์ž‘์—…(command)์„ ์ง€์ •
  • HTTP URI๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•  ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , HTTP Method(GET, POST, PUT(UPDATE), DELETE)์„ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์„ ์ œ์–ดํ•˜๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๋ฐฉ์‹์˜ ์•„ํ‚คํ…์ฒ˜

๐Ÿ’กREST ๊ตฌ์„ฑ

  • ์ž์›(Resource) - URI๋กœ ์‹๋ณ„
  • ํ–‰์œ„(Verb) - HTTP Method๋กœ ์ •์˜
  • ํ‘œํ˜„(Representations) : JSON, XML ๋“ฑ์˜ ํ˜•์‹

์ž˜ ํ‘œํ˜„๋œ HTTP URI๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  HTTP method๋กœ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ–‰์œ„๋ฅผ ์ •์˜

๐Ÿ’ก๊ธฐ์กด Service์™€ REST Service

  • ๊ธฐ์กด Service
    • ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ํ›„ ๊ฐ€๊ณต๋œ data๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠน์ • ํ”Œ๋žซํผ์— ์ ํ•ฉํ•œ ํ˜•ํƒœ์˜ View๋กœ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜
    • form or link๋ฅผ ํ†ตํ•ด parameter๋กœ ์š”์ฒญ
      โœ”๏ธ์ฆ‰, ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ๊ณณ์€ Server.
  • REST Service
    • data ์ฒ˜๋ฆฌ๋งŒ ํ•œ๋‹ค๊ฑฐ๋‚˜, ์ฒ˜๋ฆฌ ํ›„ ๋ฐ˜ํ™˜๋  data๊ฐ€ ์žˆ๋‹ค๋ฉด JSON์ด๋‚˜ XML ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ
    • AJAX๋กœ ์š”์ฒญ (fetch)
      โœ”๏ธ์ฆ‰, ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ๊ณณ์€ Client.

๐Ÿ“™REST API

์„œ๋ฒ„๋Š” ์š”์ฒญ์œผ๋กœ ๋ฐ›์€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค.

  • GET/POST/PUT/ DELETE ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ CRUD ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • HTTP URI์„ ํ†ตํ•ด ์ œ์–ดํ•  ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , HTTP Method๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์„ ์ œ์–ดํ•˜๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๋ฐฉ์‹์˜ Architecture
  • ์ž์›์„ ํ‘œํ˜„ํ•  ๋•Œ Collection(๋ฌธ์„œ, ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ)๊ณผ Document(ํ•˜๋‚˜์˜ ๋ฌธ์„œ, ๊ฐ์ฒด) ์‚ฌ์šฉ

๐Ÿ’ก๊ด€๋ จ Annotation

  • @RestController : Controller๊ฐ€ REST ๋ฐฉ์‹์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž„์„ ๋ช…์‹œ
  • @ResponseBody : JSP ๊ฐ™์€ ๋ทฐ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์ „๋‹ฌ
  • @PathVariable : URL ๊ฒฝ๋กœ์— ์žˆ๋Š” ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ถ”์ถœ
  • @CrossOrigin : AJAX์˜ ํฌ๋กœ์Šค ๋„๋ฉ”์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
  • @RequestBody : JSON ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๋ฐ”์ธ๋”ฉ

๐Ÿ’ก Jackson library

  1. jackson-databind ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ๊ฐ์ฒด๋ฅผ JSON ํฌ๋งท์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜์‹œ์ผœ์„œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก
    • RESTful API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
  2. jackson-dataformat-xml ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ๊ฐ์ฒด๋ฅผ xml๋กœ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก
    • XML ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ

๐Ÿ“™ResponseEntity< T >

๐Ÿ’กResponseEntity< T >์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

  • HTTP ์‘๋‹ต์„ ์„ธ๋ถ€์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํด๋ž˜์Šค
  • ์ฃผ๋กœ REST API์—์„œ client์—๊ฒŒ ์ƒํƒœ ์ฝ”๋“œ, ์‘๋‹ต ํ—ค๋”, ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉ
    • ์‘๋‹ต ๋ณธ๋ฌธ(response body)์— ํฌํ•จ๋  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ง€์ •
    • T์˜ ํƒ€์ž…์œผ๋กœ๋Š” String, Object, Dto ๋“ฑ์ด ์ผ๋ฐ˜์ , ํ•„์š”์— ๋”ฐ๋ผ Void๋„ ๊ฐ€๋Šฅ
public class ResponseEntity<T> extends HttpEntity<T> {}

๐Ÿ’ก ResponseEntity ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ์„ค์ • ์š”์†Œ

  1. ์ƒํƒœ ์ฝ”๋“œ ์„ค์ •
    • HTTP ์‘๋‹ต์— ํฌํ•จ๋  ์ฝ”๋“œ๋ฅผ ์„ค์ •
    ResponseEntity<String> response = new ResopnseEntity<>(HttpStatus.OK);
  2. ๋ณธ๋ฌธ ์„ค์ •
    • ์‘๋‹ต์˜ ๋ณธ๋ฌธ์œผ๋กœ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •
    • JSON, XML ๋“ฑ์œผ๋กœ ์ง๋ ฌํ™”๋˜์–ด ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌ
    ResponseEntity<List<MemberDto>> response = new ResponseEntity<List<MemberDto>>(list, HttpStatus.OK);
  3. ํ—ค๋” ์„ค์ •
    • Content-Type, Location ๋“ฑ์˜ ํ—ค๋” ๊ฐ’ ์„ค์ • ๊ฐ€๋Šฅ
    • HTTP ์‘๋‹ต ํ—ค๋”๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ์ˆ˜ ์žˆ๋‹ค.
    HttpHeaders headers = new HttpHeaders();
    headers.add("Custom-Header", "HeaderValue");
    ResponseEntity<String> response = new ResponseEntity<>("Body Content", headers, HttpStatus.OK);

๐Ÿ’กResponseEntity< T >์˜ ์ƒ์„ฑ ๋ฐฉ์‹

  1. ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹

    • body, headers, status๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜์—ฌ ResponseEntity๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    return new ResponseEntity<T>(body, headers, HttpStatus.Ok);
  2. ๋นŒ๋” ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹

    • ๋†’์€ ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด
    • ์ฃผ์š” ๋ฉ”์„œ๋“œ
      • ok() : HTTP 200 Status Code์™€ ํ•จ๊ป˜ Response๋ฅผ ์ƒ์„ฑ
      • status() : ํŠน์ • HTTP Status Code๋ฅผ ์ง์ ‘ ์„ค์ •
      • created(URI) : 201 Created ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ Location ํ—ค๋”์— URI๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ์ƒ์„ฑ
      • body() : ์‘๋‹ต ๋ณธ๋ฌธ์„ ์„ค์ •
      • headers() : ์‘๋‹ต ํ—ค๋”๋ฅผ ์„ค์ •
      • build() : ์‘๋‹ต์˜ body๊ฐ€ ์—†์„๋•Œ ResponseEntity๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜
    • ์ฒด์ด๋‹ ๋ฐฉ์‹์œผ๋กœ ๋ณธ๋ฌธ์ด๋‚˜ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€
      return ResponseEntity.ok().headers(headers).body(body);

0๊ฐœ์˜ ๋Œ“๊ธ€