2023.12.20(수)

🚥MariaDB GUI (MySQL Workbench)

  • MySQL :: Download MySQL Workbench에서 다운로드
  • 실행 후 MySQL Connections 오른쪽의 ⊕버튼 클릭
    • 127.0.01 = localhost = 내 컴퓨터
    • Port = docker에 mariadb 가져와서 설치 & 설정할 때 입력했던 port Docker Desktop을 실행시키면 바로 확인 가능
  • 왼쪽 Navigator의 아래쪽 Schemas 탭에서 database/schema 확인 가능
    (= SHOW DATABASES)
  • schema를 더블 클릭하면 굵게 표시되며 해당 schema 내에서 SQL 사용 가능
  • Query 창(SQL Editor)의 ⚡ 버튼을 누르면 작성한 SQL 실행 가능
  • 설정 : Edit > Preferences
  • Schema 생성 : Schemas 마우스 우클릭 > Create Schema…
  • Schema 내 Table 생성 : Tables 마우스 우클릭 > Create Table…

🛠️MySQL Workbench 실습

  • Youtube Schema
    • users Table
      • email(unique) & password 조합으로 로그인

        idemailnamepasswordcontactcreated_at
        1kim@mail.com김서형5678010-1234-5678
        2go@mail.com고민시3456010-9012-3456
        3cho@mail.com조미연1234010-7890-1234
        4lee@mail.com이혜인9012010-5678-9012
      • Table 생성

        +) created_at column 추가

      • GUI에서 Table에 직접 삽입

    • channels Table
      idnamesub_numvideo_cntuser_id
      1gominsi21580005462
      2kim_seohyung3360002481
      3gidle1202000045523
      4hyein.newjeans107300004924
      5noodle.zip49560004303
      • 하단 탭의 Columns에서 Foreign Keys로 이동해서 user_id column FK 설정
      • Table 생성
        • Apply 시 나오는 SQL에서 INDEX user_id_idx (user_id ASC) VISIBLE의 의미 (feat. ChatGPT)

          이 MySQL 쿼리는 데이터베이스 테이블에서 인덱스를 생성하는 명령입니다. 간단히 말해서, 이 명령은 "user_id" 열에 대한 인덱스를 만든다는 것을 나타냅니다.

          여기에서 사용된 용어를 설명하겠습니다:

          1. INDEX: 데이터베이스에서 검색 속도를 향상시키기 위해 사용되는 데이터 구조입니다. 인덱스는 특정 열(또는 열의 조합)에 대한 정렬된 복사본으로, 검색 작업을 빠르게 만들어줍니다.

          2. user_id_idx: 이 부분은 인덱스의 이름을 나타냅니다. "user_id_idx"는 이 인덱스의 이름이며, 쿼리를 통해 이 이름으로 인덱스에 접근할 수 있습니다.

          3. (user_id ASC): 이 부분은 인덱스가 어떻게 정렬되는지를 나타냅니다. "ASC"는 오름차순(ascending)을 의미하며, 따라서 "user_id" 열의 값이 오름차순으로 정렬된 인덱스가 생성됩니다.

          4. VISIBLE: 이 부분은 MySQL 8.0에서 추가된 옵션으로, 인덱스의 가시성을 나타냅니다. "VISIBLE"는 이 인덱스가 테이블에 실제로 보이는(visible) 인덱스인지를 나타냅니다. "INVISIBLE"로 설정하면 인덱스가 테이블에서는 보이지 않지만 쿼리 옵티마이저가 여전히 사용할 수 있습니다.

            ⇒ 모든 데이터를 순회하여 찾는 기존 방식 대신 Map처럼 해당 row를 바로 참조할 수 있는 index를 생성해서 검색 속도를 향상!

      • GUI에서 Table에 직접 삽입

🔗Node.js에 DB 연동

💡Tennis DB로 실습 recap

  • VS Code Terminal에 npm install --save mysql2로 Node.js에 나온 지 얼마안 된 따끈따끈한 mysql2 모듈 설치 (기존 mysql 모듈의 성능을 향상시킴🔗)

⌚Timezone setting

  • DB

    📢 화면에 보여지는 값만 바뀌는 것이고 실제 DB에 저장된 값이 바뀐 것 ❌
    값 자체는 항상 UTC로 저장됨🔗

    • 현재 time_zone 설정 확인 : SELECT @@global.time_zone, @@session.time_zone;

    • @@global.time_zone 설정 : SET GLOBAL time_zone = 'Asia/Seoul';

    • @@session.time_zone 설정 : SET time_zone = 'Asia/Seoul';

    • +) time zone 자세히 알아보기

      • 초기 상태
      • time_zone은 서버에 연결되는 session의 default time_zone을 결정하는 global value🔗
      • 서버에 연결되는 각 session에도 고유한 시간대 존재 : session의 time_zone은 처음에 global value인 time_zone의 값을 상속받음🔗
      • system_time_zone은 server가 시작될 때 OS 환경에서 읽어지고 time_zone 변수가 SYSTEM이라는 값으로 설정되었을 때 사용됨🔗

        ❓ OS 환경의 time zone대로 system_time_zone 변수가 설정된다면, 내 컴퓨터 시간은 한국 시간으로 잘 나오고 있는데 왜 time zone setting을 해주기 전에는 UTC로 나왔을까?

        • 잊지 말자. 우리는 Docker에서 DB를 사용하고 있다.
        • Docker Container의 Time Zone은 default로 UTC를 사용하기 때문에 system_time_zone 변수의 값이 UTC인 것이다.

      • 공식 문서 : Time Zones
    • 하지만 이렇게 SET 명령어로 설정한 time zone value는 서버가 재시작되면 사라지는 일회용임🔗 → 영구적으로 변경하려면 mariadb option file을 직접 수정해주어야 함

  • Node.js mysql/mysql2 module
    다음 4개 option 정도는 알고 있자.🔗
    connection-optionDescriptionDefault value+
    host접속할 database의 hostname.localhostlocal에서 실행하므로 그냥 default 값을 사용하면 됨
    portport number.3306이미 mariadb의 port number를 3306으로 설정해두었으므로 그냥 default 값을 사용하면 됨
    timezoneMySQL server에 구성된 timezone.
    JavaScript의 Date 객체를 type cast할 때 사용되는 timezone.
    'local''Z', +HH:MM 또는 -HH:MM 형태의 offset 사용 가능.
    'local''Asia/Seoul'로 설정해주면 됨
    dateStringsDate types (TIMESTAMP, DATETIME, DATE)를 JavaScript Date 객체로 확장하지 않고 String으로 반환하도록 강제.
    true/false 또는 String으로 받을 type name들의 array 가능.
    falsetrue로 설정하여 date type들을 JavaScript Date 객체로 받지 않고 String으로 받기

▶️테스트

// get the client
const mysql = require('mysql2');

// create the connection to database
const connection = mysql.createConnection({
    // host: 'localhost',
    // port: 3306,
    user: 'root',
    password: 'root',
    timezone: 'Asia/Seoul',
    database: 'Youtube',
    dateStrings: true
});

// simple query
connection.query(
    'SELECT * FROM `users`',
    function (err, results, fields) {
        let { id, email, name, created_at } = results[0];
        console.log(id);
        console.log(email);
        console.log(name);
        console.log(created_at);
    }
);

잘 출력됨!

1
kim@mail.com
김서형
2023-12-20 19:16:32
profile
이것저것 관심 많은 개발자👩‍💻

0개의 댓글