Giter VIP home page Giter VIP logo

animaltalk's Introduction

🐱 애니멀톡

🔗 배포 URL: https://beyonddevelops.github.io/AnimalTalk/

테스트 계정

개요

  • 🏫 멋쟁이사자처럼 프론트엔드스쿨 3기 팀 프로젝트로 진행한 애니멀톡입니다.
  • 🐱 애니멀톡 서비스는 참여하고 싶은 반려동물 모임(산책, 미용 등)을 등록하여 소통할 수 있는 SNS입니다.
  • ✉️ 모임을 등록하지 않아도 일상을 공유하며 즐거운 SNS 활동을 할 수 있습니다.
  • 📝 글과 사진을 함께 게시물로 작성하여 자신의 일상을 공유할 수 있습니다. 다른 사용자를 팔로우하면 유저가 올린 게시물을 홈 피드에서 소식을 확인할 수도 있습니다.
  • 💕 피드를 구경하다가 마음에 드는 게시물을 발견했다면 좋아요를 누를 수 있고 댓글을 남기거나 공유할 수도 있습니다.

팀원 구성

이지형 이재영 정수현
목차
  1. 프로젝트 목표
  2. 팀 문화
  3. 개발 환경 및 배포 URL
  4. 프로젝트 구조
  5. 역할 분담
  6. 프로젝트 진행 사항
  7. UI
  8. 페이지 기능
  9. 개발 이슈 해결 로그
  10. 개선할 점

1. 프로젝트 목표

  • React와 TailwindCSS의 결합을 통해 마크업과 디자인 구현을 통합적으로 관리하고자 합니다.
  • React Hook에 대한 동작 원리와 구현 과정을 이해하며 프로젝트를 진행합니다.
  • 라우팅과 예외처리를 위해 React-Router-Dom (v6.4 이상) 및 React Query를 사용하며 프로젝트를 진행합니다.
  • 상태관리를 위해 Redux-ToolKit을 사용합니다.
  • 사용자의 웹 접근성을 고려하여 시맨틱하게 개발합니다.
  • 컴포넌트 분리를 통한 재사용성 향상을 지향합니다.
  • 적극적인 코드리뷰를 통해 서로의 정보를 공유하고, 직접 코드를 설명하는 시간을 가져봅니다.
  • "참여하고 싶은 프로젝트", "자랑하고 싶은 프로젝트" 만들기를 팀 문화로 지정하였습니다.

(Top)

2. 팀 문화

원칙

  1. 참여하고 싶은 프로젝트 만들기
  2. 자랑하고 싶은 프로젝트 만들기

규칙

1.1 서로의 다름을 인정하기 서로의 감정과 생각을 솔직하게 말하자! => 매주 금요일 마감회의 때 감정회고 시간을 가져보기 => 자유로운 의견 제시 불편한 점이 있으면 “나는 이러저러한 불편함이 있었어요~”라고 말하기 => 금요일 저녁 10시에 맥주 회고 가지기

1.2 언제나 마음 편하게 페어프로그래밍 요청하기

1.3 주중 오후 4시에 코드 리뷰하기

1.4 자기 시간을 확보하도록 하기 => 주중 오후 8시 이후, 주말에는 최대한 자기 시간 확보하기

1.5 불참을 하게 되는 경우에는 하루 전에 말해주기

2.1 타인에게 설명할 수 있을 정도로 하나의 기능이라도 구현하려고 노력하기

2.2 내 실력을 온전히 보여줄 수 있는 수준의 코드 작성하기 => 배우면서 적용하되, 따라하지 말자!

(Top)

3. 개발 환경 및 배포 URL

개발 환경

  • Front : React, TailwindCSS, React-router-dom, Axios, React Query, React Form Hook, Redux-ToolKit
  • Back : 제공된 API 사용
  • 버전 관리 및 이슈 : 🔗GitHub, 🔗GitHub Issues, 🔗GitHub Project
  • 서비스 배포 환경 : 🔗 GitHub

배포 URL

URL : 🔗 https://beyonddevelops.github.io/AnimalTalk/

(Top)

4. 프로젝트 구조

  • public/assets/ : 이미지, svg 등
  • src/api/ : axios API 관리
  • src/components/ : 단일 페이지의 하위 요소로 들어가는 컴포넌트
  • src/context/ : 사용자 정보 등 상태관리
  • src/hooks/ : 컴포넌트에서 사용되는 훅 관리
  • src/pages/ : 화면에 렌더링 되는 컴포넌트
  • src/shared/ : 페이지에서 공통적으로 쓰이는 컴포넌트
  • src/store/ : 상태관리용 컴포넌트
  • src/types/ : 타입 관리를 위한 컴포넌트
  • src/utils/ : 뷰와 무관한 함수 모듈
