Spring/Spring 개발 상식

@Controller, @RestController, @ResponseEntity

mint* 2023. 7. 5. 18:50
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