인증키 만료 구현하려고 뻘짓은 다한 것 같다. 이거 구현하려고 많은 방법을 찾아봤다.

 

 

redis 내에서 분명 해결할 수 있을거라 생각했지만 쉽사리 찾지 못해서 우선 setTimeout으로 했었다. 그리고 몇 시간 뒤 바로 찾아서 해결했다.

 

1. setTimeout

 

setTimeout은 redis에 set 한 후 10초 뒤에 실행되게 설정해놨다. 이런 경우 비동기 처리기 때문에 인증키를 요청한 유저에게는 인증키가 전송될 거라 생각했다. 한 가지 걱정은 해당 요청이 setTimeout 때문에 10초 뒤에 종료가 된다는 점이었다. setTimeout 첫 번째 파라미터에 N초 후에 실행할 내용이다. 물론 해당 함수에 이름만 넣어야 한다. 두 번째 파라미터에는 N초 X 10에 해당하는 시간을 쓰면 된다. 세 번째부터는 첫 번째 함수에서 실행될 파라미터를 써주면 된다. 아래처럼 redis.delete 함수에 파라미터가 1개면 3번째만 써주면 된다.

setTimeout(redis.delete, timeOut, key);

 

2. Redis SET

client.set(key, value)

Redis에서 SET을 사용할 때 보통 위에처럼 만 썼다. 대부분에 블로그를 찾아보니 그랬다. 

Redis 홈페이지를 보니 SET 할 때 끝에 숫자를 쓰는 걸 봤다. 그래서 npm에 찾아보니 딱히 다른 설명은 없었다.

그래서 코드 작성할 때 파라미터 참조를 좀 쳐다봤다. 

자세히 보니 3,4번째 파라미터가 눈에 띄었다. 그중에서 duration... 

더 찾아보니 저 모드는 아래처럼 옵션이었다.

그러니깐 아래처럼 작성하니 정말 됐다.

client.set(key, value,'EX', 10 ,async () => {
            console.log(key + 'redis 저장 완료')
})

 

3. client.expire(key, ) https://redis.io/commands/set

몇몇 블로그를 보니 가끔가다가 req.cache.expire 아니면 session을 expire 하는 사람들을 봤다. 그래서 혹시나 해서 expire를 쳐보니 있긴 있었다. 

client.expire(key, 10)

 

4. redis-expiry

얼마 전까지 개고생 하다가 시간 좀 생겨서 다시 검색해보니 npm에 이런 게 생겨있다. 이거는 내가 좀 연구를 해보고 수정을 해야 할 것 같다.

https://www.npmjs.com/package/redis-expiry

728x90

Node.js에서 Redis를 사용하다보니 에러가 발생했다. Redis에서 Key를 보내어 GET 했는데 발생했다.

대충 아래 에러 메세지를 보면 감이 온다.

 

Error: node_redis: The GET command contains a invalid argument type.
Only strings, dates and buffers are accepted. Please update your code to use valid argument types.


GET을 할 때 파라미터를 string 타입으로만 보내야한다. Node.js에서는 계속 JSON 타입을 쓰다 보니 실수로 JSON 객체를 그대로 보내버린 것 같다. 아직 습관이 익숙하지가 않아서 나오는 실수들이다. 혹시나 Key를 콘솔로 찍어보는게 좋을듯하다. 이경우는 역시 다른 함수를 실행했을때도 마찬가지도 DELETE를 했을 때도 나타난다. 

 

그렇기 때문에 Key를 꼭 string 타입으로 그리고 단일 변수만 보냈는지 체크하자

 

 

 

728x90

Node.js 개발을 하다가 Redis 부분에서 에러가 났다. 

 

Error: node_redis: The SET command contains a invalid argument type.
Only strings, dates and buffers are accepted. Please update your code to use valid argument types.

 

 

대충 해석을 해보면 SET 명령을 할 때 인수가 잘못된 듯 하다.

