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

[우연서]w5_리뷰요청_실시간 새 글 등록 알람 #150

Closed
wants to merge 1 commit into from

Conversation

WooYeonSeo
Copy link
Contributor

5주차 리뷰 요청드립니다!
작업한 부분과 관련있는 컴포넌트와, 서버 api 쪽 파일을 같이 묶어서 올렸습니다.
작업의 히스토리는 #140 로 묶어서 정리해 두었습니다.

작업한 부분

  • 실시간 새글등록
    • 새 글 등록시 다른 사용자 피드에 보여짐
    • 다른 사용자가 스크롤을 하단으로 내려서 보고있었다면 상단에 새로운 피드 등록알림이 뜸
      (ex : 새 게시글 n 개)
    • 피드알림을 누르면 상단으로 스크롤 되면서 올라가며 스크롤 된 다음에는 알림이 사라짐

작업이유

실시간 새 글 등록은 pubsub을 이용해서 구현하였습니다.
apollo client의 hook을 사용하다보니 쿼리를 요청한 부분과 새로 알림을 받는 데이터를 병합해야 했습니다. 그래서 저번주에는 쿼리로 요청받은 데이터를 state로 다시 저장해서 사용하는 방식을 사용하였습니다.
하지만 apollo client의 기능 중 publish 된 데이터를 받을 때 state를 합칠 수 있게 제공하는 기능이 있어서(subscriptomore) 해당 기능을 사용해서 피드 데이터를 합치는 작업을 진행하였습니다.

리뷰 요청드리는 부분

  • 2019-17/client/src/composition/Feed/index.tsx 19-166
  • 2019-17/client/src/composition/Feed/NewFeedAlarm.tsx 24-35
  • 2019-17/server/src/api/feed/feed.resolvers.ts 1-203

@WooYeonSeo WooYeonSeo changed the title [review]우연서 [박상은]w5_리뷰요청_실시간 새 글 등록 알람 Dec 6, 2019
@WooYeonSeo WooYeonSeo changed the title [박상은]w5_리뷰요청_실시간 새 글 등록 알람 [우연서]w5_리뷰요청_실시간 새 글 등록 알람 Dec 6, 2019
};

async function feedAlarmOn() {
if (feedAlarm > ALARM_LIMIT) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

feedAlarm이 0개 이상일 경우에만 해당되는 분기라면,
ALARM_LIMIT보다 클때를 체크하기보다는 feedAlarm 존재여부를 체크한다는 의도를 드러내는 것도 괜찮을 것 같습니다.
ALARM_LIMIT은 특정한 제한이 있고 숫자가 조절가능하다는 의미로 보여졌어요~

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 맞습니다. 지금은 친구인 관계가 많지 않아서 하나라도 새로운 글이 뜨면 알림으로 주고 있는데, 친구의 관계가 많아지면 해당 limit을 올릴 예정입니다

!fetchMoreResult.feeds ||
!fetchMoreResult.feeds.feedItems ||
!prev.feeds ||
!prev.feeds.feedItems

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

어떤 상태를 나타내는 건지 따로 변수로 분리하여 의도를 노출하면 더 좋을 거 같아요.
예를들면 이런식으로..

const hasNoResult = ...
const hasNoPrevFeed = ...
if (hasNoResult || hasNoPrevFeed) {
  return prev;
}

return prev;
}

if (!fetchMoreResult.feeds.feedItems.length) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분은 바로 윗 분기와 합칠 수 있을 것 같아 보이는데 맞나요?

return subscribeToMore({
document: FEEDS_SUBSCRIPTION,
variables: {
userEmail: myInfo && myInfo.me && myInfo.me.email ? myInfo.me.email : ''

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[참고] 기존에는 객체 속성에 접근할 때 이런 코드를 불가피하게 많이 사용할 수밖에 없어서
좀 더 간결한 코드를 위해 옵셔널 체이닝이라는 스펙(https://github.com/tc39/proposal-optional-chaining/) 이 논의중이었는데요.

최근에 stage 4로 올라갔다고 하네요 :) (tc39/ecma262#1646)
요런식으로 쓸 수 있게 되겠네요.

{ userEmail: myInfo?.me?.email ? myInfo.me.email : '' }

적용보다는 알고 계시면 좋을 거 같아서 멘트드립니다 :)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

{ userEmail: myInfo?.me?.email ?? '' }

tc39/ecma262#1644

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앗 그렇네요! 훨씬 간결해지고 좋은 것 같습니다. 감사합니다

key={getDate(feed.feed.createdAt).toISOString()}
content={feed.feed.content}
feedinfo={feed}
createdAt={getDate(feed.feed.createdAt).toISOString()}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

feed.feed가 반복되는 것이 가독성이 떨어져 보이기도 합니다. 비슷한 패턴이 다른 부분에도 종종 보이는데 개선해봐도 좋겠네요~

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 반복되는 부분은 구조분해나 변수를 지정해서 받는 방법으로 가독성 개선을 해보겠습니다 감사합니다

MutationWriteCommentArgs
} from '../../types';

const DEFAUT_MAX_DATE = '9999-12-31T09:29:26.050Z';

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DEFAUT -> DEFAULT 인가요? ^^

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앗 감사합니다 수정하겠습니다

const { filename, createReadStream } = file;
filePromises.push(uploadToObjStorage(createReadStream(), filename));
}
const fileLocations = await Promise.all(filePromises);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for-await-of와 Promise.all를 잘 활용하셨네요👍

return pubsub.asyncIterator(NEW_FEED);
},
async (payload, _, context) => {
const myEmail = context.email;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 프로젝트에서 UUID가 email로 정해진 건가요?
맞다면 유저 정보로써의 email과 UUID로서의 email이 동일하게 쓰이고 있는건지 궁금하고
만약 프로그램 요구사항이 바뀌어서 다른 형식의 UUID로 대체된다고 할때 유연하게 대응가능한가도 궁금합니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네 사용자 이메일을 고유값으로 사용하기로 했습니다. 말씀하신 것처럼 다른 형식의 key로 변경된다면 어떻게 처리될지에 대한 부분도 고려해보겠습니다.

@WooYeonSeo WooYeonSeo closed this Dec 12, 2019
@WooYeonSeo WooYeonSeo deleted the yeonseo branch December 12, 2019 15:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants