코딩은 정말 신기하다. 남이 짠 (잘 동작하는) 코드를 볼때는 '오 알거같아!' 라고 생각하지만 내가 똑같은 기능을 구현하려고 하면 이리저리로 에러를 엄청나게 많이 맞이하게 된다. 이번에도 잘 짜여진 코드를 보면서 '아 이런식으로 구현하면 되는구나' 하고 이해하고나서 내가 직접 하려고 하니 왜이렇게 어려운지.
🤓
무려 이틀동안 고생하면서 헤메다가, 드디어 post 중복방지 기능을 구현했다. 이틀을 헤메면서 과연 성공이 가능한걸까..? 하는 막막함이 들었는데 오늘 드디어 헤메다가 기능을 구현해서 진짜 너무너무 기뻤다. (내가 이걸 하다니....!)
나중에 또 헷갈릴까봐 내가 겪은 에러들을 기록해두려고 한다. 덤으로 내가 배웠던 것들을 저장해놓고 mysql2를 쓰면서 나와 같은 에러가 있는 사람들이 있다면 참고가 되었으면 좋겠다.
<나의 상황>
get으로 mysql에 있는 내용을 가지고 오는것 까지는 완료했으나, post기능을 구현하는 중에 중복 이메일을 걸러야 하는 쿼리를 작성하고 있었다. 그런데 아무리 해도 중복가입 방지가 안됐다.
아얘 1)가입 자체가 안되거나 2)모두다 가입이 되거나 둘중 하나만 되어서 계속 애를 먹었던 상황.
내가 쓰는 mysql2 깃헙 사용 설명을 보면서 작성했는데, 일단 링크도 나중에 참고하기 위해 글에도 넣어둔다.
https://github.com/sidorares/node-mysql2
* 처음 작성한 post 기능: 회원 가입(중복 방지기능 없음)
처음에 일반 post로 작성을 할 때에는 아래처럼 코드를 작성했다.
connection.query()를 이용해서 바로 mysql에 쿼리를 입력하면 되니까 그리 어렵지는 않았다.
하지만 중복 방지 기능을 넣으려고 하니까 이야기가 달라졌다.
중복 방지를 하기 위해서는 "쿼리 결과값"을 가지고 와서 "비교"를 하는 수식을 넣어야 했는데
아무리 해도 connection.query()를 이용해서는 결과값을 빼내 올수가 없었다.
🤦♀️
깃헙에 나와있는 걸로는 result 값에 결과값이 담기기는 했으나
문제는 그걸 빼내오는게 계속 안되었던것.
그래서 코드를 계속 수정하다가 발견해서 수정한 에러들이다.
<중복방지 기능 안된 이유 1>
if() {} elise if() {} 에서 중괄호를 안써줌
이때까지만 해도 계속 connection.query를 쓰면서 그 값을 빼오려고 했는데
이때 처음에는 아얘 이미 가입된거가 걸러지지 않는 상태였다.
같이 수업 들으시는 분께 물어보았더니 if() elise if() 쓸때 if(){} 중괄호를 써줘야 한다고 알려주셨다.
그랬더니 중복 방지가 걸려졌지만, 모든 가입을 다 막아버렸다. 결국 신규 가입이 안되는 문제가 발생.
.... 아무리 해도 중복 방지 + 신규회원가입 두개가 같이 되는 코드가 안되었다.
<중복방지 기능 안된 이유 2>
결과값을 못가져와서 결국 promisePool.query() 사용
안되는 이유가 결국 아까와 동일하게 "results"로 결과값을 못가져오는 문제여서
결국은 connction.query()말고 const [rows]로 쿼리 결과값을 받아오는 promisePool.query()를 사용하는것으로 변경하게 되었다.
그래서 코드를 모두 promisePool.query()로 변경해서 작성했다.
<중복방지 기능 안된 이유 3>
쿼리문 작성시 ' ' 이 없어서 쿼리를 제대로 읽어오지 못함
44번째 줄에, ' ${email} ' 이 아닌 ${email}로 썼더니 정보를 읽어오지 못했다. 그래서 ①에서 '${email}'로 수정해주니 일단 쿼리를 제대로 읽어와서 rows로 가져올수 있게 되었다.
<중복방지 기능 안된 이유 4> if문에 값을 비교할때
if(rows !== [ ] ) 를
if(rows[0] !== undefined)로 변경
.
if(rows !== [] )로 작성했을때 값 비교를 읽어오지 못했다.
값은 잘 가지고 오는데, 이번에는 비교문 작성이 안되는것이다.
콘솔로 rows를 보면 --> 회원 가입이 안되어있는 상태일때 [ ]로 값을 읽어오길래
비교를 [ ]로 했는데, 이 부분을 계속해서 읽어오지 못하는 것이다.
처음에는 if 비교를 할때 47번째줄 2번을 undefined가 아닌 if (rows !== [])로 작성을 했었다.
계속 안되어서 이번에는 rows[0]번째를 가지고 왔더니 콘솔에 undefined로 나오길래
비교를 if (rows !== [])에서 if(rows[0] !== undefined)로 변경했다.
그랬더니 드디어 중복방지+회원가입 기능이 완료됐다.
정말 별거 아닌것 같은데 이 문제를 해결하기 위해 며칠이 들어갔는지. 😥
그래도 문제를 파악하고 해결해가는 능력이 하나둘 생겨가는것 같아서 감사하다.
너무 기쁜 마음으로 포스팅!
'백엔드' 카테고리의 다른 글
mongodb에서 useNewUrlParser, useUnifiedTopology 쓰는 이유 (0) | 2023.07.01 |
---|---|
sessionStorage (0) | 2023.06.22 |
노드 회원가입, if else문 중복 값 전송에러. Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client (0) | 2023.06.22 |
index.js에는 어떤 내용이 들어가야 할까? (0) | 2023.06.22 |
프로젝트 프로세스 기록(JavaScript) (0) | 2023.06.22 |