파라미터가 무조건 String 타입만 가능하다. 

혹시 넘길 때 콘솔로 찍어보고 다시 확인해보면 될것 같다.

728x90

docker repository를 통해 설치하는 방법으로 설치를 할 예정이다. 이 방법 말고도 2가지가 더 있다고 한다.

(수동으로 deb 파일을 다운로드하여 설치하는 방법, 별도의 설치 스크립트를 이용하는 방법)

 

 

 

당연히 apt 설치를 하기 때문에 update를 한번 해준다.

 

1. 필수 패키지를 설치합니다.

$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

 

2. Docker GPG key 

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

3. Docker Repository 등록

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

4. Docker 설치

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

5. 정상 설치 확인

$ sudo docker run hello-world

728x90

리눅스를 하다보니 서버를 종료 했을 때 다시 켜야하는 번거로움이 있었다.

사실 생각해보면 PC를 껏다 켰을 때를 생각했어야했다. 그래서 윈도우의 시작프로그램이 리눅스에도 있었다.

 

서비스 시작

systemctl start 서비스명

서비스 재시작

systemctl restart 서비스명

서비스 중지

systemctl stop 서비스명

서비스 상태 확인

systemctl status 서비스명

서비스 실행 확인

systemctl is-enable 서비스명

부팅 시 서비스 자동 시작

systemctl enable 서비스명

부팅 시 서비스 자동 시작 해제

systemctl disable 서비스명
728x90

서버에 FTP 설정 중 갑자기 안되길래 서비스를 체크해보니 액티브가 failed 상태다.

 

netstat 한 결과 포트도 열려있지 않다.

 

무엇이 문제인지 결국 못 찾았다...

 

그래서 패키지 삭제하고 다시 설치하니 됐다... 

여윽시 만물재설치...

 

apt purge vsftpd 사용하면 설정 파일들도 같이 삭제한다.

728x90

패키지 목록을 갱신합니다

apt update

모든 패키지를 최신 버전으로 업그레이드합니다.

apt upgrade

abc 패키지를 설치합니다. 의존성있는 패키지도 함께 설치합니다.

apt install 패키지명

abc 패키지를 삭제합니다. 설정 파일 등은 삭제하지 않습니다.

apt remove 패키지명

더 이상 필요 없는 패키지들을 삭제합니다.

apt autoremove

설정 파일 등도 포함하여 abc 패키지를 삭제합니다.

apt purge 패키지명

abc와 관련된 패키지를 검색합니다.

apt search 패키지명

abc 패키지의 정보를 출력합니다.

apt show 패키지명

패키지 목록을 출력합니다.

apt list

설치된 패키지 목록을 출력합니다.

apt list --installed

업그레이드 가능한 패키지 목록을 출력합니다.

apt list --upgradable
728x90

DML(Data Maniplulation Language)는 데이터 조작어 즉 실제 코드에서 많이 다루는 부분이다.

어차피 문법은 다른 DB나 개발 언어에서 비슷하다. 그러니 일단 스탠다드한 형태만 알아두고 사용하고, 만약 에러가 난다면 그때 한번씩 해당 언어랑 DB를 검색해보면 된다.

우선 명령어 종류다.

명령어의 종류는 SELECT, INSERT, UPDATE, DELETE가 있다.

위에 명령어는 다양하게 사용할 수 있다. 내가 생각나는대로 쓰는 것보다 계속 다양한 쿼리를 쓸 때 업데이트 하는 게 좋을듯하다.

그리고 쿼리문은 줄바꿈을 해도 상관 없다. 그리고 대소문자도 상관 없다. 어쨋든 DB는 내장함수를 대소문자, 줄바꿈 상관 없이 구분한다. 물론 컬럼이나 테이블은 아니다. 그리고 한 쿼리문당 세미콜론으로 구분한다. 그래서 끝날 때엔 세미콜론을 붙여줘야한다. 

DB마다 내장함수들도 다양하니 한번 검색해보길 바란다.


