작업 환경
IDE: IntelliJ
Spring Boot: 3.2.3
Java: 20
클라이언트로부터 요청을 받고 서버가 처리를 완료하면 다시 클라이언트로 응답 메시지를 보내야합니다.
응답 메시지는 상태 코드와 그 상태를 설명하는 메시지로 구성됩니다.
1. 1xx (정보응답)
요청이 잘 수신되었으며, 프로세스가 계속 진행될 수 있음을 의미합니다.
Ex) 100 Continue, 101 Switching Protocols
2. 2xx (성공)
클라이언트의 요청이 성공적으로 수신되었음을 나타냅니다.
Ex) 200 OK, 201 Created
3. 3xx (리다이렉션)
요청을 완료하기 위해 추가 조치가 필요함을 나타냅니다.
Ex) 301 Move Permanently, 304 Not Modified
4. 4xx (클라이언트 오류)
클라이언트의 오류로 인해 요청을 처리 할 수 없음을 나타냅니다. 클라이언트가 요청을 수정하지 않는 한 서버는 요청을 처리할 수 없습니다.
Ex) 400 Bad Request, 403 Fobidden, 404 Not Found
5. 5xx (서버오류)
서버가 유효한 요청을 처리하지 못함을 나타냅니다. 서버의 내부 문제로 인해 발생하는 경우가 대부분입니다.
Ex) 500 Internal Server Error
ResponseEntity 객체를 사용하면, 상태 코드 및 응답 헤더를 직접 제어할 수 있습니다.
먼저 Spring Framework에서 컨트롤러로 인식하고 관리할 수 있도록 @Controller 또는 @RestController 어노테이션을 컨트롤러로 인식 할 수 있게 합니다.
물론 꼭 두 어노테이션이 필요하지는 않지만 @Bean 어노테이션을 사용하여 수동으로 등록해야 합니다.
@RestController
public class ExampleController {
@GetMapping("/example1")
public ResponseEntity<String> okResponse() {
return ResponseEntity.ok("ok")
}
}
다음과 같이 작성하시면 GET /example1 으로 오는 요청은 200 ok 메시지를 반환하게 됩니다.
@RestController
public class ExampleController {
@GetMapping("/example2")
public ResponseEntity<String> notFoundResponse() {
return ResponseEntity.notFound().build();
}
}
위와 같이 GET /example2 요청에 404 NotFound 메세지를 전송 할 수도 있습니다.
다음과 같이 Postman으로 결과를 확인할 수 있습니다.
Map을 사용하며 직접 JSON 구조를 만들어주면 JSON 응답을 생성할 수 있습니다.
@RestController
public class ExampleController {
@GetMapping("/example3")
public ResponseEntity<?> okResponseJson() {
Map<String, Object> response = new HashMap<>();
response.put("status", 200);
response.put("msg", "ok");
return ResponseEntity.ok(response);
}
}
GET /example3 요청을 전송하면 아래와 같이 JSON 형식으로 응답 메시지를 받을 수 있습니다.
Controller 클래스를 작성하면 Response 메시지를 자주 작성하게 됩니다.
위와 같이 계속 Map을 사용해서 Response 메시지를 작성하면 꽤나 번거로운 작업이 됩니다.
좀 더 편하게 사용하기 위해 response 클래스를 하나 만들어서 재사용성을 늘려봅시다.
먼저 response 패키지를 만들고 그 안에 exampleResponse 클래스를 하나 만들었습니다.
exampleResponse 클래스는 다음과 같이 작성했습니다.
public class ExampleResponse {
private int status;
private String mag;
public exampleResponse(int status, String mag) {
this.status = status;
this.mag = msg;
}
}
이제 Response 메시지 작성 시 다음과 같이 작성하면 Map을 사용하지 않고 Response 메시지를 JSON 형식으로 전송 할 수 있습니다.
@RestController
public class ExampleController {
@GetMapping("/example4")
public ResponseEntity<ExampleResponse> responseClassToOkResponse() {
ExampleResponse response;
response = new ExampleResponse(200, "ok");
return ResponseEntity.ok(response);
}
}
Postman으로 확인 결과 다음과 같이 정상적으로 Response 메시지를 받을 수 있습니다.
아래와 같이 400 Bad Request, 500 Internal Server Error 등 다른 메시지도 매핑하여 전송할 수 있습니다.
@RestController
public class ExampleController {
@GetMapping("/example5")
public ResponseEntity<ExampleResponse> responseClassToBadRequest() {
ExampleResponse response;
response = new ExampleResponse(400, "Bad Request");
return ResponseEntity.badRequest().body(response);
}
@GetMapping("/example6")
public ResponseEntity<ExampleResponse> responseClassToInternalServerError() {
ExampleResponse response;
response = new ExampleResponse(500, "Internal Server Error");
return ResponseEntity.internalServerError().body(response);
}
}