Controller 에서 ResponseEntity를 사용하는 경우 / 사용법
Controller 에서 ResponseEntity를 사용하는 경우
일반적으로 페이지를 반환하는 경우(@Contorller)에는 잘 사용하지 않음.
일반 Controller 에서는 객체 리턴 시 HTTP 응답을 제어할 수 없다.
그러나
일부 데이터를 AJAX 호출을 통해
불러와야 하는 경우(RESTController) 사용한다.
RESTful API 엔드포인트에서 JSON, XML 등의 데이터 응답을 클라이언트에 제공할 때 사용된다.
예시 :
특정 예외가 발생했을 때 클라이언트에게 적절한 오류 코드와 함께 오류 메시지를 반환하고
싶을 때 or 클라이언트의 요청에 따라 다른 HTTP 상태 코드를 반환하고 싶을 때는
'ResponseEntity'를 사용하여 응답을 직접 제어하는 것이 적절하다.
public ResponseEntity<String> example() {
// 예외가 발생하면 클라이언트에게 오류 코드 500과 함께 오류 메시지 반환
try {
// 예외를 발생시키는 코드
throw new Exception("예외 발생!");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("서버 오류 발생: " + e.getMessage());
}
}
@GetMapping("/example")
public ResponseEntity<String> example() {
// 요청이 성공했을 때 200 OK를 반환
return ResponseEntity.ok("요청이 성공했습니다.");
}
ResponseEntity 적용한 메소드 양식
public ResponseEntity<String> getExample() {
// 성공적인 GET 요청 응답 생성
return ResponseEntity.ok("Success");
}
ResponseEntity<T> : 메소드의 반환 타입
ResponseEntity.ok(body) : 응답본문 설정 (성공적인 요청)
ResponseEntity.status(body) : 주로 예외 처리나 특정 조건에 따라 오류 상태 코드를 반환
ResponseEntity 잘 사용하기
1. 리턴시 생성자 패턴 보다 빌더 패턴 사용하기
빌더 패턴을 사용하면 상태 코드, 응답 본문 등을 간편하게 설명할 수 있다.
이를 통해 코드가 간결해지고 가독성을 높일 수 있다.
빌더 패턴 사용 예시1 :
@GetMapping("/example")
public ResponseEntity<String> example() {
// 성공적인 응답 생성
return ResponseEntity.ok()
.body("Success"); // 성공 응답 본문 설정
}
ResponseEntity.ok() 는 정적 팩토리 메서드
이 뒷부분을 메소드 체이닝으로 연결한 빌더 패턴을 사용하는 것이 의미가 더 직관적이고 유지보수에 좋다.
생성자 패턴 사용 예시 1 :
@GetMapping("/example")
public ResponseEntity<String> example() {
// 성공적인 응답 생성
return new ResponseEntity<>("Success", HttpStatus.OK); // 성공 응답 본문과 상태 코드 설정
}
빌더 패턴 사용 예시2 :
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
// 예외 처리를 위한 응답 생성
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("An error occurred: " + e.getMessage()); // 에러 메시지를 응답 본문에 포함
}
생성자 패턴 사용 예시2:
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
// 예외 처리를 위한 응답 생성
return new ResponseEntity<>("An error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); // 에러 메시지를 응답 본문에 포함하고 상태 코드 설정
}
2. ResponseEntity 의 타입을 작성하지 않거나, 반환타입이 명확하지 않을 때
public ResponseEntity getExample() {
}
위와 같은 예시는 ResponseEntity의 타입을 작성하지 않은 것이라 Object를 Return으로 받는다.
* Object : 모든 자바의 부모 클래스
타입을 여러개 받거나 , 반환 타입이 명확하지 않을 경우 :
타입을 여러 개 받고 싶은 경우에는 Object , <?>를 사용한다.
사실 return 타입이 명확하지 않은 경우에는 Object를 사용하는 것보다 와일드카드('?')를 사용하는 유연성을
유지할 수 있게 도와준다.
와일드 카드를 사용하면 반환할 수 있는 객체의 타입이 명확하지 않아도 사용이 가능하다.
public ResponseEntity<Object> postExample(@RequestBody Object requestBody) {
return ResponseEntity.ok().body(requestBody);
}
public ResponseEntity<?> getExample() {
return ResponseEntity.ok().body("Success");
}