Spring HTTP 상태 코드에 대한 응답 예시

Seong Hyeon Kim·2024년 7월 24일
0

스프링

목록 보기
5/9

다양한 HTTP 상태 코드에 대한 응답 예시를 포함한 ResponseEntity 사용법을 구체적으로 설명드리겠습니다. 각 상태 코드에 대해 실제로 어떻게 응답할 수 있는지 예제를 통해 살펴보겠습니다.

1. 200 OK

클라이언트의 요청이 성공적으로 처리되었을 때 사용합니다.

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
    }
}

2. 201 Created

새로운 리소스가 성공적으로 생성되었을 때 사용합니다. 보통 생성된 리소스의 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
    }
}

3. 204 No Content

요청이 성공적으로 처리되었지만 반환할 콘텐츠가 없을 때 사용합니다.

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
    }
}

4. 400 Bad Request

잘못된 요청으로 인해 서버가 요청을 처리할 수 없을 때 사용합니다.

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
    }
}

5. 401 Unauthorized

클라이언트가 인증되지 않은 상태로 보호된 리소스에 접근하려고 할 때 사용합니다.

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
    }
}

6. 403 Forbidden

클라이언트가 리소스에 접근할 권한이 없을 때 사용합니다.

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
    }
}

7. 404 Not Found

요청한 리소스를 찾을 수 없을 때 사용합니다.

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; // 예시로 항상 리소스를 찾을 수 없다고 가정
    }
}

8. 500 Internal Server Error

서버에서 오류가 발생했을 때 사용합니다.

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
    }
}

9. 종합 예제

위의 모든 상태 코드를 포함하는 종합적인 예제를 제공하겠습니다.

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를 사용하여 클라이언트에게 명확하고 적절한 응답을 제공할 수 있습니다.

profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 개발자

0개의 댓글