[프로그래머스] 백엔드심화(3)

Lina Hongbi Ko·2024년 9월 21일
0

Programmers_BootCamp

목록 보기
22/76
post-thumbnail

2024년 9월 13일

✏️ workbench 시작, Select

  • Docker 시작 -> mariadb running

  • MySQL Workbench 시작

    1. Stored Connection : 이미 만들어져 있는 Database 선택 가능

    2. Connection Method : Standard TCP/IP

      • TCP / IP : 패킷 통식 방식의 인터넷 프로토콜인 IP와 전송 조절 프로토콜인 TCP로 이뤄져있다. TCP/IP를 사용하겠다는 것은 IP 주소 체계를 따르고 IP Routing을 이용해 목적지에 도달하며 TCP의 특성을 활용해 송신자와 수신자의 논리적 연결을 생성하고 신뢰성을 유지할 수 있도록 하겠다는 것을 의미
        • 즉, 송신자가 수신자에게 IP주소를 사용해 데이터를 전달하고 그 데이터가 제대로 갔는지, 너무 빠르지는 않았는지, 제대로 받았다고 연락은 오는지에 대한 이야기를 하는 것
      • https://aws-hyoh.tistory.com/57 참조
    3. Hostname : 127.0.0.1 → localhost (데이터베이스 서버에 접근하기 위한 컴퓨터의 주소값_IP), 나 스스로를 가리키는 주소값임

    4. Port : 3306 (데이터베이스 설치할 때 잡았던 넘버)

    5. Username: root

    6. Password : 현업에서 데이터베이스에 접근할 때 미리 설정해 놓기는 함

    7. OK

    8. 만들어진 Connection 입장

  • select : SELECT * FROM posts; + 번개모양 클릭

  • 스키마를 더블클릭하고 쿼리를 요청해야함

✏️ 유튜브 users 테이블 생성

  • 스키마 생성
    : 스키마창 → 오른쪽 버튼 클릭 → Create Schema → Schema name: Youtube → Apply

  • 테이블 생성
  1. Youtube 스키마 더블 클릭 → Tables 오른쪽 버튼 클릭 → Create table → Name : users → 컬럼 만들기
    *요즘에는 로그인 할 때 이메일로 로그인 하기 때문에(이메일은 무조건 고유하게 받음 → 주소가 겹칠 수 없어서 userid처럼 사용할 수 있음) db 테이블을 수정하고 코드도 수정할 예정 (트렌드에 맞게 가보자!)

  1. 체크리스트
    • PK : Primary Key
    • NN : Not Null
    • UQ : Unique
    • B…: Binary
    • UN : Unsigned(부호 없음)
    • ZF: Zero Fill
    • AI: Auto Increment
    • G : Generated Column
    • Default/Expression
  2. 테이블 생성
    *ASC : Ascending : 오름 차순 ↔ DSC : descending : 내림 차순

✏️ 유튜브 channels 테이블 생성

  1. Youtube 스키마 더블 클릭 -> Tables 오른쪽 클릭 → Create Table → Name : channels -> 컬럼 만들기

  2. FK 만들기

  • user_id(INT) + Foreign Keys 탭 → Foreign Key : user_id(조건의 이름) + Referenced Table : ‘Youtube’, ‘users’ → Foreign key details ‘user_id’ : Column → user_id 체크 / Referenced Column → id(users테이블의 id임)

  • 다시 Columns 탭으로 돌아와서 → 마름모 색깔이 달라진 것을 확인 할 수 있음 -> Apply

✏️ 데이터 삽입

  • users 테이블 데이터 삽입

    • users -> 테이블 번개 모양 이모지 클릭

    • Result Grid 창 확인 할 수 있음

    • Result Grid창의 +컬럼 이모지 클릭

    • id, email, name, password, contact 입력 → Apply


    • SELECT * FROM Youtube.users; + 번개모양

  • id 값은 Auto Increment이기 때문에 자동으로 입력됨

    • 그러나, 내가 의도적으로 id에 다른 숫자를 입력하고 또 데이터를 삽입하면 그 숫자 다음의 수가 나옴 → 따라서, 내가 처음부터 id를 만들 것이면 처음부터 직접 써야한다
    • auto increment를 사용한다면 그냥 db에 맞기는게 편함
  • channels 테이블 데이터 삽입

    • user_id는 user의 id를 참조해서 넣어야 에러가 나지 않음

    • sub_num과 video_count는 defultfmf 0으로 설정해주었기 때문에 아무값도 입력하지 않으면 0이 입력됨

✏️ DB 연동

  • npm install —save mysql2
  • db.js 생성
    - npm 웹페이지에서 시작하는 쿼리 복사 붙여넣기 + 추가 데이터 입력
// db.js

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

