2022.8.31.수요일 TIL: 해시 알고리즘, Nodejs mySQL 연동, 네트워크 모델 정리

Dorito·2022년 8월 31일
0

공부 기록

목록 보기
14/71

하루 개요

오전
해시 맵 자료구조 관련 알고리즘 풀기 => https://school.programmers.co.kr/learn/courses/30/lessons/42578 다시 풀기
(만약 시간이 된다면) 자료구조 및 알고리즘 공부하기

오후
Node js 구현 (챕터 2, mySQL)
자바스크립트 객체 ~ 클래스, this 개념 이해하기
코어 자바스크립트 책 챕터 1 보기
네트워크 공부하기 (2강) -> 만약 시간이 된다면 wireshark 함 써보기

해시 자료구조 & 알고리즘

프로그래머스 완주하지 못한 선수 문제 복습..

  • 내 풀이
// 완주하지 못한 선수

const solution = (paricipant, completion) => {
  let map = new Map();

  for (person of paricipant) {
    map.set(person, (map.get(person) || 0) + 1);
  }

  for (completedPerson of completion) {
    map.set(completedPerson, map.get(completedPerson) - 1);
  }

  const answer = [...map].filter((elem) => elem[1] > 0);

  return answer[0][0];
};

원래 이렇게 오래 걸리는 것 맞나.. spread연산자에 filter써서 오래 걸리나..? 다른 코드 돌려봐야지

  • 다른 사람 코드
function solution(participant, completion) {
    const map = new Map();

    for(let i = 0; i < participant.length; i++) {
        let a = participant[i], 
            b = completion[i];

        map.set(a, (map.get(a) || 0) + 1);
        map.set(b, (map.get(b) || 0) - 1);
    }

    for (let entry of map) {
        if (entry[1] > 0) {
            return entry[0];
        }
    }
}

확실히 시간 차이 난다.

귀찮더라도 for (let i = 0; i < arr.length; i++) 식으로 씁시다. 혹은 귀찮음을 감수한다면, for (let i = 0, len = arr.length; i < len; i++) 이렇게 씁시다.
for ... in은 성능을 하락시킨다는 의미보다는 객체 내의 프로퍼티 속성 중 enumerable: true인 모든 프로퍼티를 순회하여 검색하는 용도이기 때문에 적합하지 않습니다. 최근의 그린 브라우저는 배열에 대해 for ... in을 사용해도 오류가 나지 않지만, Old IE의 경우에는 배열 인덱스 외에 검출되는 프로퍼티가 있기 때문에 undefined 와 같은 오류가 발생합니다. 따라서, 배열에 대해서는 for ... in 구문 보다는 for를 사용하거나 ES6의 forEach 함수를 사용하는 것을 권장합니다.

https://school.programmers.co.kr/learn/courses/30/lessons/42578 문제도 다시 풀었음

JavaScript의 Object vs ES6의 Map 언제 사용하는지?
결과적으로는 차이가 없다. Object도 Hash로 동작함. 인덱스로 바로 접근하고 싶을 때 둘 다 사용 가능.

참고: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Map

코어 자바스크립트 이해

챕터 1: 데이터 타입

데이터 타입에는 크게 기본형과 참조형이 있다.
기본형은 불변값, 참조형은 가변값

변수: 변경 가능한 데이터가 담길 수 있는 공간
식별자: 그 변수의 이름

변수를 선언하면 컴퓨터는 우선 메모리 빈공간에 식별자를 저장하고, 그 공간에 자동으로 undefined를 할당.

그 이후 그 변수에 기본형 데이터 할당하려고 하면 별도의 공간에 데이터 저장하고 그 공간의 주소를 변수 값 영역에 할당.

참조형 데이터를 할당할 때: 참조형 데이터 내부 프로퍼티를 위한 변수 영역을 별도로 확보해서 그 주소를 포인팅하고, 그 변수 영역에 각 프로퍼티의 식별자를 저장하고 각 데이터를 별도 공간에 저장해서 그 주소를 식별자들과 매칭함 (책 그림보면 이해 빠름 책이랑 보면서 다시 복습하기)

