✅ 오늘한 일

로그아웃 기능 구현

옵션 버튼을 클릭했을 경우 드롭다운이 나타나면서 log out 버튼을 클릭하여 로컬스토리지의 memberId,token 값을 지워주고, 리덕스에 isLogin 이라는 로그인 여부를 판단해주는 상태를 false로 바꿔주었다.

로그아웃을 하게되면 Ask Question 버튼이 사라지게 작업을 해주었다. (리스트 부분은 아직 진행하지 않음..) 버튼이 있어도 상관은 없었다. 백엔드분들이 user의 토큰이 header로 넘어오지 않으면 작성되지 않게 막아두셨다고 한다.

그리고 로그인을 했을 때, user생성일이 담긴 memberId라는 값이 응답값으로 오는데 이것을 가지고 로그인한 유저가 작성한 글인지 판별하여 Edit, Delete 버튼의 유무를 나타낼 수 있게 진행했다. 

이부분은 전에 리덕스와 로컬스토리지를 거즌 16시간 정도 학습을 진행했던 것 같았다... (리덕스를 잘 못썻기때문에 많은 시간을 투자하여 내것으로 만들었다...)

 

리덕스 자료정리 링크: https://velog.io/@homile/React-redux-사용하기

📌 해야할 일

  • 최종 배포
  • 메인 프로젝트 주제 생각해보기

✅ 오늘한 일

로그인 유지

우리팀은 쿠키대신 로컬스토리지에 토큰값을 담아주기로 했다. 그렇기 때문에 리덕스를 사용하여 토큰값이 있을 경우를 로그인중이라고 알려주는 역할을 하면 될 것 같았다. 하지만, 아래와 같은 오류가 발생했고, 해답 또한 찾아냈다.

  • 오류: 처음엔 리덕스에 담아서 로그인 중이라는 것을 알려주면 된다고 생각하였지만, 스토어에 담긴 상태값은 웹 브라우저를 새로고침 할 때, 초기화가 된다고 한다. 이사실을 모르고 ‘왜?자꾸 로그아웃이 되는가?’ 에 대한 의문을 품어 다양한 방법으로 시도를 하였다.
  • 해답: 로그인 중인 상태를 App.js 파일에서 처리를 해주면 된다. 우리팀의 경우 로그인시 헤더에 담겨서 넘어오는 토큰을 로컬스토리지에 담고 있다. 이때, 로컬스토리지에 담긴 토큰의 값이 undefined가 아니라면 로그인 중인 상태인 것을 App.js에서 판별해주면된다. 그냥 판별하게 될 경우 에러가 나니 useEffect를 사용하여 화면이 처음 렌더링 될 때 판별을 해주는 코드를 작성하니 새로고침이 되도 로그인 유지가 되고 있었다.
//App.js
useEffect(() => {
    if(localStorage.getItem("authorization") !== null){
        dispatch(loginSuccess());
    }
}, [])

📌 해야할 일

  • 로그아웃 기능 구현
  • 최종 배포

✅ 오늘한 일

백엔드와 통신하기 및 코드 수정

백엔드분들이 질문 작성, 수정, 보기, 삭제, 답변 작성, 수정, 삭제, 보기까지 API가 구현되었다고 하셔서 요청에 대한 응답값을 작성된 코드에 매칭시켜서 코드를 수정했다. 부분적으로 수정만 하면 되는 부분이라 다행이었다.

코드를 수정 중 데이터가 한차례 늦게 오는 경우가 있엇다. 비동기 처리를 제대로 해주지 않아서 문제가 생겼던것 같다.... 그래도 해결은 했다.!! 

코드를 수정하고 난 뒤 질문 삭제하기를 진행하던 중 새로운 오류를 발견하게 되었다. 이래서 테스트 과정은 꼭 필요한 것 같다. 해당 증상은 질문에 답변이 있을 경우 질문이 삭제가 되지 않는 문제였다... 이부분에 대한 오류가 있음을 백엔드분께 전달 드렸더니 거의 바로 수정해주셨다.!! O-O 그래서 바뀐 것으로 테스트를 진행하니 질문에 답변이 있어도 삭제가 되었다!!!!

이틀간 수정작업만 진행해서 해당 사진은 첨부할 생각을 하지 못했었다... 메인에서는 하루에 작업한 내용을 적고 사진을 미리 찍어둬야겠다.

지금까지 프로젝트 일차별 회고의 날짜가 몰아서 작성된 것 같지만 노션에서 작성한 내용을 옮겨적고 있어서 게으른 사람이 되는 느낌이다..
꼭 하루에 벌어진 일은 당일 작성할 수 있도록 해보자!

📌 해야할 일

  • 로그인 유지
  • 로그아웃 기능 구현
  • 최종 배포

✅ 오늘한 일

로그아웃 드롭다운 메뉴 틀 구현

한동안 너무 힘을 많이 썻는지 살짝 피곤한 날이었다. 그래서 간단하지만 생각을 조금 해야하는 작업을 진행하기로 했다. ;ㅅ;b

