본문 바로가기
프로그래밍/database

[220216] Mysql 직접 사용해보기

by 한코코 2022. 2. 16.

Mysql의 탄생

유료인 오라클이랑 무료인 mysql이 있었는데 오라클이 mysql을 인수함. 그래서 둘다 유료가 되어버림.

근데 mysql을 오라클이 인수하고나서 신경을 안쓰니까 열받은 개발자들이 나와서 mysql이랑 같은걸 만든게 maria.db.

 

 

 

Mysql의 목적

데이터를 하드디크스에 저장하고, 그 데이터를 관리하기 위해서 만들어진 프로그램이다.

 

 

 

Mysql에 접속하기

brew install mysql
brew services start mysql

 

 

Mysql 문법 배우기

DDL 데이터베이스나 테이블을 만들때 씀

DML 테이블 안에 있는 데이터를 조작할때 씀 / 가장 많이 쓸 문법

DCL 권한설정, 자주 안 씀

 


 

Mysql로 요청/응답 확인하기

요청 보내기

curl : 요청을 보내는 명령어

-X POST : 요청의 리퀘스트 메소드를 POST로 보내겠다. 이게 없으면 기본요청인 GET으로 갈거임

주소 : 이 포트를 통해서 요청을 보내겠다. (server.js로)

curl -X POST http://localhost:3000

(응용)

curl -X POST -d "name=ingoo" http://localhost:3000

해석 : 헤더에 리퀘스트 메소드는 post로 보낼건데, 데이터는 "name=ingoo"라는 텍스트를 보낼거야

 

응답 받기

입력값이 무엇인가에 따라서 그에 맞춰서 다르게 받아야 한다.

let text = JSON.stringify(req.body) //JSON -> string
res.send(`hello ${text}\n`)

 

 

요청값 확인해보기, 요청 타입 확인하기

console.log(req.headers)
//결과값에서 중요한것 : 'content-type': 'application/x-www-form-urlencoded'
------
curl -X POST -d "name=ingoo&subject=bye" http://localhost:3000
  • body에 보낼 내용의 데이터 타입 : application/x-www-form-urlencoded : string 타입
    • 이걸로 app.use(express.urlencoded({extended:true}))가 실행된다.
  • app.use(express.urlencoded({extended:true}))
    • 기본적으로 body 데이터가 있을때마다 실행하는게 아니다!
    • 요청헤더 내용 중 컨텐츠 타입이 application/x-www-form-urlencoded <- 이거여야 실행된다.

 

curl -X POST\
-d "name=ingoo&subject=bye"\
-H "Content-type:JSON"\  //컨텐츠 타입을 JSON으로 보냄
http://localhost:3000
//결과값 hello {}
  • -H : 요청 헤더의 내용을 추가/수정이 가능하게 한다.
  • \ : 엔터같은 역할을 함.
  • 결과값으로 빈 객체가 나온 이유 : 망가진 코드기 때문.

위 코드랑 다른건 -H "Content-type:JSON"\가 추가된 점 밖에 없다.

그러면 어디를 잘못 보낸 걸까.

 

 

curl -X POST \
-d "name=ingoo&subject=bye" \
-H "Content-type:application/x-www-form-urlencoded" \
http://localhost:3000 

//결과값
hello {"name":"ingoo","subject":"bye"}

------------

curl -X POST \
-d '{"name":"ingoo","subject":"hi","content":"내용"}' \
-H "Content-type:application/json" \
http://localhost:3000

//결과 hello {}

코드 읽어보기

  • Post 리퀘스트 메소드 형태로 요청을 보낼거야
  • 데이터는 이러한 스트링으로 내용을 보낼거야
  • 헤더는/내가 보낼 내용들은 json 형태로 요청을 보낼거고 -> json형태라서 역시 빈객체 등장
  • url은 내 로컬호스트에 있는 3000번 포트를 통해서 보낼거야

 

미들웨어의 역할

요청 body 영역에 있는 string을 객체로 변환시키는 작업을 해 준다.

왜? 요청은 무조건 string으로 보내야 하기 때문.

근데 우리는 string그대로 받으면 사용을 못하니까 express 내장객체가 우리가 쓸 수 있도록 객체 형태로 바꿔서 준다.

 

이걸 읽기위해서는 app.use(express.json)이 필요하고, 코드를 추가하면 다음과 같은 결과가 나온다.

hello {"name":"ingoo","subject":"hi","content":"내용"}

 

 


 

Mysql을 사용하기 위한 권한 설정하기

권한을 설정해야하는 이유

creat database sample;

아무 설정도 하지않고 데이터 베이스를 생성하려고하면 오류가 생긴다. ---> ERROR (42000)

계정을 나눈다는것 = 권한을 각각 다르게 부여함(이게 목적)

따라서 권한을 설정할 줄 알아야함. -> 배포할때 제일 문제되는것.

 

 

 

권한을 먼저 주자

노드 패키지 매니지먼트 안에 있는 mysql 라이브러리는,

웹서버랑 데이터베이스가 서로 포트를 통해서 데이터를 주고받게 도와준다.

mysql을 사용할때 필요한 4가지는, 사용자명, 비밀번호, 데이터베이스 이름, ip주소.

const mysql = require('mysql')

let connection = mysql.createConnection({
    host:'172.23.11.131',
    user:'ingoo',
    password:'ingoo',
    database:'sample'
})

connection.connect((err)=>{
    if (err) throw err;
    console.log('connected')
})

mysql : host

USERID : 사용자명

PASSWORD : 비밀번호

이렇게 3가지를 입력해야 접속이 가능함.

sudo mysql -uUSERID -pPASSWORD

 


 

만약 실행이 안 될 경우

맥OS의 경우

네트워크가 잘 연결되어있는지 확인하자. (연결포트나 연결주소를 틀리지는 않았는지)

 

윈도우의 경우

아래의 코드를 실행하고 address값 안나오면 netstat이 설치되어 있지 않은것.

sudo apt install net-tools를 설치하자

sudo netstat -ntlp | grep mysqld

댓글