메모리 할당 과정에서 기본형과 차이가 생긴 이유는 참조형 데이터가 여러개의 프로퍼티(변수)를 모은 그룹이기 때문!

-> 참조형 데이터를 '가변값'으로 여겨야 할 상황이 있음 (얕은 복사)
-> 하나씩 일일이 복사하면 깊은 복사 가능 => 라이브러리 써도 됨
-> 불변 객체는 자스에서 엄청 중요함!

  • 변수 선언과 데이터 할당 -> 기본형, 참조형 데이터 차이점!
    엄밀히 따지면 js의 모든 데이터 타입은 참조형 데이터,
    기본형은 주솟값 복사하는 과정이 한번만!
    참조형은 한 단계 더 거침 (책 봐야함)
  • undefined 자바스크립트가 자동으로 부여하는 경우
  1. 값을 대입하지 않은 변수 (= 데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근할 때)
  2. 객체 내부의 존재하지 않는 프로퍼티에 접근하려고 할 때
  3. return문이 없거나 호출되지 않는 함수의 실행 결과

비어있음을 명시적으로 나타내고 싶으면 null 쓰면 됨
주의할 점! typeof(null) = object 라고 함
=== null 이렇게 써줘야함

mySQL 활용

다시 하니까 SQL 다 까먹어서 추가로 복습하면서 함.
mySQL -uroot -p

  • 테이블 네이밍 규칙

  • 테이블 만들기
create table `테이블명` {
	`속성1` 타입
	`속성2` 타입,
	~
	primary key(`유일키로 사용할 속성 명`)
}


  • 데이터 삽입
INSERT INTO book(id, title, author, publisher) → 명령-테이블-컬럼
VALUES('3', '햄릿', '윌리엄 셰익스피어', '엘리스 출판'); → 추가할 데이터  
 
INSERT INTO `author` VALUES (1,'egoing','developer');
INSERT INTO `author` VALUES (2,'duru','database administrator');
INSERT INTO `author` VALUES (3,'taeho','data scientist, developer');

예제 코드에선 id 일일이 넣는데 내가 알기로는 걍 안넣었지 않았나?

INSERT INTO `author` (name, profile) VALUES ('dorito','developer');

이캐 넣음!

--
-- Table structure for table `topic`
--
 
CREATE TABLE `topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(30) NOT NULL,
  `description` text,
  `created` datetime NOT NULL,
  `author_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
 
--
-- Dumping data for table `topic`
--
 
INSERT INTO `topic` (title, description, created, author_id)  VALUES ('MySQL','MySQL is...','2018-01-01 12:10:11',1);
INSERT INTO `topic` (title, description, created, author_id) VALUES ('Oracle','Oracle is ...','2018-01-03 13:01:10',1);
INSERT INTO `topic` (title, description, created, author_id) VALUES ('SQL Server','SQL Server is ...','2018-01-20 11:01:10',2);
INSERT INTO `topic` (title, description, created, author_id) VALUES ('PostgreSQL','PostgreSQL is ...','2018-01-23 01:03:03',3);
INSERT INTO `topic` (title, description, created, author_id) VALUES ('MongoDB','MongoDB is ...','2018-01-30 12:31:03',1);

여기 책에서는 mysql 모듈 쓰게하는데 내 기억으로 nest js 좀 깔짝여볼 때 mysql2 썼던 기억이 있어서 구글링해봄

  • mySQL, mySQL2 차이점
    MySQL과 MySQL2의 차이점은 바로 promise이다. mysql은 callback기반이기 때문에 promise를 사용하지 못하고 npm에 있는 promise-mysql 모듈을 따로 설치해서 사용해야한다. 하지만 mysql2는 promise를 지원하기 때문에 다른 모듈을 설치하지 않고 사용이 가능하다.
    출처

그러면 당욘~히 내 맘대로 mySQL2 깔아봐야지! 오류나면 내 탓아님

	npm install mysql2 --save

--save 옵션: 지금 설치하는 모듈을 pakage.json 파일 depencies에 추가