AnimalTal듈
│
├─public
│  └─assets
│      ├─img
│      └─index.html
│
└─src
   ├─api
   │   ├─Club/
   │   ├─Comment/
   │   ├─Feed/
   │   ├─Image/
   │   ├─Like/
   │   ├─Profile/
   │   ├─Search/
   │   ├─User/
   │   ├─Valid/
   │   └─axios.ts
   │
   │
   ├─components
   │  ├─ChatDummyData
   │  ├─ChatModule
   │  ├─CheckAuth
   │  ├─ErrorFeed
   │  ├─HeaderParts
   │  ├─Loading
   │  ├─ModalModule
   │  ├─NoComment
   │  ├─NoFeed
   │  ├─PostTypeSelectBar
   │  ├─SimpleClub
   │  └─Textarea
   │
   ├─context
   │  └─AuthContext.jsx
   │
   ├─hooks
   │  └─useFeeds.jsx
   │
   ├─pages
   │  ├─ChatList
   │  ├─ChatRoom
   │  ├─ClubUpload
   │  ├─EditProfile
   │  ├─Follows
   │  ├─Home
   │  ├─LoginEmail
   │  ├─LoginHome
   │  ├─NotFound
   │  ├─PostDetail
   │  ├─PostUpload
   │  ├─SignUp
   │  ├─SignupProfile
   │  ├─SplashScreen
   │  ├─UserFeed
   │  └─UserSearch
   │
   ├─shared
   │   ├─Footer
   │   ├─Header
   │   ├─Post
   │   ├─Profile
   │   ├─SimpleUserList
   │   └─UserClub
   │
   ├─types
   │   └─post.ts
   │
   ├─utils
   │   ├─currentUnitComma.ts
   │   └─date.ts
   │
   ├─Root.tsx
   ├─Router.tsx
   ├─index.css
   └─index.tsx

(Top)

5. 역할 분담

🛠 공통 담당

  • 라우팅, 로그인 API, 헤더 부분

🙋🏻‍♀️ 정수현

  • 🔗github/IntHyun
  • 회원가입 기능 및 페이지, 회원정보 수정 기능 및 페이지, 모달 컴포넌트, 채팅 목록 페이지 및 해당 페이지 구현을 위한 하위 컴포넌트 등
  • 리팩토링 담당

🙋🏻‍♀️ 이지형

  • 🔗github/July249
  • 홈, 검색 페이지, 팔로우 페이지, 사용자 피드 페이지 및 해당 페이지 구현을 위한 하위 컴포넌트 등
  • 리팩토링 담당

🙋🏻‍♀️ 이재영

  • 🔗github/GreattitJY
  • 게시글 페이지, 모임 페이지, 채팅 페이지, 푸터, 유저 프로필, 댓글 및 좋아요 기능 및 해당 페이지 및 기능 구현을 위한 하위 컴포넌트 등

(Top)

6. 프로젝트 진행 사항

  • 전체 개발 기간 : 2022.12.09 ~ 현재
    • 버전 v1.1.0 : 2023.04.08 ~ 현재
    • 버전 v1.0.1 : 2023.01.07 ~ 2023.04.07
    • 버전 v1.0.0 : 2022.12.09 ~ 2023.01.06

작업 관리

  • 🔗GitHub Projects를 사용하여 진행도와 상황을 꾸준히 공유하였습니다.

  • 적극적인 코드리뷰를 통하여 서로의 지식 공유를 하였습니다.

  • 이슈에서 무엇을 진행할지에 대해 로그를 남기며 진행하였습니다.

  • Pull Request를 보낼 때 이슈번호와 연동하여 issue 관리를 진행, 스크린샷을 통해 코드리뷰의 효율성을 높였습니다.

  • GitHub Discussions를 활용하여 서로의 지식과 정보를 공유하고 의논을 나누었습니다.

진행과정

  • 22.12.09 ~ 22.12.13 : 기본 환경 설정 및 공통 스타일 작업 (레이아웃, 헤더, 푸터 등)
  • 22.12.14 ~ 22.12.20 : 기본적인 페이지, 컴포넌트 스타일 및 디자인 UI 기능 구현
  • 22.12.21 ~ 23.01.03 : 핵심 기능 구현(게시글, 팔로우, 좋아요, 댓글, 프로필 수정 등)
  • 23.01.04 ~ 23.04.07 : useFeeds, useLengthCheck 커스텀 훅을 통한 로직 재사용 관리, Header 컴포넌트 통합, 레이아웃 반응형 수정, UserSearch 성능 개선(debounce)
  • 23.04.08 ~ :

주간회의

