Rails 컨트롤러에서 응답을 처리하는 두 가지 주요 메서드인 head와 render는 각각 다른 목적을 가지고 있습니다.
head 메서드
head는 ActionController::Metal을 통해 Rails 컨트롤러에서 제공되는 메서드로, 다음과 같은 특징을 가집니다.
-
HTTP 상태 코드: 응답 본문 없이 상태 코드만 전송합니다.
-
헤더: 필요한 경우 헤더를 포함할 수 있습니다.
-
응답 본문 없음: 본문을 포함하지 않습니다. 주로 API 응답에서 본문이 필요 없는 경우에 유용합니다.
head의 일반적인 사용 사례
-
콘텐츠 없는 성공적인 액션: 액션이 성공했음을 확인하지만 데이터를 반환할 필요가 없을 때 (
head :no_content- HTTP 204). -
간단한 상태 확인: 리소스가 성공적으로 업데이트되었을 때 등.
-
세부 정보 없는 오류 응답: 오류 메시지 없이 실패 상태만 반환할 때 (
head :unprocessable_entity- HTTP 422). -
RESTful API 설계:
PUT,PATCH,DELETE와 같은 특정 액션에서 응답 본문 없이 HTTP 상태 코드만 반환하는 경우가 많습니다.
render 메서드
render는 Rails 컨트롤러에서 응답을 보내는 가장 일반적인 방법입니다. head와 달리 본문을 포함한 완전한 HTTP 응답을 전송합니다. render는 다음을 반환하는 데 사용될 수 있습니다.
-
HTML (뷰 템플릿으로부터)
-
JSON (API 응답용)
-
일반 텍스트
-
부분 템플릿 (Partial templates)
head와 render 비교
| 시나리오 | head 사용 | render 사용 |
| :——————————- | :——–: | :———: |
| HTTP 상태만 전송해야 하는 경우 | 예 | 아니오 |
| JSON, HTML, 일반 텍스트를 반환할 경우 | 아니오 | 예 |
| API의 DELETE 액션 | 예 | 아니오 |
| 직렬화된 데이터 또는 오류 메시지 반환 | 아니오 | 예 |
Rails API 응답에서의 활용 예시
ruby
def destroy
if resource.destroy
head :no_content # HTTP 204 (성공 시 본문 없음)
else
render json: { error: "Could not delete resource" }, status: :unprocessable_entity # 실패 시 상세 오류 메시지
end
end
이 패턴은 성공 시에는 가벼운 상태 전용 응답을, 오류 시에는 더 자세한 응답을 원하는 API에서 흔히 사용됩니다.