// mysql.js 파일
var mysql = require("mysql");
// 비밀번호는 별도의 파일로 분리해서 버전관리에 포함시키지 않아야 합니다.
var connection = mysql.createConnection({
  host: "localhost",
  user: "root", // 실제로는 절대 X
  password: "sql password", // 실제로는 절대 X
  database: "opentutorials",
});

connection.connect();

// 쿼리 메서드로 DB에 질의 전달

connection.query("SELECT * FROM topic", function (error, results, fields) { 
  if (error) {
    console.log(error);
  }
  console.log(results);
});

connection.end();

데이터 베이스 처리 작업은 접속 -> 질의 -> 접속 종료 패턴으로 이뤄짐

Nodejs가 MySQL 데이터베이스 클라이언트 됨

db.query(`SELECT * FROM topic`, function (error, topics) {
        console.log(topics);
        response.writeHead(200);
        response.end("hello");
      });
const mysql = require("mysql2");

const db = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "soso5020",
  database: "opentutorials",
});

db.connect();


db.query(`SELECT * FROM topic`, function (error, topics) {
        console.log(topics);
        response.writeHead(200);
        response.end("hello");
      });

첫번째 인자가 두번째 인자인 콜백 함수 topics에 담긴다
그리고 웹브라우저에 HTTP 상태 코드를 200으로 전달해서 작업 처리에 성공했음을 응답한다.

걍 sql 모듈로 갖고와서
이 객체 갖다써서 표현하면 됨

else {
      db.query(`SELECT * FROM topic`, function (error, topics) {
        if (error) {
          throw error;
        }
        db.query(
          `SELECT * FROM topic where id = ${queryData.id}`,
          function (error2, topic) {
            if (error2) {
              throw error2;
            }
            let title = topic[0].title;
            let description = topic[0].description;
            const list = template.list(topics);
            const html = template.HTML(
              title,
              list,
              `<h2>${title}</h2>${description}`,
              `<a href = "/create">create</a>`
            );
            response.writeHead(200);
            response.end(html);
          }
        );
      });

    }

id = ${queryData.id}

아.. string으로 html 코드 치게하는거 개빡친다 진짜;

nodejs mySQL 2-5까지 끝냄

SQL 요거 미리 공부해뒀는데.. 걍 typeORM같은건줄알고 금방 끝내겠지 했는데 ㅇ생각했던거랑 많이 다르다.
오늘안에 다 끝내려했는데 오류 쓸데없이 시간 많이 잡아먹어서 다 못했다

네트워크 공부 02. 네트워크의 기준! 네트워크 모델

https://velog.io/@dorito/네트워크의-기준-네트워크-모델

하루 마무리

  • 하루 한 것 ❌ 🔺✅
    해시 맵 자료구조 관련 알고리즘 풀기 ✅
    https://school.programmers.co.kr/learn/courses/30/lessons/42578 다시 풀기 ✅
    Node js 구현 (챕터 2, mySQL) ✅
    자바스크립트 객체 ~ 클래스, this 개념 이해하기 ❌
    코어 자바스크립트 책 챕터 1 보기 ✅
    네트워크 공부하기 (2강) ✅ -> 만약 시간이 된다면 wireshark 함 써보기 ❌
  • 내일 할 것
    오전
    코어 자바스크립트 챕터 1 복습
    코어 자바스크립트 챕터 2 공부
    운영체제 복습
    오후
    자료구조, 알고리즘 공부 1문제 풀기
    node js 챕터2 최대한 많이 진도 나가기 (최소 2-10까지 하기)

    네트워크 공부
  • 하루 반성
  1. 한시간씩 기록한다 해놓고 까먹음
  2. 딴짓하는 시간이 많은 것같음
  3. 오늘 공부시간
    오류머임 90
    공부 10
    까먹음 -20

도합 -10의 하루를 보낸거같음

  • 피드백
  1. 까먹지 않게 한시간 다이어리를 책상위에 올려둬야겠다.
  2. 의지력의 문제인가.. 중독의 문제인건가 모르겠음. 시간을 잘게 쪼개서 집중해야겠음.
  3. 포기만 하지말자..

0개의 댓글