Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[team-12] Eamon & Autumn 3주차 PR #47

Open
wants to merge 42 commits into
base: team-12
Choose a base branch
from

Conversation

deprecated-hongbiii
Copy link

1. 진행상황

로그인

  • github OAuth 를 이용해서 code 를 백엔드 서버에 보내주고 JWT 인증 토큰을 받아오기
  • JWT 토큰을 디코딩 하여 로그인한 사용자의 정보로 profile img 를 바꿔서 headr 에 렌더링 해주기
  • 모든 api 요청의 header 에 token 을 넣어서 요청.
  • 로그 아웃 구현
  • 모든 페이지에서 로그 아웃 시 로그인 페이지로 리다이렉트

이슈 목록 페이지

  • Tab UI를 이용하여 열린이슈/닫힌이슈 조회
  • 조건별 검색

이슈 생성 페이지

  • 이슈 생성 - 담당자, 라벨, 마일스톤 지정 가능
  • 파일 첨부
  • 마크다운 입력

이슈 상세 페이지

  • 코멘트 생성
  • 라벨 수정
  • 마일스톤 수정
  • 코멘트 수정
  • 코멘트 삭제
  • 이모지 리액션
  • 파일 첨부
  • 이슈 닫기 / 다시 열기
  • 이슈 삭제

라벨 목록 페이지

  • 라벨 생성
  • 라벨 수정
  • 라벨 삭제

마일스톤 목록 페이지

  • 마일스톤 생성
  • 마일스톤 수정
  • 마일스톤 삭제

2. 고민한 내용

여러가지 방식의 비동기 API 요청 방법

  1. useAxios 와 같은 custom Hook 사용
  2. Recoil selector 를 이용한 비동기 요청
  3. axios 의 Interceptor 를 이용한 비동기요청

세 가지 방법을 모두 사용해보았습니다.

에러처리

(현재 방식)
store.ts에서 get 요청이 발생하는 selector에 try & catch 처리를 해주었다.

(개선 방식)
비동기가 일어나는 로직에서는 에러를 throw 만해주고 그 데이터를 가지고 렌더하는 컴포넌트에서는 error 를 catch 해서 에러 발생시에 적절한 다른 컴포넌트를 렌더링한다.

Recoil 의 적절한 사용방법

  1. Recoil selector 에서 비동기 요청이 pending 상태일때 Suspense 에 fallback 에 저장되어있는 컴포넌트가 렌더링된다.
    👉 이 현상때문에 비동기 요청을 다시 보낼 때 화면이 깜빡임. (예시 상황 - 라벨 목록 페이지에서 라벨 생성/편집/삭제 후 get 요청을 받아서 다시 렌더링 할 때)
    (해결책) useRecoilValueLoadable 훅을 사용하자.

  2. selector 함수는 순수함수이기 때문에 구독하는 atom 의 값이 같으면 이전 값을 return 한다.

  • 요청을 다시 trigger 하기 위해서 true/ false 값을 가진 atom 을 만들고 요청을 다시 보낼때마다 그 값을 바꿔 줬는데 이전 값이 다시 나왔다.
  • (해결 방법) trigger atom을 boolean이 아닌, 요청이 필요할 때마다 숫자를 +1 해주는 방법으로 해결

3. 데모 영상

이슈트래커 데모


4. 느낀점

