React

[ React ] TodoList3️⃣ 로그인/로그아웃

Mungwang 2023. 9. 12. 12:33

💎 React code

📣 App.js

- Login 처리를 위한 컴포넌트를 생성해주고 improt를 진행한다.

- export const TodoListContext = createContext() : export 내보내기를 통해 TodoListContext를 전역변수로 사용하겠다!!

<TodoListContext.Provider value={ {setTodoList, setLoginMember, loginMember} }>

: ContextApi를 이용해서 자식컴포넌트에게 담아준 3개의 값을 사용할수있게한다.

 

 
  import React, { useState, createContext } from 'react';
  import './App.css';

  import SignupContainer from './Signup';
  import Login from './Login';

  export const TodoListContext = createContext(); 

  function App() {
    // 회원가입, 로그인, 회원의 Todo List출력/추가/제거
    const [ signupView, setSignupView ] = useState(false);
     
    // 09-12 추가
 
    // 로그인한 회원 정보 저장
    const [ loginMember, setLoginMember] = useState(null);

    // 로그인한 회원의 todo-list를 저장
    const [ todoList, setTodoList ] = useState([]);

    return (
      <TodoListContext.Provider value={ {setTodoList,setLoginMember,loginMember} }>
        <button onClick={()=>{setSignupView(!signupView)}}>
          {signupView ?('회원 가입 닫기') : ('회원가입 열기')}
        </button>

        <div className='signup-wrapper'>
          {signupView === true && (<SignupContainer/>)}
        </div>
 
        // 09-12 추가

        <h1>Todo List</h1>
        <Login/>

      </TodoListContext.Provider>
 
    );
  }

  export default App;
 

📣 Login.js

- improt { TodoListContext } from './App' : export로 전역변수 선언해둔 TodoListContext를 사용하겠다는 improt!

- 'Accept' : 'application/json' : 응답데이터타입을 Spring에서 json형태로 받아주는것아닌 react에서 json형태로

   받겠다고 선언하는 구문

 

   
    import React, { useState, useContext } from 'react';
    import { TodoListContext } from './App';
    const LoginComponent = () => {

        // 전역변수 Context를 사용
        const { setTodoList, setLoginMember, loginMember} = useContext(TodoListContext);

        const [id, setId] = useState('');
        const [pw, setPw] = useState('');

        const login = () => {
            fetch('/login', {
                method : 'post',
                headers : {
                    // 전달되는 데이터 타입
                    'Content-Type' : 'application/json',

                    // 응답 데이터 타입
                    'Accept' : 'application/json'
                },
                body : JSON.stringify({
                    id : id,
                    pw : pw
                })


            })
            .then(resp => resp.json())
            .then(map =>{
                console.log(map);

                // 로그인 실패 시
                if(map.loginMember === null){
                    alert('아이디 또는 비밀번호가 일치하지 않습니다.');
                    return;
                }

                // 로그인 성공시
                setLoginMember(map.loginMember);
                setTodoList(map.todolist)
               
                setId('');
                setPw('');
            })

        };
         
        // 로그아웃 
        const logout = () => {

            setLoginMember(null);


        };

        return (
            <div className="login-container">
                <table>
                    <tbody>
                        <tr>
                            <th>ID</th>
                            <td>
                                <input type="text" onChange={e => setId(e.target.value)} value={id} />
                            </td>
                        </tr>

                        <tr>
                            <th>PW</th>
                            <td>
                                <input type="password" onChange={e => setPw(e.target.value)} value={pw} />
                            </td>
                            <td>
                                <button onClick={login} >Login</button>
                            </td>
                        </tr>
                    </tbody>
                </table>
                {loginMember && (
                    <button onClick={logout}>로그아웃</button>
                )}
            </div>        
        );
    }

    export default LoginComponent;
 

- {loginMember && (<button onClick ={logout}>로그아웃</button>)} 

 : && 기준으로 왼쪽에있는게 true라면 오른쪽 구문실행 ( loginMember의 값이 null 이아니면 true )


💎 Spring

📣 Dto

@Getter
@Setter
@ToString
public class TodoMember {
	
	private int todoMemberNo;
	private String id;
	private String pw;
	private String name;;

}

📣 Controller

@RestController
public class TodoController {
   
   // org.slf4j.Logger : 로그를 작성할 수 있는 객체
   // org.slf4j.LoggerFactory
   private Logger logger = LoggerFactory.getLogger(TodoController.class);
   
   @Autowired
   private TodoService service;   
   
   @PostMapping("/login")
   public Map<String, Object> login(@RequestBody TodoMember member){ 
      return service.login(member);
   }
}

📣 Service

public interface TodoService {
   Map<String, Object> login(TodoMember member);
}

📣 ServiceImpl

@Service
public class TodoServiceImpl implements TodoService{

   @Autowired
   private TodoDao dao;
   
   @Override
   public Map<String, Object> login(TodoMember member) {
      
      TodoMember loginMember = dao.login(member);
      
      Map<String, Object> map = new HashMap<>();
      map.put("loginMember", loginMember);

      if(loginMember != null) {
         List<Todo> todoList = dao.selectTodoLst(loginMember.getTodoMemberNo());
         map.put("todoList", todoList);
      }
      
      return map;
   }
}

📣 Dao

@Repository
public class TodoDao {
   
   @Autowired
   private SqlSessionTemplate sqlSession;

   public TodoMember login(TodoMember member) {
      return sqlSession.selectOne("todoMapper.login", member);
   }
}

📣 Mapper

<resultMap type="TodoMember" id="todoMember_rm">
      <id property="todoMemberNo" column="TODO_MEMBER_NO" />
      <result property="id" column="ID" />
      <result property="pw" column="PW" />
      <result property="name" column="NAME" />
   </resultMap>
   
   <resultMap type="Todo" id="todo_rm">
      <id property="todoNo" column="TODO_NO" />
      <result property="title" column="TITLE" />
      <result property="isDone" column="IS_DONE" />
      <result property="todoMemberNo" column="TODO_MEMBER_NO" />
   </resultMap>
   
   <select id="login" resultMap="todoMember_rm">
      SELECT * FROM TODO_MEMBER
      WHERE ID = #{id}
      AND PW = #{pw}
   </select>