본문 바로가기

항해 99/Web

웹 미니 프로젝트 3일차 - 마지막

프로젝트 진행

1. ID 기반 수정 및 삭제 기능 적용

  • 실험 : DB의 users 테이블의 primary key인 user_id 값을 가져와서 post_id 값과 대조
    • 문제 파악 : user_id 값은 유저가 생성될 때만 새로 추가되지만 post_id 값은 같은 유저가 게시글을 여러 개 생성하기만 해도 값이 증가해서 대조 값으로 사용할 수 없음
    • 해결 방안 : user_id 값 대신 users 테이블의 loginID 값과 posts 테이블의 users(userID) 값과 대조하는 것으로 ID 기반 권한 부여 로직 구성
  • 문제 : 로그인 후 유저 ID 값을 인식하지 못해 유저 ID가 게시글 작성 유저의 ID와 일치하는 경우에도 수정 및 삭제 기능이 작동하지 않음
    • 실험 : 로그인한 유저 ID 값을 세션을 통해 받아오고 전달하는 과정 전부 출력(서버, 게시글 페이지)
    • 문제 파악 : 받아온 유저 ID 값의 경우 user_id 값이어서 숫자 값인 반면 users의 로그인 ID 정보는 문자형 데이터라 데이터 매칭이 안 됨
    • 해결 방안 : 서버에서 세션에서 받은 유저 값을 함수를 통해 users 테이블에서 loginID 값으로 받아서 변수에 저장하여 HTML 파일로 전송
  • 결과 : 로그인 한 유저 ID 정보가 게시글을 작성한 유저 ID 정보와 일치하는 경우 수정 및 삭제 기능이 정상적으로 작동

수정된 서버 파일

# 기존 DB의 users 테이블의 loginID 값을 가져오는 데 사용한 함수
def get_current_user_id():
    user_id = session.get('user_id')
    if user_id:
        user = Users.query.get(user_id)
        return user.loginID if user else None
    return None


@app.route("/total/", methods=['GET', 'POST'])
def total():
    if request.method == 'POST':
        # 여기에 POST 요청 처리 로직을 구현합니다.
        return redirect(url_for('total'))
    else:
        post_list = Posts.query.all()
        # 현재 로그인한 사용자의 ID를 세션에서 가져옵니다.
        user_id_from_session = session.get('user_id')
        # login_id = Users.query.filter_by(userID=userID).first()
        return render_template('total.html', data=post_list, current_user_id=user_id_from_session)
        # return render_template('total.html', data=post_list)
  • 로그인 한 유저 ID 정보를 세션을 통해 받아온 후 html 파일로 보낼 ID 대조 값으로 변수에 저장
  • posts 테이블의 users 필드 수정으로 함수 삭제

수정된 데이터 삭제 함수

@app.route("/delete_post/<int:postID>", methods=['POST'])
def delete_post(postID):
    # post_to_delete = Posts.query.get_or_404(postID)
    # db.session.delete(post_to_delete)
    # db.session.commit()
    print("Before deletion")
    post_to_delete = Posts.query.get(postID)

    # Cascade delete to associated view_count
    if post_to_delete:
        view_count_to_delete = ViewCount.query.filter_by(
            board_post_id=postID).first()
        if view_count_to_delete:
            db.session.delete(view_count_to_delete)

    db.session.delete(post_to_delete)
    db.session.commit()
    print("After deletion")
    return redirect(url_for('total'))
    # return jsonify({'success': 'Post deleted successfully'}), 200
  • 게시글 삭제 시 게시글의 조회수도 같이 삭제하도록 수정

수정된 데이터 수정 함수

@app.route('/edit-post/<int:postID>', methods=['POST'])
def edit_post(postID):
    post = db.session.get(Posts, postID)
    if not post:
        return jsonify({'error': 'Post not found'}), 404
    data = request.json
    title = data.get('title')
    content = data.get('content')
    type = data.get('type')
    url = data.get('url')
    image_url = data.get('image_url')
    if type is None:
        return jsonify({'error': '`type` is a required field'}), 400
    post.title = title
    post.content = content
    post.type = type
    url = data.get('url')
    post.url = url
    post.image_url = image_url
    try:
        db.session.commit()
        return jsonify({'success': 'Post updated successfully'}), 200
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500
  • 기존 함수에서 수정된 url 값을 받아서 DB로 보내는 변수가 없어서 해당 기능을 수행할 변수 추가

 

 

