[Spring] Spring 응답 데이터 (2)

이연우·2025년 7월 23일

TIL

목록 보기
35/100

📦 HTTP Message Body(응답)

  • REST API를 만드는 경우, HTTP Message Body에 직접 Data를 JSON 형식으로 담아 전달

📌 핵심 개념

  • HTTP Message Body에 직접 데이터를 넣어 응답하는 방식은 REST API에서 가장 중요함
    • View나 HTML이 아닌 JSON, TEXT 데이터를 응답할 때 사용하는 방식

❗ 여기서 말하는 HTTP Body 응답은 정적 리소스나 템플릿 엔진과 무관한 직접 데이터 응답


HTTP Message Body 응답 방식 4가지

1. HttpServletResponse 직접 사용 (저수준 방식)

@Controller
public class ResponseBodyController {
	
	@GetMapping("/v1/response-body")
	public void responseBodyV1(
														HttpServletResponse response
													) throws IOException {
		
		response.getWriter().write("data");
	
	}
}

HttpServlet API 그대로 사용
→ Body에 "data"를 직접 작성
→ 단순하지만 Spring 기능을 거의 활용하지 못함

2. ResponseEntity<T> 사용 (가장 많이 쓰는 실무 방식)

@GetMapping("/v2/response-body")
public ResponseEntity<String> responseBodyV2() {
		
	return new ResponseEntity<>("data", HttpStatus.OK);
}

→ Body 내용과 상태 코드 함께 설정 가능
JSON, TEXT 모두 가능
HttpHeaders도 추가 가능

✅ 유연한 제어 가능: 바디 + 상태 코드 + 헤더

3. @ResponseBody(TEXT, JSON) 사용

  • 컨트롤러 리턴 값을 HTTP Body에 직접 넣는 방식
@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가 아닌 문자열 자체가 응답 Body에 포함

✔ JSON 객체 응답

// JSON 데이터 통신
@ResponseBody
@GetMapping("/v3/response-body-json")
public Tutor responseBodyJson() {
		
	Tutor tutor = new Tutor("wonuk", 100);
		
	return tutor; // HTTP Message Body에 Tutor Object -> JSON
}
}

→ 내부적으로 HttpMessageConverter가 동작
→ 객체는 MappingJackson2HttpMessageConverter에 의해 JSON으로 직렬화

@ResponseStatus로 상태 코드 지정 가능

@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/v4/response-body")
public Tutor responseBodyV4() {
		
	Tutor tutor = new Tutor("wonuk", 100);
		
	return tutor;
}

→ 응답 상태 코드도 지정할 수 있음
→ ❗ 단, 조건에 따라 상태 코드를 동적으로 변경할 수는 없음

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을 사용하여 상태 코드를 바꿀 수 있음

❗ 조건에 따라 응답 코드를 변경할 수 있음

@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);
	}
	
}

→ 상태 코드 제어가 유연하여 실무에서 자주 사용


🔄 응답 처리 방식 요약표

방식사용 예상태 코드 설정특징
HttpServletResponseresponse.getWriter()수동 설정 필요가장 저수준
@ResponseBody@ResponseBody String, 객체기본 200 OK간단 응답 처리
@ResponseStatus함께 사용 가능고정된 상태만 가능선언형 설정
ResponseEntity<T>new ResponseEntity<>()자유롭게 제어실무 최다 사용

🏁 마무리 정리

✅ Client → Server (요청)

전송 방식설명사용 어노테이션
GET (Query Param)?key=value@RequestParam, @ModelAttribute
POST (HTML Form)application/x-www-form-urlencoded@RequestParam, @ModelAttribute
Body (JSON, TEXT)Request Body에 직접 데이터 전달@RequestBody

✅ Server → Client (응답)

응답 유형설명사용 어노테이션/클래스
정적 리소스HTML, JS, CSS 등 파일없음 (/static 등 위치)
View Template서버에서 HTML 동적 렌더링@Controller, View 이름 반환
HTTP Body (데이터)JSON, TEXT 응답@ResponseBody, ResponseEntity<T>

✅ HTTP Message Converter

  • 요청: @RequestBody + JSON → Java 객체
  • 응답: Java 객체 → JSON + 상태코드
  • 내부적으로 Jackson, Gson 등을 활용

0개의 댓글