Autumn

  • [에러 처리] 이번 프로젝트에서는 서버와 통신이 많다 보니 특히나 에러 처리의 중요성을 많이 느꼈습니다. 에러처리를 해놓지 않았더니, 개발 단계에서 API나 서버에 문제가 있을 때 화면이 아예 안 나오는 문제를 겪었습니다. 프론트 단의 에러 처리 뿐 아니라 서버 쪽에서도 에러 처리를 잘 해주어야 http 통신 과정에서 디버깅 시간을 줄일 수 있겠다는 생각을 했습니다.
  • [협업] 로직, 설계 과정을 함께 진행하면서 서로 제안과 질문을 많이 했습니다. 이전에는 팀원을 따라가기 바빴는데 저의 보폭에 맞춰준 이어몬 덕분에 함께 프로젝트를 재미있게 할 수 있었습니다. 백엔드와의 협업에 있어서는 많이 개선을 해야겠다는 생각을 했습니다. API 요청사항이나 변경사항이 있을 때 슬랙 채팅 말고 체계적인 관리 툴이 있으면 작업이 편리할 것 같았어요.
  • [상태 관리] 이번에 recoil을 처음 사용해봤는데 모든 컴포넌트에서 recoil 상태에 접근할 수 있는 점이 편리했습니다. 상태 뿐 아니라 에러 처리, 비동기 처리 등등 다양한 부분을 지원해줘서 좋은 라이브러리라고 느꼈습니다. 프로젝트를 하며 경험해 본 props drilling, Context API, recoil의 장단점을 비교하고 블로그에 정리해보는 시간을 가져야겠습니다.

Eamon
'서로 질문하며 성장하는 협업'이 무엇인지 알았던 3주였습니다. 마지막 미션이여서 그런지 치밀한 설계 계획 이나 팀원의 협업룰을 정하는 것보다도 서로 '그냥 알고지나가는 것들'을 되묻고 같이 공부하는 시간이라서 값진 시간이였습니다.

http 통신과 백엔드와의 디버깅에서 크롬의 네트워크 개발자 탭과 더 친해진 느낌이 있었지만 백엔드와 프론트엔드 모두 에러처리를 치밀하지 않게 해놓아서 개발자 탭으로 하는 디버깅이 무용지물이고 답답함을 느꼈습니다. 그렇기 때문에 효율적인 디버깅을 위해서는 프론트와 백엔드 모두 에러처리를 해야한 다는 점을 느꼈습니다.