2. master branch로 merge

  • 개발 완료된 로직을 프로젝트 마스터 브랜치로 병합 작업 실행
  • 병합 후 프로젝트 각 기능 별로 테스트 실시
    • 회원 가입, 로그인 기능(아이디, 이메일 중복확인, 비밀 번호 일치 확인)
    • 메인 화면 웹툰 우측 바(랜덤 셀렉트, 바 접고 펴기)
    • 게시글 페이지 카테고리 별 분류 확인
    • 게시글 클릭 시 링크 이동 및 조회수 증가 확인
    • 유저 ID 기반 게시글 수정 및 삭제 기능 동작 확인
    • 웹툰 상세 페이지 랜덤 셀렉트 및 갱신 상세 정보 페이지 접속 확인
  • 기능 동작 간 발생한 에러 상황 즉시 조치
    • 서버의 DB 수정 함수가 url 값을 받고 DB에 명령할 코드가 없음 → 코드 추가
    • 삭제 함수의 기능을 누를 시 페이지 로딩 오류 → 함수 중간에 함수 파라미터 값이 잘못 된 부분 올바른 파라미터 값으로 수정 조치

 

 

3. 프로젝트 발표자료(PPT) 제작 및 발표

 

  • 프로젝트 발표자료 제작 및 발표 진행

 

 

4. 프로젝트 마무리

  • 기술 매니저님께 프로젝트 피드백 및 프로젝트 간 궁금했던 사항 질문
  • 프로젝트 시연 데모 영상 제작
    • 영상 녹화 프로그램을 통해 프로젝트 완성 결과물의 각 기능 시연 영상 녹화 후 youtube에 조 이름으로 업로드
    • 프로젝트 전체 파일 제출

 

 

프로젝트 간 느낀 점

  • Git을 통해 협업을 할 경우 공통 기능의 경우 빠르게 개발하고 개발 후 수정을 거의 하지 않는 것이 좋다.
    • git push 간 충돌 최소화
  • 프로젝트 회의나 의견 교환 시 문서로 기록하는 것이 좋음
    • 어떤 의견을 주고 받았는지 프로젝트 수정 방향 등을 확인할 수 있음
  • 팀원과 개발하는 파트가 겹칠 경우 자주 의사소통하며 개발하는 것이 나중에 git 간 충돌을 줄일 수 있어서 좋음
    • 그 외에도 개발을 잘못된 방향으로 하지 않을 수 있음(팀원이 사용해야 하는 부분을 삭제 또는 수정하는 상황 방지)

 

KPT

 

KEEP

  • 팀원과 프로젝트 진행 사항을 자주 공유하고 프로젝트 기간동안 시작 회의 및 마무리 회의를 통해 프로젝트 방향을 설정한 것
  • 각자 맡은 역할을 수행하기 위해 개인 스스로 노력 뿐만 아니라 팀원과 협력을 통해 문제를 해결한 것
  • 좋은 분위기를 유지하기 위해 시작 전에 서로 노래를 추천하는 것

Problem

  • Git 작업 간 공통 사용 부분에 대한 약속을 제대로 정하지 않아 git push간 충돌 문제로 인해 코드를 수정하고 확인하는데 많은 시간이 소요 됨
  • SA 및 와이어 프레임을 작성하는데 도움이 되는 툴 사용에 미숙해서 시간이 걸렸던 점

Try

  • Git 작업 전 공통 사용 부분에 대한 개발 시 수정이나 삭제에 대한 규칙 정의 및 작업 간 겹치는 부분을 개발할 때 팀원과 활발하게 소통하며 git push 간 충돌이 발생할 만한 사항을 최소화
  • SA 및 와이어 프레임을 작성하는데 도움이 되는 툴 숙련도를 올려 작성 시간을 줄이기

 

프로젝트 PPT 및 프로젝트 전체 파일, 프로젝트 시연 영상 주소

공유다.pptx
14.03MB
0UDA_Project.zip
0.06MB