분류 전체보기

MySQL에서 localhost와 socket file! 데이터베이스 에러 프로그램을 만들 때 데이터베이스가 가장 말썽인 것 같다. 설계, 에러 등에서 시간을 많이 쓰게 된다. cloer chat프로젝트 중 잘 작동하다가 에러가 발생했다. Error: connect ECONNREFUSED ::1:3306 데이터베이스에 연결이 안되는 에러인데 간단한 실수부터 방법으로 발생하는 에러다. 단순 실수로 발생한 에러가 아니고 몰랐던 부분이어서 정리하려 한다. 내 경우 MySQL 공식문서에서 답을 찾았다. https://dev.mysql.com/doc/refman/8.0/en/can-not-connect-to-server.html MySQL에서 localhost localhost는 루프백 호스팅으로 본인의 컴퓨터..
회원가입 로직에서 생긴 Promise 비동기 DB 처리와 에러 처리 고민 고민 우선 채팅을 구현하기 앞서 회원가입과 로그인을 먼저 구현했다. 고민을 얘기하기 전 상황에 대해서 설명해보면 다음과 같다. 먼저 회원가입은 아래와 같은 절차로 진행된다. 이메일, 닉네임, 비밀번호의 형식을 확인 이메일, 닉네임 중복확인(DB) 비밀번호 해쉬화 새 유저 생성(DB) 응답 이 과정에서 이메일, 닉네임 중복확인, 비밀번호 해쉬화, 새 유저 생성은 비동기 작업으로 이루어진다. 첫 번째 고민은 비동기처리를 하나하나 순서대로 await await await으로 받아 동기와 다름없이 처리하고 싶지 않았다. 먼저 비동기 작업을 모두 프로미스로 받은 후 나중에 한 번에 await으로 받고 싶었다. 처음 생각한 방법은 이메일, ..
가볍게 pug로 front end를 개발하다 결국 react로 전환하게 되었다. pug에서 react로 react를 몇 번 써봤고 state, props에는 익숙하지만 context API, routing은 개념만 알고 사용해 본적이 몇 번 없어 조금 더 써보고 나중에 프로젝트할 때 react를 써야지 하는 마음에 pug로 개발을 시작했었습니다. 아무래도 html, css, vanillaJS에 익숙한 저에게는 pug는 손발처럼 편했습니다. 하지만 pug로 개발하던 중 이럴 바에 찾아보면서 react로 하자 라는 생각이 들어 react로 전환하게 되었습니다. pug에서 느낀 불편함 pug에서 layout과 include를 적절하게 사용하면 react처럼 컴포넌트 단위 개발을 할 수 있습니다. 단순한 화면..
· Node.js
module scope에서 실행 파일 경로를 얻어보자! node type: module npm 라이브러리들의 docs를 보다보면 commonJS보다 ES module을 사용하는 것을 자주 볼 수 있었다. 이왕 이렇게 된거 node 버전을 16에서 17로 업그레이드 하고 type을 commonJ에서 ES module로 사용하기로 했다. 업그레이드하고 require들을 모두 import, export로 바꾼뒤 실행해보니 __dirname이 정의되어 있지 않단다. ES module에서는 어떻게 바뀐건지 확인해보자. ES module에서 cwd(), import.meta.url, path.resolve() 먼저 공식문서를 확인해 보자 ES module과 commonJS의 차이는 노드 공식문서에서 확인 할 수 ..
데이터베이스 구조부터 잡고 sequelize와 MySQL query를 이용해 스키마를 생성해보자! 데이터베이스 저는 서비스를 만들 때 기능들을 구상하고 인터페이스를 대충 생각 해보고 데이터 베이스를 설계하는 편입니다. 기능 구상은 저번 포스트에서 했고 인터페이스는 크게 신경 쓰지 않을 계획이니 바로 데이터베이스를 설계해 보겠습니다. 우선 채팅 서비스에 필요한 데이터부터 생각해보면 유저, 대화방, 메시지 정도가 있습니다. 모든 테이블에 createdAt, updateAt, deletedAt을 추가 해 시간을 이용해 대화방에서 나갔다가 다시 접속했을 때 나가기 전 메시지를 불러오지 않을 계획입니다. 대충 컬럼을 생각해봤으니 관계를 맺고 정규화를 통해 나은 방법을 찾아보겠습니다. pseudo ERD '메시..
· Node.js
socket.io 없이 ws모듈을 이용한 채팅방 구현 과정과 결과입니다. ws모듈을 이용한 채팅방 구현 실시간 양방향 통신은 요즘 웹서비스에서 거의 필수입니다. 하다못해 배달 중인 음식의 위치까지 실시간으로 알려주는 시대에 살고 있습니다. web socket을 공부해보고 싶은 마음을 품고 미루던 찰나, node 강의에서 web socket 프로토콜과 ws모듈, socket.io를 소개했습니다. 제가 듣는 node 강의는 node 생태계 전체를 훑는 강의기에 깊은 내용보다는 이런 게 있다 정도의 설명이기에 스스로 예제를 만들며 학습했고 그 경험을 기록하고 공유할까 합니다. 들어가기 전에 이 글은 socket.io없이 ws모듈만을 사용하여 채팅방을 구현한 과정의 기록입니다. socket.io를 이용한 채팅방..
· Node.js
로그인 시 빼놓으면 섭섭한 passport.js의 github을 살펴보며 passport의 흐름에 대해 정리해보자. Passport.js `passport.js`는 인증을 도와주는 미들 웨어입니다. passport는 Oauth와 세션 쿠키 관리를 쉽게 도와줍니다. passportjs를 사용하며 공식문서가 조금 빈약하다고 느껴졌고 passport의 깃헙의 코드를 읽어봤습니다. 주석으로 설명이 너무 잘되어있어 깃헙을 읽게 된 과정과 내용을 정리해보려 합니다. 글이 다소 복잡할 수 있어 캡쳐와 그림만 봐도 내용을 이해하는데 큰 무리가 없도록 노력했습니다. 이 글에서는 제가 작성한 예시 코드로 설명합니다. 예시코드는 깃헙 repository에 공유해두었습니다. 이 글은 크게 두가지 내용을 담고 있습니다. pas..
let userError:object; userError = { name: "cloer", age: 10 }; // console.log(user.name) // Error: Property 'name' does not exist on type 'object'. type Score = 'A'|'B'|'C'|'D'; interface User { name: string; age: number; gender?: string; //optional readonly birthYear: number; [grade:number]: Score }; let user:User = { name:'cloer', age:10, birthYear: 2012 }; user.gender = 'male'; // user.birthYe..
// primary type const myName:string = 'cloer' const age:number = 13 const married:boolean = false // Array const weekdays:string[] = ['mon', 'tue', 'wed'] const weekend:Array = ['sat', 'sun'] // tuple const user:[string, number] = [myName, age] // void const voidFunc = ():void => { // No return } // never const naverFunc1 = ():never=>{ while(true){ // Infinite loop } } const naverFunc2 = ():neve..
canvas API와 nodeJS, MySQL로 간단한 웹게임을 만들어보자! Canvas로 슈팅게임 만들기 기말고사 기간 공부가 하기싫어 vs code를 열고 이짓 저짓 하다가 간단한 게임을 만들어 보기로 했다. 즉각적인 결과를 얻을 수 있고 로직도 짤 수 있는 canvas가 시험기간에 공부하기 싫을 때 놀기 적당해 보였다. 먼저 canvas를 써본적이 없으니 기본적인 사용 방법을 공부하기 위해 유투브에서 영상을 찾아봤다. 이 영상을 보고 만들었으며 추천한다. 영상을 보며 따라 만든 후 AWS EC2에 배포해 친구들에게 알려줬고 점수 스크린샷을 찍어 서로 자랑하는 모습을 보고 점수를 저장하는 서버를 만들기로했다. 이 글은 시험이 끝난 뒤 영상을 안보고 만들 수 있는지 스스로 테스트도 해볼겸 처음부터 리..
· Languages/R
다른 언어를 쓰다 R을 처음 접하면 요소에 접근하는 방법이 헷갈린다. 정리하며 익혀보도록 하자! 첨자(Indexing) R에서 요소근은 $, [], [[]], [,]등 여러 형태로 나타난다. 또 R언어는 인덱스가 1부터 시작한다. 프로그래밍을 처음 배울때는 왜 0부터 시작하지? 했는데 이제는 왜 1부터 시작하지? 라는 생각이 든다. matlab도 1부터 시작하는 것을 보면 아마 통계기반 언어들의 특징인것 같다. 통계를 위한 데이터들을 나타낼 때 0번째는 의미가 없기 때문이 아닐까한다. 그럼 이제 벡터, 행렬, 배열, 리스트, 데이터 프레임등 열거형 데이터의 인덱싱을 알아보자! 벡터 인덱싱 벡터는 다른 언어와 마찬가지로 [](대괄호)를 사용한다. test.vector = 1:8 test.vector[1]..
기본형(primitive type)과 참조형(reference type) 데이터를 담는 변수의 선언, 초기화, 할당 과정을 메모리 측면에서 이해하고 가변형(mutable type)과 불변형(immutable type)의 의미를 파악해보자. 데이터 타입과 가변성, 불변성 어떤 언어를 배우든 가장 먼저 변수를 배우게 됩니다. 이를 공부하다 보면 mutability와 immutability라는 단어를 마주하게 됩니다. 가변성 불변성이라고 번역되지만 불변하다고 하는데 값을 바꿀 수 있는 것 같고... 의미가 잘 와닿지 않습니다. 메모리의 관점에서 변수의 생성 과정을 보는 것이 불변, 가변의 의미를 이해하는데 조금은 도움이 될 수 있습니다. Js에서 데이터의 타입에 따른 변수의 선언, 초기화, 할당 과정을 메모리..
thecloer
'분류 전체보기' 카테고리의 글 목록 (19 Page)