RESTful API와 Spring의 RestTemplate

YeonCloud·2024년 7월 12일
0

Spring

목록 보기
2/3
post-thumbnail

프로젝트를 하면서 사용했던 RestTemplate에 대해서 공부했던 점을 정리하고 RESTful API와 Spring의 RestTemplate에 대해 이해하고, 이를 활용한 클라이언트-서버 간 상호작용 방법을 작성해 보겠다.

중요성
RESTful API는 현대 웹 애플리케이션에서 필수적인 구성 요소입니다. RESTful API를 통해 클라이언트와 서버 간의 효율적인 통신이 가능하며, 다양한 플랫폼 간의 상호 운용성을 제공합니다. Spring의 RestTemplate은 이러한 RESTful API와의 상호작용을 쉽게 해주는 강력한 도구입니다.


RESTful API란 무엇인가?

REST(Representational State Transfer)는 웹의 기본 원칙을 따르는 아키텍처 스타일입니다. RESTful 서비스는 자원을 URL로 식별하고, 자원에 대한 상태를 전송하여 클라이언트와 서버 간의 통신을 수행합니다.

RESTful 서비스의 특징

  • Stateless: 서버는 클라이언트의 상태를 저장하지 않습니다. 각 요청은 독립적이며 필요한 모든 정보를 포함해야 합니다.
  • Client-Server: 클라이언트와 서버는 독립적으로 발전할 수 있습니다. 클라이언트는 사용자 인터페이스를 관리하고, 서버는 데이터 저장소를 관리합니다.
  • Cacheable: 응답은 캐시될 수 있어야 하며, 이를 통해 성능을 향상시킬 수 있습니다.
  • Uniform Interface: 일관된 인터페이스를 제공하여 시스템 전체에서 일관된 상호작용이 가능합니다.

HTTP 메서드와 REST

RESTful API는 주로 다음과 같은 HTTP 메서드를 사용합니다:

GET: 자원을 조회합니다.
POST: 새로운 자원을 생성합니다.
PUT: 기존 자원을 업데이트합니다.
DELETE: 자원을 삭제합니다.

Spring Framework에서 RESTful API 만들기

설명을 위해 간단한 RESTful API를 만들어 보겠다. spring-boot-starter-web 의존성을 추가하고 User에 관한 api 엔드포인트를 정의하는 컨트롤러를 작성해 보겠다.

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/users")
    public List<User> getAllUsers() {
        // 사용자 목록 반환
    }

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // 새로운 사용자 생성
    }

    @PutMapping("/users/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        // 사용자 정보 업데이트
    }

    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable Long id) {
        // 사용자 삭제
    }
}

RestTemplate

RestTemplate 소개

RestTemplate은 Spring Framework에서 제공하는 클래스 중 하나로, RESTful 웹 서비스와 상호작용하기 위한 클라이언트입니다. RestTemplate을 사용하면 HTTP 요청을 보내고, 서버의 응답을 간편하게 처리할 수 있다.

주요 기능

  • HTTP 요청 전송: 다양한 HTTP 메서드를 사용하여 요청을 전송할 수 있습니다.
  • 객체 변환: 요청과 응답을 Java 객체로 변환할 수 있습니다. 예를 들어, JSON 응답을 특정 클래스의 객체로 변환할 수 있습니다.
  • 에러 처리: HTTP 응답 코드에 따라 에러를 처리할 수 있습니다.
  • 인증 및 설정: 헤더, 인증 정보 등을 설정하여 요청을 보낼 수 있습니다.

RestTemplate 사용 예제

먼저 프로젝트에 RestTemplate을 사용할 수 있도록 설정합니다. Spring Boot 프로젝트에서는 자동으로 빈으로 등록됩니다. 요청 api는 json 객체를 받을 수 있는 jsonplaceholder를 사용하겠습니다.

GET 요청

@Autowired
private RestTemplate restTemplate;

public List<User> getUsers() {
    String url = "https://jsonplaceholder.typicode.com/users";
    ResponseEntity<User[]> response = restTemplate.getForEntity(url, User[].class);
    return Arrays.asList(response.getBody());
}

POST 요청

public User createUser(User user) {
    String url = "https://jsonplaceholder.typicode.com/users";
    return restTemplate.postForObject(url, user, User.class);
}

PUT 요청

public void updateUser(Long id, User user) {
    String url = "https://jsonplaceholder.typicode.com/users/" + id;
    restTemplate.put(url, user);
}

에러 처리

try {
    restTemplate.getForObject(url, User.class);
} catch (HttpClientErrorException e) {
    // 예외 처리 로직
}

AsynRestTemplate(비동기 요청)

비동기 요청을 통해 클라이언트는 서버의 응답을 기다리지 않고 다른 작업을 계속할 수 있기때문에 Spring에서는 AsyncRestTemplate을 사용하여 비동기 요청을 보낼 수 있습니다.

AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
String URL = "https://jsonplaceholder.typicode.com/posts";
        
// 비동기 GET 요청
ListenableFuture<ResponseEntity<Post[]>> future = asyncRestTemplate.getForEntity(URL, Post[].class);
        
future.addCallback(new ListenableFutureCallback<ResponseEntity<Post[]>>() {
      @Override
      public void onSuccess(ResponseEntity<Post[]> result) {
            System.out.println("Success! Retrieved " + result.getBody().length + " posts.");
      }

      @Override
      public void onFailure(Throwable ex) {
            System.err.println("Error occurred: " + ex.getMessage());
      }
 });

// 비동기 작업이 완료될 때까지 기다리지 않고 다른 작업 수행 가능
        
        
class Post {
    private Long id;
    private String title;
    private String body;
    private Integer userId;

    // Getters and Setters
}

ListenableFuture 객체를 통해 요청의 성공 및 실패에 대한 콜백을 등록할 수 있습니다. 요청을 보낸 후, 클라이언트는 다른 작업을 계속 수행할 수 있습니다.

header 설정

HTTP 요청에 커스텀 헤더를 추가해야 하는 경우가 있습니다. 예를 들어, 인증 토큰을 헤더에 추가하여 보안을 강화할 수 있습니다. RestTemplate에서는 HttpHeadersHttpEntity를 사용하여 이러한 커스텀 헤더를 설정할 수 있습니다.

HttpHeaders는 HTTP 요청의 헤더 정보를 설정할 수 있는 클래스이며, HttpEntity는 HTTP 요청 또는 응답의 엔터티를 나타냅니다. HttpEntity는 요청 본문과 헤더를 모두 포함할 수 있습니다.

URL = "https://jsonplaceholder.typicode.com/posts";
RestTemplate restTemplate = new RestTemplate();
        
// 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer some_token");
        
// HttpEntity 객체 생성
HttpEntity<String> entity = new HttpEntity<>("body", headers);
        
// POST 요청 보내기
ResponseEntity<String> response = restTemplate.exchange(URL, HttpMethod.POST, entity, String.class);
        
System.out.println("Response: " + response.getBody());

인증 토큰을 포함한 POST 요청을 보내고, 서버의 응답을 출력합니다. 이를 통해 요청에 필요한 모든 헤더를 설정할 수 있으며, 다양한 HTTP 메서드를 사용하여 유연하게 요청을 보낼 수 있습니다.

0개의 댓글