다양한 HTTP 상태 코드에 대한 응답 예시를 포함한 ResponseEntity
사용법을 구체적으로 설명드리겠습니다. 각 상태 코드에 대해 실제로 어떻게 응답할 수 있는지 예제를 통해 살펴보겠습니다.
클라이언트의 요청이 성공적으로 처리되었을 때 사용합니다.
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@GetMapping("/success")
public ResponseEntity<String> getSuccess() {
String responseBody = "Request was successful.";
return ResponseEntity.ok(responseBody); // 200 OK
}
}
새로운 리소스가 성공적으로 생성되었을 때 사용합니다. 보통 생성된 리소스의 URI를 함께 반환합니다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.net.URI;
@RestController
public class ExampleController {
@PostMapping("/create")
public ResponseEntity<Void> createResource(@RequestBody SomeResource resource) {
// 리소스 생성 로직
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(resource.getId())
.toUri();
return ResponseEntity.created(location).build(); // 201 Created
}
}
요청이 성공적으로 처리되었지만 반환할 콘텐츠가 없을 때 사용합니다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@DeleteMapping("/delete/{id}")
public ResponseEntity<Void> deleteResource(@PathVariable("id") Long id) {
// 리소스 삭제 로직
return ResponseEntity.noContent().build(); // 204 No Content
}
}
잘못된 요청으로 인해 서버가 요청을 처리할 수 없을 때 사용합니다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@PostMapping("/validate")
public ResponseEntity<String> validateRequest(@RequestBody SomeRequest request) {
if (request.isInvalid()) {
return ResponseEntity.badRequest().body("Invalid request."); // 400 Bad Request
}
return ResponseEntity.ok("Valid request."); // 200 OK
}
@ExceptionHandler
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.badRequest().body(e.getMessage()); // 400 Bad Request
}
}
클라이언트가 인증되지 않은 상태로 보호된 리소스에 접근하려고 할 때 사용합니다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@GetMapping("/protected")
public ResponseEntity<String> getProtectedResource(@RequestHeader(value = "Authorization", required = false) String authorizationHeader) {
if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Unauthorized access."); // 401 Unauthorized
}
return ResponseEntity.ok("Protected resource"); // 200 OK
}
}
클라이언트가 리소스에 접근할 권한이 없을 때 사용합니다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@GetMapping("/forbidden")
public ResponseEntity<String> getForbiddenResource(@RequestHeader(value = "Authorization", required = false) String authorizationHeader) {
if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Forbidden access."); // 403 Forbidden
}
return ResponseEntity.ok("Accessible resource"); // 200 OK
}
}
요청한 리소스를 찾을 수 없을 때 사용합니다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@GetMapping("/resource/{id}")
public ResponseEntity<String> getResource(@PathVariable("id") Long id) {
if (resourceNotFound(id)) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Resource not found."); // 404 Not Found
}
return ResponseEntity.ok("Resource found"); // 200 OK
}
private boolean resourceNotFound(Long id) {
// 리소스 존재 여부 확인 로직
return true; // 예시로 항상 리소스를 찾을 수 없다고 가정
}
}
서버에서 오류가 발생했을 때 사용합니다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ExampleController {
@GetMapping("/error")
public ResponseEntity<String> getError() {
try {
// 일부 로직 수행
throw new RuntimeException("Internal server error");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); // 500 Internal Server Error
}
}
@ExceptionHandler
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); // 500 Internal Server Error
}
}
위의 모든 상태 코드를 포함하는 종합적인 예제를 제공하겠습니다.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.net.URI;
import java.util.Collections;
import java.util.List;
@RestController
public class ComprehensiveController {
@GetMapping("/success")
public ResponseEntity<String> getSuccess() {
String responseBody = "Request was successful.";
return ResponseEntity.ok(responseBody); // 200 OK
}
@PostMapping("/create")
public ResponseEntity<Void> createResource(@RequestBody SomeResource resource) {
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(resource.getId())
.toUri();
return ResponseEntity.created(location).build(); // 201 Created
}
@DeleteMapping("/delete/{id}")
public ResponseEntity<Void> deleteResource(@PathVariable("id") Long id) {
return ResponseEntity.noContent().build(); // 204 No Content
}
@PostMapping("/validate")
public ResponseEntity<String> validateRequest(@RequestBody SomeRequest request) {
if (request.isInvalid()) {
return ResponseEntity.badRequest().body("Invalid request."); // 400 Bad Request
}
return ResponseEntity.ok("Valid request."); // 200 OK
}
@GetMapping("/protected")
public ResponseEntity<String> getProtectedResource(@RequestHeader(value = "Authorization", required = false) String authorizationHeader) {
if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Unauthorized access."); // 401 Unauthorized
}
return ResponseEntity.ok("Protected resource"); // 200 OK
}
@GetMapping("/forbidden")
public ResponseEntity<String> getForbiddenResource(@RequestHeader(value = "Authorization", required = false) String authorizationHeader) {
if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Forbidden access."); // 403 Forbidden
}
return ResponseEntity.ok("Accessible resource"); // 200 OK
}
@GetMapping("/resource/{id}")
public ResponseEntity<String> getResource(@PathVariable("id") Long id) {
if (resourceNotFound(id)) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Resource not found."); // 404 Not Found
}
return ResponseEntity.ok("Resource found"); // 200 OK
}
private boolean resourceNotFound(Long id) {
return true; // 예시로 항상 리소스를 찾을 수 없다고 가정
}
@GetMapping("/error")
public ResponseEntity<String> getError() {
try {
throw new RuntimeException("Internal server error");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER
_ERROR).body(e.getMessage()); // 500 Internal Server Error
}
}
@ExceptionHandler
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); // 500 Internal Server Error
}
}
이 예제에서는 다양한 상황에 따라 적절한 HTTP 상태 코드와 응답 메시지를 반환하는 방법을 보여줍니다.
각 상황에 맞는 적절한 ResponseEntity
를 사용하여 클라이언트에게 명확하고 적절한 응답을 제공할 수 있습니다.