씨네
공부하는 개발자 강씨네
씨네
  • 분류 전체보기 (460)
    • Web (21)
      • HTML (11)
      • CSS (10)
    • JS 관련 (49)
      • JavaScript (27)
      • JQuery (22)
    • TS 관련 (15)
      • TypeScript (15)
    • NodeJS (7)
      • NodeJS (7)
    • 따라하며 배우는 시리즈 (23)
      • NodeJS & ReactJS Basic (23)
      • NodeJS & ReactJS Movie (0)
      • NodeJS & ReactJS Youtube (0)
      • NodeJS & ReactJS ChatBot (0)
    • SPA (14)
      • React (14)
      • Vue (0)
      • Anguler (0)
    • Java 관련 (118)
      • Java (52)
      • JDBC (6)
      • JSP & Servlet (18)
      • Spring Legecy (38)
      • SpringBoot (4)
    • Python (26)
      • Python (20)
      • PyMongo (1)
      • Django (5)
    • Git (24)
      • Github (24)
    • RDB (22)
      • Oracle (21)
      • MySQL (1)
    • NoSQL (5)
      • MongoDB (5)
    • OS (4)
      • Linux (4)
    • 빅데이터 (2)
      • hadoop (2)
    • IDE (20)
      • eclipse (11)
      • VSCODE (4)
      • VisualStudio (1)
      • IntelliJ (1)
      • PyCharm (1)
      • DBeaver (2)
    • Install (3)
      • Tomcat (1)
      • Docker (1)
      • Anaconda (1)
    • 오류&에러 (28)
      • TS (2)
      • NodeJS (7)
      • SQL (8)
      • Java (1)
      • Spring (4)
      • Git (6)
      • 기타 (0)
    • 알고리즘 (67)
      • 수열 (1)
      • 백준(backjoon) (39)
      • Programmers (27)
    • 자격증 (5)
      • SQLD (5)
    • 기타 (2)
    • IT유튜브로 지식쌓기 (2)

공지사항

인기 글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
씨네

공부하는 개발자 강씨네

[ReactJS] 로그인 페이지 구현하기
따라하며 배우는 시리즈/NodeJS & ReactJS Basic

[ReactJS] 로그인 페이지 구현하기

2022. 9. 18. 10:49
728x90

 

현재 Boiler Plate는 로그인과 회원가입을 구현하기위해 Formik과 Yup이란 라이브러리를 사용해서 다이나믹하게 만들어야하지만 기초적인 부분만 다루기 위해 이메일이나 비밀번호만을 가지고 로그인페이지를 만들려고합니다!

 

지금 현재는 서버를 실행시키면 LandingPage가 나오도록 코드가 짜여져 있는데 이 랜딩부분을 수정해 보겠습니다.

 

import React, { useEffect } from 'react';
import axios from 'axios';

function LandingPage() {
    useEffect(() => {
        axios.get('/api/hello')
        .then(response => console.log(response.data))
    }, [])
    return (
        <div style={{ 
            display: 'flex', justifyContent: 'center', alignItems: 'center', 
            width: '100%', height: '100vh'
            }}>
            <h2>시작 페이지</h2>
        </div>
    )
}

export default LandingPage;

 

페이지가 이렇게 바뀝니다!

 

URL에 http://localhost:3000/loginPage 입력을하면 로그인 페이지로 가도록 코딩이 되어있는데요.

한번 직접 이동해보겠습니다.

 

 

우선 LoginPage.js파일은 이렇게 코드를 작성했습니다.

import React, { useState } from 'react';
import { useDispatch } from 'react-redux';
import { loginUser } from '../../../_actions/user_action';

function LoginPage() {
    return (
        <div style={{ 
            display: 'flex', justifyContent: 'center', alignItems: 'center', 
            width: '100%', height: '100vh'
            }}>
            <form style={{ display: 'flex', flexDirection: 'column'}}
                onSubmit={onSubmitHandler}
            >
                <label>Email</label>
                <input type='email' value={Email} onChange={onEmailHandler}/>
                <label>Password</label>
                <input type='password' value={Password} onChange={onPasswordHandler}/>
                <br />
                <button formAction=''>
                    Login
                </button>
            </form>
        </div>
    )
}

export default LoginPage;

 

페이지의 형태를 만들기위해 작성한 코드입니다.

 

input 태그에서 value부분에 state를 넣어주어야합니다.

state를 변화를 시켜서 데이터를 변화시켜주어야 하는데요.

 

    const [Email, setEmail] = useState("");
    const [Password, setPassword] = useState("");

useState("")에서 안에 들어가는 "" 는 처음에 시작할떄 어떻게 시작하는지에대한 상태인데 이메일과 패스워드는 처음에 빈칸으로 시작해야하기 때문에 빈 문자열을 넣었습니다.

useState는 react라이브러리에서 가져올수 있습니다.

