[개념] REST, REST API, RESTful 이란 무엇인가?
[개념] REST, REST API, RESTful 이란 무엇인가?
REST란 ? REST란 Representational State Tranfer의 약자로, 자원을 이름으로 구분하여 해당 자원의 상태(정보)를 주고받는 모든 것을 의미한다. 다시말해, 자원(resource)의 표현(representation)에 의한 상태전달
soohykeee.tistory.com
ResponseEntity란 무엇인가?
Spring Framework에서 제공하는 클래스 중에서 HttpEntity라는 클래스가 존재한다. 해당 클래스는 HTTP 요청(request), 응답(response)에 해당하는 HttpHeader, HttpBody를 포함하는 클래스이다.
ResponseEntity (Spring Framework 6.0.8 API)
Create a ResponseEntity with a body, headers, and a raw status code.
docs.spring.io
이러한 HttpEntity 클래스를 상속받아 구현한 클래스가 RequestEntity, ResponseEntity 클래스이다. 여기서 ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다. HttpStatus, HttpHeaders, HttpBody를 포함한다. 간단하게 HttpHeader에는 요청, 응담에 대한 요구사항, HttpBody에는 해당 내용이, HttpStatus는 응답 상태코드가 포함된다. HttpStatus Code 정리본
물론 간단한 Controller를 구현할 때는 @ResponseBody와 같은 어노테이션을 사용하는 경우도 있다. 하지만, 해당 기능을 사용하게 되면 어노테이션을 추가하는 것만으로 간단하게 처리가 가능하다는 장점이 있지만, HTTP Header에 대해서 유연하게 설정할 수 없다는 단점이 존재한다. 이러한 단점을 해결해주기 위해서는 앞서 설명한 ResponseEntity를 사용해주어야 한다.
간단하게 결론을 말하자면 ResponseEntity 클래스를 사용하게 되면 결과값, 상태코드, 헤더값을 포함하여 Front에서 넘겨줄 수 있고, 또한 추가적으로 Error 코드도 설정해서 보내줄 수 있다는 장점이 있어 많이들 사용한다.
사용방식
간단한 예시를 통해 사용하는 방식을 알아보겠다.
@RestController
public class SampleController {
@GetMapping("users")
public ResponseEntity getAll() {
return new ResponseEntity(HttpStatus.OK);
}
}
위와 같이 작성 후 PostMan을 통해 확인해보면 Status Code가 OK에 해당하는 200으로 넘어오는 것을 확인할 수 있다.
ResponseEntity 클래스를 보게 되면, 아래와 같은 생성자로 상태코드(Status), 헤더(Headers), 응답데이터(ResponseData)를 담는 생성자도 존재하는데, 이번에는 해당 생성자를 이용하는 예시를 알아보겠다.
public class ResponseEntity<T> extends HttpEntity<T> {
public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {
super(body, headers);
Assert.notNull(status, "HttpStatus must not be null");
this.status = status;
}
}
상태코드, 메시지, 데이터를 담을 클래스인 Message를 생성해준다.
또한 간단한 상태코드 예시를 담을 enum 클래스를 생성해준다.
@Data
public class Message {
private StatusEnum status;
private String message;
private Object data;
public Message() {
this.status = StatusEnum.BAD_REQUEST;
this.data = null;
this.message = null;
}
}
public enum StatusEnum {
OK(200, "OK"),
BAD_REQUEST(400, "BAD_REQUEST"),
NOT_FOUND(404, "NOT_FOUND");
int statusCode;
String code;
StatusEnum(int statusCode, String code) {
this.statusCode = statusCode;
this.code = code;
}
}
@RestController
public class UserController {
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping(value = "/user/{id}")
public ResponseEntity<Message> findById(@PathVariable int id) {
User user = userService.findOne(id);
Message message = new Message();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
message.setStatus(StatusEnum.OK);
message.setMessage("성공코드");
message.setData(user);
return new ResponseEntity<>(message, headers, HttpStatus.OK);
}
}