기타 개발 과정

oh_eol·2022년 3월 1일
0

react

목록 보기
3/3
  • 0822 회원가입 API 추가
    1. main 브런치에서 pull
    2. yarn add jsonwebtoken —save
    3. yarn start 로 구현 전에 실행되는 것 확인
    4. swagger-ui 계속 오류... 미해결
  • 0825 동일과정
    • swagger-ui 실행 안되는 문제 해결
      • 집에서는 안됐는데 밖에 나와서 카페 ip주소 서버(openvidu, rds 보안그룹)에 등록하고 openvidu 서버 키고 IntelliJ 디버그 실행하니까 페이지 작동함... ㅇㅇ... 일주일 넘게 개고생했는데 왜,,,,
      • 설마 swagger-ui 주소가 잘못된 거,,,? http://localhost:8080/swagger-ui.html#/ 근데 처음에 주소 설정했을 때도 잘 안됐음.
    • 리액트 실행 후 sign up/in 할 때 다음과 같은 오류 발생. → 프론트단에서 서버 url이 localhost면 그럴 수 있다고 함. 로컬에서 할 때에는 아래처럼 비활성화(주석) 하고 실행하니 정상적으로 sign up / sign in 됨.
    • 그런데 또 문제.. 이메일 형식이 안맞거나 비밀번호가 4자리 미만일 경우 백단의 CreateUserDto에 따라서 어노테이션이 적용이 되어야 하는데 이메일 형식이 아니라 그냥 aaaa 이런 식이여도 회원가입이 됨. 경고 메시지가 뜨지 않음. → 해결
    • (정리)회원가입 도중에는 형식에 맞지 않을 경우 에러가 떠야 하고, 회원가입 작성 후 버튼을 누른 다음에는 예외처리에 따라서 중복회원 검사 등을 통해서 에러가 떠야 함.
    • 백단 개발분들과 상의해야 할 사항
      • 이메일 검증 안됨. aaaa@n 까지만 해도 회원가입 성공
      • 현재 방식은 모두 입력한 다음 post 하는 방식으로,
        1. (UserService.java : 예외처리)아래와 같이 exception 처리 시 모두 if문으로 되어있어서 한 번에 예외 하나만 볼 수 있음.

        2. (dto annotation 처리)이메일 입력이 완료되면 (마우스 다른 곳 클릭 등) 그 정보를 바로 서버로 보내서 이메일 형식이 맞지 않는다고 뜨고, password 와 checkPassword 불일치 시 바로 메시지 뜰 수 있도록 할 수 있는지. 지금은 정보를 한 번에 입력해서 sign up 버튼까지 눌러야 정보 전달이 가능~(이건 리액트 단에서 가능한지, 백단에서 고쳐야 하는 것인지 알아보기)

  • 0902 클라이언트에서의 오류 추가
    • 백단에서의 예외처리를 하려고 했는데 이메일 완성이 되지 않더라도 회원가입이 정상적으로 되는 것을 보고 우선 클라이언트에서 이메일 유효성 검증 구현
    • 추가로 비밀번호 4자리 넘는지, 비밀번호와 확인 비밀번호는 동일한지, 이름이 공란이지는 않는지 검증 구현
    • 에러가 난 사항에 대해서 경고 대화박스 나타냄.
  • 0908 클라이언트에서의 유효성 검증 관련 오류
    • 올바른 양식 회원가입 시도

    • 형식 오류 회원가입 시도

    • 로그인 시도

    • 기타 console.log data 출력 여부

      +++ 백엔드에서 '비밀번호 4자리 이상 여부/이메일 형식 오류' 예외처리 메시지는 안해놓은 것 같음

    1. 클라이언트 유효성 검증 X + 백엔드 유효성 검증 X

      1. 회원가입 형식 오류시 console 에 msg 데이터 출력됨.

      2. 형식 알맞게 회원가입 정상적 + 로그인 "없는 회원입니다."

      3. 이메일 형식 안맞춰서 회원가입 정상적 + 로그인 정상적

      4. 이메일 중복 확인 안됨??

        1. 패스워드 4자리 미만 = 회원가입 정상 + 로그인 정상(???)

        {

        person01@naver.com

        1

        1

        person01

        }

        1. 아이디/닉네임 중복 = console 중복 예외 메시지 정상 출력
        import React, { useState } from 'react';
        import TopBar from "../../components/topBar/TopBar";
        import SignUp from "../../components/SignUp";
        import { signUp } from "../../api/Api";
        
        const SignUpContainer = () => {
        
            const [createUser, setCreateUser] = useState({
                email: '',
                password: '',
                checkPassword: '',
                name: '',
            })
        
            const { email, password, checkPassword, name } = createUser;
        
            const handleCreateUser = e => {
                console.log(e.target.value);
                const { name, value } = e.target;
                setCreateUser({
                    ...createUser,
                    [name]: value
                });
            };
        
            const handleClick = async (e, setIsLogin) => {
                e.preventDefault()  // 콘솔 초기화 방지
                console.log('클릭!')
                await signUp.signUpApi(email, password, checkPassword, name).then(async r => {
                    console.log('회원가입 완료' + r.data['data'], r.data['msg'] + r.data['success']);
                }).catch(e => {
                    console.log(e.response);
                })
                setIsLogin(true)
            }
        
            return (
                <div>
                    <TopBar />
                    <SignUp email={email} password={password} checkPassword={checkPassword} name={name}
                        handleCreateUser={handleCreateUser} handleClick={handleClick} />
                </div>
        
            )
        }
        
        export default SignUpContainer;
    2. 클라이언트 유효성 검증 X + 백엔드 유효성 검증 O

      1. 올바르지 않은 양식으로 회원가입 성공 + 로그인 성공

      2. 같은 이메일로 중복 회원가입 시도 시 console.log data "이미 존재하는 이메일입니다"

        import React, { useState } from 'react';
        import TopBar from "../../components/topBar/TopBar";
        import SignUp from "../../components/SignUp";
        import { signUp } from "../../api/Api";
        import MuiAlert from '@material-ui/lab/Alert';
        import { Snackbar } from '@material-ui/core';
        
        const SignUpContainer = () => {
        
            const [createUser, setCreateUser] = useState({
                email: '',
                password: '',
                checkPassword: '',
                name: '',
            })
        
            const { email, password, checkPassword, name } = createUser;
        
            const [error, setError] = useState({
                isError: false,
                msg: null
            });
        
            const handleCreateUser = e => {
                console.log(e.target.value);
                const { name, value } = e.target;
                setCreateUser({
                    ...createUser,
                    [name]: value
                });
            };
        
            const handleClose = () => {
                setError({
                    ...error,
                    isError: false,
                    msg: null
                });
            }
            function Alert(props) {
                return <MuiAlert elevation={6} variant="filled" {...props} />;
            }
            const handleClick = async (e, setIsLogin) => {
                e.preventDefault()  // 콘솔 초기화 방지
                console.log('클릭!')
                await signUp.signUpApi(email, password, checkPassword, name).then(async r => {
                    console.log('회원가입 완료' + r.data['data'], r.data['msg'] + r.data['success']);
                    setError({ ...error, isError: true, msg: e.response.data.msg })
                    console.log(e.response.data.msg);
                }).catch(e => {
                    console.log(e.response);
                })
                setIsLogin(true)
            }
        
            return (
                <div>
                    <div>
                        <TopBar />
                        <SignUp email={email} password={password} checkPassword={checkPassword} name={name}
                            handleCreateUser={handleCreateUser} handleClick={handleClick} />
                    </div>
                    <Snackbar open={error.isError} autoHideDuration={6000} onClose={handleClose}>
                        <Alert onClose={handleClose} severity="error">
                            {error.msg}
                        </Alert>
                    </Snackbar>
                </div>
        
            )
        }
        
        export default SignUpContainer;
    3. 클라이언트 유효성 검증 O + 백엔드 유효성 검증 X

      1. 회원가입 시 형식 항상 바르게 입력됨. + 로그인 시 "없는 회원입니다."

      2. console data 출력 안되는 건 if 조건 안에 있는데 조건에서 탈락해서 넘어가기 때문..

        +++ signup.signUpApi 안 내용을 email.value, password.value, checkPassword.value, name.value 이걸로 바꿔주니까 로그인 가능해짐....!! 근데 여전히 r.response? 는 안나옴.

        import React, { useState } from 'react';
        import TopBar from "../../components/topBar/TopBar";
        import SignUp from "../../components/SignUp";
        import { signUp } from "../../api/Api";
        
        const SignUpContainer = () => {
        
            const [createUser, setCreateUser] = useState({
                email: '',
                password: '',
                checkPassword: '',
                name: '',
            })
        
            const { email, password, checkPassword, name } = createUser;
        
            const handleCreateUser = e => {
                console.log(e.target.value);
                const { name, value } = e.target;
                setCreateUser({
                    ...createUser,
                    [name]: value
                });
            };
        
            const handleClick = async (e, setIsLogin) => {
                e.preventDefault()  // 콘솔 초기화 방지
                console.log('클릭!')
                const email = document.querySelector('input[name="email"]')
                const password = document.querySelector('input[name="password"]')
                const checkPassword = document.querySelector('input[name="checkPassword"]')
                const name = document.querySelector('input[name="name"]')
                {/* TODO 패스워드 둘 다 하지 않고 password랑 checkPassword랑 같은지 비교해서 하나만 넣기. */ }
                if (checkEmail(email.value) && isPwSame(password.value, checkPassword.value) && (name != null)) {
                    await signUp.signUpApi(email, password, checkPassword, name).then(async r => {
                        console.log('회원가입 완료' + r.data['data'], r.data['msg'] + r.data['success']);
                    }).catch(e => {
                        console.log(e.response);
                    })
                    setIsLogin(true)
                } else if (!checkEmail(email.value)) {
                    alert("이메일이 유효하지 않습니다.\n한 번 더 확인해주세요.")
                    return false
                } else if (!checkPw(password.value) || !checkPw(checkPassword.value)) {
                    alert("비밀번호는 네 자리 이상입니다.\n한 번 더 확인해주세요.")
                    return false
                } else if (!isPwSame(password.value, checkPassword.value)) {
                    alert("비밀번호와 확인 비밀번호가 일치하지 않습니다.\n한 번 더 확인해주세요.")
                    return false
                } else {
                    alert("이름은 필수입니다.")
                }
            }
        
            //  이메일 유효성
            const checkEmail = (value) => {
                var regExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
                // 형식에 맞는 경우 true 리턴
                console.log('이메일 유효성 검사 제발 성공하자 한번에 :: ', regExp.test(value))
                return regExp.test(value)
            }
        
            //  비밀번호 유효성
            const checkPw = (value) => {
                //  최소 4자 이상
                var regExp = /[0-9a-zA-Z]{4,}$/
                // 형식에 맞는 경우 true 리턴
                console.log('비밀번호 유효성 검사 :: ', regExp.test(value))
                return regExp.test(value)
            }
        
            //  비밀번호, 확인 비밀번호 동일성 체크
            const isPwSame = (pw, ckPw) => {
                if (checkPw(pw) && checkPw(ckPw)) {
                    if (pw == ckPw) {
                        return true
                    }
                }
                else return false
            }
            return (
                <div>
                    <TopBar />
                    <SignUp email={email} password={password} checkPassword={checkPassword} name={name}
                        handleCreateUser={handleCreateUser} checkEmail={checkEmail} checkPw={checkPw} handleClick={handleClick} />
                </div>
        
            )
        }
        
        export default SignUpContainer;

    4. 클라이언트 유효성 검증 O + 백엔드 유효성 검증 O
      1. 올바른 양식으로 회원가입 시도하고 sign up 버튼 클릭 시 아래와 같은 오류 출력됨.

          ```jsx
          import React, { useState } from 'react';
          import TopBar from "../../components/topBar/TopBar";
          import SignUp from "../../components/SignUp";
          import { signUp } from "../../api/Api";
          import MuiAlert from '@material-ui/lab/Alert';
          import { Snackbar } from '@material-ui/core';
          
          const SignUpContainer = () => {
          
              const [createUser, setCreateUser] = useState({
                  email: '',
                  password: '',
                  checkPassword: '',
                  name: '',
              })
          
              const [error, setError] = useState({
                  isError: false,
                  msg: null
              });
          
              const { email, password, checkPassword, name } = createUser;
          
              const handleCreateUser = e => {
                  console.log(e.target.value);
                  const { name, value } = e.target;
                  setCreateUser({
                      ...createUser,
                      [name]: value
                  });
              };
          
              const handleClick = async (e, setIsLogin) => {
                  e.preventDefault()  // 콘솔 초기화 방지
                  console.log('클릭!')
                  const email = document.querySelector('input[name="email"]')
                  const password = document.querySelector('input[name="password"]')
                  const checkPassword = document.querySelector('input[name="checkPassword"]')
                  const name = document.querySelector('input[name="name"]')
                  {/* TODO 패스워드 둘 다 하지 않고 password랑 checkPassword랑 같은지 비교해서 하나만 넣기. */ }
                  if (checkEmail(email.value) && isPwSame(password.value, checkPassword.value) && (name != null)) {
                      await signUp.signUpApi(email, password, checkPassword, name).then(async r => {
                          console.log('회원가입 완료' + r.data['data'], r.data['msg'] + r.data['success']);
                      }).catch(e => {
                          console.log(e.response);
                          setError({ ...error, isError: true, msg: e.response.data.msg })
                          console.log(e.response.data.msg);
                      })
                      setIsLogin(true)
                  } else if (!checkEmail(email.value)) {
                      alert("이메일이 유효하지 않습니다.\n한 번 더 확인해주세요.")
                      return false
                  } else if (!checkPw(password.value) || !checkPw(checkPassword.value)) {
                      alert("비밀번호는 네 자리 이상입니다.\n한 번 더 확인해주세요.")
                      return false
                  } else if (!isPwSame(password.value, checkPassword.value)) {
                      alert("비밀번호와 확인 비밀번호가 일치하지 않습니다.\n한 번 더 확인해주세요.")
                      return false
                  } else {
                      alert("이름은 필수입니다.")
                  }
              }
          
              const handleClose = () => {
                  setError({
                      ...error,
                      isError: false,
                      msg: null
                  });
              }
          
              function Alert(props) {
                  return <MuiAlert elevation={6} variant="filled" {...props} />;
              }
          
              //  이메일 유효성
              const checkEmail = (value) => {
                  var regExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
                  // 형식에 맞는 경우 true 리턴
                  console.log('이메일 유효성 검사 제발 성공하자 한번에 :: ', regExp.test(value))
                  return regExp.test(value)
              }
          
              //  비밀번호 유효성
              const checkPw = (value) => {
                  //  최소 4자 이상
                  var regExp = /[0-9a-zA-Z]{4,}$/
                  // 형식에 맞는 경우 true 리턴
                  console.log('비밀번호 유효성 검사 :: ', regExp.test(value))
                  return regExp.test(value)
              }
          
              //  비밀번호, 확인 비밀번호 동일성 체크
              const isPwSame = (pw, ckPw) => {
                  if (checkPw(pw) && checkPw(ckPw)) {
                      if (pw == ckPw) {
                          return true
                      }
                  }
                  else return false
              }
              return (
                  <div>
                      <div>
                          <TopBar />
                          <SignUp email={email} password={password} checkPassword={checkPassword} name={name}
                              handleCreateUser={handleCreateUser} checkEmail={checkEmail} checkPw={checkPw} handleClick={handleClick} />
                      </div>
                      <Snackbar open={error.isError} autoHideDuration={6000} onClose={handleClose}>
                          <Alert onClose={handleClose} severity="error">
                              {error.msg}
                          </Alert>
                      </Snackbar>
                  </div>
          
              )
          }
          
          export default SignUpContainer;
          ```
          

      == 백엔드 유효성을 해야 회원 정보가 날아가는데 이런 ,,, 이런 오류가 나...........

      !!! 해결 !!!

      마지막에 클라이언트 백엔드 모두 연결한 거에서 signup.signUpApi 안 내용을 email.value, password.value, checkPassword.value, name.value 로 바꿔줘야 하는 내용이었음...!! 내가 const 로 각각을 다시 설정했는데 회원가입 폼을 넘기는 과정에서는 원래 변수를 넣어버림...

profile
공부 중입니다.

0개의 댓글