Spring Boot에서 응답을 만드는 방법
Spring Boot에서 응답을 생성하는 방법에는 4가지가 있습니다.
- String
- 일반 Text Type 응답
- Object
- 자동으로 JSON 변환되어 응답 상태값은 항상 상태 코드 200(OK)
- ResponseEntity
- Body의 내용을 Object로 설정하고 상황에 따라서 HTTP 상태 코드를 설정
- @ResponseBody
- RestController가 아닌 Controller에서 JSON 응답을 내릴 때 사용
ResponseEntity 반환
ResponseEntity는 Object 타입으로 반환할 때보다 조금 더 상세하게 반환하고 싶을 때 사용하는 방식입니다.
알아두어야 할 것
@RestController는 기본적으로 JSON을 반환하는 라우터입니다.
String 타입으로 반환
import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {
@GetMapping("")
public String user() {
var user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(24);
user.setEmail("hong123@naver.com");
user.setIsKorean(true);
log.info("user : {}", user);
return user.toString();
}
}
user 객체에 setter로 값을 설정하고 해당 값을 toString으로 반환하여 문자열로 응답합니다
header를 확인해보면 Content-Type이 text/plain으로 설정된 것을 확인할 수 있습니다.
Object 타입으로 반환
import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {
@GetMapping("")
public UserRequest user() {
var user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(24);
user.setEmail("hong123@naver.com");
user.setIsKorean(true);
log.info("user : {}", user);
return user;
}
}
객체를 반환하면 JSON으로 변환되어 응답됩니다.
헤더를 확인해보면 application/json으로 설정된 것을 확인할 수 있습니다.
ResponseEntity 타입으로 반환
import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {
@GetMapping("")
public ResponseEntity<UserRequest> user() {
var user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(24);
user.setEmail("hong123@naver.com");
user.setIsKorean(true);
log.info("user : {}", user);
var response = ResponseEntity
.status(HttpStatus.OK)
.header("custom_key", "custom_value")
.body(user);
return response;
}
}
상태 코드는 OK(200)으로 설정하고, 헤더에 custom_key, custom_value를 추가했습니다.
상태 코드 변경
201번 CREATED로 바꾸어 보겠습니다
import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {
@GetMapping("")
public ResponseEntity<UserRequest> user() {
var user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(24);
user.setEmail("hong123@naver.com");
user.setIsKorean(true);
log.info("user : {}", user);
var response = ResponseEntity
// 상태 코드 변경
.status(HttpStatus.CREATED)
.header("custom_key", "custom_value")
.body(user);
return response;
}
}
상태 코드를 201(CREATED)로 변경했습니다.
ResponseEntity의 장점
ResponseEntity는 헤더, 상태 코드 등 세부적인 정보를 설정할 수 있습니다.
ResponseEntity 언제 써야 할까?
ResponseEntity는 상태 코드에 따른 예외 처리를 할 때 사용할 수 있습니다. 대표적인 예시로는 404 상태 코드가 있습니다.
404 예외 처리
404는 클라이언트가 잘못된 경로로 요청을 한 경우에 발생합니다.
서버 경로를 잘못 설정하면, 아래와 같은 404 오류 페이지가 호출됩니다:
404 예외 처리가 된 서버 예시(네이버)
@Controller와 @ResponseBody 사용 예제
@Controller는 뷰 템플릿 엔진과 함께 사용되어 HTML 등의 뷰를 반환하는 데 사용됩니다. 하지만 @Controller를 사용하면서 JSON 타입의 응답을 원할 때는 @ResponseBody 어노테이션을 함께 사용해야 합니다.
@Controller 사용 시 @ResponseBody를 사용하지 않은 경우
@Slf4j
@Controller // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {
@GetMapping("")
public ResponseEntity<UserRequest> user() {
var user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(24);
user.setEmail("hong123@naver.com");
user.setIsKorean(true);
log.info("user : {}", user);
var response = ResponseEntity
.status(HttpStatus.CREATED)
.header("custom_key", "custom_value")
.body(user);
return response;
}
}
위 코드는 @Controller 어노테이션을 사용했지만, @ResponseBody를 사용하지 않았기 때문에 JSON 응답이 아닌 뷰 이름을 반환하려 시도하게 되어 오류가 발생합니다
@Controller 사용 시 @ResponseBody를 사용하는 경우
import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Slf4j
@Controller // json 응답
@RequestMapping("/api/v1")
public class ResponseApiController {
@ResponseBody
@GetMapping("")
public UserRequest user() {
var user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(24);
user.setEmail("hong123@naver.com");
user.setIsKorean(true);
log.info("user : {}", user);
return user;
}
}
위 코드는 @Controller 어노테이션과 함께 @ResponseBody 어노테이션을 사용하여 메서드가 JSON 타입으로 응답하도록 만듭니다.
핵심 요약
- @Controller 어노테이션은 기본적으로 뷰 이름을 반환하여 뷰 템플릿 엔진을 통해 HTML 등을 렌더링합니다.
- JSON 타입으로 응답하려면 @Controller 어노테이션과 함께 @ResponseBody 어노테이션을 사용해야 합니다.
- @RestController 어노테이션은 @Controller와 @ResponseBody를 합친 형태로, 기본적으로 JSON 응답을 반환합니다.
'Spring Boot' 카테고리의 다른 글
[Spring Boot] Validation 유효성 검사 클라이언트 오류 보내기 (0) | 2024.07.04 |
---|---|
[Spring Boot] Validation 유효성 검사 (0) | 2024.07.04 |
[Spring Boot] Rest API Put 메서드 + boolean is 변수명의 문제점 (0) | 2024.07.01 |
[Spring Boot] Rest API Post 메서드 (1) | 2024.07.01 |
[Spring Boot] Rest API GET 메소드(2) (0) | 2024.06.29 |