ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 팀 소개 페이지 구현 5월 3주 WIL
    WIL 2023. 5. 19. 21:04

    1. 프로젝트 목표

    1. 메인 페이지 구현

    • 메인 페이지에는 팀소개, 팀원참여버튼, 팀원의 카드출력

    2. 팀원참가 페이지

    • 팀원의 이름, 나이, 취미, 블로그주소, 코멘트, 사진을 업로드 할 수 있는 기능 구현하기

    3. 팀원 개인 페이지

    • 메인 페이지에서 팀원의 카드를 누를 시 팀원 개인페이지로 이동 후 팀원 정보 출력

    4. 저장된 팀원의 정보수정, 삭제

    • 팀원 개인페이지에서 정보수정, 삭제 기능구현하기

    2. 진행한 프로젝트

    1.팀원의 정보저장하기 POST

     function posting() {    
                let name = $('#name').val();
                let age = $('#age').val();
                let hobby = $('#hobby').val();
                let blog = $('#blog').val();
                let comment = $('#comment').val();
                let image = $('#image').val();

                let formData = new FormData();
                formData.append("name_give", name);
                formData.append("age_give", age);
                formData.append("hobby_give", hobby);
                formData.append("blog_give", blog);
                formData.append("comment_give", comment);
                formData.append("image_give", image);

                fetch('/teams', { method: "POST", body: formData }).then((res) => res.json()).then((data) => {
                    alert(data['msg'])
                    window.location.href = '/'
                })
            }

    html에서 사용자가 작성한 내용을 db로 저장하기 위해 서버로 보냄

    let name = $('#name').val();

    let name = 으로 name이란 이름의 변수안에 $('#')라는 jQuery를 사용하여 body에 id="name"이라는 값을 지정하고

    .val()이라는 jQuery를 사용하여 지정한 값을 가저오게하였다.

    let formData = new FormData();
                formData.append("name_give", name);

    name 이라는 변수를 name_give라는 이름으로 FormData에 넣어 서버로 보내준다.

    서버에 보낼때는 JSON형태가 아닌 FormData에 넣어 POST 요청을 하는것이다.

     fetch('/teams', { method: "POST", body: formData }).then((res) => res.json()).then((data) => {})

    /teams라는 이름으로 서버로 POST 요청 body내용물은 formData

    @app.route("/teams", methods=["POST"])
    def teams_post():
        name_receive = request.form['name_give']
        age_receive = request.form['age_give']
        hobby_receive = request.form['hobby_give']
        blog_receive = request.form['blog_give']
        comment_receive = request.form['comment_give']
        image_receive = request.form['image_give']
       
        doc = {
            'name':name_receive,
            'age':age_receive,
            'hobby':hobby_receive,
            'blog':blog_receive,
            'comment':comment_receive,
            'image':image_receive
        }
        db.teams.insert_one(doc)

     프론트에서 보내준 값을 받아 각 값에 대응하는 이름을 정하여

     db.teams.insert_one(doc)

    데이터베이스의 teams라는 폴더에 insert 해달라는 요청을 보내는 것이다.

     

    구현을 끝마치고 코드를 보며 알게되었는데

    doc = {
            'name':request.form['name_give'] }

    이런 식으로 바로 작성을 한다면 코드가 짧아지니 더 좋을 것같다.

     

    이미지 파일은 업로드에 실패하여 이미지URL을 사용하는 것으로 일단 완성하였다.

     

    2. 팀원 정보 GET 및 팀원 개인 페이지 이동

    팀별로 개인페이지(html)은 만들지 않았고 같은 페이지에서 한팀원의 정보만 출력되게 하고싶었다.

    그렇게 하기위 해선 팀원 페이지에서 한 팀원의 정보만 가져올 필요가있고, 페이지 이동기능이 필요했다.

     

    먼저 페이지 이동기능을 만들었다.

    버튼 테그에 <a> 테그를 사용하여 a href =".html"로 사용 해보았다.

    하지만 , <a> 테그는 하이퍼 링크를 걸어 주는 것이므로, 배포를 하지않은 상태에선 페이지가 넘어 가지않는 문제가 발생

     

    다른 방법을 모색하여 html 파일끼리 이동이 가능한 location.href = "" 을 사용하여 문제를 해결하였다.

    onclick="location.href='/gocard/'"

    flask 에서 웹 표현 : route('/') 을 사용하여

    @app.rout('/gocard')

    • 맨 앞에 @가 붙는 것은 장식자 (decorator)를 난타낸다.
    • flask에서는 이러한 장식자가 URL 연결에 활용된다.
    • 장식자를 사용하면 다음 행의 함수부터 장식자에 적용 된다.
    @app.route('/gocard')
    def gocard():
        return render_template('card.html')

    url '/gocard'는 다은 행에 정의 되어있는 gocard함수와 연결된다.

    route 장식자는 플라스크 서버로 '/gocard'URL 요청이 들어왔을 때 어떤 함수를 호출할 걸인가 조정한다.

    route 장식자는 장식된 함수에서 결과를 반활할때 그결과를 대기중인 웹 브라우저로 반환한다.

    이렇게 개인페이지로 넘어가는 것은 완료 되었다.

     

    하지만, 같은 페이지에서 특정 데이터만 불러오는 것에서 문제가 생겼다.

    팀원 각각의 html을 만들지 않았기에, 한 페이지에 원하는 정보만을 가져오는 방법을 사용해야하는데

    방법을 몰랐던 것이다.

     

    처음에는 MongoDB에서 자동으로 생성해주는 ObjectId 타입의 '_id'컬럼을 사용하려 했으나 해당 타입이 string이 아닌 관계로 jsonString으로 프론트에 전달하기 위해서는 String 타입으로 변경해주는 작업이 추가적으로 필요했다. 하지만 MongoDB에서 데이터를 find할 때 ObjectId를 사전에 String타입으로 가져오는 방법이 없어 iteration을 통해 따로 ObjectId 타입을 변경해주는 추가 작업이 필요했는데  구형하는 기술력도 부족하거니와, 마감시간까지의 시간이 촉박하여 일단은 손쉬운 방법으로 실행했다.

    onclick="location.href='/gocard/${name}

    팀원 개인 페이지로 넘어가는 링크에 같은 이름의 데이터를 받아오는 방식으로 했다.

    @app.route('/gocard/<memberNamed>')
    def gocard(memberNamed):
        only_memberd = list(db.teams.find({'name':memberNamed},{'_id':False}))
       
        return render_template('card.html',only = only_memberd)

    ${name} 을 <memberNamed>으로 받아 db에 같은 이름의 데이터를 찾은 이후 only 라는 변수로 html에 보내주었다.

    여기서 문제발생

    • 이 경우 이름이 같은 데이터가 있다면 1개의 데이터가 아닌 같은 이름의 데이터가 더 나오게된다.
    • 추후 위에서 서술한 ObjectId 타입을 변경해주는 방법을 찾아 수정이 필요하다.
    <p class="card-text">나이 : {{only[0].age}}</p>

    이제 가져온 데이터를 내가 원하는 값에 맞게끔 넣어주는 작업을 하여 끝냈다.

     

    그러던 중 blog주소를 표시하는데 링크를 달아주고싶었다.

    <p class="card-text" >블로그 : {{only[0].blog}}</p>

    이렇게 작성만 하였을 땐 블로그의 주소에 링크가 달리지 않아

    이번엔 하이퍼링크를 달아주는 <a> 테그를 사용하여

    <p class="card-text" >블로그 : <a href="{{only[0].blog}}">{{only[0].blog}}</a></p>

    웹 페이지에서 블로그 주소를 눌렀을 때 이동할 수 있게 하이퍼 링크를 달아주었다.

     

    3. 데이터 삭제

    <button onclick="member_delete()" type="button" >팀원 삭제</button>

    팀원 삭제 버튼을 만들고 버튼에 member_delete() 라는 함수를 입력

    function member_delete() {
                let name = '{{only[0].name}}'
                fetch(`/teams/${name}`, { method: "DELETE" }).then((res) => res.json()).then((data) => {
                    alert(data['msg'])
                    window.location.href = '/'
                })
            }

    이 곳에 사용 된 정보중 이름{{only[0].name}} 을 기준으로 DELETE 요청

    추가) window.location.hred = '/' 는 작업성공시 메인페이지로 보내주는 기능이다.

    @app.route("/teams/<name>", methods=["DELETE"])
    def teams_delete(name):

        db.teams.delete_one({'name':name})

        return jsonify({'msg':'삭제 완료!'})

    {{only[0].name}}을 name 이라는 변수로 보낸 것을 /teams/<name> 에서 <name>으로 받아

    db.teams에서 delete_one(삭제요청) {'name' : name} 'name'값이 변수 name과 같은 정보를.

    여기서도 name을 기준으로 잡았기에 위에서 서술한 같은 name 이있을 경우 문제가 발생할 수 있다.

     

    4.데이터 수정

    <button onclick="location.href='/goupdate/{{only[0].name}}'" type="button" >팀원 수정</button>

    데이터 수정 페이지로 넘어가게 하였고, 넘어 갈때 {{only[0].name}}으로 지금 수정을 하고싶은 데이터의 기준을 name으로 잡았다.

    @app.route('/goupdate/<memberName>')
    def goupdate(memberName):
        only_member = list(db.teams.find({'name':memberName},{'_id':False}))
       
        return render_template('update.html',onlyone = only_member)

    수정 하는 페이지에 값을 가져와 value를 사용하여 기존 데이터를 보여주고 수정이 필요한 부분을 직관적으로 보여주었다.

    <input type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-lg" id="name" value="{{onlyone[0].name}}">

    이렇게 수정에 완료한값은 POST와 비슷하게 서버로 요청을 보내는데

    function updating(){
                let name = $('#name').val();
                let age = $('#age').val();
                let hobby = $('#hobby').val();
                let blog = $('#blog').val();
                let comment = $('#comment').val();
                let image = $('#image').val();

                let formData = new FormData();
                formData.append("name_give", name);
                formData.append("age_give", age);
                formData.append("hobby_give", hobby);
                formData.append("blog_give", blog);
                formData.append("comment_give", comment);
                formData.append("image_give", image);

                fetch('/teamsUpdate/{{onlyone[0].name}}', { method: "UPDATE", body: formData }).then((res) => res.json()).then((data) => {
                    alert(data['msg'])
                    window.location.href = '/'
                })
            }

    이 값을

    @app.route("/teamsUpdate/<updateName>", methods=["UPDATE"])
    def teams_update(updateName):
        name_receive = request.form['name_give']
        age_receive = request.form['age_give']
        hobby_receive = request.form['hobby_give']
        blog_receive = request.form['blog_give']
        comment_receive = request.form['comment_give']
        image_receive = request.form['image_give']
        db.teams.update_one(
            {'name':updateName},
            {
                "$set":{
                    'name':name_receive,
                    'age':age_receive,
                    'hobby':hobby_receive,
                    'blog':blog_receive,
                    'comment':comment_receive,
                    'image':image_receive
                }
            }
        )
        return jsonify({'msg':'수정 완료!'})

    받은 후 db의 'name' 값이 upadteName 값과 같은 데이터를

    특정 데이터를 수정할 수 있는 "$set" 을 사용해 수정 하였다.

     

    3. 실패한 기능들

    1. 위에서도 서술 하였듯이 get, delete, update에 사용한 객체값을 고유한 값을

    사용한 것이 아니기에 문제가 발생할 수있다.

    추후 MongoDB에서 자동으로 생성해주는 ObjectId 타입의 '_id'컬럼을 사용하는 방법을 터득하여 고유값으로

    이러한 문제를 해결해보자.

    혹은, 등록한 년,월,일,시,분,초 까지 같이 등록하여 한 데이터의 유니크한 고유값을 만들어 활용해 보자.

     

    2. 이미지 업로드 및 다운로드를 구현하지 못하였다.

    이미지의 저장 방법을 찾았지만, 경로 설정부터 막혀버렸다.

    시간이 촉박하여 URL주소를 사용하는 방법으로 대채하였으나 추후 수정을 할때 방법을 찾아 추가해보자.

    외부 저장프로그램 ex)AWS와 같은 것 사용하는 것도 좋은 방법이겠으나,아직 나에게는 어려운 부분이 많기 때문에 로컬에 저장하고 활용하는 법부터 익혀보자.

    'WIL' 카테고리의 다른 글

    23-06-19 ~ 23-06-25 WIL  (0) 2023.06.26
    23-06-12~23-06-18  (0) 2023.06.18
    23-06-05 ~ 23-06-11 WIL  (0) 2023.06.11
    WIL 23-05-29 ~ 23-06-4  (0) 2023.06.03
    자바스크립트 기초 + for in ,for of  (2) 2023.05.28
Designed by Tistory.