글

라벨이 update인 게시물 표시

NestJS Redis를 이용하여 캐시(Cache) 관리 mset, mget

이미지
 이전 글에서는 하나의 키와 값을 저장하거나 하나만 조회를 했습니다. 이번에는 여러개의 키값을 이용하여 값을 저장하거나 조회하는 비즈니스 로직을 작성하도록 하겠습니다. 아래 링크를 참고하시면 NestJS와 Redis를 연결하고 사용하는 방법에 대해서 알수 있습니다. NestJS Redis 연결 NestJS Redis를 이용하여 캐시(Cache) 관리 redis가 Local에 설치되지 않을시 해당 'docker-compose.yaml'을 사용하여 redis컨테이너를 생성하면 됩니다.  // 여러개의 keys값과 values를 저장하기 위한 서비스 async saveDataMany ( key : string [], value : any []) { try { const setKeysValues : any [] = []; if ( key . length === value . length ) { // mset을 하기 위해서 [key, value] for ( let i = 0 ; i < key . length ; i ++) { setKeysValues . push ( key [ i ]); setKeysValues . push ( value [ i ]); } } else { throw new ConflictException ( 'key와 value갯수가 일치하지 않음' ); } console . log ( 'setKeysValues : ' , setKeysValues ); // ttl이 설정되지 않는다면 기본 5초간 유지되고 사라진다. 0은 무제한 const result = await this . cacheManager . store . mset (... setKeysValues , { t...

Kbernetes kubectl을 이용하여 Pods를 업데이트 하기

이미지
  해당 pods에 사용되는 이미지를 다른 이미지로 바꿔야 하는 경우가 있습니다. 이때도 변경된 이미지를 Pull받아야 합니다. 해당 글은 아래 gitHub repository를 이용하여 작성했습니다. gitHubLink : https://github.com/Alex-Choi0/kubernetes_create_one_pod.git 기존 코드와 다르게 '<h2>Update ver 1</h2>'를 추가하였습니다. 이는 배포된 pod에 없는 테그 이므로 같은 이미지를 사용하는 컨테이너를 다시 배포를 해야 합니다.  const express = require ( 'express' ); const app = express (); app . get ( '/' , ( req , res ) => { res . send ( ` <h1>Test for minikube</h1> <h2>Update ver 1</h2> <p>/ : Open the site</p> <p>/err : process top (get error)</p> ` ); }); app . get ( '/err' , ( req , res ) => { process . exit ( 1 ); }); app . listen ( 8080 ); 1. 이미지 Create하고 Push 하기(경로는 도커파일이 존재하는곳) $ docker build -t [image name]:[tag] . copy 이제 해당 이미지를 컨테이너에 다시 배포해야 한다. minikube dashboard를 확인하면 컨테이너의 이름을 확인할수 있다. 아래 사진으로는 'first-pods' 이다. 이미지는 'alexchoi1/first-pods:latest'를 사용하지만 위의...

GCP VM Instance(Compute Engine) 생성 및 터미널 연결

이미지
  사진1) Compute Engine 선택 GCP에서 VM Instance를 생성하기 위해서 Compute Engine를 선택합니다. 사진2) 인스턴스 만들기 선택 인스턴스를 생성합니다. (AWS의 인스턴스와 같음) 사진3) 인스턴스 생성을 위한 설정값 입력 사진4) 리전 선택 사진5) 기타옵션 선택(HTTP, HTTPS 등등) 사진 3 ~ 5까지 인스턴스 생성을 위한 설정값을 줍니다. 위 블로그 글에는 Dabian(Linux) OS로 만들었습니다. 사진6) 인스턴스 만들기 사진6에서 만들기를 클릭하면 인스턴스가 생성됩니다. 사진7) 인스턴스 생성 인스턴스가 생성되는데 약 5분정도 걸립니다. 생성이 완료 되면 SSH접속이 가능합니다. 사진8) 웹으로 SSH 접속 사진9) 웹  SSH접속중 사진10) 터미널 접속 SSH접속후 아래와 같은 작업을 해야 합니다. 사진5에서 이미 HTTP트랙픽을 허용했기 때문에 모든 포트에 대해서 접근이 가능합니다. 하지만 빠르게 열렸는지를 확인하기 위해서 apache2를 설치하고 80번 포트로 연결해서 외부에서 인스턴스에 접근 가능한지 확인하겠습니다. 1) apt update - 로컬 패키기가 최신 버전으로 반영 $ sudo apt update copy 1) http 배포 및 확인을 위한 apache2 설치 - 80포트가 외부로 정상 접근 가능한지 확인을 위해 설치 $ sudo apt install apache2 copy 사진11) VM 인스턴스 방화벽 설정 참고로 만약 연결하지 못한다면 사진 11의 창으로 가서 80번 포트가 접속이 허용되어 있는지 확인 부탁드립니다. 사진12) 80번 디폴트 페이지 출력 완료