주간회의를 진행하여 작업 방향이나 코드 고민에 대해 나누었고 GitHub Wiki를 사용하여 기록하였습니다.

  • 🔗221125 회의록 1회차

    • 사용할 기술 스택에 대한 논의
    • 물리적 거리의 한계를 극복하고자 Discord에서 주로 회의 진행
    • GitHub Orgarization 생성
    • GitHub Wiki, Projects, Discussions를 적극적으로 활용하여 회의록 및 프로젝트 진행사항 확인
    • GitHub Flow 방식 차용하여 진행
  • 🔗221127 회의록 2회차

    • 조 이름, 조장 정하기, GitHub Origanization 생성 및 등록
  • 🔗221130 회의록 3회차

    • 커밋 컨벤션 지정
    • 코드 컨벤션 지정
    • GitHub flow 방식에 따라 Pull Request 연습하기
  • 🔗221207 회의록 4회차

    • 이미지 assets 폴더 public vs. src 논의 => public 지정
    • TailwindCSS 공통 스타일, 초기 설정 지정
  • 🔗221209 회의록 5회차

    • Commit, PR, Issue 템플릿 적용
    • PR 단위 의논
    • Merge 할 때 규칙
      1. Approve 이후 셀프Merge 진행
      2. 다음 기능 구현을 위한 빠른 Merge 요구시 즉각적인 셀프 머지 진행
      3. Merge 전에는 항상 코멘트 남기기
    • Branch 명 정하기 => (커밋 컨벤션)/issue_(이슈번호) ex. feat/issue_120
    • 코드리뷰 시간은 주중 오후 4시
  • 🔗221212 회의록 6회차

    • VSCode prettier 설정 동기화를 통해 esLint 미적용
  • 🔗221220 회의록 7회차

    • API 명세 및 피그마 디자인을 기준으로 폴더구조 설정
    • 라우터 설정
    • 서버 데이터 생성 논의 (썬더 클라이언트 이용)
    • 디자인 작업 종료 시점 논의
    • 기능 구현 업무 분담 => 페이지 단위로 진행
    • 로그인 기능 구현 페어프로그래밍
  • 🔗221222 회의록 8회차

    • 페이지 업무 분담 및 추가 업무 분담
  • 🔗221229 회의록 9회차

    • 작업한 페이지 확인
    • 버그 및 미완성 기능 확인
    • 추가 작업 사항 논의
  • 🔗230106 회의록 10회차

    • 교육기간 내 프로젝트에 대한 서로의 회고
    • 서로에 대한 추천서 써주기
    • 교육 이후 프로젝트 진행 방향 및 방식 논의

(Top)

7. UI

(Top)

7. 페이지 기능

1. Login

🔗splash 🔗로그인 🔗회원가입

2. Home

🔗 🔗검색 🔗채팅

3. 게시글

🔗작성 🔗삭제
🔗수정 🔗상세

4. 프로필

🔗내 프로필 🔗프로필 수정 🔗팔로우
🔗팔로워 리스트 🔗팔로잉 리스트 🔗로그아웃

5. 모임

🔗모임 만들기 🔗모임 수정하기 🔗모임 삭제하기

6. 좋아요 및 댓글

🔗좋아요 🔗댓글 작성 및 삭제

(Top)

