Post

SignUp




SignUp



1. 회원가입

회원가입 기능 구현

1.1. 유효성 검사

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
    // input value 값을 담아줄 state 선언한다.
    const [input, setInput] = useState({
        email: '',
        password: '',
        nickname: '',
        role: "USER"
    })

    // input name을 state와 일치 시킨 후 key로 input에 value를 value로 넣어준다.
    const handleInputChange = (e) => {
        setInput({
            ...input,
            [e.target.name]: e.target.value
        })

    // 아래 swich문의 값으로 e.target.name을 내려주고 e.target.value를 테스트한다.
        authInput(e.target.name, e.target.value)
    }

    // 유효성 검사
    // 아이디는 @, . 을 포함해야합니다.
    // 비밀번호는 영문, 숫자 조합 6글자 이상입니다.
    const authInput = (name, value) => {
        let state = false
        switch (name) {
            case "email":
                state = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/.test(value);
                break;
            case "password":
                state = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z0-9]{6,20}$/.test(value);
                break;
            case "checkPassword":
                state = value === input.password
                break;
            case "nickname":
                state = /^.{3,10}$/.test(value);
                break;
            default:
                state = true;
        }
    
    // name은 위에서 부터 내려온 e.target.name
    // name(key): state(value 유효성 검사 후 boolean)
    // 통과하면 아래 auth에 상태가 전부 true
        setAuth({
            ...auth,
            [name]: state
        });
    }

    // 유효성 검사 통과 후 상태 값
    const [auth, setAuth] = useState({
        email: false,
        password: false,
        checkPassword: false,
        nickname: false,
    })

    // 유효성 검사 통과 했을 때 회원가입 가능
    const signUp = async () => {
        if (auth.email && auth.password && auth.checkPassword && auth.nickname) {
            try {
                const newUser = {
                    email: input.email,
                    password: input.password,
                    nickname: input.nickname,
                    role: input.role
                }
                // const response = await api.post("앤드포인트", newUser)
                alert("회원가입이 완료됐습니다.")
                navigate("/signin")
            } catch (error) {
                console.log(error)
                alert('회원가입 양식에 문제가 있습니다.')
            }
        }
    }


1.2. 회원가입 state 메세지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    // massage state 를 만들어준다.
    const [focusState, setFocusState] = useState({
        email: false,
        nickname: false,
        password: false,
        checkPassword: false,
    });

    // input의 onFocus()를 이용 포커스 됐을 시 handlerFocus실행
    // 인자로 state와 동일한 input name을 가져온다.
    // focusState를 true로 재할당
    const handlerFocus = (name) => {
        setFocusState({
            ...focusState,
            [name]: true
        })
    }

    // onFBlur()를 이용 focus가 해재 됐을 시 handlerBlur 실행
    // 인자로 state와 동일한 input name을 가져온다.
    // focusState를 false로 재할당
    const handlerBlur = (name) => {
        setFocusState({
            ...focusState,
            [name]: false
        })
    }

    // massage state를 통해 state 출력
    // auth[name] 즉 유효성 검사를 통과했을 시 
    // "확인됐습니다." 출력 아니면 "형식이 올바르지 않습니다."
    // styled에 props로 focusState[name]상태를 보내 display를 제어한다.

    const message =(name) => {
        return (auth[name] ? 
        <Message focus={focusState[name]? "block": "none"}> 확인됐습니다. </Message>
        : 
        <Message focus={focusState[name]? "block": "none"}> 형식이 올바르지 않습니다. </Message>)
    }

평소에는 커스텀 훅을 만들어 state와 onChange값을 제어했는데 유효성 검사를
하나의 state를 통해 해결할 수 있을 것 같아서 이 방법을 사용해봤다.
로직을 짜면서 중요한점은 기존 state와 input name의 key를 통일 시켜
값을 대체하게 만드는 것 같다.

This post is licensed under CC BY 4.0 by the author.