NestJS MongoDB 사용하기4- DB Update Delete

 안녕하세요. 알렉스입니다. 저번 포스팅에 이어 이번에는 MongoDB에 CRUD기능중 Update, Delete을 넣도록 하겠습니다. 처음 들어오셨다면 이전글을 참고해 주시기 바랍니다. 이전글 : NestJS MongoDB 사용하기3 - DB Create Read // src/users/dto/update-user.dto.ts import { ApiProperty , PartialType } from '@nestjs/swagger' ; import { IsEmpty , IsString } from 'class-validator' ; import { CreateUserDto } from './create-user.dto' ; export class UpdateUserDto extends PartialType ( CreateUserDto ) { @ IsString () @ IsEmpty () @ ApiProperty ({ readOnly : true , }) id : string ; } 코드1) UpdateUserDto 작성 코드1에서 id를 다시 정의한 이유는 'extends PartialType'이 CreateUserDto이기 때문입니다. id는 필수값으로 넣어야 하는에 업데이트 할때는 파라메터로 넣기 때문에 필수가 아닙니다. 따라서 재 설정을 하여 id는 비어도 class-validator에서 걸리지 않도록 수정한 것입니다. // src/users/users.service.ts import { Injectable , NotFoundException } from '@nestjs/common' ; import { InjectModel } from '@nestjs/mongoose' ; import mongoose from 'mongoose' ; import { CreateUserDto ...

DBMS MySQL - SQL8-3: 인덱스 사용시 악영향(INSERT, UPDATE, DELETE)

이미지
 균형트리구조를 이용하여 조회를 할때 속도면에서 많은 이득이 있었습니다. 하지만 삽입, 수정, 삭제를 할시 DB의 성능에 영향을 줄수 있습니다.  사진1) 이전 글에서 사용한 균형트리 이제 사진1에서 저는 210, 211, 212를 추가하고 싶습니다. 그러면 일단 아래와 같이 추가를 할수 있습니다. 사진2) 210, 211, 212추가 사진2와 같이 3개의 데이터를 추가했는데 200페이지에 지나치게 많은 데이터가 몰렸습니다. 그럼 이때 중간의 페이지를 늘려줘야 합니다. 사진3) 트리구조 변경  사진3처럼 효율적으로 데이터를 찾기 위해 트리 구조가 변경 되었습니다. 210 ~ 212를 쉽게 찾기 위해 중간에 211 페이지가 추가 되었고 200 ~ 211에는 210이 211 ~ 224에는 211, 212가 배정되었습니다.   이렇듯 INSERT를 하게 되면 트리구조의 변경이 생기기 때문에 성능에 문제가 생길수 있습니다. 이는 UPDATE나 DELETE도 마찬가지 입니다. 데이터가 변경이 되면 인덱스는 검색하기 효율적인 방법으로 구조를 재편하게 됩니다. 하지만 인덱스량이 많으면 그만큼 시간이 걸립니다.  이전글 :  DBMS MySQL - SQL8-2: 인덱스 내부 동작 원리 이후글 :  DBMS MySQL - SQL8-4: 인덱스 SQL 사용하기

DBMS MySQL - SQL6 : UPDATE MANY -> 여러개의 레코드를 한 쿼리에 UPDATE하기

이미지
이전글 : DBMS MySQL - SQL5 : GROUP BY 레코드를 그룹으로 묶기  안녕하세요. 알렉스입니다. 이번에는 SQL문을 이용하여 하나의 쿼리로 여러개의 Record를 업데이트 하도록 하겠습니다. 1. 기존 UPDATE 기존의 UPDATE는 WHERE을 이용하여 검색한 다음에 SET을 이용하여 Value를 UPDATE하는 방식 이였습니다. 아래 링크 참조 링크 : DBMS MySQL - SQL2 : UPDATE, SUBSTRING, REPLACE 하지만 여러개의 레코드를 한 쿼리안에 UPDATE를 할려면 다른 쿼리를 이용해야 합니다. 2. 여러개의 Query로 Record 업데이트 $ INSERT INTO [table name]([column name1], [column name2], [column name3]) VALUES ([value1-1], [value1-2], [value1-3]), ([value2-1], [value2-2], [value2-3]) ON DUPLICATE KEY UPDATE  [column name1]=VALUES([column name1]), [column name2]=VALUES([column name2]);   copy 사진1) 여러 Record Update 사진1에서 INSERT를 쓴것을 알수 있습니다. 하지만 'ON DUPLICATE KEY UPDATE'를 삽입하여 중복되는 key에 대해서 UPDATE를 하도록 하였습니다. 이 방법을 이용하면 UPDATE을 하기 위해서 DB에 불필요한 요청을 보낼 필요가 없습니다. 다음글 : DBMS MySQL - SQL7: MIN, MAX 최대, 최소 및 중복 쿼리문 사용하기(2개이상) 

DBMS MySQL - SQL2 : UPDATE, SUBSTRING, REPLACE

