프로젝트를 하면서 사용했던 RestTemplate
에 대해서 공부했던 점을 정리하고 RESTful API와 Spring의 RestTemplate
에 대해 이해하고, 이를 활용한 클라이언트-서버 간 상호작용 방법을 작성해 보겠다.
중요성
RESTful API는 현대 웹 애플리케이션에서 필수적인 구성 요소입니다. RESTful API를 통해 클라이언트와 서버 간의 효율적인 통신이 가능하며, 다양한 플랫폼 간의 상호 운용성을 제공합니다. Spring의 RestTemplate
은 이러한 RESTful API와의 상호작용을 쉽게 해주는 강력한 도구입니다.
REST(Representational State Transfer)는 웹의 기본 원칙을 따르는 아키텍처 스타일입니다. RESTful 서비스는 자원을 URL로 식별하고, 자원에 대한 상태를 전송하여 클라이언트와 서버 간의 통신을 수행합니다.
RESTful API는 주로 다음과 같은 HTTP 메서드를 사용합니다:
GET: 자원을 조회합니다.
POST: 새로운 자원을 생성합니다.
PUT: 기존 자원을 업데이트합니다.
DELETE: 자원을 삭제합니다.
설명을 위해 간단한 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은 Spring Framework에서 제공하는 클래스 중 하나로, RESTful 웹 서비스와 상호작용하기 위한 클라이언트입니다. RestTemplate
을 사용하면 HTTP 요청을 보내고, 서버의 응답을 간편하게 처리할 수 있다.
먼저 프로젝트에 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) {
// 예외 처리 로직
}
비동기 요청을 통해 클라이언트는 서버의 응답을 기다리지 않고 다른 작업을 계속할 수 있기때문에 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
객체를 통해 요청의 성공 및 실패에 대한 콜백을 등록할 수 있습니다. 요청을 보낸 후, 클라이언트는 다른 작업을 계속 수행할 수 있습니다.
HTTP 요청에 커스텀 헤더를 추가해야 하는 경우가 있습니다. 예를 들어, 인증 토큰을 헤더에 추가하여 보안을 강화할 수 있습니다. RestTemplate에서는 HttpHeaders
와 HttpEntity
를 사용하여 이러한 커스텀 헤더를 설정할 수 있습니다.
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 메서드를 사용하여 유연하게 요청을 보낼 수 있습니다.