로그인 시 나타나는 navbar 옵션버튼을 클릭할 경우 드롭다운이 출력되며 log out을 할 수 있는 버튼이 생긴다. 이것을 구현하기로 했다.

이전에 컴포넌트 만들기를 해보면서 드롭다운을 한번 작업해 본적이 있어서 비슷하게 진행했다. 그 당시에는 div 태그로만 작성했지만 이번에는 ul, li 태크를 사용하여 리스트 형으로 작업을 해주었다.

그렇게 완성된 드롭다운이 아래와 같은 화면이다. 하지만, 여기서 문제인점은 log out을 누르거나 외부 배경을 누를 경우 드롭다운이 닫혀야 하는 것을 구현하지 못했다. ;-; 여러가지 시도(useRef 사용 등)를 해보았지만 먼가 로직이 꼬였는가 잘 되지 않았다. 

이에 따른 코드를 조금 더 찾아봐야 겠다..... ㅠㅠ

드롭다운 메뉴 틀 구현

📌 해야할 일

  • 드롭다운 버튼클릭, 외부 배경 클릭 시 드롭다운 축소 구현
  • 백엔드와 통신, API 명세서에 맞는 응답값으로 코드 수정
  • 로그인 유지
  • 로그아웃 기능

✅ 오늘한 일

답변 작성 기능 구현

답변을 작성할 경우 title을 뺴고 내용만을 작성하여 데이터를 서버로 전달하고 해당 데이터를 바로 받아와서 작성된 답변이 실시간으로 보이도록 했다. 작업을 하던중 실시간으로 보여주려 했으나 새로고침을 해야 볼 수 있었다. 이것은 windows.location.reload()를 사용하여 새로고침을 하여 해결했다.

질문 작성 기능 구현

답변 수정 페이지 구현

답변 수정하기 페이지의 로직도 질문 수정하기 로직이랑 똑같은 형식으로 진행된다. 그리고 두 개의 컴포넌트를 처음에 하나로 사용했었는데 질문하기에는 title이 존재하고, 답변 수정 페이지에는 title이 존재하지 않아서 삼항연산자를 사용해 하나의 컴포넌트로 사용하려 했지만 아직 실력이 부족했던 것 같다. 다음에는 조금 더 컴포넌트를 재사용할 수 있도록 작성해봐야겠다.

질문 수정 페이지 구현 글: https://homile.tistory.com/170 

답변 수정 페이지

백엔드 서버와 통신

백엔드 서버와 통신을 해보았다. 서버와 통신을 하기전 axios를 사용하여 서버에 요청하느 코드를 작성해 두어야 했기에 JSON 서버를 사용하여 통신을 했었다. 이제 백엔드분들이 서버를 구현하셨다고 하여 우리 코드를 하드코딩하여 통신이 되는지 여부를 확인했고, 회원가입, 질문작성, 질문수정 기능에 대한 통신 테스트를 했다.

테스트를 하던 중 CORS 오류가 있어서 프로트쪽에서 package.json 파일에 Proxy 설정을 해주고 백엔드분들이 CORS 에러를 잡아주어 원활한 테스트를 할 수 있었고 요청에 따른 응답값이 잘 넘언오는 것을 확인했다.

JSON 서버 데이터를 구성할 때 API 명세서와 조금 다르게 작성이 되어 이부분을 고치는 수정 작업이 필요해졌다... 메인 프로젝트때는 처음부터 API 명세서에 맞춰서 JSON 서버 데이터를 구성해 봐야겠다.

📌 해야할 일

  • 로그아웃 드롭다운 메뉴 틀 구현
  • 로그아웃 기능 구현
  • API 명세서에 맞춰서 코드 변경하기
  • 로그인 유지

 

✅ 오늘한 일

질문 수정 페이지 구현

질문 상세 페이지에 작성된 title, body의 데이터를 Link 컴포넌트를 사용하여 질문 수정 페이지로 이동하면서 url에 state값으로 질문의 아이디값, 제목, 내용을 넘겨준다.

이동된 페이지에서 useLocation을 사용하여 url에 담아둔 state값을 useState에 할당하고 input에 defaultvalue를 설정해주어 수정전 작성 내용을 보여준다. 이후 수정이 된다면 state값이 변하고, 이 값을 axios를 사용하여 서버측에 headers에 토큰값과 함께 넘겨준다.

// QuestionViewer.js
<StyledLink
  to={`/questionedit/${questionId}`}
  state={{ title: title, body: body, questionId: questionId }}
>
  <span>Edit</span>
</StyledLink>

// QuestionEdit.js
  const location = useLocation();
  const [questionPost, setQuestionPost] = useState({
    title: location.state.title,
    body: location.state.body,
  });

질문 수정 페이지

📌 해야할 일

  • 답변 작성 기능 구현
  • 답변 수정 기능 구현
  • 백엔드와 통신하기

 

+ Recent posts