Post

[Spring] 5. RESTful API

웹 브라우저, 모바일 앱, 다른 서버 등 다양한 클라이언트가 내 Spring 서버에 요청을 보낼 수 있다.
이때 서로 약속된 통신 규약이 필요한데 그것이 바로 ‘API (Application Programming Interface)’이다.


REST(Representational State Transfer) 란?


  • 웹 API 를 설계하는 가장 대표적인 ‘아키텍처 스타일(Architectural Style)’
  • 웹에 존재하는 모든 것을 ‘자원(Resource)’으로 보고, 각 자원에 고유한 ‘주소(URI)’를 부여하며, 정해진 ‘행위(HTTP Method)’를 통해 자원의 상태를 주고받는다.



REST의 3가지 핵심 구성 요소


1. 자원 (Resource)

  • 의미 : API가 관리하는 모든 것. 웹에서 다루는 모든 데이터나 엔티티를 의미한다.
  • 예시 : 사용자 정보, 게시글, 상품, 주문 등. 시스템의 ‘명사’에 해당한다.
  • 표현 : 각 자원은 고유한 주소(URI, Uniform Resource Identifier)를 통해 식별된다.
    ex) /users/123, /products/456


2. 행위 (Verb)

  • 의미 : 자원에 대해 수행하고 싶은 작업.
  • 예시 : 조회, 생성, 수정, 삭제 등.
  • 표현 : 이 행위들은 표준 HTTP 메서드를 통해 명시적으로 표현된다.

    HTTP Method역할
    GET자원 조회
    POST자원 생성
    PUT자원 전체 수정
    PATCH자원 부분 수정
    DELETE자원 삭제


3. 표현 (Representation)

  • 의미 : 클라이언트와 서버가 자원의 상태를 주고받는 ‘표현 형태’.
  • 예시 : 특정 사용자의 정보를 요청했을 때, 그 사용자의 상태는 JSON 또는 XML과 같은 형식으로 표현되어 전달된다.
  • 특징 : 클라이언트와 서버는 HTTP 헤더(Content-Type, Accept)를 통해 어떤 표현 형태로 소통할지 약속한다. 현대 웹에서는 대부분 JSON을 사용한다.



‘RESTful’ 이란?


  • API가 REST의 설계 원칙들을 잘 따라서 만들어졌을 때, 우리는 그 API를 ‘RESTful 하다’라고 말한다.
  • RESTful API 설계의 핵심 원칙
    • “URI는 자원을 표현하는 데 집중하고, 행위는 HTTP 메서드에 위임한다.”
  • URI에는 자원을 나타내는 명사만 포함하고, get, create, delete 같은 동사를 포함하지 않는 것이 좋다.


작업 내용잘못된 예시 (Bad)올바른 예시 (Good)
사용자 1번 조회GET /getUser?id=1GET /users/1
모든 사용자 조회GET /getAllUsersGET /users
사용자 생성POST /createUserPOST /users
사용자 1번 수정POST /updateUserPUT /users/1
사용자 1번 삭제GET /deleteUser?id=1DELETE /users/1

이렇게 일관된 규칙으로 API를 설계하면, API의 기능을 예측하기 쉬워지고 사용성이 크게 향상된다.



스프링과 RESTful API


  • 스프링 프레임워크는 @RestController 어노테이션을 통해 RESTful API를 매우 쉽고 편리하게 만들 수 있도록 지원한다.
  • @RestController데이터(JSON 등) 자체를 반환하도록 설계되어 RESTful API 제작에 최적화되어 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestController
public class UserController {

    // GET /users/1
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // ... id로 사용자를 조회하는 로직 ...
        return new User("김스프링", "spring@example.com"); // 이 User 객체가 JSON으로 변환되어 응답
    }

    // POST /users
    @PostMapping("/users")
    public void createUser(@RequestBody User user) {
        // ... 전달받은 user 데이터로 사용자를 생성하는 로직 ...
    }
}
This post is licensed under CC BY 4.0 by the author.