ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SW 정글 95일차] 나만의 무기 3일차 (mysql 시작부터 거슬리네)
    기타/SW 사관학교 정글 2021. 11. 6. 13:29

    오늘은  nodejs와 mysql을 연동하여 로그인과 회원가입 기능을 만드는 것을 목표로 했다.

    실제 프로젝트에서 쓰이는 것이 아니라 일단은 간단하게 실습형태로 진행하려고 했다.

    nodejs는 2주 전부터 주말에 pintos에 집중이 안될 때마다 간간히 봐서 CRUD기능 구현과 Express 프레임워크까지 사용해봤다.

    그리고 우리는 DB로 mysql을 쓰기 때문에 mysql은 이전에 국비지원교육 때 써본 기억이 있어서 sql문만 복습하거나 ORM을 쓸 수도 있어서 일단은 nodejs와 mysql연동부터 시작하려고 했다.

     

    생활코딩 강의가 빠르게 학습할 수 있는 좋은 자료여서 생활코딩 강의로 시작을 알리고 딥하게 들어갈 수 있는 시간이 있으면 그렇게 하려고 계획을 잡았다.

    시작 시간은 9시 30분

    오늘은 sql구문과 js언어를 쳐보기도 전에 수 많은 걸림돌이 거슬리게 했다.

     

     

    1. mysql ubuntu 설치 에러

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 

    해결은 못했다...

    5시간동안 붙잡고 구글링해서 어떻게든 해결해보려고 했는데 결국 못하고 포맷을 하고 재설치를 했는데 똑같은 error가 발생했다.

    결국에는 시간 낭비를 하는 요소라고 생각하여 일단은 windows에 mysql설치하고 일단은 windows환경에서 nodejs와 mysql연동 실습을 시작하려고 했다.

     

     

    2. 변경사항

    생활코딩 강의의 시작은 mysql에 새로운 데이터베이스를 만드는 것이였다.

    생활코딩에서는 CREATE DATABASE [데이터베이스명]; 명령어로 새로운 데이터베이스를 만들면 된다고 했다.

    하지만 error가 발생했고 error 내용은 sql문이 현재 version에서 지원하지 않으니까 나는 못 알아듣겠어요였다.

    그래서 nodejs 교과서라는 책을 펼쳐 찾아보았는데 CREATE SHEMA 'opentutorials' DEFAULT CHARACTER SET utf8라고 나와있어서 버전이 바뀌면서 명령어가 바뀌었다고 생각하여 한 번 입력시켜보았더니 됐다.

    너무 오래된 강의는 오히려 독이다...

     

     

    3. windows 11은 보기(만) 좋은 감나무였다.

    맨 처음 mysql을 ubuntu에 설치할 때 마주한 에러를 해결하지 못하여 포맷을 했는데 windows 11을 설치시켜준다길래 한 번 경험해보고 싶어서 설치했다.

    포맷 후에 모든 개발 환경을 다시 세팅하고 windows 11에서 nodejs와 mysql을 설치하고 간단하게 새로운 데이터베이스 생성만 해봤는데 캡처 도구가 동작하지 않아 결국 window 10으로 rollback했다.

    캡처 도구는 나의 기록을 남기기위한 가장 중요한 도구여서 없으면 안되는 존재이다.

    그래서 결국 windows10으로 rollback을 하고 mysql이 삭제되어서 재설치를 진행하는데 이번에는 visual C++ 2017 x64를 설치하는데 걸림돌이 생겼다.

     

    mysql server와 mysql workbench를 설치하기 위해서는 visual C++ 2015-2019 x64를 설치해야했고 mysql installer에서 없으면 visual C++ 2017 x64를 진행시켜주는데 VC_RUNTIMEMINIMUM_X64.MSI ERROR가 계속 발생하는 것이다.

    기본적으로 VC_RUNTIMEMINIMUM_X64.MSI가 존재하는 설정된 경로에는 해당 파일이 없었고 파일 탐색기로 파일을 찾아 경로를 설정해줬는데 받기 싫은지 계속 error를 내뱉었다.

    그래서 기존에 존재하는 VC_RUNTIMEMINIMUM_X64.MSI를 찾어서 삭제하고 다시 진행했는데 계속 새로 생기면서 설치 진행이 안됐다.

    빠르게 구글링을 해서 error 해결법을 찾으려고 했다.

    찾은 해결법은 아래의 블로그에 나와있다.

    https://singingdalong.blogspot.com/2020/07/vc-runtimeMinimum-x64-msi-error.html

     

    vc_runtimeMinimum_x64.msi error | 프로그램 설치 및 제거 문제 해결사

    vc runtimeMinimum x64.msi error를 해결할 수 있는 마이크로소프트에서 제공하는 [프로그램 설치 및 제거 문제 해결사] 도구.

    singingdalong.blogspot.com

    이런 것들을 어떻게 다 알아내는지 신기하다...

    일단은 성장하는 과정이니까 이렇게 하나하나 알아가는 것도 나의 성장에 도움이 된다고 생각해야겠다.

     

     

     

     

    4. Error: ER_NOT_SUPPORTED_AUTH_MODE

    mysql 설치와 간단하게 bash에서 query를 던져서 table을 생성하고 값을 insert하는 것을 해보았다.

    그리고 nodejs에서 mysql 모듈을 사용하여 js로 mysql에 접근하려고 했는데 error가 떴다.

    구글링한 결과, 새로운 user를 입력시켜줘야한다는 것을 알았다.

    데이터베이스에 등록된 user가 있고 각각의 user들이 어떠한 IP를 가지고 있는 클라이언트로 접속하는지 알려주는 Host가 등록되어있다.

    user column으로 등록되어있는 이름을 가진 user이자 Hose column에 등록되어있는 IP를 가지고 접근하는 user만 데이터베이스에 접근이 가능하다.

    즉, 데이터베이스는 여러 user들이 등록되어서 접근할 수 있는 다중사용자 시스템이다.

    참고한 사이트는 아래의 url이다.

    https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql

     

    How To Create a New User and Grant Permissions in MySQL | DigitalOcean

    MySQL is a powerful database management system used for organizing and retrieving data. This tutorial explains how to to create new MySQL users and how to grant them the appropriate permissions.

    www.digitalocean.com

     

     

     

    5. 오늘 사용한 sql문

    1) show databases: 모든 데이터베이스 조회

    2) use [데이터베이스 명]: 해당 데이터베이스를 사용하겠다는 것을 알림. 이후 작성되는 sql문(insert, select 등)은 use로 선언된 데이터베이스에서 동작함.

    3) select * from [table명]: 해당 table에 있는 모든 tuple 조회

    이외 insert, update를 해봤다.

    코드는 npm에서 제공하는 mysql모듈 document를 참고했다.

    https://www.npmjs.com/package/mysql

     

    mysql

    A node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 100% MIT licensed.

    www.npmjs.com

     

     

     

    <오늘 궁금증>

    (1) db.query(`SELECT * FROM topic WHERE id = ${queryData.id}`, function(error2, topic)

    (2) db.query(`SELECT * FROM topic WHERE id = ?`, [queryData.id], function(error2, topic)

     

    일단 (1)번과 (2) 결과는 동일하다.

    (1)번은 데이터베이스가 가지고 있는 코드의 특성에 의해 공격을 당할 수 있다.

    (2)번은 id = ?에서 ?에 2번째 인자인 [queryData.id]가 자동으로 들어가는 구조로 공격의도가 있는 코드들은 세탁해주는 처리를 알아서하기 때문에 (2)번이 (1)번보다 훨씬 좋은 방법이다.

    왜일까??????????????

     

     


    [오늘의 나는 어땠을까?]

    오늘부터 개발을 위한 기초 공부를 시작했다.

    이전에 nodejs와 Express를 pintos에 집중이 안될 때마다 잠깐잠깐봐서 현재 가장 필요한 mysql에 익숙해지기 위한 공부를 했다.

    아침부터 mysql설치에 허덕이는 나를 보니 너무 한심했다.

    결국 해결하지 못하여 일단은 windows로 돌아오고...

    빠르게 학습해야하는 시점에서 이러한 사소한 것에 걸려서 앞으로 전진하지 못하는 것이 싫다.

     

    어제는 머릿 속으로 실시간성을 어떻게 구현할까?라는 생각을 했지만 그냥 기본부터 시작해야겠다.

    나는 아직 하수다.

    댓글

Designed by Tistory.