REST API 개념

홍나연·2024년 11월 3일

Backend

목록 보기
8/8

1. REST API란?

1-1. REST API의 개념 및 정의

  • REST (Representational State Transfer)
    : 웹에서 데이터를 주고받기 위한 구조적 규칙으로, 네트워크 아키텍처의 원리 중 하나이다. REST는 자원의 표현(Representation)을 통해 상태를 전송한다는 의미를 담고 있다.
  • API (Application Programming Interface)
    : 애플리케이션 간 데이터를 주고받는 중개 역할을 하는 통로이다. REST API는 REST의 원칙을 따르며, HTTP를 통해 자원에 접근할 수 있게 설계된 API다.

REST 구성
= 자원 + 행위 + 표현

  • 자원
    • 자원은 서버에서 관리하는 데이터를 의미하며, 이를 고유하게 식별하기 위해 URI(주소)를 사용한다.
    • ex) https://example.com/users는 "users"라는 자원에 해당하며, 사용자 목록 데이터를 가리킨다. → /users/{id}와 같은 URI는 특정 사용자 데이터를 조회할 수 있도록 구체적으로 자원을 지정한다.
    • 자원은 데이터에 대한 상태와 정보를 담고 있을 뿐, 특정 작업을 지칭하지 않는다. 작업은 HTTP 메서드로 정의된다.
  • 행위
    • HTTP 메서드를 통해 자원에 대해 수행할 작업을 정의한다.
    • REST API에서 자원의 주요 작업은 CRUD(생성, 조회, 수정, 삭제)에 해당한다.
      • GET : 자원 조회 ex) 사용자 정보 조회
      • POST : 자원 생성 ex) 새로운 사용자 등록
      • PUT : 자원 수정 ex) 사용자 정보 업데이트
      • DELETE : 자원 삭제 ex) 사용자 삭제
  • 표현
    • 자원의 상태와 데이터를 클라이언트와 서버 간에 전달할 때 사용하는 형식이다.
    • JSON이나 XML과 같은 포맷을 사용해 자원의 정보를 직관적이고 이해하기 쉽게 전송한다.
    • 표현을 통해 자원의 현재 상태나 요청 결과를 전달받고, 이를 화면에 표시하거나 다른 처리에 활용한다.

REST API

  • REST API는 REST 원칙을 준수하는 API로, 서버와 클라이언트 간 데이터를 효율적이고 직관적으로 주고받을 수 있도록 설계되었다.
  • 주로 JSON 형식으로 응답을 반환하여 가독성과 데이터 처리 속도가 뛰어난다.

1-2. RESTful 설계 원칙과 특징

  1. 자원의 명확한 식별
    • 모든 데이터(자원)는 고유한 URI(주소)를 통해 식별된다. 이렇게 하면 클라이언트가 어떤 데이터를 요청하고 있는지 명확하게 알 수 있다.
    • ex) /users는 전체 사용자 목록을, /users/123는 특정 ID를 가진 사용자 정보를 나타낸다.
  2. 무상태성 (Stateless)
    • 서버는 클라이언트의 상태를 유지하지 않는다. 따라서 클라이언트는 필요한 정보를 매번 요청에 포함하여 보내야 하며 각 요청은 독립적으로 작동한다.
    • 서버가 클라이언트의 상태를 기억하지 않기 때문에 확장성이 좋고, 클라이언트가 여러 서버에 요청을 보내도 동일한 응답을 받을 수 있다.
  3. 캐시 가능성 (Cacheable)
    • 서버의 응답이 캐시(임시 저장)될 수 있다면, 같은 요청을 반복하지 않고 이전 응답을 재사용할 수 있다.
    • 캐시를 통해 클라이언트는 자주 요청하는 데이터를 빠르게 가져올 수 있으며, 서버 부하를 줄여 성능이 개선된다. 응답 데이터에 Cache-Control 헤더를 사용하여 캐시 가능 여부와 기간을 설정할 수 있다.
  4. 일관된 인터페이스 (Uniform Interface)
    • API는 일관된 방식으로 작동하여, 누구나 쉽게 이해하고 사용할 수 있어야 한다.
    • REST API - HTTP 메서드와 URI의 일관된 규칙
      ex) GET은 조회, POST는 생성, PUT은 수정, DELETE는 삭제에만 사용되도록 규칙을 지킨다.
    • 일관성 덕분에 사용자는 API의 구조나 사용법을 쉽게 예측할 수 있다.
  5. 계층화된 시스템 (Layered System)
    • REST 아키텍처는 서버와 클라이언트 사이에 중간 계층(예: 로드 밸런서, 프록시 서버)을 두어 통신할 수 있다.
    • 이 중간 계층은 보안을 강화하거나, 로드 밸런싱을 통해 요청 부하를 조정하는 등 시스템 안정성을 높이는 역할을 한다. 중간 계층의 존재가 클라이언트-서버 간의 데이터 전송에 영향을 미치지 않아야 한다.
	로드 밸런서 (Load Balancer) 
    : 여러 서버로 들어오는 요청을 분산시켜 서버 부하를 조절한다. 로드 밸런서는 각 서버의 상태와 트래픽을 고려해 클라이언트 요청을 적절히 분배하므로, 특정 서버에 과부하가 걸리지 않고 전체 시스템 성능이 균형을 이루게 한다.
    
    프록시 서버 (Proxy Server)
    : 클라이언트와 서버 사이에 위치해 클라이언트 요청을 서버에 전달하거나 서버 응답을 클라이언트에 전달하는 중간 역할을 한다. 프록시는 캐시된 데이터를 제공해 응답 속도를 높이거나 보안을 강화하는 역할도 수행한다.
    

