클론코딩 주차가 끝나고 이제 실전 프로젝트가 시작됐다.
아직 1주일 밖에 안 지났다는게 믿기진 않지만, 이제 게임을 시작하는 부분을 구현해야 한다.
내가 맡았던 부분들은 웹소켓을 적용하지 않는 부분들이었고, 시간이 상대적으로 많은 기간인만큼, 이전엔 해보지 못 했던 디테일을 신경써서 작업을 진행했다.
첫번째로 신경써서 만들어본 것은 페이지네이션 기능이다.
단순히 <
, >
모양의 버튼을 이용해서 좌우로 슬라이드처럼 구현했지만, 내 생각보다 단순하게 일이 풀리지 않았었다.
한정된 개수만 한 페이지에서 보여야해서 api 명세서에 있는 size=int
부분에 int를 그냥 4라고 뒀더니 오류가 생겼었다. 정확히 뭐 때문에 오류가 생겼는진 모르겠지만, limit이라는 값을 두고 limit을 넘기니까 해결됐었다.
const rooms = useSelector((state) => state.rooms.rooms);
// 1. 리덕스에 저장되어있는 rooms의 정보를 읽어와서 상수 rooms에 대입한다.
const [page, setPage] = useState(0);
// 2. page라는 state를 만들고, 초기값을 0으로 둔다.
const [limit, setLimit] = useState(4);
// 3. 한 페이지에 4개의 방이 보이도록 했기 때문에 전체가 보이지 않도록 limit이라는 state를 만들고 초기값을 4로 한다.
const dispatch = useDispatch();
useEffect(() => {
dispatch(readAllRooms({ page, limit }));
// 4. readAllRooms를 실행할 때 매개변수로 page의 값과 limit의 값을 넘긴다.
}, [dispatch, page, limit]);
------
export const readAllRooms = createAsyncThunk(
'room/readAllRooms',
async (payload, thunkAPI) => {
try {
const response = await instance.get(
`/rooms?page=${payload.page}&size=${payload.limit}`,
// 5. 한 페이지에 4개의 방이 표시되게끔 매변 변경되는 페이지의 값과 고정되어야하는 4라는 값의 limit을 넘겼다.
);
return thunkAPI.fulfillWithValue(response.data);
} catch (error) {
return thunkAPI.rejectWithValue(error);
}
},
);
새로 만들어본 것 들 중 하나는 모달과 토스트 메세지였다.
그 동안은 시간이 없어서 alert()
만 활용해서 메세지를 띄웠는데, 실전 프로젝트는 더 신경쓸 수 있으니 새로운 것을 시도해봤다.
토스트 메세지의 경우, 실제로 setTimeout()
을 활용해본 첫번째 예시가 되었다.
실수라는 건 원래 매번 했던거지만, 이번 실수는 조금 더 바보같은 실수였다. 뭔가 급하게 만들어야 한다는 생각에 실수 했던 것 같고, 막상 하다보니 내 생각보다 3주라는 시간은 짧지 않았다.
그래서 조금 더 마음을 풀고 꼼꼼하게 실수를 챙길 수 있는 여유를 갖고 프로젝트를 진행하기로 했다.
특별히 바보 같았던 실수 모음:
enterRoom ()
함수 만들기 실수
만들어진 게임 방에 들어갈 때, 평소 하던거처럼 그냥 < Link >만 걸어도 된다고 생각했었다.
동일하게 useParams()
를 활용해서 특정 방의 id 값을 구한 후 이동하게 만들었는데, 생각치도 못 한 문제가 생겼다.
개발에 몰두하다보니 api 명세서가 업데이트 되었을 때 바로바로 확인하지 않았었다.
함수 무한 호출하기
1주차는 아직까지 기술적으로 굉장히 challenging 하진 않았다.
아직 웹소켓을 사용하는 부분에 참여하지 않은 것도 있겠지만, 그래도 그 동안 프로젝트를 구현하면서 약간의 지식과 검색 능력이 상승돼서 그런 듯 하다.
아마 이제 게임방에 들어가서 게임 관련된 로직을 만지는 다음 주차가 어렵겠지... 그래도 어찌어찌 잘 할 수 있을 것 같다!