wafflestudio / seminar-2021

2021 Rookies 세미나
47 stars 110 forks source link

리액트 세미나 2 과제 공통 피드백 #531

Closed woohm402 closed 3 years ago

woohm402 commented 3 years ago

리액트 세미나 2 과제 공통 피드백

나름 세미나 1 과제보다는 쉽게 냈지만, 그래도 안 알려드린 부분이 많아 걱정하고 있었는데 다들 잘 해 주셔서 만족?스러웠던 과제였습니다! 배포 부분도 분명 처음 해 본다면 상당히 부담되는 내용인데, 잘 해결해주신 것 같습니다. 수고하셨어요!

공통 피드백 시작하겠습니다.








Context API의 사용

수업 시간에 설명드렸듯이 Context API는 Props Drilling을 하지 않아도 되게 해 주는 역할 딱 하나를 담당합니다. 또한 이를 응용한 Context best practice 코드는 데이터를 앱 전체에서 전역으로 사용할 수 있도록 도와줍니다. 따라서 불필요하고 더럽게 props를 넘기는 상황을 방지할 수 있습니다.

하지만 당연히 전역 데이터라는 것은 아주 조심스럽게 사용해야 합니다.

추가로, Context를 목적과 제공하는 값에 따라 잘 분류해야 합니다. 가령 학생 목록을 제공하는 Provider에 로그인 정보가 들어있는 것은 좋지 않습니다. 로그인 정보는 따로 AuthContext라든가 그런 곳에 있는 게 옳습니다. 물론 기능이나 성능상 차이는 없으나, 코드를 의미에 맞게 잘 분리하는 건 중요합니다. 한국말을 할 때 "나는 집에서 딸기를 먹고 학교에서 바나나를 먹었어"라고 하는 것과 "나는 딸기와 바나나를 집과 학교에서 각각 먹었어"라고 하는 것 중 전자가 훨씬 이해가 잘 됩니다. 이것과 유사한 이유라고 생각해주시면 됩니다.


제가 이 과제를 혼자 구현해봤을 때는 아래와 같이 디자인했습니다.

이외의 모든 상태를 각 컴포넌트의 state에 적합하게 집어넣어 구현하였습니다. 여담으로 당연히 과제 3도 미리 구현해 봤는데, 이때는 어차피 학생 추가나 삭제 등의 로직을 서버가 모두 담당하기 때문에 StudentDataContext가 딱히 필요가 없어졌습니다. 그래서 저는 로그인 정보 (AuthContext) 하나만 Context로 관리했습니다. 로그인 정보가 바뀌는 건 자주 있는 일도 아니고, 그 경우 앱 전체가 리렌더되는 건 너무 당연하니까요!

여기까지 읽으면 다음과 같은 의문이 들 수 있습니다.

그러면 Context는 거의 쓸 일 없겠네요?

뭐 일단 제 취향은 그렇습니다. 제가 개인적으로 / 회사에서 / 팀에서 프로젝트를 진행할 때 전역으로 저장하는 값은 대부분의 상황에서 로그인 정보 하나뿐입니다. (리덕스를 쓴다면 말이 다르지만요)

하지만, 꼭 Context를 적게 써야 한다고 단정지을 수는 없습니다. 전역으로 쓸 만한 값들이 많을 수도 있죠. 또한 페이지의 특성에 따라 best practice처럼 사용하지 않고, 그냥 컴포넌트 자체에서 바로 Context.Provider 불러서 provide할 경우도 있을 수 있습니다. 리액트는 언제나 자유로운 코드 문화를 가지고 있었기에 항상 "이렇다" 라고 말할 수 있는 건 거의 없습니다.

아무튼 중요한 건 본인의 앱이 어떻게 돌아가는지 확실하게 이해하는 거예요. Context에 많은 데이터를 넣을수록 성능에 부담이 된다 (너무 큰 규모의 많은 리렌더가 일어나니까)는 걸 이해하고 계신 게 중요합니다. 그리고 그걸 이해하고 계시다면, 적어도 이번 과제에서는 어느 정도의 props drilling을 감수하더라도 저와 같이 디자인하는 게 좋을 거란 의견에 동의하실 것 같네요!




로그인 정보 유지

로그인 정보 유지를 위해 localStorage를 사용하신 분들이 많았습니다. 잘 구현해 주셨더라고요 👍

하지만 일단 localStorage가 state보다 접근하는 데 더 오래 걸립니다. 또한 localStorage의 데이터는 mutable하므로 자주 접근하게 되면 리액트스럽지 않아집니다.

따라서 로그인 정보는 항상 state에 저장해 두고, localStorage는 정말 딱 "백업용"으로, 앱 켜질 때 / 로그인할 때 / 로그아웃할 때 말고는 한 번도 접근하지 않는 게 좋습니다. 가령 App.js에서 localStorage.getItem()하여 로그인 상태를 확인하는 등은 바람직하지 않겠군요




기타