고양이와 코딩

[웹 풀 사이클 데브코스 TIL] 2주차 Day 5 - 웹 생태계 전반에 대한 실습(2) 본문

데브코스 TIL

[웹 풀 사이클 데브코스 TIL] 2주차 Day 5 - 웹 생태계 전반에 대한 실습(2)

ovovvvvv 2023. 11. 24. 15:00
728x90

1. 데이터베이스란 

데이터베이스 (DB) : 데이터를 통합하여 효율적으로 관리하기 위한 데이터 집합체. 데이터를 구조화하여 관리함으로써 데이터 중복을 막고, 효육적이고 빠른 데이터 연산을 가능하게 합니다 

 

DBMS(DataBase Management System) : 데이터베이스를 운영하고 관리하기 위한 것 
(ex ORACLE, MySQL, MariaDB ...)

 

SQL : 데이터베이스에 연산을 요청하기 위해 사용 되는 언어로 데이터를 생성, 조회, 수정, 삭제 .. 같은 기능을 수행합니다

  • 데이터 삽입: INSERT
  • 데이터 조회: SELECT
  • 데이터 수정: UPDATE
  • 데이터 삭제: DELETE

 

2. Docker 개요, 도커 설치, mariaDB 설치

도커 설치

https://www.docker.com/get-started/

 

Get Started | Docker

Get started with Docker Desktop and join millions of developers in faster, more secure app development using containers and beyond.

www.docker.com

What is a Container ?

 

mariaDB 설치

mac 기준 terminal에서

docker pull mariadb

오류 발생.....

계속 docker daemon이 실행중이지 않는다고 뜨네요 .....
해결하고 돌아오겠습니다 ㅎㅎ

...

두시간 삽질한 결과 블로그에 있는 이런 저런 방법은 다 안되고.. mac 소프트웨어 업데이트를 하니 제대로 실행되더군요.. ^^

이렇게 나오면 성공 !

 

docker run --name mariadb -d -p 3306:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root mariadb
docker exec -it mariadb /bin/bash 

// mariadb가 있는 컨테이너 접속
mysql -u root -p

// mariadb 실행

여기서 오류가 발생한다면(나)

mariadb -u root -p

이걸로 시도해주세요 !

 

Enter password 에는 root를 넣어줍니다 

ㅠㅠ성공.. ~~~

 

 

3. SQL : CREATE

저번 시간에 Docker로 MariaDB 실행했던 단계를 정리하고 갑시다

  1. Docker desktop 프로그램 실행
  2. cmd(윈도우) 또는 터미널(맥)실행
  3. mariadb가 있는 컨테이너 접속: docker exec -it mariadb /bin/bash
  4. mariadb 실행: mariadb -u root -p

데이터를 저장할 방(database) 만들기

  • 방 확인: SHOW DATABASES;
  • 방 만들기: CREATE DATABASE Tennis;
  • 방 들어가기: USE Tennis;

SHOW DATABASES;
CREATE DATABASE Tennis;  Tennis가 생겼습니다 !

 

USE Tennis;

 

CREATE TABLE member
(
	id INT,
    name VARCHAR(30),
    pwd VARCHAR(30),
)

이렇게 테이블을 생성 할 수 있어요

현재 테이블이 하나도 없는 상태에서 만들어 보도록 할게요 ㅎㅎ

 

앞서 말한 테이블 생성 명령어를 그대로 입력해서 테이블을 만든 후, SHOW TABLES; 로 확인해 봤습니다 👾

 

 

4. SQL: SELECT, INSERT

  • 테이블 데이터 조회 : SELECT 컬럼명 FROM 테이블명
  • 테이블 데이터 삽입 : INSERT 컬럼명1, 컬럼명2, ... INTO 테이블명 
                                   VALUES(컬럼1 데이터, 컬럼2 데이터, ...);

 

컬럼에 데이터를 추가하고 id만 뽑아봤어요 ( •̀ᴗ•́ )و ̑̑

 

그런데 만약 나중에 컬럼이 너무 많아진다면 모든 컬럼명을 볼 때 어떻게 해야할까요 ❓

SELECT * FROM member;

이렇게 *을 써주면 해당 테이블의 모든 컬럼이 보여집니다 ㅎㅅㅎ

 

  • 특정 데이터 조회 : SELECT 컬럼명 FROM 테이블명 WHERE 조건;

 

 

