May 02, 2021
이번에는 중간에 정보처리기사 시험이 껴있어서 2~3주차 정리를 못해서 😭 이제와서라도 한다.
최종 회고는 버퍼 기간이 모두 끝나면 작성하도록 하겠다.
결론적으로 매우 2~3주차 미션도 매우 재미있었고 많은 생각을 요했으며 꽤나 발전했다고 느꼈던 2주였다. 😃
2주차 미션을 진행하면서 가장 신경썼던 부분은 아래와 같다.
const request = async (endPoint, option = {}) => {
const response = await fetch(baseUrl + endPoint, option)
const data = await response.json()
if (!response.ok) {
if (response.message === NO_USERLIST_MESSAGE) return []
throw ERROR_TYPE_BY_MESSAGE[data.message] ?? ERROR_TYPE.SERVER_ERROR
}
return data
}
const headers = { 'Content-Type': 'application/json' }
const options = {
GET: { method: HttpMethod.GET },
POST: (body = '') => {
return {
method: HttpMethod.POST,
headers,
body: body ? JSON.stringify(body) : '',
}
},
PUT: (body = '') => {
return {
method: HttpMethod.PUT,
headers,
body: body ? JSON.stringify(body) : '',
}
},
DELETE: {
method: HttpMethod.DELETE,
},
}
const endPoints = {
getUserList: 'api/users',
addUser: 'api/users',
getUser: userId => `api/users/${userId}`,
removeUser: userId => `api/users/${userId}`,
getUserTodo: userId => `api/users/${userId}/items/`,
addTodoItem: userId => `api/users/${userId}/items/`,
removeAllTodo: userId => `api/users/${userId}/items/`,
removeTodo: (userId, itemId) => `api/users/${userId}/items/${itemId}`,
updateTodo: (userId, itemId) => `api/users/${userId}/items/${itemId}`,
todoToggle: (userId, itemId) => `api/users/${userId}/items/${itemId}/toggle`,
setPriority: (userId, itemId) =>
`api/users/${userId}/items/${itemId}/priority`,
}
에러핸들링은 처음에는 놓치고 있던 부분인데, 먼저 풀리퀘스트를 올려주신 분의 코드를 보고 인사이트를 얻어서 수정하였다 ㅎㅎ. 다중 사용자가 허용되는 어플리케이션이므로, 충분히 고려해야할 사항이었다.
에러는 response.ok
여부로 판단을 했고, 에러의 종류는 response.message
에 들어오는 메시지에 따라서 달리 하였다. 아래는 util/errors
의 소스코드이며, 에러와 관련된 객체들이 저장되어 있다.
에러 처리 플로우를 정리하자면 아래와 같다
export const ERROR_TYPE = {
NO_USER: 'NO_USER',
NO_TODO: 'NO_TODO',
SERVER_ERROR: 'SERVER_ERROR',
NOT_VALIDATE_USERNAME: 'NOT_VALIDATE_USERNAME',
NOT_VALIDATE_TODO: 'NOT_VALIDATE_TODO',
NOT_VALIDATE_TODOLIST: 'NOT_VALIDATE_TODOLIST',
}
export const NO_USERLIST_MESSAGE = 'user가 없습니다'
export const ERROR_TYPE_BY_MESSAGE = {
'해당 이름의 user가 없습니다.': ERROR_TYPE.NO_USER,
'해당 이름의 유저가 없습니다.': ERROR_TYPE.NO_USER,
'해당 유저가 존재하지 않습니다.': ERROR_TYPE.NO_USER,
'Todo Item을 수정하는데 에러가 발생했습니다.': ERROR_TYPE.NO_TODO,
'Todo Item의 priority를 수정하는데 에러가 발생했습니다.': ERROR_TYPE.NO_TODO,
}
export const ERROR_HANDLER = {
NO_USER: () => {
alert('존재하지 않는 유저입니다.')
return location.reload()
},
NO_TODO: () => alert('존재하지 않는 항목입니다.'),
SERVER_ERROR: () => {
alert('잠시후 다시 시도해주세요')
return location.reload()
},
NOT_VALIDATE_USERNAME: () => alert('이름은 2글자 이상이어야 합니다'),
NOT_VALIDATE_TODO: () => alert('2글자 이상 입력해주세요'),
NOT_VALIDATE_TODOLIST: () => alert('삭제할 항목이 없습니다'),
}
에러 핸들링의 두가지 경우는 아래와 같다.
투두 작성 도중 유저가 삭제된 경우
투두 수정 도중 해당 투두 아이템이 삭제된 경우
TodoList 컴포넌트가 너무 많은 기능을 한다
2주차에는 정말 정말 고민을 많이 했었고, 많이 고치고 리팩토링했었다. 아무리도 비동기 통신을 하다보니 코드가 여기저기 더러워져버릴 위험이 많았기 때문에 많이 신경을 쓰게 되었다.
정말 스터디 참여하면서, 코드를 최대한 깔끔하고 가독성 좋고 효율적으로 쓰기 위해 많이 노력하게되는데, 이게 큰 성장으로 이어지는 것 같아서 매우 뿌듯하다 😄
3주차도 마저 마무리하고 금방 회고를 가져오겠다 …