Node.js 교과서의 프로젝트를 다시 스스로 해보는 김에 Nodebird
(트워터의 클론 사이트)를 구현하는 게 아니라 내 프로젝트를 진행해 보면 어떨까 싶었다. 나름대로 프로젝트의 이름도 정했는데, Needog
이다. 발음은 니덕(...)으로 니덕분에 동물을 구했다는 김빠지는 네이밍을 했다.
사실 요새 Vue
를 공부하고 있긴 class가 기반이 되는 Vue가 영 재미가 없다. 물론 SFC
로 할 수는 있다고는 하지만 굳이 프로젝트를 하는데 시간을 더 들여서까지 뷰를 도입할 이유를 찾을 수가 없어서 일단은 보다 익숙한 React
로 Client-Side를 만들기로 했다.
서버는 뭐 노드 교과서로부터 시작한 것이니까 Express
를 사용하기로 했다.
와 그런데 확실히 서버와 드디어 통신할 수 있게 되니 데이터를 어떻게 구성하고 처리할 지 알 수 있게 되어서 너무 재밌다. 진작에 다른 사람들과 프로젝트를 참여해 볼 것을... 항상 부족함을 느껴서 혼자하게 되니까 결국 서버를 배우는 지경에 오게 되었다. 그래도 Nodejs
를 알아두는 것은 너무 좋은 일 같다. 다른 라이브러리라던가 네트워크도 훨씬 감각적으로 알 수 있게 되어서 좋다 😎
일단 가볍게 Client에 react-router-dom
을 이용해서 페이지를 몇 개 생성했다. 페이지 구성은 기존에 있는 사이트와 앱을 참고했다.
Header와 Footer컴포넌트도 navigation을 위해서 임의로 만들어 두었다.
Server 쪽은 간단하게 session
, 그리고 passport
를 이용한 기본적인 사용자 인증을 미들웨어로 설치해 두었다. mysql2
를 이용한 사용자 검색 함수도 구현해 두었다.
사용자가 이용한 페이지 렌더링은 모두 Client쪽에서 React를 통해서 제어할 것이므로 route는 일단 /
와 /auth
만 설정해 두었다.
일단은 Client/SignUp 페이지에서 Form을 통해 axios
로 데이터를 처리 받아서 MySQL서버에 유저 정보를 저장하는 식으로 생각했다.
그런데 전달 받은 id를 통해 table에서 유저를 찾는 함수인 findeUser
에서 자꾸 오류가 발생하였다.
findUser: async (where) => {
const [key, val] = Object.entries(where);
try {
const [user] = await promisePool.query(
`SELECT * FROM users WHERE ${key}=${val}`
);
return user;
} catch (error) {
console.log(error);
}
},
const [key, val] = Object.entries(where)
에서 첫 번재 오류가 있었다. Object.entries()
는 함수의 이름이 가리키듯이 [key, value] 을 element로 갖는 배열을 반환한다. 즉 [[key1, val1], [key2,val2], ...]
의 형태가 된다. 따라서 제대로 실제 코드에는 key에 배열이 들어갔고, val에는 undefined가 할당되었다.const [key,val] = Object.entries(where);
console.log(key); //Print: [id,val]
console.log(val); //Print: undefined | [id2,val2]
SELECT * FROM users WHERE ${key}=${val}
에서 자꾸 오류가 발생했다. 뭔가 싶어서console.log
를 찍어서 계속 확인 했는데 SQL 문법상 key는 문자열 표기("", '')를 할 필요가 없지만 val에는 문자열 표기를 했어야 했다. 따라서 SELECT * FROM users WHERE ${key}=$'{val}'
와 같이 수정하였다.마찬가지로 createUser
도 같은 문제가 있어서 수정하였다.
createUser: async (enrollment) => {
const keys = Object.keys(enrollment);
//const values = Object.values(enrollment);
const values = Object.values(enrollment).map(
(val) => '"' + val.toString() + '"'
);
try {
//바뀌기 전
//await promisePool.query(`
// INSERT INTO users (${keys.toString()})
// VALUES (${values.toString()});
//`);
await promisePool.query(`
INSERT INTO users (${keys.toString()})
VALUES (${values});
`);
} catch (error) {
console.log(error);
throw new Error("MySQL: failed to create a user");
}
실제 MySQL에서는 문자 표기를 계속 해왔는데 자바스크립트에서는 쿼리 구문 자체가 문자열로 표기되어있다 보니 나도 모르게 문자열 표기를 하는 것을 깜빡하게 되는 것 같다.