TIL/Spring

TIL 2024-11-07 (Spring 입문 - 응답 데이터)

myoma 2024. 11. 7. 21:06

1 ) 응답 데이터

  • Server에서 Client로 Data를 전달하는 방법은 정적리소스, View Template, HTTP Message Body 세가지 방법이 존재

 

 

  1. 정적리소스
    • 정적인 HTML, CSS, JS, Image 등을 변경 없이 그대로 반환한다.
  2. View Template
    • SSR(Server Side Rendering)을 사용할 때 View가 반환된다.
  3. HTTP Message Body
    • 응답 데이터를 직접 Message Body에 담아 반환한다.

 

 

  • 정적 리소스 - 웹 애플리케이션에서 변하지 않는 파일들을 의미한다. 예를 들어 HTML, CSS, JavaScript, 이미지 파일들 등이 정적 리소스에 해당된다.
    • Spring boot의 정적 리소스 경로 ( 아래 경로들에 정적 리소스가 존재하면 서버에서 별도의 처리없이 파일 그대로 반환)
      1. /static
      2. /public
      3. /META-INF/resources
      4. src/main/resources
        1. /static
    • /static 대신에 /public 혹은 /META-INF/resources도 사용 가능하다.

 

 

  • View Template
    • View Template은 Model을 참고하여 HTML 등이 동적으로 만들어지고 Client에 응답된다.
    • Spring Boot는 기본적으로 View Template 경로를 설정한다.
    • build.gradle에 Thymeleaf 의존성을 추가하면 ThymeleafViewResolver와 필요한 Spring Bean들이 자동으로 등록된다.

 

 


  • HTTP Message Body
    1. HttpServletResponse 사용
      1. Response Body에 data 라는 문자열이 입력되어 응답된다.
      2. 기존 Servlet을 다룰 때 코드와 형태가 같다.
@Controller
public class ResponseBodyController {
	
	@GetMapping("/v1/response-body")
	public void responseBodyV1(
														HttpServletResponse response
													) throws IOException {
		
		response.getWriter().write("data");
	
	}
}

 

   2. ResponseEntity<> 사용

@GetMapping("/v2/response-body")
public ResponseEntity<String> responseBodyV2() {
		
	return new ResponseEntity<>("data", HttpStatus.OK);
}
  • Response Body에 Data라는 문자열과 HttpStatus.OK에 해당하는 상태 코드를 반환한다.
  • ResponseEntity는 HttpEntity를 상속받았다.
    • HttpEntity는 HTTP Message의 Header, Body 모두 가지고 있다

 

   3. @ResponseBody(TEXT, JSON) 사용

@Data
@NoArgsConstructor // 기본 생성자
@AllArgsConstructor // 전체 필드를 인자로 가진 생성자
public class Tutor {

    private String name;
    private int age;

}



// TEXT 데이터 통신
@ResponseBody
@GetMapping("/v3/response-body-text")
public String responseBodyText() {
		
	return "data"; // HTTP Message Body에 "data"
}
  • View를 사용하는 것이 아닌 HTTP Message Converter를 통해 HTTP Message  Body를 직접 입력할 수 있다. -> ResponseEntity와 같음.
  • @ResponseStatus를 사용하여 상태 코드를 지정할 수 있다.

 

    4. ResponseEntity<Object>(JSON)

@ResponseBody
@GetMapping("/v5/response-body")
public ResponseEntity<Tutor> responseBody() {
		
	Tutor tutor = new Tutor("wonuk", 100);
	
	return new ResponseEntity<>(tutor, HttpStatus.OK);
}
  • ResponseEntity<> 두번째 파라미터에 Enum을 사용하여 상태 코드를 바꿀 수 있다.
  • HTTP Message Converter를 통해서 JSON 형태로 변환되어 반환된다.
  • 동적으로 응답 코드를 변경할 수 있다.
@ResponseBody
@GetMapping("/v5/response-body")
public ResponseEntity<Tutor> responseBody() {
		
	Tutor tutor = new Tutor("wonuk", 100);
	
	if (조건) {
		return new ResponseEntity<>(tutor, HttpStatus.OK);
	} else {
		return new ResponseEntity<>(tutor, HttpStatus.BAD_REQUEST);
	}
	
}
  • HttpEntity를 상속받았다.