2. Spring Boot로 REST API 구현하기

2-1. Spring Boot에서 REST API 엔드포인트 만들기

Spring Boot에서는 REST API 엔드포인트를 쉽게 정의할 수 있도록 다양한 어노테이션을 제공한다. 이를 통해 복잡한 설정 없이 간단하게 API를 생성할 수 있다.

  • @RestController: 클래스 전체를 RESTful 엔드포인트로 지정한다. 메서드의 결과는 자동으로 JSON 형식으로 변환되어 클라이언트에 응답된다.
  • @RequestMapping: URL 경로와 해당 경로에서 처리할 메서드를 매핑하는 데 사용된다.
  • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping: 각각 GET, POST, PUT, DELETE 요청을 처리할 수 있도록 메서드를 매핑하는 어노테이션이다.

2-2. CRUD를 위한 HTTP 메서드 구현

  • CREATE (POST)
    • 새로운 데이터를 추가하는 메서드로, @PostMapping 어노테이션을 사용한다.

    • ex) 사용자를 추가하는 API

      @PostMapping("/users")
      public ResponseEntity<User> createUser(@RequestBody User user) {
          User newUser = userService.save(user); // userService를 통해 사용자 저장
          return ResponseEntity.status(HttpStatus.CREATED).body(newUser);
      }
    • 코드 설명

      • @RequestBody를 이용하여 요청 본문에서 User 객체를 받아온다.
      • userService.save(user)를 통해 데이터를 저장한다.
      • 새로운 사용자가 성공적으로 생성된 경우, HttpStatus.CREATED(201 상태 코드)와 함께 newUser 객체를 응답 본문에 포함하여 반환한다.
      • CREATED 상태 코드는 새 자원이 생성되었음을 의미한다. body(newUser)를 통해 생성된 사용자 객체를 JSON 형식으로 응답 본문에 담아 클라이언트로 전송한다.
  • READ (GET)
    • 데이터를 조회하는 메서드로, @GetMapping 어노테이션을 사용한다.

    • ex) 전체 사용자 목록 조회 API, 특정 사용자 정보 조회 API

      @GetMapping("/users")
      public List<User> getAllUsers() {
          return userService.findAll();
      }
      
      @GetMapping("/users/{id}")
      public ResponseEntity<User> getUserById(@PathVariable Long id) {
          User user = userService.findById(id);
          return ResponseEntity.ok(user);
      }
    • 코드 설명

      • @PathVariable를 통해 URL에서 id 값을 매핑해 해당 사용자 정보를 가져온다.
      • 첫 번째 메서드 getAllUsers : 전체 사용자 목록을 리스트 형식으로 반환한다. 모든 사용자 정보를 성공적으로 조회한 경우에는 기본적으로 HTTP 상태 코드 200 OK가 설정된다.
      • 두 번째 메서드 getUserById : 특정 사용자의 정보를 반환한다. ResponseEntity.ok(user) 를 통해 200 OK 상태 코드와 함께 user 객체를 응답 본문에 담아 반환한다. ok()200 OK 상태를 설정하고, 해당 객체를 JSON 형식으로 포함해 전송한다.
  • UPDATE (PUT)
    • 기존 데이터를 수정하는 메서드로, @PutMapping 어노테이션을 사용한다.

    • ex) 특정 사용자 정보 수정 API

      @PutMapping("/users/{id}")
      public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User userDetails) {
          User updatedUser = userService.update(id, userDetails);
          return ResponseEntity.ok(updatedUser);
      }
    • 코드 설명

      • @PathVariable로 URL의 사용자 ID를, @RequestBody로 수정할 데이터를 받는다.
      • userService.update(id, userDetails)를 통해 해당 ID의 사용자 정보를 업데이트한다.
      • 사용자 정보를 성공적으로 수정한 후, 200 OK 상태 코드와 함께 업데이트된 updatedUser 객체를 반환한다. ok(updatedUser)200 OK 상태를 설정하고, 변경된 사용자 객체를 응답 본문에 담아 클라이언트로 전송한다. 이는 수정이 성공적으로 이루어졌음을 의미한다.
  • DELETE (DELETE)
    • 데이터를 삭제하는 메서드로, @DeleteMapping 어노테이션을 사용한다.

    • ex) 특정 사용자 삭제 API

      @DeleteMapping("/users/{id}")
      public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
          userService.delete(id);
          return ResponseEntity.noContent().build();
      }
    • 코드 설명

      • @PathVariable로 특정 사용자의 ID를 받아와 userService.delete(id)로 삭제한다.
      • 삭제 작업이 성공적으로 완료된 경우 204 No Content 상태 코드로 응답한다.
      • noContent().build()를 통해 빈 응답을 생성하며, 204 No Content 상태를 설정한다. 이 상태 코드는 삭제가 성공했으나 응답 본문에 반환할 데이터가 없음을 의미한다.

3. Vue에서 REST API 연동하기

(추가 예정)


4. Spring Boot와 Vue 통신 구조 이해하기

(추가 예정)

0개의 댓글