[java] REST란 무엇인가? 어떻게 작동하는가?

개요

REST는 Representational State Transfer의 약자로, 웹 서비스의 구축과 통신을 위한 소프트웨어 아키텍처 스타일입니다. REST는 네트워크 상에서 클라이언트와 서버 사이의 통신을 간단하고 효율적으로 만들기 위해 일련의 제약 조건을 제시합니다. 이러한 제약 조건을 준수하는 웹 서비스는 가독성, 확장성, 신뢰성이 뛰어난 아키텍처를 가질 수 있습니다.

REST의 핵심 개념

REST 아키텍처를 이해하기 위해서는 다음과 같은 핵심 개념을 알고 있어야 합니다:

  1. 자원 (Resource)
    • REST에서 자원은 클라이언트가 요청하는 정보의 대상입니다. 예를 들어, 사용자, 상품, 주문 등이 자원이 될 수 있습니다. 각 자원은 고유한 식별자인 URI로 식별됩니다.
  2. 표현 (Representation)
    • 자원은 클라이언트에게 특정 형식으로 표현되어 전달됩니다. 예를 들어, JSON, XML 등의 형식을 사용할 수 있습니다. 클라이언트는 이러한 표현을 통해 자원에 접근하고 조작할 수 있습니다.
  3. 작업 (Method)
    • REST에서는 HTTP를 기반으로하는 일련의 메서드를 사용하여 자원을 조작합니다. 대표적으로 GET, POST, PUT, DELETE 등이 있습니다. 각 메서드는 특정한 의미와 동작을 가지고 있습니다.
  4. 상태 전이 (State Transfer)
    • 클라이언트와 서버 사이에서 요청과 응답을 통해 상태가 전달됩니다. 서버는 상태를 변경하고, 클라이언트는 서버의 상태를 이용하여 다음 동작을 수행합니다.

REST의 작동 방식

REST 아키텍처를 따르는 웹 서비스는 다음과 같이 작동합니다:

  1. 클라이언트가 서버에게 요청을 보냅니다.
  2. 서버는 클라이언트의 요청을 처리하고, 요청에 필요한 자원을 제공합니다.
  3. 서버는 응답으로 표현을 반환하고, 상태 정보를 함께 전달합니다.
  4. 클라이언트는 서버의 응답을 받아 처리하고, 필요에 따라 추가적인 요청을 보낼 수 있습니다.
  5. 이러한 요청과 응답의 과정을 반복하며, 클라이언트와 서버 간의 효율적인 통신이 이루어집니다.

예시 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class RESTClient {

    public static void main(String[] args) throws Exception {
        // RESTful API 요청을 보낼 URL
        String url = "https://api.example.com/users";
        
        // URL 객체 생성
        URL obj = new URL(url);
        
        // HTTP 연결 객체 생성
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        // GET 메서드로 설정
        con.setRequestMethod("GET");

        // 응답 상태 코드 확인
        int responseCode = con.getResponseCode();
        System.out.println("Response Code: " + responseCode);

        // 응답 메시지 읽기
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        // 응답 내용 출력
        System.out.println("Response Data: " + response.toString());
    }
}

참고 자료