You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
😈 데브타운은 developer's town의 약자로, 더 나은 개발자로서 성장하기 위한 주니어 개발자들의 커뮤니티 플랫폼입니다.
💪🏻 개발자들이 모여 다양한 정보를 자유롭게 공유하면서 함께 성장 할 수 있는 환경을 제공합니다.
🥰 주니어로서 겪을 수 있는 문제들에 대해 서로 공유하고 공감하며 같이 해결해 나갈 수 있습니다.
📚 개발 관련 상품을 판매할 수 있습니다.
- 팀원 모두 리덕스를 잘 모르는 상태에서 사용하려다보니, 리덕스에 대해 공부하고 적용하기까지 시간이 많이 소요되었습니다.
- Live Share와 게더타운을 이용한 페어프로그래밍을 통해, 리덕스를 적용하여 코드를 작성하였습니다.
- 이해한 내용을 주석으로 작성하여, 리덕스 활용시 쉽게 이해할 수 있도록 하였습니다.
- Redux-Persist를 사용해 새로고침이나 웹을 종료해도 store가 리셋되는 것을 방지하고 싶었지만
적용을 해도 계속해서 데이터가 휘발되는 이슈가 있었습니다.
- 또한 특정한 reducer에만 데이터를 사용하고 싶은 경우 persistConfig에 whitelist를 설정해 넣어줬지만
데이터가 휘발되어 현재는 Redux-Persist를 사용하지 않고 sessionStorage를 통해 새로고침을 방지하고 있습니다.
✅ 트러블슈팅; 게시물 업로드 기능에서 이미지 미리보기와 이미지 url서버 전송
[문제]
이미지 프리뷰가 뜨면 서버로 전송이 안되고, 반대로 서버로 전송이 되면 프리뷰가 보이지 않음.
[해결 과정]
이미지를 서버에 업로드하는 액션과 포스트하는 액션을 따로 설정
=> 오히려 코드의 복잡도가 올라가고 그다지 효율적이지 않아 postAction 이라는 하나의 함수로 dispatch 설정
useEffect 안에서 formData와 fileReader를 동시에 만들어서 감시하도록 했지만 useEffect 코드를 제거하고 formData 관련 코드를 리덕스의 액션함수 파일로 이동
functionUploadPage(){const[postText,setPostText]=useState('');const[uploadedImg,setUploadedImg]=useState([]);const[imgPreview,setImgPreview]=useState([]);//중략constonSubmitHandler=(e)=>{e.preventDefault();if(uploadedImg===[]&&postText===''){alert('게시물을 작성해주세요');}else{history.push('/myprofile');dispatch(postAction.post(uploadedImg,postText));}};constHandlePostText=(e)=>{setPostText(e.target.value);};constHandleOnchange=(e)=>{letprevImgs=[];for(letindex=0;index<e.target.files.length;index++){constelement=e.target.files[index];constreader=newFileReader();//file을 비동기로 읽기 위한 FileReader 객체를 생성reader.onload=function(){//FileReader가 이미지를 잘 인코딩하고 난 후의 결과를 처리prevImgs.push(reader.result);setImgPreview((prev)=>{if(prevImgs.length<=3){letnewPreviews=prevImgs;returnnewPreviews;}else{returnprev;}});};reader.readAsDataURL(element);}setUploadedImg((prev)=>{if(prev.length<3){letnewList=e.target.files;returnnewList;}else{alert('이미지는 최대 3장까지 업로드가 가능합니다.');returnprev;}});};}// 이전 코드: 이미지 미리보기 로직과 이미지 url 만드는 로직을 useEffect 안에다 작성하여 코드가 제대로 동작이 안됨.// useEffect(() => {// for (let index = 0; index < uploadedImg.length; index++) {// const file = uploadedImg[index];// const reader = new FileReader();// reader.onloadend = () => {// SetImgPreview((prev) => {// let newPreviews = [...prev, reader.result];// if (newPreviews.length > 3){// alert('이미지는 최대 3장까지 업로드가 가능합니다.')// newPreviews = newPreviews.slice(0,3)// return newPreviews// }// return newPreviews;// });// };// reader.readAsDataURL(file);// const formData = new FormData()// formData.append('image',file)// }// }, [uploadedImg]);//후략
functionpost(fileList,postText){constformData=newFormData();if(fileList.length>0){for(letindex=0;index<fileList.length;index++){constfile=fileList[index];formData.append('image',file);}//formData 처리 후 이미지업로드 요청returnasync(dispatch,getState)=>{leturl='https://mandarin.api.weniv.co.kr';constreqPath='/image/uploadfiles';consttoken=getState().auth.token;try{letimageUrls=''if(fileList.length>0){letfileRes=awaitfetch(url+reqPath,{method: 'POST',body: formData,});constfileJson=awaitfileRes.json();imageUrls=fileJson.map((fileData)=>url+'/'+fileData.filename).join(',');}//게시물 포스트 요청constpostReq='/post';letpostRes=awaitfetch(url+postReq,{method: 'POST',headers: {Authorization: `Bearer ${token}`,'Content-type': 'application/json',},body: JSON.stringify({post: {content: postText,image: imageUrls,},}),});//후략
♻️ 보완할 부분
1. 아직 구현하지 못한 기능
- 채팅 기능
- 신고하기 기능
- 게시물 수정 및 삭제
- 상품/게시물 수정시 리렌더링
- Redux-Persist
2. 컴포넌트의 아토믹화
3. 중복되는 코드를 없애고 커스텀훅 모듈 제작
4. 리렌더링 최소화