keemtj / project-basic-instagram

인스타그램 클론 코딩

Home Page:https://instagram-73830.web.app

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

인스타그램 클론 코딩

📗 목차

📝 프로젝트 개요

clone site image

프로젝트: 인스타그램(Instagram) 클론코딩

기획 및 제작: 김태진

분류: 개인 프로젝트

제작 기간: 2021. 03 ~ 08.

배포일: 2021.08.18.

주요 기능: 회원가입, 로그인, 포스트 작성 및 삭제, 댓글, 유저 검색, 다이렉트 메시지, 팔로우, 프로필 페이지, 좋아요 및 북마크

사용 기술: React, Styled-component, Redux-thunk, Firebase, Git flow

문의: keemgreat@gmail.com


🏆 목표

React, Styled-component, redux-thunk, firebase를 이용하여 인스타그램 클론 코딩 완성하기입니다. firebase의 Authentication, Cloud firestore, storage, hosting 서비스를 이용하였습니다. 데이터 베이스와 스토리지에 데이터를 저장하고 불러오는 요청 처리와 완성된 프로젝트의 호스팅을 목표로 진행하였습니다.


🛠 기술 및 도구

React Styled-Components Redux Firebase GitHub


🔗 링크

링크: instagram

ID: test@gmail.com | PW: 123456를 입력하여 접속 가능


✨ 기능 업데이트

git flow를 통한 업데이트 진행

  • ✨ 메인 페이지 및 프로필 페이지에 인피니트 스크롤 기능 추가(21.09.06)

  • 🐛 프로필 페이지로 이동하는 버튼 클릭 시 발생했던 데이터 가져오기 에러 수정(21.09.06)


👨🏻‍💻 기능 구현

0. Firebase

- Authentication

회원 관리 이미지

- Firebase Cloud Firestore(JSON TREE)

{
  "users": {
    "user-1": {
      "uid": "",
      "username": "",
      "displayName": "",
      "email": "",
      "phone": "",
      "photoURL": "",
      "presentation": "",
    },
    "user-2": { ... }
  }
}
{
  "posts": {
    "post-1": {
      "uid": "",
      "id": "",
      "text": "",
      "date": "",
      "imagesArray": [
        {
          "name": "",
          "timeCreated": 1628775963000,
          "url": ""
        },
      ],
      "bookmarks": ["", ..., ""],
      "hearts": ["", ..., ""],
      "location": "",
      "subLocation": "",
      "isPossibleToComment": true,
      "comments": {
        "comment-1": {
          "text": "",
          "date": 1628775963100,
          "uid": "",
        },
        "comment-2": { ... }
      }
    },
    "post-2": { ... }
  }
}
{
  "follow": {
    "follow-1": {
      "displayName": "",
      "followers": ["", ...,""],
      "following": ["", ...,""],
    },
    "follow-2": { ... }
  }
}
{
  "direct": {
    "room-1": {
      "id": "",
      "timeStamp": 1628775963100,
      "from": "",
      "msg": "",
      "msgId": "",
      "participant": ["", ..., ""],
      "messages": {
        "message-1": {
          "id": "",
          "msg": "",
          "timeStamp": 1628775963100,
          "uid": "",
        },
        "message-2": { ... }
      }
    },
    "room-2": { ... }
  }
}

- Firebase Storage

Firebase Storage를 구조화한 이미지

스크린샷 2021-08-29 19 48 19

1. 회원가입

- 이메일을 이용한 회원가입

회원가입 화면 이미지

  • 이메일, 패스워드, 성명, 아이디를 입력하여 회원가입 구현
  • Firebase의 Authentication에서 회원가입한 유저 정보 관리

- Google 인증을 통한 회원가입

  • 본인의 Google 계정을 연동하여 회원가입 진행하는 기능 구현
  • 별도의 이메일, 패스워드 입력없이 Google 계정을 통해 회원가입 및 즉시 회원가입 가능

2. 로그인

- 이메일 및 패스워드 로그인

스크린샷 2021-08-20 00 20 40

스크린샷 2021-08-20 00 25 14

스크린샷 2021-08-20 00 21 07

  • 인증된 이메일과 패스워드를 통해 로그인하도록 구현
  • 이메일 형식이 아닌 경우, 비밀번호가 6자리 미만인 경우 로그인 버튼 기능을 제한함
  • 이메일 혹은 비밀번호만 입력한 경우, 이메일 혹은 비밀번호가 일치하지 않을 경우 로그인 제한 기능 구현

- Google계정 로그인

  • 기존에 회원가입을 통해 인증된 Google 계정이 존재할 경우 즉시 로그인
  • 회원이 존재하지 않더라도 구글 인증 과정을 거친 후 즉시 로그인

3. 헤더

- 유저 검색

스크린샷 2021-08-20 00 31 18

스크린샷 2021-08-20 00 33 07

스크린샷 2021-08-20 00 34 04

  • 현재 회원가입된 유저를 검색하는 기능 구현
  • 최근 검색한 유저의 리스트를 최근 검색 항목에 구현
  • 검색 기록 지우기, 모두 지우기, 최근 검색 항목에서 유저를 선택할 경우 최근 검색 항목의 상위로 업데이트하는 기능 구현