8. 개발하며 겪은 이슈

  1. 프로필 수정 시 계정 이름을 변경하면 useContext로 내려받던 유저 정보가 업데이트 되지 않아 렌더링 오류가 발생
  • 해결방법 : 근본적인 해결 방법은 쿼리를 사용해서 서버 상태를 감시하는 것이지만 useState를 사용해서 클라이언트 쪽에서 한 번 더 감시해서 해결했습니다.

  • 해결 코드

    const { accountname } = useContext(UserContext);
    const [newAccountname, setNewAccountname] = useState(accountname);
    const token = localStorage.getItem("token");
    
    useEffect(() => {
      const token = localStorage.getItem("token");
      const getUserInfo = async () => {
        try {
          const res = await axios.get("/user/myinfo", {
            headers: {
              Authorization: `Bearer ${token}`,
            },
          });
          setNewAccountname(res.data.user.accountname);
        } catch (err) {
          console.log(err);
        }
      };
      getUserInfo();
    }, []);
  • 트러블 코드

    const CheckAuth = () => {
      const token = localStorage.getItem("token");
      const [userInfo, setUserInfo] = useState(null);
    
      useEffect(() => {
        if (!userInfo) {
          const getUserInfo = async () => {
            try {
              const res = await api.get("/user/myinfo", {
                headers: {
                  Authorization: `Bearer ${token}`,
                },
              });
              setUserInfo({ ...res.data.user });
            } catch (err) {
              console.log(err);
            }
          };
          getUserInfo();
        }
      }, [token, userInfo]);
    
      return (
        <UserContext.Provider value={{ ...userInfo }}>
          {token ? <Outlet /> : <Navigate to="/login" replace="true" />}
        </UserContext.Provider>
      );
    };

  1. 무한 스크롤 기능을 구현하기 위해 Intersection Observer API를 이용하며 겪은 API 데이터 요청 이슈

    • 기능 구현 1: Observe Target 요소가 viewport 안에 intersect 되었을 때 추가 데이터를 얻기 위해 API 요청이 진행되도록 Home 페이지에서 기능 구현하였음
    const getFollowersFeeds = async () => {
      try {
        const res = await axios.get(`/post/feed?limit=10&skip=${state.postNum}`, {
          headers: {
            Authorization: `Bearer ${token}`,
          },
        });
        setPosts((prev) => [...prev, ...res.data.posts]);
        setState((prev) => ({ postNum: prev.postNum + 10, moreFeed: posts.length % 10 === 0 }));
      } catch (err) {
        console.log(err);
      }
    };
    
    const observerTarget = useRef(null);
    
    useInterset(observerTarget, state.postNum, state.moreFeed, getFollowersFeeds);
    • 기능 구현 2: Home, UserFeed, Followers 페이지에서 무한스크롤을 반복적으로 사용하게 되므로 커스텀 훅으로 관리해야할 필요성을 느낌
    import { useEffect } from "react";
    
    export default function useInterset(targetRef, stateCount, stateMore, requestAPIFunc) {
      useEffect(() => {
        if (!targetRef.current || !stateMore) return;
    
        const observerCallback = (entries, observer) => {
          if (entries[0].isIntersecting) {
            requestAPIFunc();
          }
        };
    
        const observer = new IntersectionObserver(observerCallback);
        observer.observe(targetRef.current);
    
        return () => observer.disconnect();
      }, [stateCount, stateMore]);
    }
    • 이슈1: Home 페이지 내에 팔로잉하는 사용자가 없는 경우 Observer Target이 노출됨에 따른 무한 API 데이터 요청 이슈가 있음을 확인함

    • 이슈1 해결방법: 받아온 게시글이 있을 때에만 Target 요소가 노출될 수 있도록 조건부 렌더링을 적용하여 해결

    {
      posts.length > 0 && <div ref={observerTarget}></div>;
    }
    • 이슈2: Home 페이지 최초 렌더링 시 API 요청이 비동기이기 때문에 발생하는 게시글 배열의 크기가 0인 이슈로 인해 API 요청 함수 자체가 동작하지 않음

    • 이슈2 해결방법: useEffect를 이용하여 최초 렌더링 시 API 요청 함수가 무조건 1회 동작하도록 코드를 추가하여 해결

    useEffect(() => {
      if (posts.length === 0) {
        getFollowersFeeds();
      }
    }, []);
    • 이슈3: useIntersect 커스텀 훅을 이용하여 UserFeed 페이지 구현시 무한 스크롤 기능을 구현하였으나, 마지막 게시글에 대해 이슈1번과 동일한 문제가 발생하였음

    • 이슈3 해결방법: 프로필 수정시 계정 ID를 수정하기 위해 재영님이 적용한 isUpload 상태가 Target 요소가 나타났을 때 API 요청을 지속하는 문제를 해결하는 핵심 기능이 되었음. 해결이 진행된 이유를 명확하게 파악해야하는 이슈가 아직 남아있음

    const getPageProfile = async () => {
      try {
        const res = await api.get(`/profile/${pageAccount}`, {
          headers: {
            Authorization: `Bearer ${token}`,
          },
        });
        setPageProfile(res.data.profile);
      } catch (err) {
        console.log(err);
      }
    };
    
    //.. 중략
    
    const observerTarget = useRef(null);
    
    useIntersect(observerTarget, state.postNum, state.moreFeed, getUserFeeds);
    
    useEffect(() => {
      if (!isUpload) return;
      getPageProfile();
      getUserClub();
      getUserFeeds();
      setIsUpload(false);
    }, [pageAccount, isUpload, postDataArray, pageProfile]);

  2. 이미지를 받아올 때 아래의 코드와 같이 api주소가 중복되는 버그가 발생하여 x-box가 렌더링 되는 버그 발생

    <img src="https://user-images.githubusercontent.com/68059880/210592195-18303b33-9e99-405b-82d7-c44bb8f52b4a.png" />

    이유 : 기존에는 아래와 같이 url을 삽입하여 경로를 설정해주었는데 서버에서 img경로를 받아올때 url 주소가 파일이름 혹은 서버주소+파일이름처럼 일관되지 않게 들어오는 문제 발생

    <img src=`https://api.mandarin.weniv.co.kr/${img}` />

    해결방안

    <img src={img.includes("https") ? img : `https://api.mandarin.weniv.co.kr/${img}`} />

    includes를 통해 https가 있는지 검사하고 https가 있다면 img를 바로 넣어주고 없다면 주소를 넣어 img를 넣어주어 x-box가 렌더링이 되는 문제를 해결

    <img onError={(e) => { e.target.src = profileSmallImg; }>

    추가적으로 이미지를 제대로 받아오지 못했을 때 x-box가 뜨는 버그를 수정해주기 위해 위와 같이 onError 이벤트를 활용하여 애니멀 톡의 기본 여자이미지로 변경되도록 리팩토링

9. 개선할 점

  1. 성능 테스트 (Lighthouse)

    image
  • 프로젝트 목표 중 하나인 웹 접근성을 고려하여 시맨틱한 코드를 작성하였으나 아직 부족한 부분이 있습니다. 추후 접근성과 성능 개선이 필요합니다.

  • 권장사항 :

    1. HTTPS 사용하지 않음 (폰트 사용 시 안전하지 않은 URL)
    2. 이미지가 낮은 해상도로 제공
  • 해결 방법 : import url 누락된 https를 입력 및 이미지 파일 svg로 변경

    image
  1. 중복된 api 요청 관리하기
  • 각 컴포넌트에서 선언된 api 요청들을 하나의 파일에서 관리하는 게 필요합니다.

(Top)

10. 애니멀 톡 컨벤션

  • 머지를 진행하기 전에 팀원들에게 리뷰를 받아 코드를 수정하는 과정을 거친 뒤 머지를 진행

  • 바로 머지를 진행하여야 하는 경우 팀원들에게 알린 뒤 바로 머지를 진행

  • 머지 한 후에 해당 브랜치 삭제 후 issue close

    1. 코드 컨벤션

    • Prettier : tap 간격 통일, 홑 따옴표 사용, tap Width 통일
    • props로 전달되는 함수 앞에는 on 키워드를 붙여 전달
    • 함수명 이름의 시작은 handle로 통일
    • 변수표기는 Camel 표기법 사용

    2. 커밋 컨벤션

    키워드 사용 시점
    feat 새로운 기능 추가
    fix 버그 수정
    docs 문서 수정
    style 세미콜론 누락 등 기능 수정이 없는 경우
    design 사용자 UI 디자인 변경 (CSS 등)
    test 테스트 코드, 리팩토링 테스트 코드 추가
    refactor 코드 리팩토링
    build 빌드 파일 수정
    setting 패키지 매니저 수정, 개발 환경 설정 등
    rename 파일 혹은 폴더명을 수정만 한 경우
    remove 파일을 삭제한 경우

    3. 브랜치 생성 컨벤션

    • 브랜치 생성전 issue를 생성하여 어떤 것에 대한 작업을 진행할 것인지 미리 작성
    • 브랜치 생성에 있어 네이밍을 단순화 및 획일화 하여 추적이 가능하다는 점에서 (커밋컨벤션 키워드)/issue_(이슈번호)로 브랜치 생성

(Top)

animaltalk's People

Contributors

greattitjy avatar inthyun avatar july249 avatar

Stargazers

 avatar  avatar  avatar

animaltalk's Issues

[issue] 전반적인 디자인 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • px 단위 전부 rem으로 변경
  • 로그인, 회원가입 페이지에 배경색 변경

🤔 구현방법 및 예상 동작

  • 모든 파일 확인하며 px을 rem으로 바꿉니다
  • 임시로 적용해놓았던 배경색들을 일괄적으로 바꿉니다

⭐ 특이사항

  • 디자인을 전부 일괄 수정하겠습니다.

[issue] Header 컴포넌트 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 페이지별로 들어가는 헤더 컴포넌트 생성

🤔 구현방법 및 예상 동작

  • share/HeaderBinder에 헤더 함수 4개를 구현하여 사용

⭐ 특이사항

  • 없음

[issue] 로그인 페이지 디자인 리펙토링 요청

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 로그인 페이지와 스프레쉬스크린 상의 이미지 높이가 다릅니다.
    image

  • 로그인 페이지의 article 디자인에 문제가 있습니다.
    image

🤔 구현방법 및 예상 동작

⭐ 특이사항

[issue] PostUpload 페이지 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • PostCreate 페이지 구현할 생각입니다.

🤔 구현방법 및 예상 동작

  • 텍스트와 사진을 입력받아 API로 데이터를 전송합니다.

⭐ 특이사항

  • 없습니다.

[issue] 중복 스타일 그룹화 및 변수화

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 중복되는 스타일을 그룹화하여 클래스명으로 일괄 적용 가능하도록 변경
  • 색코드, px 정보 등을 변수화

🤔 구현방법 및 예상 동작

  • style.js tailwind.config.js 및 필요시 추가 파일 생성

⭐ 특이사항

  • 스타일 유지보수를 향상시킬 수 있을 것으로 기대됩니다.

[issue] HeaderBind.jsx header 스타일 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • header 스타일 내 불필요한 스타일 속성을 제거
  • height를 강제한 스타일을 제거하여 콘텐츠로 높이 맞춤

🤔 구현방법 및 예상 동작

  • 중복 또는 불필요한 스타일을 제거하여 디자인의 유지보수성을 향상

⭐ 특이사항

[issue] axios 모듈 설치

👨‍💻 무엇을 하실 건지 설명해주세요!

  • api 통신을 위한 axios 모듈 설치

🤔 구현방법 및 예상 동작

⭐ 특이사항

[discussion] map을 돌 때 key 값으로 crypto.randomUUID()사용

🙋‍♂️ 논의할 사항에 대해 적어주세요~

  • map을 돌 때 key 값에 index밖에 넣을 게 없을 경우 브라우저에 내장된 기능인 crypto.randomUUID()를 사용해봐요~!

🙋‍♂️ 사전에 계획한 것들과 무엇이 다를까요?

  • map을 돌 때 index를 사용하는 것보다 안전해집니다.

🙋‍♂️ 제안하실 해결 방안이 있으실까요? 있다면 적어주세요~

🙋‍♂️ 답변

  • A의 답변:
  • B의 답변:

🙋‍♂️ 결론

[issue] fix: 레이아웃 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • index.css에 있는 text px로 다시 수정

🤔 구현방법 및 예상 동작

  • text 의 px을 rem으로 바꿨는데 다시 px로 수정

⭐ 특이사항

  • px을 rem으로 바꿔서 rem의 기준이 바뀌어버렸어요 그래서 레이아웃이 엉망이 되어버렸습니다.. 다행히 text만 px로 바꾸어주면 모두 정상적으로 돌아옵니다.

[issue] 스크롤바 숨김 모듈 설치

👨‍💻 무엇을 하실 건지 설명해주세요!

  • tailwind에서 제공하는 scrollbar-hide 모듈을 설치하여 Club 컴포넌트 스타일에 적용할 예정입니다.

🤔 구현방법 및 예상 동작

  • npm으로 devDependencies로 설치를 진행할 예정입니다.
  • 설치 후 해당 모듈에서 제공하는 클래스명으로 Club 컴포넌트에 적용할 예정입니다.

⭐ 특이사항

[issue] 로그인 화면 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 로그인 화면 구현

🤔 구현방법 및 예상 동작

  • 로그인 메인화면과 로그인을 하는 화면을 구현

⭐ 특이사항

  • 없습니다

[issue] 모달창 컴포넌트 생성

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 모달창 컴포넌트를 생성할 예정입니다

🤔 구현방법 및 예상 동작

  • 모달창을 구현합니다

⭐ 특이사항

  • 없음

[issue] footer와 header에 shrink추가

👨‍💻 무엇을 하실 건지 설명해주세요!

  • footer와 header에 shrink추가

🤔 구현방법 및 예상 동작

  • footer와 header의 크기가 줄어드는 것을 막기 위해 shrink를 추가합니다.

⭐ 특이사항

  • 없음

[issue] user profile 컴포넌트 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 페이지에서 공통으로 쓰이는 유저 프로필 컴포넌트를 구현할 생각입니다.

🤔 구현방법 및 예상 동작

  • 최총적으로 API와 props를 통해서 유저 정보를 전달받아 프로필을 반환합니다.
  • 팔로우, 사진, 유저 이름, 아이디, 채팅, 공유하기 등 기능이 요구됩니다.

⭐ 특이사항

  • 없습니다.

[issue] chat room 컴포넌트 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • chat room에 사용되는 대화창 컴포넌트를 구현할 생각입니다.

🤔 구현방법 및 예상 동작

  • yourChat 컴포넌트와 myChat 컴포넌트를 구현할 생각입니다.

⭐ 특이사항

  • 없습니다.

[issue] 모듈 조립, 앱 페이지 확인 및 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 각자 작업한 컴포넌트를 조립하여 페이지를 확인하고 수정하는 작업입니다.

🤔 구현방법 및 예상 동작

  • 페이지에 들어가는 컴포넌트들이 이상없이 작동되는지 확인합니다.

⭐ 특이사항

  • 페어 프로그래밍

[issue] Club 버튼 디자인 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • Club에서 버튼으로 슬라이드를 진행합니다.
  • 처음 시작시에는 왼쪽 버튼이 나타나지 않고, 오른쪽 버튼 클릭시에만 나타나게 구현
  • 마지막에는 오른쪽 버튼이 나타나지 않고, 왼쪽 버튼만 나타나게 구현

🤔 구현방법 및 예상 동작

⭐ 특이사항

[issue] Club 컴포넌트 디자인

👨‍💻 무엇을 하실 건지 설명해주세요!

  • Club 컴포넌트 디자인을 구현합니다.

🤔 구현방법 및 예상 동작

  • UserProfile 바로 밑으로 들어갑니다.
  • 스크롤바는 존재하지 않도록 합니다.
  • 해당 영역 안에서 스크롤을 하면 좌우 리스트가 이동합니다.

⭐ 특이사항

  • Club 컴포넌트 디자인 작업이 완료된 이후 UserProfile, Post 컴포넌트와 함께 MyProfile에서 제대로 디자인이 적용되는지 확인하는 작업이 필요합니다.

  • 상하 스크롤을 좌우 스크롤로 변환하는 기능 구현을 진행하지 않았습니다.

  • 그 이유는 UX적으로 사용자의 웹 문서 스크롤링에 방해를 줄 수 있기 때문입니다.

  • 모바일 사용자는 좌우 터치무브를 통해 스크롤링을 할 수 있음을 확인하였습니다. (개발자 도구에서 확인함)

  • 따라서 웹 사용자에게는 스크롤 버튼을 통해 li 요소를 확인하는 경험을 제공하고

  • 모바일 사용자에게는 스크롤 버튼을 제공하지 않고 좌우 터치 무브로 확인하는 경험을 제공하는 것으로 정했습니다.

[issue] SimpleUserList 컴포넌트 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 검색이나 채팅 시 유저 정보를 불러올 때 사용하는 공유 컴포넌트입니다.

🤔 구현방법 및 예상 동작

  • props나 상태관리 툴로 유저 정보를 받아서 리스트를 뿌려줍니다.

⭐ 특이사항

  • 없음

[issue] Prettier 설정 확인

👨‍💻 무엇을 하실 건지 설명해주세요!

  • Prettier 설정 확인

🤔 구현방법 및 예상 동작

  • 모두 동일하게 Prettier 설정이 적용이 되는지

⭐ 특이사항

  • 없습니다

[issue] post 컴포넌트 리팩토링

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 하트와 채팅에 클릭 이벤트 활성화 (API 연결 x)
  • div 태그 리팩토링 (시맨틱하게)

🤔 구현방법 및 예상 동작

  • 기능적인 측먄은 버튼에 이벤트가 추가됩니다.
  • 코드의 가독성이 좋아집니다.

⭐ 특이사항

  • 없습니다.

[issue] 404 페이지 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 404 페이지를 구현합니다.

🤔 구현방법 및 예상 동작

  • 404페이지 구현

⭐ 특이사항

  • 없음

[issue] 모달창 디자인 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 모달창 디자인 수정

🤔 구현방법 및 예상 동작

  • 모달창의 색깔을 figma대로 적용한 뒤 box-shadow적용

⭐ 특이사항

  • 없음

[issue] Splash Screen 메인화면 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • Splash Screen 구현

🤔 구현방법 및 예상 동작

  • Splash Screen 메인화면 구현

⭐ 특이사항

  • 없음

[discussion] 페이지 레이아웃 결정

🙋‍♂️ 논의할 사항에 대해 적어주세요~

  • 페이지 레이아웃에 대해 논의해봐요~

🙋‍♂️ 사전에 계획한 것들과 무엇이 다를까요?

  • 페이지 레이아웃 초안입니다.

🙋‍♂️ 제안하실 해결 방안이 있으실까요? 있다면 적어주세요~

  • 페이지에 flex를 사용해서 자식요소로 header main footer를 가져가면 좋을 거 같아요~
import React from "react";
import Footer from "../../share/Footer";
const Chat = () => {
  const ts = true;
  return (
    <div className="bg-gray-100">
      <div className="page flex flex-col justify-between">
        <header className="h-[48px] bg-green-300">헤더가 들어갑니다.</header>
        <main className="bg-cyan-300 basis-full">
          <button className={`btn-xl ${ts ? "bg-[#EDA751]" : "bg-[#FCD690]"}`}>
            Chat 나와라
          </button>
          <button className="btn-lg bg-[#EDA751]">팔로우</button>
          <button className="btn-md bg-[#EDA751]">저장</button>
          <button className="btn-sm bg-[#EDA751]">팔로우</button>
        </main>
        <Footer />
      </div>
    </div>
  );
};

export default Chat;

🙋‍♂️ 답변

  • A의 답변:
  • B의 답변:

🙋‍♂️ 결론

[issue] 폴더 구조화 재편성 및 Router 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 폴더 구조화 진행
  • Router 구조를 App.jsx 파일에 구현

🤔 구현방법 및 예상 동작

⭐ 특이사항

  • README.md에 폴더 구조화 결과물 추가

[discussion] 폴더 구조트리 간편화

🙋‍♂️ 논의할 사항에 대해 적어주세요~

  • 파일들이 늘어남에 따라 폴더가 한 눈에 들어오기 어려운 거 같습니다.
  • 이제 header, main, footer, chat, post, login 등 카테고리가 생긴 거 같은데 묶어서 관리하는 건 어떨까요?

🙋‍♂️ 사전에 계획한 것들과 무엇이 다를까요?

  • 관련된 폴더들을 한 곳에 묶음으로써 가독성과 편리성이 증가합니다.

🙋‍♂️ 제안하실 해결 방안이 있으실까요? 있다면 적어주세요~

  • 대안들
  1. components에 들어가는 요소들은 CategoriModule 폴더를 만들어 관리 (LoginModule, PostModule 등)
    image

  2. pages에 들어가는 요소들은 Chat, Home, Login, Post 등처럼 대표 url을 따라가고 관련 카테고리는 하위 폴더로 정리
    image

  3. share에 들어가는 요소들은 CategoriShare 폴더를 만들어 관리 (ProfileShare, HeaderShare 등)
    image

  • Module, url, Share로 나눈 이유는 파일이나 폴더명이 겹치는 걸 방지하고 이름으로 구분짓기 용이할 거 같아서 나눴습니다.

🙋‍♂️ 답변

  • A의 답변:
  • B의 답변:

🙋‍♂️ 결론

[issue] HeaderSave 컴포넌트 수정 (PostUpload, ClubUpload 컴포넌트)

👨‍💻 무엇을 하실 건지 설명해주세요!

  • HeaderSave에 사용되는 버튼 활성화 정보와 텍스트를 props로 전달받게 만들 생각입니다.

🤔 구현방법 및 예상 동작

  • HeaderSave를 호출 할 때 데이터를 전달하여 화면에 렌더링합니다.

⭐ 특이사항

  • 없습니다.

[issue] Post.jsx 머지 충돌 이슈 복원

👨‍💻 무엇을 하실 건지 설명해주세요!

  • #106 머지 과정에서 충돌 이슈가 발생하였습니다.
  • 충돌된 파일은 Post.jsx 입니다.
  • 이를 해결하기 위해 9d3fd07 커밋을 진행하여 develop 브랜치 기준으로 되돌렸습니다.
  • 이로 인해 누락된 Post.jsx 코드가 존재하여 이를 복원하기 위해 다시 PR을 진행합니다.

🤔 구현방법 및 예상 동작

⭐ 특이사항

[issue] 공통 스타일 작업

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 공통 style css 작업

🤔 구현방법 및 예상 동작

-공통으로 사용되는 부분을 미리 만들어 업무 효율 증가 예상

  • style.js 혹은 index.css에서 구현 예정

⭐ 특이사항

  • 없음

[issue] SimpleClub 컴포넌트 생성 및 Club 컴포넌트 import 작업

👨‍💻 무엇을 하실 건지 설명해주세요!

  • SimpleClub 컴포넌트 생성 및 Club 컴포넌트 import 작업

🤔 구현방법 및 예상 동작

  • Club 컴포넌트 내부 콘텐츠인 li 요소를 별도의 컴포넌트로 분리
  • 분리된 컴포넌트인 SimpleClub 컴포넌트를 Club 컴포넌트에 import
  • data를 배열로 받아왔을 경우를 가정하여 Club에 fake 데이터 배열 생성
  • 해당 데이터의 갯수만큼 SimpleClub 컴포넌트를 생산 (map 메서드 사용)

⭐ 특이사항

[issue] profile 앨범형 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • profile 앨범형 디자인 및 동작 구현

🤔 구현방법 및 예상 동작

  • fake 데이터를 명세서를 기반으로 제작합니다.
  • fake 데이터에 있는 이미지를 기반으로 앨범형을 구현합니다.
  • post 나열 방식과 앨범형 간의 상호 이동 기능 구현은 나중에 구현합니다.
  • 이미지를 클릭하면 모달창이 나타나면서 전체 화면에서 이미지의 원본 비율에 맞추어 나타나게 합니다.
  • 모달창의 X 버튼을 클릭하면 모달창이 사라지게 합니다.
  • 여러 이미지가 있는 경우 클릭 이벤트가 발생하면 우측으로 이미지가 나열되도록 합니다.

⭐ 특이사항

[issue] SignUp 페이지 생성

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 회원가입하는 페이지를 생성할 계획입니다

🤔 구현방법 및 예상 동작

  • 회원가입 페이지가 따로 있어 만들 예정입니다

⭐ 특이사항

  • 컴포넌트로 만들어둬서 props만 수정하면 될 것 같습니다.

[issue] 함수 포맷 변경

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 함수 포맷 변경입니다.
  • 스니펫은 rafce입니다.

🤔 구현방법 및 예상 동작

  • 변경 전
import React from "react";

export const Chat = () => {
  return <div className="text-red-400">Chat 나와라</div>;
};
  • 변경 후
import React from "react";

const Chat = () => {
  return <div className="text-red-400">Chat 나와라</div>;
};

export default Chat;

⭐ 특이사항

  • 없음

[issue] Footer 컴포넌트 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • 페이지 하단의 메뉴바를 컴포넌트로 만들기

🤔 구현방법 및 예상 동작

  • 클릭 시 해당 페이지 렌더링

⭐ 특이사항

  • 유저 정보 확인 필요

[issue] share에 있는 Profilesettion 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • share에 있는 Profilesettion 파일 수정 할 예정입니다

🤔 구현방법 및 예상 동작

  • 프로필 설정 컴포넌트 구현

⭐ 특이사항

  • 없음

[issue] Post 컴포넌트에 이미지 캐러셀 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • Post 컴포넌트에 이미지 캐러셀을 구현할 생각입니다.

🤔 구현방법 및 예상 동작

  • 이미지 하단의 버튼 클릭 시 이미지 슬라이드가 작동합니다.

⭐ 특이사항

  • 없습니다.

[issue] index.css 기본 레이아웃 스타일 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • index.css 기본 레이아웃 스타일 수정 작업 진행
  • page 전체 레이아웃 -> h-screen
  • main 레이아웃 -> basis-full
  • main 내부 콘텐츠 -> 필요에 따라 mb-auto
  • 브라우저 기본 텍스트 크기 10px 설정 (rem 단위로의 리펙토링을 위한 설정)
  • .root 에 bg-gray-100 스타일 지정 (콘텐츠 전반의 레이아웃을 구분하기 위함)

🤔 구현방법 및 예상 동작

⭐ 특이사항

[issue] Tailwind 환경 설정

👨‍💻 무엇을 하실 건지 설명해주세요!

-Tailwind 환경 설정

🤔 구현방법 및 예상 동작

  • styled components 대신 Tailwind를 통한 css 설정

⭐ 특이사항

  • 없음

[issue] 회원가입 기능 구현

👨‍💻 무엇을 하실 건지 설명해주세요!

  • axios로 통신하여 회원가입 기능을 구현합니다.

🤔 구현방법 및 예상 동작

  • 가입된 메일주소라면 가입이 되지 않게하고 가입된 메일 주소가 아니라면 가입이 되게 합니다.

⭐ 특이사항

  • 없음

[issue] post share 컴포넌트 생성 및 디자인

👨‍💻 무엇을 하실 건지 설명해주세요!

  • home에서 사용될 피드 컴포넌트를 생성

🤔 구현방법 및 예상 동작

  • 콘텐츠(글 및 사진), 좋아요, 댓글 등의 전반적인 디자인 작업 수행

⭐ 특이사항

[issue] postcss.config.js 에러 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • postcss.config.js 설정을 초기로 복원하여 에러를 수정합니다.

🤔 구현방법 및 예상 동작

  • localhost에서의 정상적인 react 구동

⭐ 특이사항

  • 아래의 에러를 해결하기 위함입니다.
    image

[issue] LoginBtn.jsx 에서 변수를 읽지못하는 버그 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • LoginBtn.jsx 에서 변수를 읽지못하는 버그 수정

🤔 구현방법 및 예상 동작

  • 버그를 수정 할 예정입니다.

⭐ 특이사항

  • tailwind의 특성으로 인해 border-[ ] 배열의 안에 직접적으로 변수를 넣어주니 색을 인식하지 못하는 버그가 발견되었습니다

[issue] fix: App.jsx의 SinpUp 파일 경로 수정

👨‍💻 무엇을 하실 건지 설명해주세요!

  • App.jsx의 SinpUp 파일 경로가 잘못되어 오류가 납니다. 수정하겠습니다.

🤔 구현방법 및 예상 동작

  • 오류가 해결됩니다.

⭐ 특이사항

  • 없습니다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.