728x90
@Controller
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(annotation = Component.class)
String value() default "";
}
기본적으로 View를 반환한다.
@ResponseBody
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}
Controller에서 View가 아닌 Data를 반환할때 @ResponseBody를 사용한다.
@RestController = @Controller + @ResponseBody
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(annotation = Controller.class)
String value() default "";
}
위에서 설명한 두 어노테이션(@Controller, @ResponseBody)를 합친 어노테이션이다.
Data를 반환하는 Controller를 뜻한다.
REST API 구현시 사용한다.
ResponseEntity
public class ResponseEntity<T> extends HttpEntity<T> {
private final Object status; //상태 코드
//상태코드만으로 응답 생성
public ResponseEntity(HttpStatus status) {
this(null, null, status);
}
//body + 상태코드
public ResponseEntity(@Nullable T body, HttpStatus status) {
this(body, null, status);
}
//header + 상태코드
public ResponseEntity(MultiValueMap<String, String> headers, HttpStatus status) {
this(null, headers, status);
}
//body + header + 상태코드로 응답 생성
public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {
this(body, headers, (Object) status);
}
...
}
생성된 응답에 상태코드와 헤더 정보 등으로 한번 더 감싼 응답을 생성한다.
HttpEntity의 header, body 필드를 상속받고, 자체적으로 status(상태코드) 필드를 가진다. (총 3개의 필드)
➡️ HTTP 아키텍처에 맞는 적절한 응답을 전송할 수 있으며, 에러 코드 등 상세한 정보를 전달할 수 있다.
ResponseEntity 생성
생성자를 이용해 생성할 수 있다.
@RequestMapping("/handle")
public ResponseEntity<String> handle() {
User user = service.getUser(); //body
URI location = "Seoul";
HttpHeaders responseHeaders = new HttpHeaders(); //header
responseHeaders.setLocation(location);
responseHeaders.set("MyResponseHeader", "MyValue");
//body, header, status
return new ResponseEntity<>(user, responseHeaders, HttpStatus.CREATED);
}
ResponseEntity의 Builder 패턴
public class ResponseEntity<T> extends HttpEntity<T> {
...
//상태코드 ok인 builder 생성
public static BodyBuilder ok() {
return status(HttpStatus.OK);
}
//상태코드 ok와 body 함께 보내는 응답 생성
public static <T> ResponseEntity<T> ok(@Nullable T body) {
return ok().body(body);
}
...
}
ResponseEntity 내부에 정의된 Builder 패턴을 이용해 생성할 수 있다.
위 코드를 보면 ResponseEntity.ok()는 상태코드가 200(OK)인 BodyBuilder를 반환한다.
✳️ 400(Bad Request)인 경우에 ResponseEntity.badRequest()를 사용하면 된다.
사용방법
return ResponseEntity.ok()
.headers(headers)
.body(body);
builder로 객체 생성시 메서드 체이닝을 사용하여 간편하다.
728x90
'Spring > Spring 개발 상식' 카테고리의 다른 글
DB : 기본키, 외래키, 제약조건 (1) | 2023.07.06 |
---|---|
Mock test : @AutoConfigureMockMvc, MockMvc, JsonPath (0) | 2023.07.05 |
REST API 설계 (0) | 2023.06.26 |
IaaS vs PaaS vs SaaS (0) | 2023.06.26 |
JWT Token (0) | 2023.06.26 |