문제은행 DB 설계 분투기 8 - SQL문에서 변수 선언하기, exports 와 module.exports의 차이

양태환·2023년 9월 18일

인턴기

목록 보기
8/14
post-thumbnail

이제 데이터베이스의 데이터들을 CRUD 테스트를 진행 할 예정입니다.
MVC패턴으로 API를 구현해봐야죠

그럼 sql문을 작성하기 앞서
어떤 기능들을 만들어야할지 체크해봅니다.

업무 시작 전 업무 파악

  1. 문제 생성 기능 (CREATE)
    a. 문제 정보
    b. 문제 문항
    c. 문제 힌트
  2. 해시태그(문제 그룹핑) 이름 생성 기능
  3. 문제와 해시태그 매핑 기능

SQL문에서 변수 선언하기

sql문을 통해 가져올 때
이것이 변경해줘야할 값이다를 알려주기 위해
변수를 선언해서 작업해줄 예정입니다. - 참고한 블로그

SET과 @를 사용하여 데이터를 만들고
사용할 때는 @변수이름 으로 사용하면 됩니다.
ex) 
SET @user_id = 'user1';
SET @user_pwd = 'password1';
select * from QB_USER where USER_ID=@user_id AND USER_PASSWD=@user_pwd;

데모 프로젝트 코드에 login 기능 코드를 추가하여 넣어봤습니다.
이때 ejs를 통해서 화면에 뿌려주는데 이 ejs를 지금 짤 수는 없으니
일단은 postman을 통해서 확인해보겠습니다.

확인해보려고 postman에서 get 요청을 보냈더니 오류가 나서 일단 db관련 오류가 뜨는 것 같습니다. 먼저 연결을 진행하고 host이름을 MySQL에서 보고 잘 작성한 뒤에

다시 요청을 날려보니까

Error: Unknown database 가 계속 뜹니다..
왜일까요...ㅠㅠ


설정을 들어가보니
내가 "Connection Name"을 "database 이름" 쓰는 란에다가 쓰고있었다.
그래서 Error: Unknown database 'question_bank_db' 라는 오류가 계속 떴었다.

제대로 쓰려면 이렇게 써야한다.

그리고 require를 하면서 자동으로 connection pool을 생성하는 것 같다.
이건 보안사항이 담겨있을 수 있으니 따로 정리하는 걸로 하고 넘어간다.

module.exports와 exports 차이점

이제 다시 login함수 만들기를 진행해보려고한다.
그런데!
service함수 안에 있는 db 연결 함수 userCheck 함수가 자꾸 없다고 뜬다.
TypeError: userCheck is not a function

이유는

참조 글

require가 어떻게 이루어지는 지를 공부했고 - 참조
commonJS의 import 방법을 알아봤습니다. - 참조

결론은
1. 여러 개의 객체를 내보낼 경우
exports를 사용, import 도 여러 개로 나눠받아 사용
2. 하나의 객체로 내보낼 경우
module.exports를 사용, import 도 하나의 객체로 받아 사용


이 코드는 이렇게 module.exports 변수 자체에 여러 함수를 모아 할당해주는 것이기 때문에 {} 괄호를 써줘야하는 것이었습니다.

SQL문에 변수 데이터 값은 무조건 '' 따옴표로 감싸주기

이제 postman요청을 날렸을 때 뜨는 오류가 달라졌습니다.

SET @user_id = 'user1';
SET @user_pwd = 'password1';
select * from QB_USER where USER_ID=@user_id AND USER_PASSWD=@user_pwd;

제가 이런 쿼리를 담아서 날렸습니다.

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use 
near 'SET @user_pwd = 'password1';

그랬더니 이런 오류가 떴습니다.
SET을 쓰면 안 되는 건가 싶어서 SET 문법과 @문법을 지우고 날려봤습니다.

Error: Unknown column 'user1' in 'where clause'
이런 오류가 떠서 곰곰히 보는데

SELECT * FROM company_work_db.QB_USER WHERE user_id='user1' AND user_passwd='password1';

이 쿼리문은 MySQL문에서는 잘 동작하는데

SELECT * FROM company_work_db.QB_USER WHERE user_id=${user_id} AND user_passwd=${user_pw};

이 쿼리문은 잘 동작하지 않았습니다.

비교를 해보니
user_id 뒤에 쓰는 변수를 무조건 따옴표로 감싸줘야했습니다.
저는 변수가 들어가서 따옴표 없이 넣어줘도 된다고 생각했는데 아니었습니다.


추가 공부 포인트

  1. require 함수의 이해
  2. exports 와 module.exports의 차이
  3. SQL문에서 '' 따옴표의 의미
profile
당신의 오류 제가 잡아드립니다.

0개의 댓글