5. SQL : UPDATE, DELETE

  • 테이블 데이터 수정 : UPDATE 테이블명 SET 컬럼명 = 수정할 값 WHERE 조건;

tennisking의 pwd가 zzzzz로 바뀌었어요

 

만약 조건을 걸지 않고 바꿀 값만 설정해주면

모든 pwd가 sssss로 바뀐 걸 볼 수 있습니다!

 

  • 테이블 데이터 삭제 : DELETE FROM 테이블명 WHERE 조건; 
    * 마찬가지로 WHERE 절을 제외하면 데이터 전체 삭제가 가능합니다 

 

 

 

6. node.js에 db연동 준비, 설정 파일 만들기, SELECT 테스트

먼저 Tennis product 테이블을 생성해야해요

CREATE TABLE product
(
	id INT,
    name VARCHAR(30),
    description VARCHAR(100),
    price INT
 )

성공적으로 삽입 😺

 

이제 node.js와 db를 연결해봅시다 !
vscode 터미널에서 

npm instal mysql --save

❗️ 를 입력해주면, 또!!! 오류가 뜹니다...  오류가 절 지나치질 못하네요 ㅜㅜ ~

그래도 슬랙에 저와 같은 오류를 겪으신 분이 해결방법을 잘 올려주셔서 .. ㅎㅎ(감사합니다!!!)

npm init

후 다시 시도하면 정상적으로 작동합니다 

 

그리고 database / connect 폴더를 만들고, 그 안에 mariadb.js 파일을 생성해 준 뒤

const mariadb = require("mysql");

const conn = mariadb.createConnection({
  host: "localhost",
  port: 3306,
  user: "root",
  password: "root",
  database: "Tennis",
});

module.exports = conn;

이렇게 작성을 해 줍니다 !

 
다음으로 index.js 파일로 넘어가서 mariadb를 호출 해 줄게요

const mariadb = require('./database/connet/mariadb');
mariadb.connect();

 

그리고 requestHandler.js 파일에

const mariadb = require("./database/connect/mariadb");

