MySQL
React, MySQL 11일차 (로그아웃과 댓글 삭제하기)
수연 (Suyeon)
2023. 10. 28. 23:55
반응형
PedroTech님의 풀스택 강의 11일 차를 참고했습니다.
📌 Logout 버튼과 Logout 함수 생성하기
// ./client/App.js
function App() {
const [authState, setAuthState] = useState({
username: "",
id: 0,
status: false,
});
useEffect(() => {
axios
.get("http://localhost:3001/auth/auth", {
headers: { accessTocken: localStorage.getItem("accessTocken") },
})
.then((response) => {
if (response.data.error) {
setAuthState({ ...authState, status: false });
} else {
setAuthState({
username: response.data.username,
id: response.data.id,
status: true,
});
}
});
}, []);
const logout = () => {
localStorage.removeItem("accessTocken");
setAuthState({ username: "", id: 0, status: false });
};
return (
<div className="App">
<AuthContext.Provider value={{ authState, setAuthState }}>
<BrowserRouter>
<div className="nav">
<Link to="/" className="link">
Home Page
</Link>
<Link to="/createpost" className="link">
Create A Post
</Link>
{!authState.status ? (
<>
<Link to="/login" className="link">
Login
</Link>
<Link to="/registration" className="link">
Registration
</Link>
</>
) : (
// 로그아웃 버튼을 생성합니다.
<button
type="button"
className="logoutBtn"
onClick={() => {
logout();
}}
>
Logout
</button>
)}
<h2 className="username">{authState.username}</h2>
</div>
<Routes>...
</Routes>
</BrowserRouter>
</AuthContext.Provider>
</div>
);
}
export default App;
변수 해석
1. authState: username은 사용자 이름(로그인ID)이고, id는 User 테이블에 로그인 정보가 저장되었을 때 id값이고 state는 로그인을 한 상태를 나타냈습니다.
함수 해석
1. logout(): localStorage에 저장했던 로그인 정보를 삭제하고, authState를 초기화 해줍니다.
📌 로그인할 때 정보 전달하기
// ./client/pages/Login.js
function Login() {
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const { setAuthState } = useContext(AuthContext);
let navigate = useNavigate();
const login = () => {
const data = { username: username, password: password };
axios.post("http://localhost:3001/auth/login", data).then((response) => {
if (response.data.error) {
alert(response.data.error);
} else {
localStorage.setItem("accessTocken", response.data.tocken);
// 로그인 상태를 변경해줍니다.
setAuthState({
username: response.data.username,
id: response.data.id,
status: true,
});
navigate("/");
}
});
};
return (...
);
}
export default Login;
로그인 화면에서 성공적으로 로그인 했을 때 setAuthState를 활용해서 정보를 수정해줍니다.
📌 결과(로그인/로그아웃)
📌 댓글 삭제 router 생성하기
// ./server/routes/Comments.js
router.get("/:postId", async (req, res) => {...
});
router.post("/", validateTocken, async (req, res) => {...
});
// 댓글 삭제해주는 router을 생성합니다.
router.delete("/:commentId", validateTocken, async (req, res) => {
const commentId = req.params.commentId;
await Comments.destroy({
where: {
id: commentId,
},
});
res.json("DELETED SUCCESSFULLY");
});
module.exports = router;
router.delete("/:commentId") 코드 해석
1. router.delete: 해당 router가 호출되면 특정 데이터를 삭제할 수 있습니다.
2. req.params.commentId: commentId라는 파라미터를 가져옵니다.
3. Comments.destory({where: {id: commentId}}): Comments 테이블에서 where(조건)과 맞는 데이터를 삭제해줍니다.
4. res.json(): 처리를 다 했을 때 res.json을 해줘야 삭제했을 때 새로고침이 되어서 적용된 화면을 바로 사용자에게 보여줍니다.
📌 댓글 삭제 버튼과 함수 생성하기
// ./client/src/pages/Post.js
function Post() {
let { id } = useParams();
const [comments, setComments] = useState([]);
const { authState } = useContext(AuthContext);
useEffect(() => {...
}, []);
const addComment = () => {...
};
// 댓글 삭제 함수를 생성합니다.
const deleteComment = (id) => {
axios
.delete(`http://localhost:3001/comments/${id}`, {
headers: {
accessTocken: localStorage.getItem("accessTocken")
},
})
.then(() => {
setComments(
comments.filter((val) => {
return val.id !== id;
})
);
});
};
return (
<div className="postPage">
<div className="leftSide">...
</div>
<div className="rightSide">
<div className="addCommentContainer">...
</div>
<div className="listOfComments">
{comments.map((comment, key) => {
return (
<div key={key} className="comment">
<span>{comment.commentBody}</span>
<label>Username: {comment.username}</label>
{authState.username === comment.username
&&
// 댓글 삭제 버튼을 생성해줍니다.
( <button
type="button"
className="deleteBtn"
onClick={() => {
deleteComment(comment.id);
}}
>
X
</button>
)}
</div>
);
})}
</div>
</div>
</div>
);
}
export default Post;
변수 설명
1. authState: 로그인의 정보를 저장하고 있는 변수입니다.
2. comments: 전체 댓글을 저장하고 있는 변수입니다.
deleteComment 코드 해석
1. axios.delete(`http://localhost:3001/comments/${id}`): 삭제 router을 호출하는 axios입니다.
2. then(): 성공적으로 댓글을 삭제했을 때 삭제한 댓글ID와 다른 댓글들만 comments에 저장합니다.
return 코드 해석
1. authState.username === comment.username && <button></button>:
현재 로그인한 사용자와 댓글을 작성한 사용자가 같을 때만 삭제 버튼을 보여줍니다.
📌 결과(댓글 삭제)
📌 느낀 점
댓글 삭제를 하기 위해 처음으로 delete기능을 수행하는 router를 생성해보니 정말 새로웠고 덕분에 DB에서 데이터를 삭제하는 방법에 대해 알게 되어 뿌듯합니다!
또 로그인한 사용자에게만 댓글 삭제 버튼을 보여주는 방법이 생각보다 쉬워서 나중에 사용해야할 때 쉽게 적용할 수 있을 것 같습니다.
덕분에 저의 지식이 늘어나는게 느껴져 성장하는 하루를 보낼 수 있었습니다!
다음에는 또 어떤 기능에 대해 배우게 될지 아주 기대가 되네요..!!
728x90