티스토리 뷰

<Complete List>

1. 데이터베이스 및 UI 설계하기

  • 인스타그램 UI 구성
  • 데이터베이스 테이블 설계 및 구현

2. 앱 만들기

  • instagram, accounts 앱 만들기
  • views.py 분리하기

3. 회원가입 페이지

  • 비밀번호 암호화 함수 구현 - 해시 함수

4. 로그인 페이지

  • 세션에 사용자 ID 저장하기

5. 로그아웃 뷰

6. 메인 페이지

  • 6-1. 좋아요 뷰 / 좋아요 취소 뷰
  • 6-2. 북마크 뷰 / 북마크 취소 뷰

7. 포스트 리스트 페이지

  • 7-1. 팔로우 뷰 / 언팔로우 뷰
  • 7-2. 팔로잉 계정 리스트 모달
  • 7-3. 컬렉션 탭 추가

8. 포스트 상세 페이지

9. 포스트 업로드 페이지

10. 회원 정보 수정 페이지

11. 비밀번호 수정 페이지

12. 포스트 수정 페이지

13. 포스트 삭제 뷰

 

<To Do List>

9-1. 포스트 업로드 페이지

  • 해시태그 입력

12-1. 포스트 수정 페이지

  • 해시태그 수정

6-3. 메인 페이지

  • 해시태그 띄우기

 


9-1. 포스트 업로드 페이지(해시태그 입력)

  • pystagram에서 작업
  • 포스트 업로드 페이지의 해시태그 입력

해시태그와 포스트의 관계는 다대다 관계이다. 논리적으로는 다대다 관계를 표현할 수 있지만 실제 테이블에서 구현할 때

 

는 2개의 테이블만으로는 구현할 수 없다. 다대다 관계를 실제로 구현하기 위해선 각 테이블의 Primary Key를

 

Foreign Key로 참조 하고 있는 연결 테이블(매핑 테이블)을 사용해야 한다. 따라서, 해시태그를 위한 테이블을 만들 때,

 

post , post_hashtag (연결 테이블), hashtag 총 3개의 테이블이 필요하다. (참고)

 

9-1.1 PostUploadView

hashtags = request.POST.get('hashtag')
hashtags = hashtags.split(" ")
...
try:
    cursor = connection.cursor()

    strSql = "INSERT INTO post(user_id, post_img_url, content)"
    strSql += " VALUES(%s, %s, %s)"
    result = cursor.execute(strSql, (user.username, post_img_url, content))
    insertedPostId = cursor.lastrowid

    for tag in hashtags:
        if tag.startswith("#"):
            # hashtag 테이블에 등록된 해시태그인지 확인
            strSql = "SELECT hashtag_id FROM hashtag WHERE keyword = (%s)"
            result = cursor.execute(strSql, (tag,))
            data = cursor.fetchall()

            # 등록되지 않은 해시태그인 경우, hashtag 테이블과 post_hashtag 테이블 모두 INSERT
            if result == 0:
                strSql = "INSERT INTO hashtag(keyword)"
                strSql += " VALUES(%s)"
                result = cursor.execute(strSql, (tag,))
                insertedHashtagId = cursor.lastrowid

                strSql = "INSERT INTO post_hashtag(post_id, hashtag_id)"
                strSql += " VALUES(%s, %s)"
                result = cursor.execute(strSql, (insertedPostId, insertedHashtagId))

            # 등록된 해시태그인 경우, post_hashtag 테이블에만 INSERT
            else:
                strSql = "INSERT INTO post_hashtag(post_id, hashtag_id)"
                strSql += " VALUES(%s, %s)"
                result = cursor.execute(strSql, (insertedPostId, data[0][0]))
  • cursor.lastrowid : 커서를 통해 INSERT 된 row 중 가장 마지막 row의 id 값을 가져온다.

 

9-1.2 post_create.html

  • 전체코드 - github
  • 해시태그 입력 칸 추가

 

12-1. 포스트 수정 페이지(해시태그 수정)

  • pystagram에서 작업
  • 포스트 수정 페이지의 해시태그 수정

12-1.1 PostModifyView

  • 해시태그같은 경우 hashtag 테이블에서 수정하는 것이 아니라 post_hashtag 테이블에서 수정해줘야 한다. 그렇기

     

    때문에 포스트 데이터를 수정하는 것보다 경우의 수도 많으며, 그에 따라 로직도 다르게 처리해야하기 때문에 복잡하

     

    다. 따라서, post_hashtag 테이블에서 기존에 포스트와 해시태그가 연결된 row들을 모두 삭제한 후, 마치

     

    PostUploadView에서 새로 포스트와 해시태그를 연결하는 것처럼 로직을 처리하는 것이 훨씬 간결하다.
...
if request.method == "GET":
    try:
        ...
        strSql = "SELECT H.keyword"
        strSql += " FROM hashtag H"
        strSql += " JOIN post_hashtag PH ON H.hashtag_id = PH.hashtag_id"
        strSql += " WHERE PH.post_id = (%s)"
        result = cursor.execute(strSql, (post_id,))
        datas = cursor.fetchall()
        # 모든 해시태그를 합쳐 하나의 문자열로 만들어 해시태그 수정 칸에 띄워주기 위함
        hashtags = " ".join([x for row in datas for x in row])

        post['hashtags'] = hashtags
        ...

else:
    modifiedhashtags = request.POST.get('hashtag')
    modifiedhashtags = modifiedhashtags.split(" ")

    try:
        ...
        strSql = "DELETE FROM post_hashtag"
        strSql += " WHERE post_id = (%s)"
        result = cursor.execute(strSql, (post_id,))

        for tag in modifiedhashtags:
            if tag.startswith("#"):
                strSql = "SELECT hashtag_id FROM hashtag WHERE keyword = (%s)"
                result = cursor.execute(strSql, (tag,))
                data = cursor.fetchall()

                if result == 0:
                    strSql = "INSERT INTO hashtag(keyword)"
                    strSql += " VALUES(%s)"
                    result = cursor.execute(strSql, (tag,))
                    insertedHashtagId = cursor.lastrowid

                    strSql = "INSERT INTO post_hashtag(post_id, hashtag_id)"
                    strSql += " VALUES(%s, %s)"
                    result = cursor.execute(strSql, (post_id, insertedHashtagId))

                else:
                    strSql = "INSERT INTO post_hashtag(post_id, hashtag_id)"
                    strSql += " VALUES(%s, %s)"
                    result = cursor.execute(strSql, (post_id, data[0][0]))
                    ...

 

12-1.2 post_modify.html

  • 전체코드 - github
  • 해시태그 수정 칸 추가

 

6-3. 메인 페이지 (해시태그 띄우기)

  • pystagram에서 작업
  • 메인 페이지의 포스트 별 해시태그

6-3.1 MainView

# 포스트 별 해시태그
strSql = "SELECT H.keyword"
strSql += " FROM post_hashtag PH"
strSql += " JOIN hashtag H ON PH.hashtag_id = H.hashtag_id"
strSql += " WHERE PH.post_id = (%s)"
result = cursor.execute(strSql, (raw_data['post_id'],))
data = cursor.fetchall()
hashtags = [x for row in data for x in row]

raw_data['hashtags'] = hashtags

 

6-3.2 main.html

  • 전체코드 - github
  • 해시태그 칸 추가

 

포스트 상세 페이지에도 클릭된 포스트와 연결된 해시태그를 띄워줘야 하므로 위와 똑같이 반영한다.

댓글