function main(response) {
  console.log("main");

  mariadb.query("SELECT * FROM product", function (err, rows) {
    console.log(rows);
  });

 

이 코드를 추가 해주면

 

내가 만든 db갛... (감격 ( ⸝⸝ ᷇࿀ ᷆⸝⸝ƪ))

처음 배우는건 뭐든 재미있는 것 같아요.. 신기하구,..

 

 

7. 메인 페이지 연동하기 -1

이제 TennisMarket을 만든 폴더로 넘어가서 다시 서버를 구축해주도록 할게요 ! 
지금까지 했던 방법이랑 똑같이 하면 됩니다 ㅎㅎ

 

이제 localhost:8888을 입력하면 내가 만들어 놓은 mainpage가 뜨도록 해 볼거에요

화면을 바꾸려면 node.js가 제공하는 fs 라는 모듈이 필요해요. requestHandler.js파일을 이렇게 수정 해 줍니다.

const fs = require("fs");
const main_view = fs.readFileSync("./main.html", "utf-8");

const mariadb = require("./database/connect/mariadb");

function main(response) {
  console.log("main");

  mariadb.query("SELECT * FROM product", function (err, rows) {
    console.log(rows);
  });

  response.writeHead(200, { "Content-Type": "text/html" });
  response.write(main_view);

흠 ,, 경로로 전달하던 이미지를 따로 처리 해 주어야 해요

 

function redRacket(response) {
  fs.readFile("./img/redRacket.png", function (err, data) {
    response.writeHead(200, { "Content-Type": "text/html" });
    response.write(data);
    response.end();
  });
}

function blueRacket(response) {
  fs.readFile("./img/blueRacket.png", function (err, data) {
    response.writeHead(200, { "Content-Type": "text/html" });
    response.write(data);
    response.end();
  });
}

function blackRacket(response) {
  fs.readFile("./img/blackRacket.png", function (err, data) {
    response.writeHead(200, { "Content-Type": "text/html" });
    response.write(data);
    response.end();
  });
}

let handle = {}; // key:value 쌍으로 이루어진 변수 상자
handle["/"] = main;

/* image directory  */
handle["/img/redRacket.png"] = redRacket;
handle["/img/blueRacket.png"] = blueRacket;
handle["/img/blackRacket.png"] = blackRacket;

exports.handle = handle;

requestHandler.js 파일

 

 

8. 메인 페이지 연동하기 -2 (order)

function order(response) {
  response.writeHead(200, { "Content-Type": "text/html" });
  response.write("order page");
  response.end();
}

let handle = {}; // key:value 쌍으로 이루어진 변수 상자
handle["/"] = main;
handle["/order"] = order;

링크에 localhost:8888/order 를 입력하면 orderpage로 넘어가도록 코드를 수정했어요

😺

 

function order(response, productId) {
  response.writeHead(200, { "Content-Type": "text/html" });

  mariadb.query(
    "INSERT INTO orderlist VALUES(" +
      productId +
      ", '" +
      new Date().toLocaleDateString() +
      "');",
    function (err, rows) {
      console.log(rows);
    }
  );
let handle = {}; // key:value 쌍으로 이루어진 변수 상자
handle["/"] = main;
handle["/order"] = order;

requestHandler.js 에서 데이터를 삽입 해 주고, handle 은 라우터에서 작동하기 때문에 router.js로 이동해줍니다 !

 

function route(pathname, handle, respons, productId) {
  console.log("pathname: " + pathname);

  if (typeof handle[pathname] === "function") {
    handle[pathname](response, productId);
  } else {
    response.writeHead(404, { "Content-Type": "text/html" });
    response.write("Not Found");
    response.end();
  }
}

exports.route = route;

router에 productId를 추가하고, 그럼 또 route를 호출하는.. server.js 파일로 올라가야합니다 ( (༎ຶ⌑༎ຶ) )

 

let http = require("http");
let url = require("url");
const { query } = require("./database/connect/mariadb");

function start(route, handle) {
  function onRequest(request, response) {
    let pathname = url.parse(request.url).pathname;
    let queryData = url.parse(request.url, true).query;

    route(pathname, handle, response, queryData.productId);
  }

  http.createServer(onRequest).listen(8888);
}

exports.start = start;

server.js 파일,

       <input
          class="card_button"
          type="button"
          value="order"
          onclick="location.href='/order?productId=1'"
        />

main.html 파일의 버튼 부분을 이렇게 수정 해 주세요. 
그리고 나서 데이터베이스를 확인하면

❗️여기에서도 강의를 그대로 따라했는데 계속해서 undefined 값만 받아졌는데요, ㅜㅜ 또 긴 시간 삽질 후.. 

vscode를 다 껐다가 재실행 하고 서버도 다시 여니 

이렇게 데이터가 잘 들어왔답니다.. ^ ,^ 

 

 

❗️추가로 node.js와 연결 한 뒤로부터 계속 css 적용이 되지 않았는데요,,

검색해보니 거의 다 express로 사용하길래 저는 지금 환경 그대로에서 server.js 코드만 수정 했더니 문제가 해결 되었어욥

let http = require("http");
let url = require("url");
let fs = require("fs");

function start(route, handle) {
  function onRequest(request, response) {
    let pathname = url.parse(request.url).pathname;

    if (pathname === "/main.css") {
      // css 파일을 읽어옵니다.
      fs.readFile(__dirname + "/main.css", function (err, data) {
        if (err) {
          response.writeHead(500, { "Content-Type": "text/plain" });
          response.write("Error loading CSS file");
          response.end();
        } else {
          response.writeHead(200, { "Content-Type": "text/css" });
          response.write(data);
          response.end();
        }
      });
    } else {
      // 다른 요청은 라우팅 핸들러로 전달합니다.
      let queryData = url.parse(request.url, true).query;
      route(pathname, handle, response, queryData.productId);
    }
  }

  http.createServer(onRequest).listen(8888);
}

exports.start = start;

기존에 있던 queryData 부분은 라우팅 핸들러로 전달하게끔 바꿔주고 if문에 css 파일을 불러오는걸로 추가했더니 해결 됐습니다 ㅎㅎ

(이게 잘 하는 방법인진 모르겠지만 ~)

 

다음 강의는 orderlist 페이지를 db와 연동 시켜서 <th></th> html 태그 안에 데이터를 받아오는 걸 실습 해 보고
강사님이 힌트(??) 를 주시는 ㅎㅎ식으로 진행됐습니다 ...
처음 접하는 내용이라 계속 머리가 어렵다 어렵다 어케하지 이런생각을 하는데요,
송아 강사님께서 계속 하나도 ~~ 어렵지 않다고 말 해 주시는 덕분에 쉽게 생각할 수 있었던 것 같아요 🍀