백엔드 교육과정/5월

Controller 에서 ResponseEntity를 사용하는 경우 / 사용법

Ji@n 2024. 5. 22. 12:48

 

 

 

 

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