📌 ResponseEntity란?
ResponseEntity는 Spring에서 HTTP 응답을 구성할 때 매우 유연하게 사용할 수 있는 클래스입니다. 빌더 패턴과 메서드 체이닝을 활용하여 상태 코드, 헤더, 본문 등을 설정할 수 있으며, 다양한 상황에 맞게 응답을 구성할 수 있습니다. 🌟
📌 ResponseEntity 작성 규칙
1️⃣ 기본 구조
ResponseEntity는 다음 세 가지 요소를 설정할 수 있습니다:
- 🛑 HTTP 상태 코드: 요청 처리 결과를 나타냅니다 (예: 200 OK, 404 Not Found).
- 📦 응답 본문(body): 클라이언트에게 반환할 데이터입니다.
- 📜 헤더(headers): 추가적인 메타데이터를 포함합니다.
2️⃣ 주요 작성 방식
(1) 상태 코드와 본문 설정
가장 간단한 형태로 상태 코드와 본문을 설정합니다:
- ✅ 성공 응답 (200 OK)
return ResponseEntity.ok(user); // 상태 코드 200 + 응답 본문
- 🎉 리소스 생성 (201 Created)
return ResponseEntity.status(HttpStatus.CREATED).body(user); // 상태 코드 201 + 응답 본문
(2) 상태 코드만 설정
본문이 필요 없는 경우 .build()를 사용하여 상태 코드만 반환합니다:
- 🔍 리소스 없음 (404 Not Found)
return ResponseEntity.notFound().build(); // 상태 코드 404 + 본문 없음
- 🧹 리소스 삭제 완료 (204 No Content)
return ResponseEntity.noContent().build(); // 상태 코드 204 + 본문 없음
(3) 헤더 추가
응답에 헤더를 추가하려면 .headers() 또는 .header() 메서드를 사용합니다:
- 📜 HttpHeaders 객체 사용
HttpHeaders headers = new HttpHeaders();
headers.add("Custom-Header", "value");
return ResponseEntity.ok()
.headers(headers)
.body(user); // 상태 코드 200 + 헤더 + 본문
- 🚀 간단한 헤더 추가
return ResponseEntity.ok()
.header("Custom-Header", "value")
.body(user); // 상태 코드 200 + 헤더 + 본문
(4) 빌더 패턴 활용
빌더 패턴을 사용하여 상태 코드, 헤더, 본문을 체이닝 방식으로 조합할 수 있습니다:
- ✅ 요청 수락 (202 Accepted)
return ResponseEntity.status(HttpStatus.ACCEPTED)
.header("Custom-Header", "value")
.body("Request accepted and processing"); // 상태 코드 202 + 헤더 + 본문
3️⃣ 상황별 작성 규칙
| ✅ 요청 성공 | ResponseEntity.ok(user) |
| 🎉 리소스 생성 | ResponseEntity.created(location).body(user) |
| 🧹 리소스 삭제 | ResponseEntity.noContent().build() |
| ❌ 잘못된 요청 | ResponseEntity.badRequest().body("Invalid request parameter") |
| 🔍 리소스 없음 | ResponseEntity.notFound().build() |
| 🛑 서버 오류 | ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Server error") |
| 📜 헤더 포함 | .header("Custom-Header", "value").body(user) |
| 🚀 비동기 처리 | ResponseEntity.accepted().body("Request accepted") |
4️⃣ 다양한 형태가 존재하는 이유
다양한 작성 방식은 다음과 같은 이유로 존재합니다:
- 🌟 유연성: 응답의 구성 요소(상태 코드, 본문, 헤더)를 상황에 맞게 조합할 수 있도록 설계되었습니다.
- ⚙️ 빌더 패턴: 메서드 체이닝을 통해 직관적이고 간결한 코드를 작성할 수 있습니다.
- ✅ 편의 메서드 제공: ok(), created(), notFound() 등은 자주 사용하는 HTTP 상태 코드를 쉽게 반환하도록 도와줍니다.
📌 결론
ResponseEntity 작성 방식은 크게 두 가지로 나뉩니다:
- 단순한 상황에서는 편의 메서드 (ok(), created(), noContent())를 사용하세요. ✅
- 복잡한 응답이 필요한 경우 빌더 패턴 (status(), .header(), .body())을 활용하세요. ⚙️
형태가 다양해 보이는 이유는 설계의 유연성을 극대화하기 위함이며, 필요한 요소만 선택적으로 사용하면 됩니다! 🚀
📌 .build()가 붙는 경우란?
.build()는 ResponseEntity를 구성할 때 **응답 본문(body)**이 필요하지 않은 경우에 사용됩니다.
즉, HTTP 상태 코드와 헤더만 설정하고 본문은 비우고 싶을 때 주로 활용됩니다. 🚀
📌 .build()가 사용되는 주요 상황
1️⃣ 응답 본문이 필요 없는 경우
- HTTP 상태 코드만 반환하거나, 추가적인 데이터 없이 요청이 성공했음을 알릴 때 사용합니다.
🧹 예: 204 No Content
리소스를 삭제하거나 요청 처리 후 반환할 데이터가 없을 때 사용합니다.
return ResponseEntity.noContent().build();
- 상태 코드: 204 No Content
- 본문: 없음
2️⃣ 리소스를 찾지 못한 경우
- 리소스가 존재하지 않을 때 404 Not Found를 반환하며, 추가적인 메시지 없이 상태 코드만 반환할 수 있습니다.
🔍 예: 404 Not Found
return ResponseEntity.notFound().build();
- 상태 코드: 404 Not Found
- 본문: 없음
3️⃣ 헤더만 반환하고 본문이 없는 경우
- HTTP 응답 헤더를 설정하고, 응답 본문은 비워두고 싶을 때 사용합니다.
📜 예: 특정 헤더와 함께 200 OK 반환
HttpHeaders headers = new HttpHeaders();
headers.add("Custom-Header", "value");
return ResponseEntity.ok()
.headers(headers)
.build();
- 상태 코드: 200 OK
- 본문: 없음
- 헤더: Custom-Header: value
4️⃣ 커스텀 상태 코드만 반환하는 경우
- 특정 상태 코드를 직접 설정하고, 본문 없이 반환할 때 .status()와 .build()를 조합합니다.
✅ 예: 202 Accepted (본문 없음)
return ResponseEntity.status(HttpStatus.ACCEPTED).build();
- 상태 코드: 202 Accepted
- 본문: 없음
📌 왜 .build()를 사용하는가?
1. 🌟 응답 본문이 필요 없는 경우 명확하게 의도를 표현하기 위해
- 본문이 없다는 것을 명시적으로 나타내며, 불필요한 데이터 전송을 방지합니다.
2. ⚙️ 빌더 패턴의 마지막 단계로 호출
- .build()는 빌더 패턴의 마지막 단계로, 응답 객체를 완성하기 위해 호출됩니다.
3. 🚫 불필요한 null 반환 방지
- 명시적으로 "본문 없음"을 나타내기 위해 .build()를 사용하여 빈 응답을 생성합니다.
📌 결론
.build()는 다음과 같은 상황에서 활용됩니다:
- 🧹 상태 코드만 반환 (예: 204 No Content, 404 Not Found).
- 📜 헤더만 포함된 응답 (본문 없음).
- ✅ 커스텀 상태 코드와 함께 빈 응답 생성.
.body()와 .build()의 차이는 단순히 "본문의 유무"에 있습니다:
- .body(): 데이터를 포함한 응답 생성.
- .build(): 데이터를 포함하지 않는 빈 응답 생성.
.build()는 응답 본문이 필요하지 않은 상황에서 최종적으로 ResponseEntity 객체를 생성하기 위한 필수적인 메서드입니다! 🚀
'Spring > 10. rest-api' 카테고리의 다른 글
| FeignClient (0) | 2025.03.17 |
|---|---|
| RestControllerAdvice란? (0) | 2025.03.17 |
| ResponseEntity의 메서드들 (0) | 2025.03.16 |
| @PathVariable / @RequesteBody / @RequestParam (0) | 2025.03.16 |
| REST API 예제 (0) | 2025.03.14 |