- 네비게이션 바

스크린샷 2021-08-20 00 39 41

스크린샷 2021-08-20 00 39 33

스크린샷 2021-08-20 00 39 22

스크린샷 2021-08-20 00 39 16

  • 현재 보여주는 페이지에 대해 시각적으로 표시하고 Modal 혹은 Popup창이 열렸다가 닫힐 경우 다시 기존의 페이지로 보여주도록 구현

- 프로필 팝업

네비게이션 팝업

  • 프로필 페이지로 이동하기 전 팝업창을 통해 프로필, 저장됨, 좋아요 페이지 혹은 프로필 설정 페이지, 로그아웃 기능을 쉽게 이용할 수 있도록 구현

4. 새 게시물 작성

- 새 게시물

새 게시물 작성 과정

새 게시물 modal

새 게시물 작성 예시

장소 검색

업로드 중

업로드 완료

  • 실제 인스타그램의 웹 버전은 모바일 앱과 다르게 새 게시물 작성 기능이 없어 본 프로젝트에서 새롭게 구현함
  • 새 게시물 작성은 Modal창으로 작성
  • 새 게시물 작성 도중 Dimmed 부분을 클릭할 경우 창이 닫히지 않도록 구현
  • 인스타그램의 가장 큰 특징은 사진업로드 기능이기 때문에 새 게시물 작성 시 사진을 업로드 하지 않으면 공유되지 않도록 구현
  • 사진 업로드, 문구 입력, 장소 검색을 통해 위치 추가, 업로드 로딩 및 완료를 구현
  • 업로드되는 게시물에 대해서 댓글 작성에 대한 권한을 On/Off하는 Toggle 버튼 구현
  • 업로드된 새 게시물 데이터는 Firebase의 Cloud firestore에 저장되고, 사진의 경우 Firebase의 Storage에 저장함
  • 이미지는 Storage의 URL을 통해 사이트에 보여지도록 구현

- 실제 인스타그램에서의 새 게시물 Modal

스크린샷 2021-08-20 22 11 41

  • 본 기능을 완성한 후 실제 인스타그램에서 부분적으로 새 게시물 업로드 기능이 생겼다 없어졌다하는 테스트가 진행되는 것으로 확인됨
  • 실제 테스트 중인 인스타그램의 새 게시물에서 업로드 로딩 및 완료시 UI를 클론하여 본 프로젝트에 재구현

5. 메인 페이지

- 게시물

이미지 슬라이더 gif

  • 피드를 올린 유저의 프로필 이미지 혹은 아이디를 클릭하면 해당 유저의 프로필 페이지로 이동함
  • 이미지 슬라이더(Carousel)을 직접 구현하여 여러 장의 이미지를 볼 수 있도록 구현
  • 현재 보여지는 이미지가 몇 번째인지 알 수 있도록 슬라이더에 대한 pagination을 Dot 모양으로 구현

- 좋아요, 북마크, 댓글 작성

좋아요, 북마크, 댓글 작성 gif

  • 피드에 좋아요, 북마크, 댓글 작성 구현
  • 좋아요, 북마크한 게시글은 프로필 페이지에서 다시 볼 수 있도록 함
  • 새로운 댓글은 피드에서 바로 볼 수 있도록 기존에 보여지는 2개의 댓글 밑에 연속적으로 구현
  • Emoji Picker library를 이용하여 댓글에 Emoji를 추가하여 작성할 수 있도록 구현

- 포스트 모달

스크린샷 2021-08-23 18 05 51

  • 게시물에 작성된 댓글은 최대 2개까지 보여지고 말풍선 모양의 아이콘 또는 댓글 n개 더보기를 클릭하면 Modal창이 열리면서 더 많은 댓글을 볼 수 있도록 구현

- Aside

유저 추천 리스트 gif

  • 피드가 올라오는 타임라인의 오른편에 배치하였고 로그아웃이 바로 가능하도록 구현
  • 현재 나를 팔로우하는 유저에 한해서 추천 목록에 보여지도록 구현
  • 맞팔로우하게 되면 추천 목록에서 지워지도록 구현

6. 다이렉트 메시지

- 게시물 공유

유저 추천 리스트 gif

  • 공유하기 아이콘 클릭 시 Modal창이 열리도록 구현
  • 다이렉트 메시지를 주고 받은 유저가 이미 존재할 경우 추천된 유저 목록에 보여지도록 구현
  • 검색된 유저를 선택하게 되면 선택한 유저 목록에 보여지도록 구현
  • 이미 선택받은 유저가 있으면 검색 결과에서 체크 중 표시를 나타내어 구현
  • 선택한 유저가 여러명인 경우 불필요한 유저는 목록에서 바로 삭제할 수 있도록 구현
  • 메시지를 작성할 경우 작성된 메시지와 게시물 링크를 함께 전달하고, 메시지를 작성하지 않으면 게시물 링크만 보내도록 구현

- 다이렉트

