본문 바로가기
  • 포르쉐타고싶다

분류 전체보기93

[javascript] join() - 배열을 문자열로 변환 1. 배경 서버와 DB간에 통신을 하는 과정에서 배열을 STRING으로 바꿔 보내야 하는 경우가 있다. 예를 들어, DB의 Stored Procedure의 인자로 배열을 넣고 싶을 때 서버에서 갖고있던 배열을 String으로 바꾸고 call [프로시저 이름] 의 인자로 넣어줘야 한다. 2. 개념 Array의 join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만든다. 3. 사용방법 const foodArr = ['Apple', 'Tomato', 'Orange']; console.log(foodArr.join()); // expected output: "Apple,Tomato,Orange" 중요한 것은!!!!! 콘솔창에 뜨는 것을 보면 콤마(,)와 다음 항복 사이에 공백이 없다! 프로시저를 부.. 2020. 4. 24.
[node.js] 이해가 어려웠던 카카오 로그인 박살내기 연동로그인은 앱과 사용자간의 거리를 좁혀주는 확실히 필요한 툴이다. 그 중 한국에서는 카카오를 사용하지 않으면 간첩(?)일 정도니 카카오 연동로그인 구현이 필수적이라고 생각한다. 하지만 연동로그인은 계정, 사용자 정보를 공유하는 것이니 그 절차가 복잡하고 까다로울 수 밖에 없다. 그래서 여러 지원 툴이 나와있는데 그 중 가장 유명한 것이 passport이다 하지만 passport는 페이스북, 구글 등 해외 소셜앱에 대해서는 체계적으로 그 방법이 나와있고 스택 오버플로우 등에서 그 절차 또한 여럿 공유되고 있다. 거의 모든 앱이 카카오 연동로그인을 갖추고 있는 만큼 그 레퍼런스도 충분히 많았지만 어떤 아이디어로 구현하고자 하느냐에 따라 프론트엔드와 백엔드가 어떻게 역할을 나누냐에 따라 등등 그 안에서 또 .. 2020. 4. 23.
[flutter] 에러 'Android toolchain - develop for Android devices ' 해결 1. 상황 - flutter를 설치하고 나서 기본적인 sdk를 설치했음에도 flutter doctor을 입력하면 아래와 같이 각 모듈들의 상태중에서 warning( [!] ) 표시가 붙어있는 것을 볼 수 있다. 1) Android license status unknown 2) Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses 이는 아래와 같은 두 단계로 해결할 수 있다. 2. 해결 1) [SDK Manager] -> [Android SDK] -> [SDK Tools] -> Android SDK Tools (Obsolete) 설치 이것은 flutter를 설치한다고 해도 자동으로 설치되지 않고 .. 2020. 4. 22.
[Node.js] pm2 무중단 서비스 구현 https://engineering.linecorp.com/ko/blog/pm2-nodejs/ PM2를 활용한 Node.js 무중단 서비스하기 - LINE ENGINEERING 자바스크립트는 가장 널리 사용되는 클라이언트 측 프로그래밍 언어이자 프론트엔드 웹 개발 언어 중 하나입니다. 그리고 Node.js는 Chrome의 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타�� engineering.linecorp.com 2020. 4. 20.
[nginx] upstream에 keep-alive 적용 2020. 4. 18.
[MySQL] trigger란 1. 배경 서버와 DB가 통신을 할 때, 소켓통신이 아닌 이상 서버가 요청한 쿼리문을 통해 DB가 수정된다. 하지만 한 테이블에 여러 테이블이 얽혀있는 경우가 있다. 예를 들어, 한 게시물에 '좋아요'를 누르면 1) 게시물 좋아요 갯수 키 값 1 증가 2) 게시물 좋아요 테이블에 {게시물 - 유저(좋아요 누른)} 데이터 추가 3) 알림 테이블에 좋아요 추가 알림 추가 . . . 등등 여러 테이블이 동시에 수정되는 경우가 있다. 이런 단일 상황에 정말 여러개의 쿼리를 직접 만들어야 하는걸까? 아니다. 2. 개념 trigger : 방아쇠 - 어떠한 상황이 발생하면 그에 따라 자동으로 수행되도록 정해놓은 프로시저 trigger는 위에서 설명한 것과 같이 한 테이블에 변화가 생겼을 때 그것과 연관된 다른 테이블.. 2020. 4. 15.
[MySQL] MySQL 프로파일링 - 쿼리문 성능 비교 서버는 쿼리문을 통해 데이터베이스와 네트워킹을 한다. 이 때, 같은 결과물이라도 쿼리문을 어떻게 짜냐에 따라 성능, 즉 클라이언트의 대기시간이 결정되고 이는 결국 어플의 존속문제에도 큰 비중을 차지한다. 같은 결과물들을 위한 다양한 방법의 쿼리문을 짜는데 각각의 쿼리문의 네트워킹 비용, 대기시간 같은 성능을 체크하는 방법 하나를 소개하겠다. 1. 네트워킹 시간 : MySQL 프로파일링. 이 기능은 각각의 쿼리문의 걸린시간들을 리스트 혹은 상세한 시간을 기록해서 보여준다. 2. 네트워킹 비용 : Last_query_cost 이 기능은 각각의 쿼리문에 드는 총 비용(cpu 용량 등)을 보여준다. 비용과 걸린 시간은 비례하지 않는다. 비용이 커도 걸린 시간은 적을 수 있다. 사용법은 이러하다. 1. 프로파일링.. 2020. 4. 10.
[node.js] dotenv 사용법 및 적용 및 에러 해결 1. dotenv 실행 순서 1) dotenv를 설치한다. npm i dotenv —save 2) 보안이 담긴 값들을 담은 .env파일을 만든다 3) 서버 실행 시 가장 먼저 실행되는 파일(index.js나 app.js)에 env를 가져오는 명령어를 입력(두가지 상황) (1) 단일 상황에 대한 보안값을 담은 단일 파일 .env이면 require('dotenv').config(); (2) 몇가지의 상황(개발 or 배포)에 대한 보안값을 담은 몇개의 파일로 나뉘어 있다면(prod.env, dev.env)ㅋ if(process.env.NODE_ENV === 'production') { require('dotenv').config({ path: path.join(__dirname, '/env/server.env.. 2020. 4. 10.
[MySQL] Can't connect to local MySQL server through socket '/tmp/mysql.sock' 에러 해결 MySQL에 접속하려고 하는데 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 이런 오류가 발생하는 것을 볼 때가 있다. 이 문제의 원인은 경험상 1. MySQL을 재실행한 지 얼마 안되어서 부팅이 안 되어 있을 때, 2. MySQL이 실행되고 있지 않을 때 따라서 localhost:~/ brew services restart mysql 로 재실행 한 것을 조금 대기하면 들어가 질 수 있고 MySQL이 실행되고 있지 않다면 localhost:~/ brew services start mysql 로 MySQL을 재실행 시켜주면 되겠다. 2020. 4. 8.
[linux] MySQL 포트 변경하기 자신의 운영체제에 MySQL을 설치하고 실행하면 기본적으로 3306의 포트번호가 할당된다. 하지만 여러개의 mysql db를 관리해야 하는 시점이 오면 mysql 서버에 여러개의 포트를 할당해야 한다. 예를 들어 필자는 서버 하나를 운영하는 동안 이 서버를 배포하고 난 뒤 같이 배포된 DB가 아닌 지속적인 백그라운드 개발, 테스트를 진행하기 위해 또 다른 테스트DB를 만들고 데스크톱과 연결해야 하는 상황이 생겼다. (이 과정에서 dotenv를 이용하여 같은 서버에 대해 상황에 맞게 DB환경변수를 전환할 수 있는 환경을 구현하였다. 이 부분도 다음 포스팅에서 설명하려고 한다.) 기존에 로컬과 3306으로 연결되어 있었던 MySQL 데이터베이스는 AWS RDS에 올려놓은 DB서버였고 테스트 DB는 내 데스크.. 2020. 4. 7.
[MySQL] 프로시저를 사용한 cursor loop fetch 적용(sql의 for문) DB와 서버를 만지다 보면 DB에서 가져온 데이터 목록에 대해서 일괄처리, 그 중 반복문을 돌려 처리를 해야 하는 상황이 생긴다. 그런 상황은 단순한 상황과 복잡한 상황으로 나눠서 보자 예를 들어보자 먼저 단순한 상황을 생각해 보면 쿼리를 통해 db에서 가져온 목록들에 대해 for문을 돌려 특정 컬럼에 대해 분류를 해서 응답을 하는 경우가 있겠다. 이 같이 단순한 경우는 1. 쿼리문(DB)안에서 ORDER BY를 이용해 분류하고 서버에서 어느정도 분류된 데이터를 for문으로 돌려 나누는 방법 2. 쿼리문(DB) 단계에서는 다른 분류 없이 단순 select문을 통해 서버로 가져온 다음 서버단에서 for문을 통해 분류하는 방법 으로 나눌 수 있을 것이다. 이번엔 복잡한 상황을 생각해보자 예를 들어 스타벅스 .. 2020. 4. 6.
[알고리즘] DATABASE에서 여러 테이블을 JOIN해서 가져온 데이터배열 중복 제거, 정리(2) 두가지 프로퍼티를 재정리하기위해 데이터를 가져오면 훨씬 더 많은 중복되는 객체들이 나온다. 왜냐하면 프로퍼티의 개수만큼 객체가 곱해서 나오기 때문이다. (디비에서 가져오는 배열 크기 = 묶고싶은 객체 한덩어리 x 프로퍼티1 개수 x 프로퍼티2 개수) 하지만 전 포스팅에서 소개했던 방식을 그대로 추가된 프로퍼티에 대해 한 번씩만 더 써주면 된다. 먼저 상황을 가정해보자 - 우리가 원하는 배열 : A [ { board_idx : 1, comment : "안녕하세요", tag : [ 1, 2 ], img_url : [ "http://aaaa.aaaaa.aaaaaa", "http://bbbb.bbbbb.bbbbbb", ] }, { board_idx : 2, comment : "안녕히계세요", tag : [ 3,.. 2020. 4. 2.
[linux] zsh의 .zshrc 변경 후 변경사항 저장 mac의 Catalia 의 기본 쉘이 zsh로 변경되었다. 따라서 mac의 터미널의 기본 PATH에 경로를 저장하기 위해서는 vim ~/.zshrc 를 입력하여 환경설정 창으로 들어간 뒤 export PATH="[경로명]:$PATH" 를 입력하고 저장하고 빠져나온다. 이때 가장 중요한 점! 아직 변경사항이 적용되지 않은 것이다!!!! 이 변경사항을 적용하려면 source ~/.zshrc 를 입력해줘야 한다. 2020. 3. 31.
[MySQL] Insert 할 때 특정 컬럼만 select 보통의 INSERT문은 INSERT INTO [TABLE] (COLUMN1, COLUMN2, COLUMN3) VALUES (VALUE1, VALUE2, VALUE3) 의 형태로 사용된다. 하지만 본인은 쿼리문을 작성 중, 다른 테이블에서 어떠한 조건을 가진 레코드에 대해서, 해당 인덱스에 대해서만 다른 테이블에 그에 대한 정보를 insert해야할 일이 생겼다. 그리고 INSERT해야하는 값 중에는 다른테이블의 값이 아닌 일반 상수도 포함되어야 한다. 예를 들어, 학생들 중 점수가 90점이 넘은 학생들만 장학생 테이블에 추가한다고 해보자 먼저 학생 테이블 [STUDENT]를 보면 STUDENT_IDX STUDENT_NAME STUDENT_SCORE 1 철수 92 2 영희 87 3 민수 95 그리고 점수가 .. 2020. 3. 31.
[node.js] MYSQL 쿼리문 여러개(다중쿼리) 전송방법 node.js와 MYSQL을 연결하는 가장 기본적인 방법은 데이터베이스 config파일을 만든 뒤 const mysql = require("promise-mysql"); const dbConfig = { host : '[호스트 이름]', port : 3306, user : '[유저명]', password : '[비밀번호]', database : '[스키마 명]' } module.exports = mysql.createPool(dbConfig); 이렇게 작성을 해놓고 이 파일을 가져다 connection파일을 만드는 것이다. 이 connection파일을 사용하면서 db와 데이터를 주고받을 때 여러번 주고받는것은 효율성면에서 떨어진다. 이를 반대로 말하면 한 번 주고받을 때 많은 정보를 주고받는것이 효율적이.. 2020. 3. 30.