HTTP 상태 코드 201 Created의 대체 방법

2024-05-27

HTTP 상태 코드 201 Created (RFC 9110) 프로그래밍

응답 헤더

201 Created 응답에는 다음 헤더가 포함될 수 있습니다.

  • Location: 새로 생성된 리소스의 URI를 나타냅니다. 클라이언트는 이 URI를 사용하여 새 리소스에 액세스할 수 있습니다.
  • Content-Location: 새로 생성된 리소스의 콘텐츠를 나타냅니다. 이 헤더가 없는 경우 새 리소스에는 콘텐츠가 없습니다.
  • ETag: 새로 생성된 리소스의 ETag입니다. ETag는 리소스 버전을 식별하는 데 사용됩니다.

프로그래밍 예제

다음은 Python에서 201 Created 응답을 생성하는 방법의 예입니다.

from flask import Flask, request

app = Flask(__name__)

@app.route('/create', methods=['POST'])
def create_resource():
    # 새로운 리소스 생성
    new_resource = create_new_resource(request.data)

    # 응답 생성
    response = flask.Response()
    response.status_code = 201
    response.headers['Location'] = url_for('get_resource', resource_id=new_resource.id)
    return response

@app.route('/resource/<resource_id>', methods=['GET'])
def get_resource(resource_id):
    # 리소스 가져오기
    resource = get_resource_by_id(resource_id)

    # 응답 생성
    response = flask.Response(resource.data)
    response.headers['ETag'] = resource.etag
    return response

if __name__ == '__main__':
    app.run(debug=True)

이 예제에서는 create_resource 함수가 새로운 리소스를 생성하고 Location 헤더에 새 리소스의 URI를 포함하는 201 Created 응답을 반환합니다. get_resource 함수는 리소스 ID를 기반으로 리소스를 가져오고 ETag 헤더에 리소스의 ETag를 포함하는 응답을 반환합니다.

추가 고려 사항

  • 201 Created 응답은 새 리소스가 성공적으로 생성되었음을 나타내지만, 반드시 리소스가 사용 가능하거나 안정적임을 보장하지는 않습니다.
  • 새 리소스에 대한 액세스 제어를 구현해야 합니다.
  • 새 리소스의 캐싱을 고려해야 합니다.


HTTP 상태 코드 201 Created(RFC 9110) 관련 샘플 코드

Python

from flask import Flask, request

app = Flask(__name__)

@app.route('/create', methods=['POST'])
def create_resource():
    # 새로운 리소스 생성
    new_resource = create_new_resource(request.data)

    # 응답 생성
    response = flask.Response()
    response.status_code = 201
    response.headers['Location'] = url_for('get_resource', resource_id=new_resource.id)
    return response

@app.route('/resource/<resource_id>', methods=['GET'])
def get_resource(resource_id):
    # 리소스 가져오기
    resource = get_resource_by_id(resource_id)

    # 응답 생성
    response = flask.Response(resource.data)
    response.headers['ETag'] = resource.etag
    return response

if __name__ == '__main__':
    app.run(debug=True)

Java

import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.ws.rs.core.Response;

public class ResourceService {

    @POST
    @Path("/create")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response createResource(Resource resource) {
        // 새로운 리소스 생성
        Resource newResource = createResource(resource);

        // URI 생성
        URI location = URI.create("/resource/" + newResource.getId());

        // 응답 생성
        return Response.created(location)
                .entity(newResource)
                .build();
    }

    @GET
    @Path("/resource/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getResource(@PathParam("id") String id) {
        // 리소스 가져오기
        Resource resource = getResourceById(id);

        // ETag 생성
        String etag = resource.getEtag();

        // 응답 생성
        return Response.ok(resource)
                .header("ETag", etag)
                .build();
    }
}

JavaScript

const express = require('express');
const app = express();

app.post('/create', (req, res) => {
    // 새로운 리소스 생성
    const newResource = createResource(req.body);

    // URI 생성
    const location = `/resource/${newResource.id}`;

    // 응답 생성
    res.status(201)
        .location(location)
        .json(newResource);
});

app.get('/resource/:id', (req, res) => {
    // 리소스 가져오기
    const resource = getResourceById(req.params.id);

    // ETag 생성
    const etag = resource.getEtag();

    // 응답 생성
    res.status(200)
        .setHeader('ETag', etag)
        .json(resource);
});

app.listen(3000, () => console.log('Server started on port 3000'));


HTTP 상태 코드 201 Created의 대체 방법

하지만 상황에 따라 201 Created 대신 다른 상태 코드를 사용하는 것이 더 적합할 수도 있습니다.

다음은 몇 가지 대체 방법입니다.

  • 200 OK: 새 리소스가 생성되었지만 이미 알려진 URI를 사용하는 경우 200 OK를 사용할 수 있습니다. 예를 들어, 사용자가 계정을 만들 때 이미 사용 가능한 사용자 이름을 선택하면 200 OK 응답과 함께 오류 메시지를 반환할 수 있습니다.
  • 204 No Content: 새 리소스가 생성되었지만 응답 본문에 포함할 콘텐츠가 없는 경우 204 No Content를 사용할 수 있습니다. 예를 들어, 사용자가 리소스를 삭제하도록 요청하면 204 No Content 응답을 반환할 수 있습니다.
  • 202 Accepted: 요청은 수락되었지만 아직 처리되지 않은 경우 202 Accepted를 사용할 수 있습니다. 예를 들어, 사용자가 작업을 제출하면 202 Accepted 응답과 함께 작업이 큐에 추가되었음을 나타내는 메시지를 반환할 수 있습니다.

주의: 201 Created 외의 다른 상태 코드를 사용하기 전에 HTTP 프로토콜 및 해당 응답 코드의 의미를 잘 이해해야 합니다.

결론

HTTP 상태 코드 201 Created는 새 리소스가 생성되었음을 나타내는 데 유용한 코드이지만, 상황에 따라 다른 코드를 사용하는 것이 더 적합할 수 있습니다.