세 번째, 버킷 리스트

이번의 특별한 기능은, 완료 버튼을 누르면 완료버튼이 없어지고 내용에 줄이 그어져야 한다

STEP 1 : 무엇을 고려해야 하는가?

  • URL은 어떻게 만들 것인지, 요청 방식은 어떻게 될 것인지?
  • 클라이언트에서 서버로는 어떤 것을 넘겨 줄 것인지?
  • 서버에서 클라이언트로는 어떤 것을 넘겨 줄 것인지?
  • 주의사항 : hidden field로 번호를 넣어 주어야 완료버튼을 눌렀을 때 어떤 것이 완료인지를 알 수 있다.

STEP 2 : 서버단 설정 (POST방식)

💣'done'의 상태를 숫자 0, 1로 표현했을 때는 후처리가 중요하다. 이는 뒤에서 다시 설명하겠다.

@app.route("/bucket", methods=["POST"])
def bucket_post():
    bucket_receive = request.form["bucket_give"]
#클라이언트로 전달받은 bucket_give를 bucket_receive에 저장한다.
    count = list(db.bucket.find({},{'_id':False}))
    num = len(count) + 1
#bucket의 개수를 count, 그리고 새로 만드는 bucket은 +1이 붙어야 하니까
#num이라는 변수에 len함수를 이용해 길이를 알아내고 count+1을 해준다.
    doc = {
        'num':num,
        'bucket': bucket_receive,
        'done':0
    }
#done는 0(미완)상태와 1(완료)상태로 나누어서 구분해준다.
    db.bucket.insert_one(doc)
    return jsonify({'msg':'등록 완료!'})
#insert를 하고 json형식으로 메세지를 보내주면 끝!

STEP 3 : 클라이언트단 설정

function save_bucket(){
    let bucket = $('#bucket').val()
#bucket class의 value를 가져와서 bucket 변수에 저장한다.
    $.ajax({
        type: "POST",
        url: "/bucket",
        data: {bucket_give:bucket},
#bucket 변수의 데이터를 bucket_give라는 param에 넣어서 서버에 전달한다.
        success: function (response) {
            alert(response["msg"])
            window.location.reload()
#별 일이 없으면 response에 담긴 json에서 msg를 꺼내서 alert해주고
#새로고침 해주면 끝!
        }
    });
}

 

GET방식도 그대로 하면 된다.

STEP 2 : 서버단 설정(GET방식)

*POST가 아니므로 클라이언트에서 서버로 가져갈 것이 없기 때문에 간단하게 쓸 수 있다.

@app.route("/bucket", methods=["GET"])
def bucket_get():
    buckets_list = list(db.bucket.find({},{'_id':False}))
    return jsonify({'buckets':buckets_list})

STEP 3 : 클라이언트단 설정

#document가 완료되면 show_bucket를 실행하는 메서드를 추가한다.
function show_bucket(){
    $('#bucket-list').empty()
    $.ajax({
        type: "GET",
        url: "/bucket",
        data: {},
#서버로 줄 게 없다.
        success: function (response) {
#다만 서버에서 받은 response로 들어온 버킷리스트를 띄워줘야 한다.
            let rows = response['buckets']
            for (let i = 0; i < rows.length; i++) {
                let bucket = rows[i]['bucket']
                let num = rows[i]['num']
                let done = rows[i]['done']

                let temp_html = ``
                if (done == 0) {
                    temp_html = `<li>
                                    <h2>✅ ${bucket}</h2>
                                    <button onclick="done_bucket(${num})" type="button" class="btn btn-outline-primary">완료!</button>
#여기가 매우 중요한데, 여기서 done_bucket(${num})으로 onclick함수를 만들어주어야 한다.
#온클릭 함수에 아규먼트로 버킷리스트 번호를 들어가게 하고, 그 번호에 맞는 버킷리스트를
#종료처리(done=1)로 해 줄 것이다.
				</li>`
                } else {
                    temp_html = `<li>
                                    <h2 class="done">✅ ${bucket}</h2>
                                </li>`
                }
                $('#bucket-list').append(temp_html)
            }
        }
    });
}

 

DONE_BUCKET 구현하기

STEP 2 : 서버단 설정

아까 위에서 설명했던대로 done_bucket function을 만들어 줌으로써 완료처리를 하는 함수를 구현해야 한다.

처음 GET/POST의 차이를 설명했었는데, '수정'에 대한 사항은 POST 방식으로 해 주어야 하기 때문에 POST방식으로 구현을 해 주어야 한다.

메서드는 insert가 아닌 update로 해 주어야 하고, url도 /bucket이 아닌 뒤에 /done을 적어주어야 위의 bucket_post와 구별될 수 있다.

또한, 위의 💣 imoge에 써 놓았듯, num이 DB에 저장될 때에는 integer형태로 저장되어 있는데 꼭 형변환을 해 주어야 한다.

@app.route("/bucket/done", methods=["POST"])
def bucket_done():
    num_receive = request.form["num_give"]
    db.bucket.update_one({'num': int(num_receive)}, {'$set': {'done': 1}})
#num_receive는 꼭 integer로 형변환을 해 주어야 한다. default값이 문자열이기 때문
    return jsonify({'msg': '버킷 완료!'})

STEP 3 : 클라이언트단 설정

function done_bucket(num){
#다른 function과는 별개로, 파라미터로 num인자를 꼭 받아야 돌아가게 해 놓아야 한다
    $.ajax({
        type: "POST",
        url: "/bucket/done",
#url 또한 /bucket/done에서 진행된다고 해 주어야 한다.
#처음 설명했듯, /bucket라는 창구에서 두 가지 post를 진행할 수 없기 때문이다.
        data: {'num_give':num},
#데이터는 num_give라는 파라미터에 num을 담아서 주어야 한다.
        success: function (response) {
            alert(response["msg"])
            window.location.reload()
        }
    });
}

 

 

이렇게 해서 버킷리스트도 끝났다.

 

+ Recent posts