유저 추천 리스트 gif

  • 다이렉트 페이지에서 왼편은 다이렉트 룸, 오른편은 다이렉트 메시지 섹션이 나타나도록 구현
  • 메시지 보내기 아이콘을 누르면 공유하기와 같은 Modal창이 열리도록 하고, 다이렉트 페이지에서는 게시물 공유 기능 없이 메시지만 전달하도록 구현
  • 다이렉트 룸에 대한 멤버 정보 및 채팅 삭제는 다이렉트 메시지 섹션에서 확인 가능하도록 구현
  • 보낸 메시지에 대해서 복사 및 삭제가 가능하도록 구현

7. 프로필 페이지

- 유저 정보

스크린샷 2021-08-23 19 53 09

  • 유저의 프로필 사진, 아이디, 게시물 갯수, 팔로워, 팔로잉, 이름, 프로필 소개 문구 등의 정보를 확인할 수 있도록 구현
  • 본인의 프로필 페이지일 경우 프로필 편집 및 프로필 설정 버튼, 다른 유저의 프로필 페이지일 경우 팔로우가 가능하도록 구현

- 게시물, 저장됨, 좋아요

스크린샷 2021-08-23 19 53 09

스크린샷 2021-08-23 19 53 09

스크린샷 2021-08-23 20 13 08

스크린샷 2021-08-23 20 20 51

스크린샷 2021-08-23 20 20 46

  • 유저의 게시물, 저장됨(북마크), 좋아요 목록을 서브라우터로 구현
  • 저장됨, 좋아요 목록은 본인만 확인할 수 있고 다른 유저의 프로필 페이지에 접속할 경우 게시물 탭만 보여지도록 구현
  • 게시물 목록의 경우 Grid 레이아웃을 이용하여 구현
  • 게시물 목록에 Hover하면 좋아요 갯수와 댓글 수를 확인할 수 있도록 구현
  • 게시물 목록을 클릭하면 Modal창이 활성화 되고 게시물을 더 자세히 볼 수 있도록 구현
  • 모달의 왼쪽과 오른쪽에 <, >아이콘을 통해 Modal창을 닫지 않고 이전 게시물, 다음 게시물을 볼 수 있도록 구현
  • 첫 번째 혹은 마지막 번째 게시물의 경우 <, >아이콘을 없애서 사용자가 처음 혹은 마지막 게시물에 도달했음을 알 수 있도록 구현
  • 게시물, 저장됨, 좋아요 목록이 존재하지 않을 때 보여주는 페이지를 구현

8. 프로필 편집 페이지

- 프로필 편집 및 비밀번호 설정

스크린샷 2021-08-23 20 24 05

스크린샷 2021-08-23 20 43 06

스크린샷 2021-08-23 20 24 05

스크린샷 2021-08-23 20 38 15

  • 네비게이션 바에서 프로필 사진 클릭 > 설정 탭을 통해서 접속하도록 구현
  • 프로필 페이지에서 프로필 편집 버튼 혹은 톱니바퀴 모양의 아이콘 클릭시 프로필 편집 페이지로 접속하도록 구현
  • 프로필 사진 바꾸기 버튼 혹은 프로필 이미지를 클릭하여 프로필 사진을 변경하는 기능 구현
  • 이름, 사용자 이름, 이메일, 전화번호, 소개 문구를 제출하여 수정하도록 구현
  • 비밀번호 변경 탭에서 새로운 비밀번호로 변경하는 기능을 구현

9. 싱글 포스트 페이지

스크린샷 2021-08-23 21 17 39

- 싱글 포스트

스크린샷 2021-08-23 21 19 43

  • 게시물의 Modal창 대신에 페이지에서 볼 수 있도록 구현
  • 좋아요, 북마크, 댓글 작성, 게시물 공유하기 등 구현

- 주요 게시물

스크린샷 2021-08-23 21 20 51

  • 게시물을 작성한 유저의 싱글 포스트 페이지이기 때문에 보고 있는 게시물 이 외의 주요 게시물이 무엇인지 나타내는 섹션을 분리해 구현
  • 최대 6개의 게시물이 나오고 클릭하면 바로 그 게시물에 대해서 싱글 포스트 섹션에서 확인 가능하도록 구현
  • 게시물 더보기의 닉네임을 클릭하면 클릭한 유저의 프로필 페이지로 접속되도록 구현
  • 주요 게시물은 프로필 페이지와 마찬가지로 hover시 좋아요, 댓글 갯수를 확인할 수 있도록 구현

10. 기타 기능

- React.Portal

- Emoji picker library


🚀 배포

Hosting(CLI)

  • 첫 배포
$ npm install -g firebase-tools
$ firebase init
$ firebase login
  > HOSTING
  > Directroy? build
$ yarn build
$ firebase deploy
  • 수정 후 배포
$ yarn build
$ firebase deploy

커스텀 도메인

미설정, 호스팅이 완료되면 Firebase console의 Hosting탭에서 설정 가능


⏰ 커밋 히스토리

내 커밋 히스토리 보러가기


About

인스타그램 클론 코딩

https://instagram-73830.web.app


Languages

Language:JavaScript 99.5%Language:HTML 0.5%