이전 글에서 정리한 스프링 MVC의 HTTP 요청-처리 어노테이션들의 실제 사용법을 알기 위해 REST 엔드포인트를 먼저 생성해야 한다.
REST 엔드포인트(Endpoint)란?
REST 엔드포인트는 간단히 말해, 클라이언트가 서버에 있는 특정 데이터나 서비스에 접근할 수 있도록 마련된 통신 지점(주소)을 의미한다.
API를 통해 서버와 대화할 때, 어디로(URL) 가서 무엇을(Method) 할지를 정의하는 일종의 최종 목적지와 같은 개념인 것이다.
@RestController 어노테이션은 다음 두 가지를 지원한다.
- 스테레오타입 어노테이션이므로, 이 어노테이션이 지정된 클래스를 스프링의 컴포넌트 검색으로 찾을 수 있다.
→ 컨트롤러의 모든 HTTP 요청 처리 메서드에서 HTTP 응답 몸체에 직접 쓰는 값을 반환한다는 것을 스프링에게 알려 주기 때문에 반환값이 뷰를 통해 HTML로 변환되지 않고 직접 HTTP 응답으로 브라우저에 전달되어 나타난다.
- 일반적인 스프링 MVC 컨트롤러처럼 클래스에
@Controller를 사용할 수도 있다.
→ 이런 경우에는 클래스에 모든 요청 처리 메서드에@ResponseBody어노테이션을 지정해야만@RestController와 같은 결과를 얻을 수 있다.
서버에 데이터를 전송하는 예시 코드이다.
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
// 데이터 구조를 정의하는 DTO (Data Transfer Object)
class UserRequest {
public String name;
public String email;
}
@RestController // REST API 전용 컨트롤러 선언
@RequestMapping("/v1")
public class UserController {
// POST 엔드포인트: http://localhost:8080/v1/users
@PostMapping("/users")
public ResponseEntity<String> createUser(@RequestBody UserRequest user) {
// @RequestBody는 들어오는 JSON 데이터를 UserRequest 객체로 자동 변환해줌
System.out.println("데이터 수신 완료: " + user.name);
// 성공 응답 반환 (201 Created)
return ResponseEntity
.status(HttpStatus.CREATED)
.body("사용자 " + user.name + " 가 생성되었습니다.");
}
}
@RequestBody는 클라이언트가 보낸 JSON을 DTO로 자동 변환해 주는 역할을 합니다. 이를 통해 복잡한 파싱 과정 없이 HTTP 본문 데이터를 즉시 프로그래밍에 활용할 수 있다.
데이터를 변경하기 위한 메서드는 PUT과 PATCH가 있다.
PUT은 데이터를 변경하는 데 사용되지만 실제로 GET과 반대 의미를 갖는다. (GET : 서버 → 클라이언트, PUT : 클라이언트 → 서버)
또한 PUT은 데이터 전체를 교체하는 것이고 PATCH는 데이터의 일부분을 변경하는 것이다.
대부분의 경우에서 데이터 전체를 교체하는 경우는 드물고 만약 데이터 전체를 교체하는 경우 교체를 원하지 않았던 데이터는 null이 되기 때문에 데이터를 변경할 때 PUT보다 PATCH를 사용하는 것이 더 적절하다.
데이터를 그냥 삭제할 때는 DELETE 요청을 처리하는 메서드에 스프링 MVC의 @DeleteMapping을 지정하면 된다.
또한 요청, 변경, 삭제의 각 과정들에서 HTTP 메서드가 잘 수행되었는지 확인하기 위해 @ResponseStatus를 사용하여 클라이언트에게 더 서술적이며 정확한 HTTP 상태 코드를 전달하는 것이 좋다.