Select 명령어

Select 명령어는 생성되어 있는 테이블에서 데이터를 가져오는 명령어다.

자연스럽게 조건에 맞는 데이터라는 말이 따라 붙을 것이다. 

물론 조건문에 중첩 또한 가능하다. 다중 If 문 또는 다중 For 문 처럼 말이다. 그러니 좀 더 유연하게 사용하길 바란다.기본 형태는 아래와 같다.

Select 추출할 컬럼  From 해당 테이블  Where 조건문

예를 하나 들어보겠다.

SELECT * FROM table WHERE id = 'user';

table 테이블에서 id가 user의 컬럼 데이터를 모두 가져온다는 뜻이다.

Select문은 나의 경우는 조건문에서 많이 갈린다. 예를 들어 AND 나 OR 그리고 다중 Select 문을 사용하여 데이터를 추출한다.


Insert 명령어

Insert는 명령어는 이미 생성된 테이블에 데이터를 삽입하는 명령어다.

이 명령어는 해당 테이블에 필요한 컬럼의 데이터만 넣을 것인지 아니면 해당 테이블의 모든 컬럼 데이터를 넣을 것인지 쿼리문에서 구별할 수 있다. 모든 컬럼 데이터를 삽입할 경우 컬럼의 순서에 맞게 모든 데이터를 입력해야한다. 특정 컬럼의 데이터만 넣을 시에는 Into 부분에서 컬럼을 같이 써줘야한다.

INSERT INTO 테이블(컬럼1, 컬럼2, ... )
        VALUES (컬럼1 데이터, 컬럼2 데이터, … )

INSERT INTO 테이블
        VALUES (컬럼1 데이터, 컬럼2 데이터, … )

첫번 째 Insert문은 바로 특정 컬럼의 데이터만 넣고 싶을 때이다.

두번 째 Insert문은 해당 테이블에 모든 컬럼에 데이터를 삽입하고 싶을 때 쓰는 경우다.

아래 예시를 한번 보자.

INSERT INTO table (id, name) VALUES ('user', '홍길동');

Update 명령어

Update 명령어는 이미 들어가 있는 데이터를 수정하는 명령어다.

조건식을 통해 구분하여 데이터를 수정한다.

* 이 부분에서는 조건문을 사용하지 않으면 그 테이블에 해당 컬럼이 모두 바뀌니 주의하자.

UPDATE  테이블명
SET     컬럼1 = 컬럼1의 데이터, 컬럼2 = 컬럼2의 데이터, ...
WHERE   조건식

예를 한번 들어보겠다. 아래는 name이 홍길동인 사람의 id를 모두 400으로 수정하는 쿼리다.

UPDATE  table
SET     id = '200'
WHERE   name = '홍길동';

주의할 점은 조건문에 기본키가 아닌 다른 컬럼일 경우 적어도 1개 이상의 데이터가 변경될 수 있다. 

그러니깐 이름이 홍길동인 사람들의 id가 다 바뀐다.


Delete 명령어

Delete 명령어는 특정 데이터나 아니면 테이블에 있는 데이터를 삭제할 수 있다.

이 명령어도 주의해야 할 점은 조건문이 잘못될 경우 상관 없는 데이터가 삭제될 수 있다. 그리고 조건문이 없으면 모든 데이터가 삭제된다.

DELETE FROM 테이블 WHERE 조건문

예를 한번 들어보겠다. 아래는 name이 '홍길동'인 사람의 데이터를 삭제하는 쿼리다.

DELETE FROM table WHERE name = '홍길동';    

Update 문 처럼 조건문에 기본키가 아닌 다른 컬럼일 경우 적어도 1개 이상의 데이터가 삭제될 수 있다.

그러니깐 이름이 홍길동인 사람들의 데이터는 다 삭제된다.

 

* 저는 현재 Mysql을 사용하고 있습니다.

#mysql dml

728x90

+ Recent posts