개망톡 프로젝트
😊 사이트 링크
📁 frontend-repository
📁 backend-repository
🎬 유튜브 링크
개요
- 명칭 : gaemangtalk
- 개발 인원 : 4명
- 기발 기간 : 2021.04.16 ~ 2021.04.22
- 주요 기능 : 소셜 로그인, 채팅
- 개발 언어 : JavaScript
- 개발 라이브러리 : React.js
- 형상 관리 툴 : git
- 협업 툴 : Slack,notion
- 간단 소개 : 리액트 - 스프링 협업의 웹소켓 기반 채팅 프로젝트
사용 패키지
- class101/ui
- reduxjs/toolkit
- socks-client
- stompjs
- styled-components
- axios
- connected-react-router, history
상세페이지
로그인, 카카오 소셜 로그인
회원가입
비밀번호 찾기 기능
회원정보 수정
채팅방 생성✨
채팅✨
반응형 - 모바일 / 태블릿
Trouble shooting
프로젝트를 하며 마주친 문제들과 해결한 방법을 정리
withcredential?
- withCredential은 옵션이 true면 다른 포트끼리 쿠키 공유가 가능하다
- 기본값은 false
- 이전 프로젝트에서 withCredential=true로 하지않으면 cors에러가 나서 옵션을 미리 바꾸고 api 요청을 했는데, 아래와 같은 에러가 났다
Access to XMLHttpRequest at 'http://54.180.141.91:8080/api/user/signup/emailCheck' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
- response header의 'Access-Control-Allow-Origin'가 *면 withCredential이 true면 안되는 의미.
- 지금 서버설정에서는 withCredential을 다시 false로 바꾸니 요청이 잘 들어갔다
로그인 유지할 때 어떻게 하지?
- 새로고침하면 스토어에 저장한 user 정보가 사라져서, 로그인 상태를 유지할 방법이 필요하다.
- 로그인할 때 필요한 사용자 정보를 쿠키나 세션 스토리지에 저장할지, 토큰만 저장해 토큰으로 user 정보를 가져올지 고민했음
- 사용자 정보를 스토리지에 저장하면, 업데이트를 할 때도 매번 반영을 해야해서, token 값만 저장해 새로고침할 때마다 user 정보를 오는 방법으로 구현했다.
- 쿠키는 요청이 갈 때마다 같이 전송이 되므로, 브라우저를 끄면 정보가 사라지는 session에 토큰을 저장하는 방법이 좋을 것 같다
3. 채팅이 끊기는 문제
- Connect -> Subscribe 후 send 메소드로 메시지를 보낼 때 발생
- 접속 자체가 되어있음에도 불구하고 간헐적으로 발생
원인
- 웹소켓 객체의 readyState라는 프로퍼티의 상태
- send 메소드를 보낼 때, readyState가 0이면 위의 오류가 발생하는 것이었음
Value | State | Description |
---|
0 | CONNECTING | 소켓이 생성, 연결이 아직 되지 않음 |
1 | OPEN | 연결이 열려 있고 , 통신할 준비가 되어 있음 |
해결
- setTimeout 함수로 readyState가 1이 될 때 send 메소드를 실행할 수 있도록 함
// 웹소켓이 연결될 때 까지 실행하는 함수
function waitForConnection(ws, callback) {
setTimeout(
function () {
// 연결되었을 때 콜백함수 실행
if (ws.ws.readyState === 1) {
callback();
// 연결이 안 되었으면 재호출
} else {
waitForConnection(ws, callback);
}
},
1 // 밀리초 간격으로 실행
);
}
reference