컨트롤러에서 서비스 메서드의 ResponseEntity
를 제대로 처리하지 않고, 상태 코드를 덮어씌우는 문제를 다루는 쉬운 예시를 작성해 보겠습니다.
이 예시는 상태 코드를 덮어씌우는 문제를 설명하고, 이를 해결하는 방법을 단계별로 설명할 수 있도록 구성했습니다.
이 컨트롤러는 서비스에서 반환된 ResponseEntity
를 받아서, 항상 200 OK
상태 코드로 덮어씌우는 예시입니다.
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{userId}")
public ResponseEntity<JSONObject> getUser(@PathVariable String userId) {
// 서비스 메서드 호출
ResponseEntity<JSONObject> response = userService.getUserById(userId);
// 여기서 상태 코드를 덮어쓰고 무조건 200 OK로 반환
return ResponseEntity.status(HttpStatus.OK).body(response.getBody());
}
}
@Service
public class UserService {
public ResponseEntity<JSONObject> getUserById(String userId) {
// 예시로, 사용자가 없을 때 404 반환
if ("unknown".equals(userId)) {
JSONObject errorResponse = new JSONObject();
errorResponse.put("message", "유저를 찾는데 실패했습니다.");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse);
}
// 성공일때 정상적인 값 반환
JSONObject response = new JSONObject();
response.put("message","해당하는 유저를 찾았습니다!! ");
return ResponseEntity.status(HttpStatus.OK).body(response);
}
}
userService.getUserById(userId)
메서드는 사용자가 존재하지 않으면 404 Not Found
상태 코드를 반환하고, 사용자가 있으면 200 OK
를 반환합니다.200 OK
로 덮어쓰고 있기 때문에, Postman 등에서 404가 발생해도 항상 200 OK
로 반환되는 문제가 있습니다.@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{userId}")
public ResponseEntity<JSONObject> getUser(@PathVariable String userId) {
// 서비스 메서드의 ResponseEntity를 그대로 반환 (상태 코드 포함)
return userService.getUserById(userId);
혹은
.
.
.
JsonObject response = userService.getUserById(userId);
return response;
}
}
@Service
public class UserService {
public ResponseEntity<JSONObject> getUserById(String userId) {
if ("unknown".equals(userId)) {
JSONObject errorResponse = new JSONObject();
errorResponse.put("message", "User not found");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse);
}
JSONObject response = new JSONObject();
response.put("message", "해당하는 유저를 찾았습니다. ");
return ResponseEntity.status(HttpStatus.OK).body(response);
}
}
200 OK
응답):404 Not Found
응답):이제 서비스에서 반환한 상태 코드가 Postman 등 클라이언트에서 올바르게 표시됩니다.