IT모저모

[SpringBoot] ResponseEntity로 Http 코드에 따라 응답데이터 반환하기 본문

Develop/SpringBoot

[SpringBoot] ResponseEntity로 Http 코드에 따라 응답데이터 반환하기

YU JIN 2024. 12. 6. 12:38
반응형

초기 개발 시작할 때는  컨트롤러 작성할 때 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에서 클라이언트와 서버 간의 명확한 통신을 구현할 수 있습니다.

 

감사합니다 ~~!! 

Comments