[SpringBoot] ResponseEntity로 Http 코드에 따라 응답데이터 반환하기
초기 개발 시작할 때는 컨트롤러 작성할 때 http코드를 생각하지 못하고 반환해서 무작위로 오류를 반환하고 그랬는데요..
http 코드별로 ResponseEntity를 사용할 수 있다하니 바로 적용해보겠습니다.
특별한 경우의 http코드만 취급해보겠습니다 !!
1. 200 OK
리소스 조회 성공 시 데이터를 반환합니다.
언제 사용할 수 있을까 하면 데이터를 Read할 때 사용할 수 있겠죠?
@Slf4j
@RestController
@RequestMapping("/api/v1")
public class UserInfoController {
@GetMapping("/resource/{id}")
public ResponseEntity<Resource> getResource(@PathVariable Long id) {
Optional<Resource> resource = resourceService.findById(id);
return resource.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
}
해당 코드는 map과 orElse를 사용하여 200코드를 반환하거나 없을 때 204코드를 반환하는 코드입니다.
Optional<?> 로 작성하게 되면 isPresent와 isEmpty를 통해 null값 판정하는데 좋고 entity를 반환하는데에도 좋다 판단합니다.
4. 400 BAD REQUEST
클라이언트 요청이 유효하지 않을 때 사용합니다.
@Slf4j
@RestController
@RequestMapping("/api/v1")
public class UserInfoController {
@PostMapping("/resource")
public ResponseEntity<String> createInvalidResource(@RequestBody Resource resource) {
if (!isValid(resource)) {
return ResponseEntity.badRequest().body("Invalid resource data");
}
Resource createdResource = resourceService.save(resource);
return ResponseEntity.ok(createdResource);
}
}
5. 401 UNAUTHORIZED
인증이 필요한 요청에서 인증되지 않았을 경우 반환합니다.
@Slf4j
@RestController
@RequestMapping("/api/v1")
public class UserInfoController {
@GetMapping("/protected")
public ResponseEntity<String> getProtectedResource() {
if (!isAuthenticated()) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Authentication required");
}
return ResponseEntity.ok("Protected data");
}
}
SpringSecurity를 사용하게 되면 isAuthenticated() 함수를 사용할 수 있습니다.
6. 403 FORBIDDEN
권한이 없는 사용자가 요청할 경우 반환합니다.
권한이나 특정 롤에 따라 기능, 페이지를 나누는 경우가 있는데 그 때 사용하기에 좋겠지요.
예시 코드는 admin data에 접속했을 때 권한이 없음을 리턴하는 코드입니다.
@Slf4j
@RestController
@RequestMapping("/api/v1")
public class UserInfoController {
@GetMapping("/admin")
public ResponseEntity<String> getAdminResource() {
if (!hasAdminRights()) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Access denied");
}
return ResponseEntity.ok("Admin data");
}
}
7. 404 NOT FOUND
요청한 리소스가 없을 때 반환합니다.
보통 404, 500 코드가 빈번히 발생하는데 그 부분에서 유용하게 사용할 수 있겠죠
@GetMapping("/api/error")
public ResponseEntity<String> triggerServerError() {
try {
throw new RuntimeException("Server error occurred");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
8. 500 INTERNAL SERVER ERROR
서버에서 예외가 발생했을 경우 사용합니다.
데이터베이스나 다른 부분에서 오류가 생겼을 경우, 반환하기도 합니다.
@GetMapping("/api/error")
public ResponseEntity<String> triggerServerError() {
try {
throw new RuntimeException("Server error occurred");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
나중에 저를 위해 정리한 글입니다..
일을 일주일 쉬면 바로 까먹는 타입이라..하항
Anyway !!
ResponseEntity는 HTTP 상태 코드, 응답 헤더, 응답 본문을 조합하여 다양한 상황에 맞는 HTTP 응답을 구성할 수 있습니다.
이를 통해 RESTful API에서 클라이언트와 서버 간의 명확한 통신을 구현할 수 있습니다.
감사합니다 ~~!!