Spring 컨트롤러에서 서비스의 상태 코드를 올바르게 처리하기

Seong Hyeon Kim·2024년 10월 21일
0

트러블슈팅

목록 보기
5/7

Spring 컨트롤러에서 서비스의 상태 코드를 올바르게 처리하기"

컨트롤러에서 서비스 메서드의 ResponseEntity를 제대로 처리하지 않고, 상태 코드를 덮어씌우는 문제를 다루는 쉬운 예시를 작성해 보겠습니다.

이 예시는 상태 코드를 덮어씌우는 문제를 설명하고, 이를 해결하는 방법을 단계별로 설명할 수 있도록 구성했습니다.




예시: 사용자 정보를 조회하는 간단한 API

1. 문제 코드: 상태 코드를 덮어씌우는 컨트롤러

이 컨트롤러는 서비스에서 반환된 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());
    }
}

2. 서비스 클래스

@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);
    }
}

status 는 200 이지만 response 값은 에러일때의 값이 나오는걸 볼 수 있습니다.

설명:

  1. userService.getUserById(userId) 메서드는 사용자가 존재하지 않으면 404 Not Found 상태 코드를 반환하고, 사용자가 있으면 200 OK를 반환합니다.
  2. 하지만 컨트롤러에서 무조건 200 OK로 덮어쓰고 있기 때문에, Postman 등에서 404가 발생해도 항상 200 OK로 반환되는 문제가 있습니다.



3. 해결 코드: 서비스의 상태 코드를 그대로 반환

@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);
    }
}

해결된 코드 설명:

  • 컨트롤러에서 서비스 메서드의 상태 코드를 덮어쓰지 않고, 그대로 반환하게 변경했습니다. 이제 404나 500과 같은 상태 코드를 서비스에서 설정하면, 컨트롤러에서 그대로 반영됩니다.



4. Postman을 통한 테스트

1. 사용자가 존재하는 경우 (정상적인 200 OK 응답):

2. 사용자가 존재하지 않는 경우 (404 Not Found 응답):

이제 서비스에서 반환한 상태 코드가 Postman 등 클라이언트에서 올바르게 표시됩니다.

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

0개의 댓글