// create the connection to database
const connection = mysql.createConnection({
	host: 'localhost',
	user: 'root',
	password: 'root',
	database: 'Youtube'
});

// simple query
connection.query(
	'SELECT * FROM `users`',
	function(err, results,fields) {
		console.log(results);
		console.log(fields);
	}
)

서버 재생 <docker 확인 → stop 후 restart 해주기 (너무 오래 켜져 있으면)>

results: users 테이블을 json array 형태로 보여줌 / fileds: 컬럼의 정보 배열로 보여줌

✏️ DB 결과 json array 비구조화, created_at 추가

  • db는 json array형태이므로 배열에서 데이터를 하나씩 꺼내 쓴다고 생각하면 easy!
  • 비구조화를 통해 배열의 데이터를 빼보자
// db.js

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

// create the connection to database
const connection = mysql.createConnection({
	host: 'localhost',
	user: 'root',
	password: 'root',
	database: 'Youtube'
});

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

  • 언제 가입 했는지에 대한 정보를 넣어주기 위해 users에 date 칼럼 넣기
    • users 테이블 오른쪽 연장 아이콘 클릭 → 칼럼 추가 → created_at(TIMESTAMP) + Default/Expression : CURRENT_TIMESTAMP() [NOW 라고 적어도됨] -> Apply

❗️ 참고 : TIMESTAMP() → () 안에 들어가는 내용은 숫자가 들어가는데, 초 뒤에 소수점을 찍어줄 수 있는 몇자리까지 상세히 보여줄까 하는 자릿수를 적음

  • 새로운 데이터를 삽입해보면, created_at에 새로운 시간이 삽입 된 것을 알 수 있음

  • created_at 비구조화에 넣어주기
// db.js

... 생략 ...

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

그런데 시간 셋팅이 다르다는 거을 알 수 있음 -> 9시간 차이

✏️ timezone 설정

  • node.js에서의 시간과 db에서의 시간이 맞지 않으므로 맞춰줘야 함
  • 데이터베이스 커넥션 할 때의 시간대를 맞춰보자
// db.js

... 생략 ...
const connection = mysql.createConnection({
	host: 'localhost',
	user: 'root',
	password: 'root',
	timezone : 'Asia/Seoul',
	database: 'Youtube'
});

... 생략 ...

Ignore 되는 것을 볼 수 있다.

  • 데이터베이스 자체에서 시간대를 맞춰보자
    • 쿼리 : SET GLOBAL time_zone = ‘Asia/Seoul’; + 번개모양

    • SELECT * FROM Youtube.users;

    • 이미 들어간 데이터는 변경된게 없음 -> 새로운 데이터 삽입


    • 아직도 바뀌지 않는 것을 알 수 있음 그러나, 데이터 베이스와 Node.js 시간은 같아짐
  • 그럼 시간을 알맞게 맞춰주려면?

    • SELECT @@global.time_zone, @@session.time_zone; + 번개모양

    • session의 time_zone이 SYSTEM인 것을 확인 할 수 있음

    • session의 timezone 변경

      • SET time_zone = ‘Asia/Seoul’; + 번개모양
      • SELECT @@global.time_zone, @@session.time_zone; + 번개모양
    • session의 time_zone이 이제 Asia/Seoul인 것을 확인 할 수 있음

    • SELECT * FROM Youtube.users; + 번개모양

    • created_at 시간이 바뀐 것을 알 수 있음

    • 그러나 node.js 시간은 바뀌지 않음

    • node.js에서 시간의 소숫점을 일단 제거해보자

      // db.js
      
      const connection = mysql.createConnection({
          host: 'localhost',
          user: 'root',
          password: 'root',
          timezone : 'Asia/Seoul',
          database: 'Youtube',
          dateStrings: true
      });
      
    • 데이터베이스의 시간 셋팅으로 바뀜

*형식을 바꿨음 → node.js에서는 날 것의 데이터를 보여줬는데, 이 형식을 바꾸니 같아짐

🍎🍏 오늘의 느낀점 : 일단, mysql workbench가 OS에 따라 설치하는 방법이 다르고, 또 맥마다 다른 버전으로 설치해야해서 찾아보는데 조금 시간이 많이 걸렸다. 나중에는 이런 점들을 알았으니, 헤멜일은 없을듯..! 그리고 직접 workbench에서 데이터를 만들어보고 db에 연동시켜서 직접 내 눈으로 보니 신기했다. 나중에는 CLI로 직접 쿼리를 넣고, 데이터들을 관리 해야된다는 생각을 하니 많은 연습이 필요하겠구나 했다. GUI로 봐서 편리하지만 CLI도 빼놓지 않고 쿼리들을 잘 숙지해야겠다.

profile
프론트엔드개발자가 되고 싶어서 열심히 땅굴 파는 자

0개의 댓글