하지만 이 코드로 상태를 바꿀수는 있지만 아마 타이핑을 하려고 하면 타이핑은 되지 않을 것입니다.

 

    const onEmailHandler = (event) => {
        setEmail(event.currentTarget.value);
    }
    const onPasswordHandler = (event) => {
        setPassword(event.currentTarget.value);
    }

이 코드를 작성해서 onChange라는 이벤트를 발생시켜야 state가 바뀌어야 value가 바뀌게 됩니다!

 

자 이렇게 로그인을 위한 준비가 되었는데 아직까지는 버튼을 눌러도 동작이 뭔가 되지 않는데요.

form태그에 submit이벤트에도 핸들러가 있어야합니다.

 

    const dispatch = useDispatch();

    const onSubmitHandler = (event) => {
        // 버튼만 누르면 리프레시 되는것을 막아줌
        event.preventDefault();

        console.log('Email', Email);
        console.log('Password', Password);
        
        let body = {
            email: Email,
            password: Password,
        }

        dispatch(loginUser(body));
    }

event.preventDefault();를 해주지 않으면 버튼을 누를때마다 페이지가 리프레시됩니다.

그런 현상을 막아주기 위한 코드입니다.

원래는 이 안에서 axios를 통해 원하는 path에다가 body를 보내주어야 하는데 리덕스를 사용하고 있기 때문에 그 역할을 디스패치를 이용해서 action을 취할 예정입니다.

 

import React, { useState } from 'react';
import { useDispatch } from 'react-redux';
import { loginUser } from '../../../_actions/user_action';

function LoginPage() {

    const dispatch = useDispatch();

    const [Email, setEmail] = useState("");
    const [Password, setPassword] = useState("");

    const onEmailHandler = (event) => {
        setEmail(event.currentTarget.value);
    }
    const onPasswordHandler = (event) => {
        setPassword(event.currentTarget.value);
    }
    const onSubmitHandler = (event) => {
        // 버튼만 누르면 리로드 되는것을 막아줌
        event.preventDefault();

        console.log('Email', Email);
        console.log('Password', Password);
        
        let body = {
            email: Email,
            password: Password,
        }

        dispatch(loginUser(body));
    }

    return (
        <div style={{ 
            display: 'flex', justifyContent: 'center', alignItems: 'center', 
            width: '100%', height: '100vh'
            }}>
            <form style={{ display: 'flex', flexDirection: 'column'}}
                onSubmit={onSubmitHandler}
            >
                <label>Email</label>
                <input type='email' value={Email} onChange={onEmailHandler}/>
                <label>Password</label>
                <input type='password' value={Password} onChange={onPasswordHandler}/>
                <br />
                <button formAction=''>
                    Login
                </button>
            </form>
        </div>
    )
}

export default LoginPage;

로그인 페이지의 전체 코드입니다.

 

 

import axios from 'axios';
import {
    LOGIN_USER,
} from './types';
export function loginUser(dataToSubmit) {

    const request = axios.post('/api/users/login', dataToSubmit)
        .then(response => response.data)

    return {
        type: LOGIN_USER,
        payload: request
    }
}

디스패치를 통해 받아온 data를 path에다가 보내주고 잘 보내주었다면 data를 리턴하겠습니다.

 

type은 쉬운 관리를 위해 따로 뺴주었는데요.

export const LOGIN_USER = "login_user";

_actions디렉터리에 tpyes.js 파일에서 관리를 해주겠습니다.

 

 

import { 
    LOGIN_USER
} from '../_actions/types'

export default function (state = {}, action) {
    switch(action.tpye) {
        case LOGIN_USER:
            return { ...state, loginSuccess: action.payload }
            break;
            
        default:
            return state;
    }
}

_reducer디렉터리에 user_reducer.js파일을 생성하여 이렇게 코드를 작성했습니다.

주의할점!! state = {}안해주면 에러 발생합니다!!

(이거 때문에 진짜 고생했어요..)

action.type이 로그인유저이면 상태와 성공시 메세지를 리턴하네요!

 

이렇게 완성된 코드를 실행하고 데이터베이스에 있는 id로 로그인을 한뒤 redux extension을 보면 이렇게 성공했습니다!

728x90
저작자표시

'따라하며 배우는 시리즈 > NodeJS & ReactJS Basic' 카테고리의 다른 글

[ReactJS] 로그아웃 기능 구현하기  (0) 2022.09.20
[ReactJS] 회원가입 페이지 구현하기  (1) 2022.09.19
[ReactJS] class Component & functional Component  (0) 2022.09.17
[ReactJS] Redux 기초, Redux 설정  (1) 2022.09.16
[ReactJS] Antd CSS Framework  (0) 2022.09.15
    '따라하며 배우는 시리즈/NodeJS & ReactJS Basic' 카테고리의 다른 글
    • [ReactJS] 로그아웃 기능 구현하기
    • [ReactJS] 회원가입 페이지 구현하기
    • [ReactJS] class Component & functional Component
    • [ReactJS] Redux 기초, Redux 설정
    씨네
    씨네
    개발자 씨네가 공부하는 내용을 기록 겸 공유하는 블로그입니다!

    티스토리툴바