deprecated-hongbiii and others added 30 commits June 15, 2021 16:38
- recoil의 selector를 사용해서 하는 중
- 담당자, 작성자 조회 쪽 API에 문제가 있어 주석처리 해둠
- 로딩 처리 및 데이터 업데이트에 관해서 고민 더 필요
* [#31]commentTextarea생성 & useAxios 수정 $ utils/url 생성

* [#31]Style: newStyle Right 와 완료 버튼 생성

* [#42]Style: MilestonePage 구성

* [#42]Stlye: milestonePage UI 완성
* [#40] Feat: 이슈 상세 페이지 헤더 ui

- 상태를 사용하지 않고 하드코딩된 상태
- 일부 컴포넌트는 open/close 여부에 따라 다르게 렌더링되도록 했음

* [#40] Feat: Comment 컴포넌트 생성

* [#40] Feat: 이슈 상세 페이지 body 왼쪽 부분 ui 작업
- 사이드바 컴포넌트(현재 이름 NewIssueRight)는 재사용을 위해 수정이 필요해서 일단 비워놨음
* [#42]Feat: 버튼을 이용해서 router 링크 이동 가능하게 설정함

* [#42]Refactor: router 분리와 header 컴포넌트 고정

* [#42]Refactor: loginPage \

* [#42]Style: loginPage
* [#50] Chore: store.ts에 주석 처리해뒀던 get요청 부활

- 배열로 응답하도록 API가 수정됐기 때문에 비로소 부활시킬 수 있었다..
- text_color 속성이 추가됐고 label title과 description을 구분하여 저장

* [#50] Chore: 사용하지 않는 import 제거

* [#50] Refactor: LabelPage recoil value 사용해서 화면 렌더링

- 수정 과정에서 LabelItemType 정의가 필요해서 store.ts에 타입 정의함
- 추후 타입들만 따로 모아놓도록 리팩토링 해야할 듯...

* [#50] Style: 라벨 목록 페이지 css 살짝 손봄
- 코드 리뷰 중 mock 데이터 부분과 useAxios는 제외
- recoil selector에서 선언해둔 타입과 mock 배열로 렌더링하느라 선언한 타입의 속성 이름이
서로 달라서 고치다보니 답이 없어서 일단 이슈 목록 페이지 부분의 배열데이터를 주석처리함
* [#73] Fix: 로그인 버튼의 href url 수정

- 로그인 부분은 MJ네 팀과 같은 API 사용하기로 해서 수정

* [#73] Fix: jwt 토큰 담아서 요청 보내기, GET요청 에러처리

- 일단 try ~ catch 로 잡기만 함
- 화면 나온다!!!!!!!!!!! ㅠㅠ
* [#50] Feat: 이슈 목록페이지 select 완료 & issuesStateAtom 을 이용하여 open close 요청

* [#50] Feat: totalCountOfIssue 에서 api 로 전체 오픈 클로즈 갯수 요청보냄
* [#50] Add: 마일스톤 페이지 서버로부터 받은 데이터로 렌더링하기 위한 상태 생성

- 코드가 너무 중복이지만 일단 closed 여부에 따른 요청 나눠서 마일스톤 selector 만듦
- 마일스톤 관련 selector를 stores/milestoneStore.ts 로 분리

* [#50] Feat: 열린 마일스톤, 닫힌 마일스톤 버튼 클릭에 따라 렌더링

- 중복 코드 매우 많음
- 어떤 탭이 클릭됐는지 상태 관리하기 위해 Milestones.tsx 에 isOpenedMilestoneTab라는 상태를 만들어서 해결
- 하지만 atom을 사용하여 selector가 해당 atom을 구독하게 하면 더 깔끔해질 듯 (리팩토링 예정)
- Route의 순서를 약간 바꿨음
- API에 수정할 사항이 있어서 아직 서버에서 받은 데이터로 렌더링은 못 한 상태
* [#94] Fix: try~catch 에러 처리 추가

- jwt 디코딩 하려던 도중에 서버가 터져서 급하게 에러 처리 추가함

* [#52] Refactor: 라우터 리팩토링

- Switch를 하나 더 만들어서 Header 컴포넌트 처리

* [#51][#75] Feat: 로고 클릭 시 IssuesPage로 라우팅, IssuesPage 로그인 여부 체크

- 일단은 IssuesPage에만 로그인 체크하는 로직을 넣어놨음
- 추후 모든 페이지에서 로그인 체크해야 할 듯
- 중복되기 때문에 커스텀 훅 등으로 리팩토링 예정
* [#79] 라벨 수정 컴포넌트 UI 생성

* [#79]Style: 라벨 수정 컴포넌트 작성
* [#79]Style: 마일스톤 수정 컴포넌트 완성

* [#79] Refactor: 오타수정
* [#103]Feat: 수정요청을 위한 state 프론트에서 저장

* [#105]delete 요청 보낸 후 get 요청 보내고 다시 렌더링하기

* [#103]Feat: label 편집 완료버튼 누를시 수정요청보내기
* [#108]마일스톤 수정요청 보내기

* [#105]마일스톤 삭제요청 보내기
* [#82] Feat: 이슈 상세 페이지 헤더 부분 서버 데이터로 렌더링

- IssueDetailHeader에서 디스트럭쳐링 하고 싶었는데 타입 에러 때문에 못 함

* [#82] Feat: 이슈 상세페이지 본문, 코멘트 서버에서 받은 데이터로 렌더링

* [#82] Feat: 이슈 작성자 === 댓글 작성자 일 때 '작성자' 라벨 붙여주는 로직 추가

* [#82] Feat: 이슈 작성자 === 댓글 작성자 일 때 '작성자' 라벨 붙여주는 로직 추가

- Comment 컴포넌트에서 바로 issue author id를 알 수 없어서 atom을 새로 만듦
- issueDetailQuery 요청에서 /api/issues/null 로 요청하게 되는 에러가 있음

* [#82] Fix: clickedIssueId의 초기값 null이 요청 url에 들어가서 생기는 에러 해결

- null일 경우 early return하게 해서 해결했다.

* [#82] Feat: 이슈 상세 페이지 로그인 유저 === 코멘트 작성자 이면 편집 버튼 노출

* [#82] Feat: 코멘트 작성 부분에 loginUser 정보를 바탕으로 아바타 렌더링

- Avatar에 더이상 name 속성이 필요 없어서 삭제
* [#83] style: 새로운 라벨 추가 UI 컴포넌트 생성

* [#83]Feat: 새로운 라벨 생성하기
* [#111] Feat: 코멘트 작성란에 파일첨부 ui 추가

* [#111] 코멘트 작성 버튼 ui 생성

* [#52][#82] Refactor: 이슈 상세 페이지 관련 store 파일 분리

* [#111] Chore: CommentTextarea를 공통 컴포넌트로 사용하기 위한 작업

- 이슈 생성, 코멘트 생성, 코멘트 편집에서 공통으로 사용되기 때문에 각각의 atom을 만들어서
  각각의 CommentTextarea의 부모 컴포넌트에서 setAtom을 props로 내려줌

* [#82] Feat: 코멘트 작성 기능

- post 요청에서 다양한 에러 나는 중... 404, 415, 500
* [#118] Fix: 코멘트에 작성자 프로필 사진이 안 나오는 문제 해결

* [#93] Fix: 라벨이 없을 때 0이라고 표시되는 문제 해결
* Feat: 사이드바 상태관리

* [#81] 사이드바 클릭시 상태값 저장

* [#81] 사이드바 클릭시 상태값 보여줌

* [#81] Feat: input 입력시 newIssuesContentAtom 상태에 저장

* [#81] Feat: instanceWithAuth 를 이용한 이슈 생성 요청

* [#81] Fix: 이슈생성 요청 에러 fix
wade3420 and others added 10 commits June 30, 2021 13:04
* Refactor: 리다이렉트 url env 로 변경

* Feat:logOut 기능 구현
* [#111] Feat: 코멘트 생성 시 새로고침 안 해도 화면에 렌더링 되도록 atom 추가

* [#126] Feat: login user id와 comment author id 비교해서 삭제 버튼 렌더링

* [#126] Feat: 코멘트 삭제 기능 구현
* [#131]Feat: headerParser&emphasisParser

* chore: markdown preview 제거
* [#126] Feat: 코멘트 편집 버튼 클릭 시 input창 렌더링

* [#126] Feat: 코멘트 수정 기능 추가 (다시 get요청 받아 화면 업데이트 필요)

* [#126] Feat: 코멘트 편집 후 새로 get 요청 보내서 화면 업데이트
- 사이드바 컴포넌트를 재사용하기 위해 이슈 생성 페이지에서 상태를 reset 하는 로직을 만듦
* [#82] Feat: 이슈 닫기 기능

- 이슈 상세, 이슈 목록에는 닫힌 이슈가 바로 반영되게 했으나 열린이슈 닫힌이슈 카운트 부분은
아직 해결을 못 함

* [#82] Feat: 이슈 다시 열기 기능 추가
- 삭제는 잘 되지만 열린이슈/닫힌이슈 카운트가 업데이트 안 됨
* [#82]Fix: 디테일 페이지에서 새로고침시 에러

* [#82]Feat: 디테일 페이지 라우팅시 라벨 마일스톤 담당자 렌더링

* Feat:[#81] 수정요청진행중
* [#140] Fix: 열린이슈, 닫힌이슈 카운트 업데이트 되도록 수정

- 이슈 삭제, 이슈 닫기, 다시 열기 시 카운트도 업데이트 되도록 수정
- 프론트에서의 버그는 해결했으나 서버에서 버그가 있어서 제대로 카운트가 안 되고 있음

* [#140] Fix: 로그인 중 화면에 회색 박스 보이는 버그 해결

* [#140] Fix: console.log 삭제 & 이슈 작성 페이지에 유저 프로필 사진 나오도록 수정

* [#116] Fix: 마일스톤 달성률 NaN으로 표시되는 문제, 달성률 소수점 아래 두자리까지 표시
* [#142] Style: 로그아웃 버튼 스타일링

* [#142] 이슈 목록의 헤더 필터 담당자, 레이블, 마일스톤, 작성자로 변경
janeljs pushed a commit that referenced this pull request Jul 13, 2021
janeljs pushed a commit that referenced this pull request Jul 13, 2021
janeljs pushed a commit that referenced this pull request Jul 13, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants