[JAVA] RequestEntity & ResponseEntity

진영준·2024년 1월 26일

서론(TMI)

생각을 해보자. 내가 특정 API, 예를 들어 chatGPT의 생성형 API를 사용하고 싶다. 사실 API를 사용하고 싶지 않다면 자신이 직접 만들면 된다. chatGPT같은 AI를 개인이 만든다고 생각한다면 아마.. 100년정도 열심히 공부하고 장비를 사면 만들 수 있을 것이다. 하지만, 개인이 만들기는 힘들기 때문에 openAI(마이크로소프트에서 chatGPT API를 제공하는 사이트)를 통해 간단한 API요청을 보내고 응답을 받으면 그만이다. 이때 요청에 사용할 메소드가 RequestEntity이다.

⚡ RequestEntity


역할 및 사용이유

🚕 역할

  • HTTP 헤더, HTTP 메소드, 요청 본문 등의 요청 속성을 설정하여 클라이언트의 HTTP 요청을 표현한다.
  • 주로 RestTemplate이나 WebClient와 함께 사용되어 특정 리소스에 대한 요청을 보낼 때 사용한다.

🚓 사용이유

  • 특정한 요청 속성을 커스터마이징하여 요청을 정교하게 조작할 수 있습니다.
  • 예를 들어, 내가 사용하고 싶은 API에서 어떻게 요청을 보내야하는 지 Docs에 기재를 해놓는 경우가 있는데 그때 해당 규정에 맞게 요청값을 보낼 수 있다.
  // @RequestEntity 예시
  RequestEntity<String> requestEntity = RequestEntity
          .post(new URI("https://example.com/api/resource"))
          .header("Content-Type", "application/json")
          .body("{'key':'value'}");

실제 내가 chatGPT API를 사용할 때 사용한 요청코드(예시)

  RestTemplate restTemplate = new RestTemplate();
  HttpHeaders httpHeaders = new HttpHeaders();

  // json형식의 매개변수 message 역직렬화를 통해 String 데이터 타입으로 변환(Object활용)
  log.info("content = {}", question); // log찍어보기


  // 엔드포인트 uri 지정
  String uri = "https://api.openai.com/v1/chat/completions";

  // 헤드 작성 + apikey
  httpHeaders.add("Authorization", "Bearer " + apikey);
  httpHeaders.setContentType(MediaType.APPLICATION_JSON); // json타입으로 데이터를 전달하겠다는 뜻

  ArrayList<Message> messages = new ArrayList<>();
  messages.add(new Message("user", question));

  // 바디 작성 + model + messages
  Map<String, Object> requestBody = new HashMap<>();
  requestBody.put("model", model);
  requestBody.put("messages", messages);

  // 요청하고 받기
  RequestEntity<Map<String, Object>> httpEntity
          = new RequestEntity<>(requestBody, httpHeaders, HttpMethod.POST, URI.create(uri));

⚡ ResponseEntity


🚕 역할

  • HTTP 응답의 상태 코드, 헤더, 본문 등을 설정하여 서버의 응답을 표현할 수 있다.
  • 주로 컨트롤러에서의 메소드 반환 타입으로 사용되어, 특정 상태 코드나 헤더, 본문을 클라이언트에게 반환할 수 있다.

🚲 의문점

굳이 ResponseEntity를 사용하는 이유는 무엇일까? 내가 만약 클라이언트에게 응답값을 보낸다고 했을 때 JSON형식의 값을 줘도 되고 또는 model 객체에 담아서 값을 전해줄 수도 있는데 @ResponseEntity를 사용해서 응답값을 전해줄 필요가 있을까?

🚓 사용이유

  • 위의 상황과 같이 기초적인 데이터만 넘길 때는 JSON으로 반환을 하거나 model에 값을 담아서 보내는 게 효율적일지도 모른다. 하지만, 기초적이 아닌 HTTP header에 값을 세팅하거나, status (HttpStatus.OK 등)을 세팅해야할 때 다음과 같은 세팅은 하기 힘들 것이다. 그렇기 때문에 보다 쉽게 값을 세팅할 수 있는 ResponseEntity를 사용하는 것이다.

ResponseEntity 예시

  ResponseEntity<String> responseEntity = ResponseEntity
          .status(HttpStatus.OK)
          .header("Custom-Header", "value")
          .body("{'message':'success'}");
  ResponseEntity<GptApiResponse> exchange
                  = restTemplate.exchange(httpEntity, GptApiResponse.class);

🚑 추가내용


내가 지금 포스팅한 글이 정설은 아닐 것이다.
RequestEntity와 ResponseEntity는 활용을 어떻게 하냐에 따라서 굉장히 유용 기능이기 때문이다.
앞으로 프로젝트나 프로그래밍을 하면서 내용을 계속 업로드(추가 및 수정)할 예정이다.

profile
주니어 개발자를 꿈꾸는 12hugs입니다.

0개의 댓글