이미지
 안녕하세요. 알렉스 입니다. 저번에 이어서 DBMS의 MySQL의 SQL문에 대해서 작성하겠습니다. 이전 글 : 링크 1. Record Update DataBase에 있는 Table의 Record를 수정(UPDATE)합니다. $ UPDATE [Table] SET [Column1 Name] = [Value1], [Column2 Name] = [Value2] WHERE [UPDATE Column Name] = [Value]; copy 사진1) publish날짜 Update 2. 문자열 자르기 : SUBSTRING Column에서 문자열을 잘라냅니다. $ SELECT SUBSTRING([Column Name], [시작 인덱스], [마지막 인덱스]) FROM [Table Name]; copy 사진2) name컬럼에서 1~5자리만 남김 SUBSTRING은 단독으로 사용이 가능합니다. $ SELECT SUBSTRING([String], [시작 인덱스], [마지막 인덱스]) copy 사진3) 'Hello World' 잘라내기 3. Table안에 Record를 REPLACE하기 선택한 Table Column의 Record의 문자열을 대체합니다. $ SELECT REPLACE([Column Name], [검색 문자열], [대체 문자열]) FROM [Table Name]; copy 사진4) 'e'를 'fffff'으로 REPLACE REPLACE은 단독으로 사용이 가능합니다. $ SELECT REPLACE([Column Name], [검색 문자열], [대체 문자열]) copy 사진5) 문자열만 변환(Replace)

nest js -12 Turn Your Server url http to https2 : Apply to your code

이미지
 저번시간의 연장선으로 이번에는 nestjs에 https프로토콜을 적용하도록 하겠습니다.  위 화면은 key, cert.pem파일이 포함된 코드 입니다. NestJS에서 코딩하는 부분과 실행하는 부분이 다르기 때문에 src에 있는 .pem파일은 dist쪽으로 옮겨줘야 합니다.  $ mv cert.pem ../dist/ $mv key.pem ../dist/ // main.ts : /src/ import { NestFactory } from '@nestjs/core' ; import { AppModule } from './app.module' ; // NodeJS에 있는 모든 FileSystem을 // fs로 import 한다. import * as fs from 'fs' ; async function bootstrap () { // https옵션을 저장할 변수 // httpsOption을 생성한다. const httpsOptions = { // key, cert의 해당경로를 통해 read한다. // __dirname은 디렉토리 경로를 나타낸다. key : fs . readFileSync ( __dirname + '/key.pem' ), cert : fs . readFileSync ( __dirname + '/cert.pem' ), } const app = await NestFactory . create ( AppModule , { httpsOptions }); await app . listen ( 3000 ); } bootstrap (); 이제 main.ts부분의 코드를 추가하겠다. 일단 httpsOptions변수가 추가됬다. 이 변수안에는 key, cert 두개의 키값이 존재하는데 파일경로를 통해 읽은 문자열을 갖고있다. 파일경로는 cli로 옮긴 파일 경로를 작성하면 된다. ...

nest js -11 Turn Your Server url http to https1 : create certificate(key, cert.pem)

이미지
 안녕하세요. 기존의 NestJS는 http로 되어있습니다. 그대로 사용할수 있지만 보안이 중요한 웹사이트 같은경우는 위험할수 있습니다. 그래서 이번에는 지금까지 작성한 NestJS서버를 https프로토콜로 변경하도록 하겠습니다.  - 위 코드는 nest js - 1번 부터 10번까지 코딩한 자료를 바탕으로 만들었습니다. 자세한 코드는 블로그 글을 참고해 주시기 바랍니다. 일단 https프로토콜을 적용하기 위해서는 인증서가 필요합니다. 이번 글에서는 mkcert를 사용하여 인증서를 생성하도록 하겠습니다.  $ sudo apt install libnss3-tools $ wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64 $ chmod +x mkcert $ sudo cp mkcert /usr/local/bin/ 이제 위와같이 cli작성이 마무리 되면 key, cert.pem파일을 생성할수 있다. 일단 인증발급기관을 추가합니다. 여기서는 mkcert입니다. $ mkcert -install 이제 해당 인증서를 생성합니다.  $ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1 이제 해당 프로젝트 안에 key, cert.pem파일이 생긴것을 확인 할수 있습니다. 다음 글에서는 이걸로 실제 https프로토콜을 적용하고 사용을 하도록 하겠습니다.

nest js -10 Delete Particular member(parameter) in DB Record with TypeORM(DELETE)

이미지
// member.repository.ts : /src/members import { Member } from './member.entity' ; import { EntityRepository , Repository } from 'typeorm' ; // 내부에 에러가 발생시 사용. import { BadRequestException , InternalServerErrorException } from '@nestjs/common' ; // Member entity를 불러서 DB의 테이블 생성 @ EntityRepository ( Member ) export class MemberRepository extends Repository < Member > { // members.service.ts에 사용할 method생성 // Member를 생성한다. async createMember ( name : string , password : string , email : string , age : number , ) : Promise < Member > { // member record 생성 const member = new Member () // service에서 받은 정보를 record에 작성 member . name = name ; member . password = password ; member . email = email ; member . age = age ; try { // 작성한 record를 DB에 저장. await member . save (); } catch ( e...