uhee-12의 등록된 링크

키자드에 등록된 총 186개의 포스트를 확인하실 수 있습니다.

Tistory

[Kubernetes] taint & toleration 개념 알아보기

taint라는 개념을 봤는데 정확히 어디 쓰이는지 모르는 개념이었다. 이를 오늘 알아보고 활용하고자 한다.개념여러 곳에서 taint의 원래 뜻을 알아보고 그에 대한 toleration 개념을 알려주는데 오히려 헷갈려서 개념을 쌓는데 더 오래 걸렸다. 한마디로 둘의 개념은 이거다.taint : 제한 걸어주기toleration : 제한 풀어주기이 말로 설명하는 게 제일 간단한 듯하다.pod에는 각각의 할당되어지는 노드들이 존재한다. 이 노드들의 가지고 있는 성능에 따라 돌리고 싶은 노드들이 존재하기에 이 때문에 제약을 걸어두는 것이다.taint & tolerations 알아보기우선 제한을 걸어두는 taint에 대해서 알아보자면 세 가지의 옵션이 존재한다.NoSchedule : taint에 대한 key,val..

Tistory

[Kubernetes] Centos에서 snap 사용하기

centos에서 snap을 바로 설치할 수 없다. 그래서 EPEL 레포지토리가 필요하고, 그 다음에 snapd를 설치해야 이를 사용할 수 있다.1. EPEL 저장소 활성화하기sudo yum install epel-release -yEPEL(Enterprise Linux용 추가 패키지)은 CentOS용 추가 패키지를 제공한다.2. snapd 설치하기sudo yum install snapd -yEPEL 저장소가 활성화되면 Snapd를 설치할 수 있다.3. Classic Confinement 활성화(필요한 경우):sudo systemctl enable --now snapd.socket일부 스냅에는 시스템 리소스에 대한 무제한 액세스를 허용하는 클래식 제한이 필요하다. 그러므로 클래식 제한을 활성화하려면 다음 ..

Tistory

[Kubernetes] Drain, Cordon 개념 쌓기

쿠버네티스 클러스터를 사용하다 보면 특정 노드에 있는 포드들을 모두 다른 곳으로 옮기거나 아니면 특정 노드에는 포드들이 스케쥴링 되지 않도록 제한을 걸어둘 필요가 있다. 그럴 때 사용하는 것이 cordon, drain이다.cordon: cordon은 지정된 노드에 더 이상 pod들이 스케쥴링되어서 실행되지 않도록 제재하는 것을 말한다.1) pod 확인하기kubectl get po -o wide위의 명령어를 쳐서 pod들에게 할당되어진 pod들을 확인한다. 내 경우 워커노드를 3개를 돌리고 있어서 각각 w1,w2,w3에게 골고루 지정되어 있다.2) cordon 지정하기kubectl scale deployment --replicas=1우선 워커들이 pod들에게 지정되어 있으므로 replicas를 pod 하..

Tistory

[Kubernetes] kubernetes label 활용하기

kubernetes를 처음에 공부했을 때 별로 필요없는 줄 알고 비중을 크게 두지 않았다. 근데 공부하고 나서 활용도가 높아서 정리하게 되었다.예를 들어 ai모델을 클라우드에서 돌리고자 한다. 그런데 워커 노드에 어떤 gpu와 disk가 있는지 모른다. 그렇다면 어느 노드에 돌리는 것이 효율적인지 모른다.이럴 경우를 대비하여 label를 사용한다.위와 같이 node1에는 gpu가 있고, disk가 ssd임을 알려준다면 ai모델을 돌리는 워커 노드를 택하는 것이 쉬워질 것이다. 이럴 경우에 쓰이도록 한다.1. 노드의 label 할당하기1) 전체 노드의 label 확인하기kubectl get nodes --show-labels위와 같이 node들의 label들을 확인할 수 있다. 이는 기본적으로 node들에..

Tistory

[Kubernetes] kubernetes안에 mysql 배포하기

참고 사이트를 기반으로 하여 mysql를 배포하였습니다.기본적으로 data가 많다면 kubernetes안에 mysql을 배포하는 것이 좋지 않은 선택이다. 그렇지만 데이터가 많지 않고 insert하고 나중에 delete하는 작업을 반복한다면 안에 넣어 관리하는 것도 나쁘지 않다고 생각한다.1. 쿠버네티스 secret 만들기: 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는 오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너 이미지에 포함될 수 있다.vi mysql-secret.yamlmysql의 secret파일을 만든다.apiVersion: v1kind: Secretmetadata: name: mysql-secrettype: kubernetes.io/basic-auths..

Tistory

[Kubernetes] kubernets NFS server 알아보기

Kubernetes에서 NFS 서버는 Kubernetes 클러스터에서 실행되는 애플리케이션에 영구 스토리지를 제공하는 NFS(네트워크 파일 시스템) 서버입니다. NFS는 클라이언트가 마치 로컬에 저장된 것처럼 네트워크를 통해 파일에 액세스할 수 있도록 하는 분산 파일 시스템 프로토콜입니다. Kubernetes의 맥락에서 NFS 서버는 일반적으로 외부 스토리지 솔루션으로 사용됩니다. 이를 통해 Kubernetes 포드는 NFS 서버에서 호스팅되는 공유 스토리지 볼륨에 액세스할 수 있습니다. 이는 여러 Pod 간에 데이터를 공유하거나 개별 Pod의 수명 주기를 넘어 데이터를 유지해야 하는 시나리오에 유용합니다.1. NFS 서버를 쓰는 배경클러스터 내부 저장소에 마운트하면 컨테이너 생명주기와 클러스터 생명주기..

Tistory

[Kubernetes] Volume 개념 적립하기

볼륨을 사용해야 하는 이유는?컨테이너 특성 상 어떠한 문제가 발생하여 컨테이너가 삭제 된다면 데이터도 같이 삭제되게 된다. 파일을 따로 보관해야 한다거나, 데이터 베이스를 사용할 경우 실시간으로 생성되던 데이터가 사라지면 큰 장애가 발생 하게 된다. 모종의 이유로 컨테이너를 사용할 때 중요한 데이터가 있다면, 볼륨을 사용하여 데이터를 보관해줘야 한다.즉, Stateful한 Application 경우(Pod, Deployment) 데이터를 영속적으로 저장하기 위한 방법이 필요하다.Storage Volume이란?Pod의 일부분으로 정의되며 Pod와 동일한 Lifecycle을 가진다. 파드가 시작되면 Volume이 생성되고, 파드가 삭제되면 볼륨이 삭제된다는 것을 의미한다.→ 쿠버네티스 Volume은 Pod의..

Tistory

[Kubernetes] microk8s 생성하기

microk8s 생성하기내 경우 yum을 사용하여 기본적인 명령어를 설치하고는 했다. 그래서 snap이 설치되지 않았다. microk8s를 설치하려면 snap이 있어야 하기에 snap부터 설치해준다.snapd가 설치되어 있는지 확인하기 : 시스템에 snapd가 설치되어 있는지 확인한다.sudo yum install snapd이미 설치가 되어 다음 단계로 넘어갔다.2. snapd 서비스 시작하기 : snapd가 설치된 경우 snapd 서비스를 시작한다.sudo systemctl start snapd3. snapd 서비스 활성화 : 부팅 시 snapd 서비스가 시작되도록 활성화되어 있는지 확인한다.sudo systemctl start snapd4. snapd 상태 확인 : snapd 서비스의 상태를 확인하여..

Tistory

[Kubernetes] ingress-nginx을 사용하여 배포하기

내 경우 참고 사이트에 있는 영상으로 해서 어떻게 ingress가 돌아가는지 파악하였다.쿠버네티스 ingress를 이용한 nginx 배포 실습 환경master node 1개(192.168..16.10)worker node 1개(192.168..16.101)실습하기1) deployment, service 생성하기kubectl create deploy nginx --image=nginx이름이 nginx이고, 이미지는 nginx를 기반으로 생성해주었다.kubectl expose deploy nginx --type=NodePort --port=80 --target-port=80생성되어 있는 deployment nginx를 기반으로 하여 type은 Nodeport로 하고 port는 80으로 지정해준다.kube..

Tistory

[Docker] docker volume 연결하기

데이터 유지를 위해 사용하게 되었다. 도커 컨테이너의 경우 컨테이너를 삭제하게 되면 작업했던 데이터가 모두 삭제되어 버린다. 컨테이너는 삭제되어도 데이터는 유지하고 싶은 경우를 대비하여 볼륨을 사용하고자 한다.1. 볼륨 생성하기1-1) 볼륨 생성하기docker volume create 나는 아래와 같이 생성하고자 하는 볼륨의 이름을 new-one이라고 지정하였기에 new-one이라는 이름이 나오면서 생성이 된 것을 알 수 있다.1-2) 볼륨 리스트 확인하기docker volume lsdriver와 함께 내가 생성한 볼륨을 확인할 수 있다.driver : 드라이버는 호스트와 클라우드 공급자로 나뉜다. 나의 경우 local에서 생성했으니 driver가 호스트로 지정된 것을 알 수 있다.또한, 볼륨 내용을 암..

Tistory

[Kubernetes] metalLB로 ingress-nginx-controller external ip로 접속하기

1. metalLB이란?클라우드에서 제공하는 외부 로드밸런서가 필요하다. 내가 사용하고 있는 쿠버네티스 즉, 일반적인 환경에서는 로드 밸런서를 사용하게 되면 external-ip부분에 pending이 뜨고, 사용하지 못 한다. 이 환경을 온프레미스환경이라고 하는데, 여기서 로드밸런서를 사용하려면 내부에 로드밸런서 서비스를 받아주는 구성이 필요하다.이를 지원하는 것이 MetalLB이다. MetalLB는 베어메탈(bare metal, 운영체제가 설치되지 않은 하드웨어)로 구성된 쿠버네티스에서도 로드밸런서를 사용할 수 있게 고안된 프로젝트이다. MetalLB는 특별한 네트워크 설정이나 구성이 있는 것이 아니라 기존의 **L2 네트워크(ARP/NDP)**와 **L3 네트워크(BGP)**로 로드밸런서를 구현한다...

Tistory

[Kubernetes] kubernetes dashboard 배포하기

dashboard 배포하기1. dashboard 설치하기kubectl apply -f 맨 밑의 참고사이트를 보면 공식문서가 존재한다. 공식문서에서 yaml파일을 제공해주므로 이를 통해 dashboard를 설치한다.2. 서비스 돌아가는지 확인하기kubectl get svc -n kubernetes-dashboard위와 같이 kubernetes-dashboard가 있다면 제대로 돌아가고 있는 것이다.3. 외부접속을 위해 NodePort 설정하기위에서 service의 목록을 보았을 때 type이 clusterIp였다. 이는 클러스터 안에서만 접속을 할 수 있다는 뜻이다. 외부 ip에서 대시보드에 접속할 수 있도록 type을 NodePort로 변경해야 한다.kubectl edit svc kubernetes-da..

Tistory

[Kubernets] ReplicaSet and Deployment 알아보기

ReplicaSet 개념레플리카셋은클러스터 안에서 움직이는 파드의 수를 유지하는 장치클러스터의 파드의 실행을 항상 안정적으로 유지하는 것을 목표로 명시된 파드 개수에 대한 가용성을 보증하는데 사용된다.replicaset을 구성하는 yaml파일# replicaset-nginx.yaml# [1] 기본 항목apiVersion: apps/v1kind: ReplicaSetmetadata: name: nginx-replicaset# [2] ReplicaSet 스펙spec: replicas: 3 # Pod의 수 selector: # Pod 템플릿의 검색 조건 matchLabels: app: nginx-replicaset # [3] Pod 템플릿 template: metadata: ..

Tistory

[Docker] docker compose 알아보기

: 단일 서버에서 여러 개의 컨테이너를 하나로 정의하고 실행하기 위한 도구이다. 즉 docker run을 통해서 실행하는 모든 어플리케이션은 docker-compose 명령어를 사용하여 작업하여 관리할 수 있다.docker-compose 사용 이유docker로 만든 여러 개의 컨테이너를 한번에 작업하고자 할 때가 존재한다. 웹서버는 기본적으로 프론트 엔드 서버, 백엔드 서버, 데이터베이스 서버 가 존재한다. 이를 각각 하나씩 컨테이너로 만들어 구동할 수 있게 작업해줘야 하는데, docker-compose를 사용하면 이를 한번에 작업할 수 있다.docker-compose 설치하기docker-compose는 각각의 OS환경에 따라 다르다. 그러므로 docker docs에서 본인의 환경에 맞는 OS를 선택하여..

Tistory

[Docker] docker ssh 설치해서 filezilla로 파일 업데이트하기

1. docker 이미지 생성 및 컨테이너 포트 열기1) docker images 확인하기docker images도커 이미지가 잘 생성되었는지를 확인하고, 이미지id를 확인하여 따로 복사해둔다.2) 실행중인 컨테이너 확인하기docker run -i -t -p [host port]:22  --name [컨테이너명] nvidia/cuda /bin/bash-i : 이 플래그는 interactive를 의미하고, 이는 터미널에 연결하여 컨테이너의 명령줄과 상호 작용할 수 있도록 한다. 컨테이너 내부에서 실행되는 명령이나 스크립트에 입력을 제공한다.-t : "pseudo-terminal"을 나타낸다. 터미널 장치를 할당하여 터미널에서 컨테이너의 명령 프롬프트와 터미널 출력을 볼 수 있다.-d : ‘backgroun..

Tistory

[Docker] docker buildx 사용해서 크로스 아키텍처 빌드하기

기기마다 다른 플랫폼이나 아키텍처를 가진다. 내가 원하는 환경에서 구동되면 좋겠지만 그게 아니라면 그것들을 위한 환경을 만들어줘야 한다.1) 아키텍처 확인하기uname -a접속한 기기의 아키텍처를 알 수 있다.Ubuntu에서 build한 image를 iot등에 실행시킨다면 아키텍처가 다르다.2) docker 버전 확인하기우선 docker 19.03 버전부터 사용이 가능하므로 설치되어 있는 docker의 버전을 확인해준다.3) buildkit 환경셋팅해주기sudo mkdir /etc/buildkitsudo vi /etc/buildkit/buildkitd.tomldebug = trueroot = "/var/lib/buildkit"insecure-entitlements = ["network.host", "se..

Tistory

[Kubernetes] microk8s 설치하고 사용하기

chatgpt한테 물어보았다. microk8s와 kubernetes의 차이가 뭐야?라고 물어보니KubernetesKubernetes는 원래 Google에서 개발한 강력한 오픈 소스 컨테이너 조정 플랫폼입니다. 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하도록 설계되었다.Kubernetes는 자동 확장, 롤링 업데이트, 서비스 검색, 로드 밸런싱, 스토리지 오케스트레이션 등을 포함하여 컨테이너화된 애플리케이션을 관리하기 위한 포괄적인 기능 세트를 제공한다.Microk8sMicroK8s는 Canonical(Ubuntu 뒤의 회사)에서 개발한 경량 Kubernetes 배포판이다. MicroK8s는 단일 노드 Kubernetes 클러스터를 워크스테이션이나 VM에서 빠르게 설정할 수 있는 단순화된 배..

Tistory

[Docker] docker에 자바 배포하기

1. docker에 코드와 일치하는 java버전 설치하기2. docker에 코드와 일치하는 tomcat버전 설치하기 3. WORKDIR 설정해서 자바설정 파일 옮기기docker를 설치했다는 가정하에 linux에서 workdir를 하나 설정하여 java파일을 옮겨놓는다.4. dockerfile을 설정하기Dockerfile : Container를 어떻게 만들어야 할지에 대한 설명서Docker Image : 어플리케이션을 실행하는 데에 필요한 코드, 런타임 환경, 시스템 라이브러리 등 모든 셋팅들을 포함하는 것Container : Docker Image를 고립된 환경에 실행시킬 수 있는 것  Docker Container를 만들기 위해서는 Dockerfile를 이용해 Docker Image를 만들고 Con..

Tistory

[React] 트리 구조 메뉴 쉽게 만들기

우연히 글을 보다가 트리 구조의 메뉴를 만드는 것을 보고 나중에 참고할 수 있을 것 같아서 글을 쓴다.1. react-arborist 맛보기1) 설치하기npm install react-arborist2) 데이터 셋팅export const data = [ { id: "1", name: "public", children: [{ id: "c1-1", name: "index.html" }] }, { id: "2", name: "src", children: [ { id: "c2-1", name: "App.js" }, { id: "c2-2", name: "index.js" }, { id: "c2-3", name: "styles.css" } ] ..

Tistory

[Node.js] swagger로 api 문서 자동화하기

api를 문서화하고 있었는데, 매번 일일이 치기 귀찮다. 시간도 많이 드는데 하나씩 언제 치고 있는가. 그래서 자동화하는 라이브러리를 봤다가 시도했다가 실패했다. 그래서 머리 아파서 나중에 하자.지금이 그 나중이다.설치하기npm install swagger-jsdoc swagger-ui-express swagger-autogenswagger-jsdoc : json으로 만들어진 파일을 가지고 openAPI 사양을 생성한다.swagger-ui-express : express에서 swagger.json를 기반으로 swagger-ui를 생성해준다.swagger-autogen : swagger를 자동 생성해주는 라이브러리이다.swagger.js 셋팅하기1) 구조 살피기// 프로젝트 구조 src swagger..

Tistory

[Node.js] npm install과 npm ci의 차이 알아보기

우연히 이 둘의 차이점을 보게 되서 이에 대한 글을 쓰고자 한다.npm install을 할 때 밑의 두 파일을 기반으로 설치를 하게 된다.package.jsonpackage-lock.jsonpackage.json 은 우리가 설치하고자 하는 모듈에 대한 의존성 목록이 존재한다. 여기서 의존성 목록의 버전은 version range를 따르고 있다. (~, ^ "react": "^17.0.2"version range로 인해 발생할 수 있는 이슈는 각자 서로 다른 node_modules 를 생성할 수 있다.예를 들어, 하나의 프로젝트에 여러 명의 개발자가 협업을 할 경우에 각자의 로컬 환경에 따라 npm, node 버전 등이 다르다. 이러한 상황에서 각자 npm install 실행한다면, 서로 다른 버전을 가지..

Tistory

[Node.js] 배열에서 filter, some으로 값 삭제하기

우연히 some함수를 알게 되어서, filter와 비슷하여 비교글을 쓰고자 한다.1. filter()을 활용한 삭제const deleteNote = (id) => { const newNotes = notes.filter((note) => note.id !== id); setNotes(newNotes);}→ id를 prop으로 받아온다. notes배열에서 note.id가 파라미터로 일치하지 않는 원소만 추출하여 새로운 배열을 만든다. 이 말은 note.id가 id인 것을 삭제해준다. 처음에 이걸 이해를 못해서 많이 헤맸다.2. some()을 활용한 삭제const array = [1, 2, 3, 4, 5];const even = (element) => element % 2 === 0;console..

Tistory

[React] 이미지 슬라이드 쉽게 구현하기

react로 이미지 슬라이드를 쉽게 구현하고자 한다.🏻 기술스택 : React, tailwind.css나의 경우 두가지 경우로 구현하였다.1. animation을 이용하여 구현하기작동 방식보여주고 싶은 카드들의 배열을 만들고, 이를 복제하여 나타낸 뒤 번갈아 가며 보여주는 방식이다. 내가 만들고자 하는 컴포넌트들의 컨테이너를 배너라고 칭한다.[원본 배너]- 원본 배너와 복제 배너를 한 방향으로 이동시켜주는 애니메이션을 실행시킨다-  원본 배너가 배너 너비만큼 이동하면, 복제 배너의 뒤로 이동시킨다.-  원본 배너는 다시 배너 너비만큼 이동한다.[복제 배너]-  복제배너는 일정 방향으로 배너크기의 2배만큼 이동시켜주면 된다.-  사용자는 마치 하나의 배너가 무한으로 렌더링되는 것처럼 보인다..-  사실..

Tistory

[React] react-hot-toast로 toast 띄우기

Toast토스트 메시지란 사용자에게 간단한 정보를 잠깐 보여주는 UI 요소이다. 화면의 특정 위치에서 떠오르고, 일정 시간이 지나면 사라진다.→ 이를 사용하게 된 계기는 alert창을 쓰다가 단조로워서 바꿀까하다가 우연히 보게 참고 사이트 글을 보게 되어 사용하게 되면서 글을 쓰게 되었다.react-hot-toast 사용하기1) 패키지 설치하기npm i react-hot-toast2) 앱에 toaster 넣기import toast, { Toaster } from 'react-hot-toast';해당 패키지를 설치했으니, 이를 가져온다.const App = () => { return ( Make me a toast );};toast를 쓰기 위해서 Toaster를 앱에 맨 위..

Tistory

[Node.js] 세션 알아보고 적용하기

카카오톡 api를 설정하면서 세션을 등록하였다. 이에 대해서 글이 길어질까 싶어 글을 쪼갰다. 오늘은 session에 대해서 설명하고자 한다.개발환경Backend: Express + TypeScript + Node.js + MongoDB세션이란?Cookie방식과 다르게 데이터를 서버에 저장하는 방식Server가 Client에 유일하고 암호화된 아이디(Session ID)를 부여실제 데이터는 서버에 보관해 두고 각각의 유저들에 대한 고유 id 값을 쿠키에 저장하여 기록한다. 서버는 사용자의 ID값(Cookie에 저장되어 있는)을 비교 및 판단하여 어떤 사용자의 데이터인지와 그 사용자의 접속 여부를 판별할 수 있다.Session Store란?: 세션이 데이터를 저장하는 장소대표적으로 세가지가 있다.기본 셋팅..

Tistory

[Node.js] kakao rest api로 카카오 로그인 적용하기

개발 환경Frontend: TypeScript + React + Next.jsBackend: Express + TypeScript + Node.js + MongoDBKAKAO DEVELOPER에서 선행작업하기 ️ Kakao developer 해당 사이트에 들어가서 해야 할 선행 작업을 수행한다.1. 애플리케이션 만들기→ 앱 아이콘, 이름, 사업자명, 카테고리 등을 넣어 등록한다. 나의 경우 개인으로 추가한 것이기에 사업자명은 내 별명을 넣어주었다.해당 애플리케이션 만들어졌다.2. REST API 키 등록하기애플리케이션을 만들면 자동으로 만들어진다. 여기 중 REST API를 따로 저장해놓는다.3. 사이트 도메인 설정하기내 애플리케이션 > 앱 설정 > 플랫폼에 들어가면 맨 하단에 설정할 수 있다.나중..

Tistory

[Node.js] Tailwind CSS 적용하고 최적화하기

개념Tailwind CSS는 Utility-First 컨셉을 가진 CSS 프레임워크다. 부트스트랩과 비슷하게 m-1, **flex**와 같이 미리 세팅된 유틸리티 클래스를 활용하는 방식으로 HTML 코드 내에서 스타일링을 할 수 있다.코드의 길이 Not Pretty Code 내가 이 글을 쓴 계기는 코드의 가독성때문에 찾다가 쓰게 되었다.그래서 구글링해서 찾아보았더니, styled-component를 쓰던가 아니면 apply방식을 썼다.가독성 좋게 만들기1) styled-componentimport styled from "styled-components";const StyledButton = styled.button` padding: 6px 12px; border-radius: 8px; fon..

Tistory

[React] Modal 사용하여 팝업창 만들기

설치하기npm install react-modal위와 같이 설치했는데 오류가 걸리는 경우가 존재한다. 내가 그랬기 때문이다.npm i --save-dev @types/react-modal타입 정의 라이브러리를 사용하면 오류가 나지 않는다.import하기import Modal from 'react-modal';import를 해주고 modal을 사용해주면 된다.useState 셋팅해주기나의 경우에 button을 클릭했을 때 modal을 보여주게 하고 싶기에 변수를 button과 modal을 연결해놓으면 된다.import React, { useState } from 'react';import Modal from 'react-modal';function App() { const [modalIsOpen, set..

Tistory

[React] Global Style 적용하기

사람은 역시 공부해야 하는 동물이구나 느끼면서 글을 작성하고자 한다.styled-resetstyled-reset은 브라우저의 기본 스타일을 리셋시켜주는 node.js 패키지이다. 내가 css를 적용할려고 했는데 브라우저에 기본적으로 적용되어 있는 스타일 때문에 적용이 안 된 경우를 많이 보았을 것이다. 그 때 reset을 시켜줘야 하는데, 구글에 쳐봤을 때 리셋시켜주는 코드를 쉽게 구할 수 있다.그러나, react에서 reset시켜주는 라이브러리가 존재한다. 이를 쓰면 원하는 스타일링을 하기 앞서 기본 세팅을 리셋해주는 것이 좋다. 또한 styled-reset을 시켜주는 가장 큰 이유는 크로스 브라우징 때문이다.  브라우저마다 HTML 시맨틱 태그에 대한 기본값의 차이를 없애주기 위함이다.styled-..

Tistory

[Node.js] socket.io으로 양방향 통신 해보기

개념node.js에서는 많은 웹 소켓 구현체가 있다. 대표적으로 socket.io와 ws가 있다. 지금 여기서 내가 사용할 기술은 socket.io이다.웹에서 데이터를 주고 받을 땐 HTTP를 사용한다. 하지만 HTTP는 요청이 있어야만 응답을 보내주기 때문에 실시간을 보장하지 않는다. HTML5 WebSocket은 매우 유용한 기술이지만 오래된 브라우저의 경우 지원하지 않는 경우가 있다.www.caniuse.com브라우저 간 호환이나 이전 버전 호환을 고려하여 Node.js를 위한 강력한 Cross-platform WebSocket API인 Socket.io를 사용하는 것이 바람직하다.socket.io를 통한 양방향 통신 구현하기1) 백엔드에서 socket.io 설치하기(서버)npm i socket.i..

Tistory

[Next.js] V0.dev waitlist에서 대기타고 ai로 코딩하기

chatGPT가 나왔을 때만 엊그제같은데, 지금은 vercel v0이 개발하였다. 개발자는 트렌드를 못 쫓아가면 죽겠구나 생각이 든다. chatGPT가 나오고 여러 인공지능이 개발되었다. 그런데 이제는 프론트를 꾸며준다니 점차 개발자가 설 공간이 줄어드는 건 아닌가라는 생각이 든다.v0서론은 이만하고 v0.dev에 대해서 서술하고자 한다. 참고사이트의 사이트를 들어갔다가 우연히 v0에 대해서 알게 되었다. 이는 인공지능이 프론트엔드 개발을 해주는 서비스이다.v0 by Vercel 해당 사이트에 들어가보면 알겠지만, 지금 엄청 많은 사이트들을 구현해놓았다. 보고 되게 신선한 충격을 받았다. 진짜 세상이 나도 모르는 사이에 너무 빠르게 변화하고 있구나라는 생각이 절로 든다. 채팅앱이나 인스타그램, 가계부등 ..

Tistory

[React] react-calendar 적용하기

리액트에는 react-calendar와 react-datepicker등으로 캘린더를 구현할 수 있다.설치npm i react-calendarimport하기import Calendar from 'react-calendar';import 'react-calendar/dist/Calendar.css'; // css importreact-calendar를 설치하고 import해준다.아래의 css는 react-calendar에서 기본적으로 제공해주는 css파일이다.표시하기 위와 같이 했으면 Calendar를 가져와서 표시해주면 캘린더가 보이게 된다.하지만, 캘린더를 클릭시 내가 클릭한 날짜를 보여주게 해주고 싶으면 아래와 같이 코드를 추가해주면 된다.npm i moment우선, moment를 설치해준다...

Tistory

[Django] views.py 파일 분리하기

앱의 크기가 커지면 커질수록 뷰 파일의 함수도 늘어나게 된다. 그러면서 원하는 기능을 찾기가 어려워지게 되고, 뷰 파일의 크기가 방대해지게 된다.그래서 views.py 파일을 분리하고자 한다. 이에 두가지 방법이 존재한다.첫번째 방법폴더를 하나를 만들어 views.py안에 있는 함수를 기능별로 분류하는 방법이다.내 경우 테이블이 두 개가 있다. 질문과 답변을 받아 데이터를 관리하는데, 이를 가지고 세 가지로 분류하고자 한다.파일명 기능 함수base_views.py기본관리index, detailquestion_views.py질문관리question_create, question_modify, question_deleteanswer_views.py답변관리answer_create, answer_modify, a..

Tistory

[Django] 검색 기능 구현하기

미리 페이지네이션을 구현하였고, 이제는 검색 기능을 구현하고자 한다. keyword와 page를 받고, 이를 get방식으로 호출하여 검색 기능을 구현한다.1. 템플릿 수정하기1) input과 button 추가하기 찾기 input과 button을 추가한다. 그리고 input 태그에 id로 search_kw, value로 keyword를 지정한다.2) form 추가하기 GET 방식으로 요청해야 하므로 method 속성에 "get"로 설정한다.kw와 page는 이전에 요청했던 값을 기억하고 있어야 하므로..

Tistory

[Django] 장고 이미지 간단하게 추가하기

1. settings.py에 파일 경로 추가하기STATIC_URL = 'static/'STATICFILES_DIRS = [ BASE_DIR / 'static',]static폴더에 image파일을 사용하기 위해서 static폴더를 등록해준다.폴더는 이렇게 되어 있어야 static폴더 하위에 있는 이미지 파일을 사용할 수 있다.2. templates에 img 추가하기그리고 내 경우에 templates에 있는 html파일에 바로 이미지를 추가하고자 한다.1) static 파일 사용함을 공지하기{% load static %}img태그보다 위에 static 파일을 사용한다고 지정해줘야 한다.2) img태그 경로 설정하기그럴 경우 img태그를 만들어 src에 바로 static폴더 경로를 추가해준다.

Tistory

[Django] 로그인, 로그아웃 구현하기

장고의 로그인, 로그아웃을 도와주는 앱은 django.contrib.auth 이다. 이를 가지고 구현해보즈아!하나의 웹 사이트에는 게시판 서비스, 블로그나 쇼핑몰과 같은 굵직한 단위의 앱들이 함께 있을 수 있기 때문에 공통으로 사용되는 기능인 로그인이나 로그아웃을 이 중의 하나의 앱에 종속시키는 것은 좋지 않다. 이러한 이유로 로그인 · 로그아웃을 "공통 기능을 가진 앱"이라는 의미의 common 앱에 구현하는 것이 좋다.1. common 앱 생성하기django-admin startapp common위의 명령어를 치면 디렉터리와 파일들이 자동으로 생성된다.// config\\settings.pyINSTALLED_APPS = [ 'common.apps.CommonConfig', ]그리고 나서 앱을 ..

Tistory

[Django] 회원가입 구현하기

회원가입 장고의 django.contrib.auth 앱을 이용하면 쉽게 구현할 수 있다. 이를 가지고 구현해보즈아!1.회원가입 템플릿 추가하기 // templates/navbar.html {% if not user.is_authenticated %} 회원가입 {% endif %} navbar.html 템플릿에 회원가입 템플릿을 추가해준다.2.URL 맵핑하기navbar.html 템플릿에 {% url 'common:signup' %} 태그를 추가했으므로 여기에 대응하는 URL 매핑 규칙을 추가해야 한다.// common\\urls.pyfrom django.urls import pa..

Tistory

[Django] 장고 모델 변경하기

게시판의 질문, 답변에는 누가 글을 작성했는지 알려주는 "글쓴이" 항목이 필요하다. Question과 Answer 모델에 "글쓴이"에 해당되는 author 속성을 추가하고자 한다.1. Question테이블에 속성 추가하기from django.db import modelsfrom django.contrib.auth.models import Userclass Question(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE) (... 생략 ...)User 모델 :  django.contrib.auth 앱이 제공하는 사용자 모델로 회원 가입시 데이터 저장에 사용한 모델이다.CASCADE : 계정이 삭제되면 이 계정이 작..

Tistory

[Django] static 디렉터리 설정 및 공통 템플릿 만들기

1. static 디렉터리//config\\settings.pySTATICFILES_DIRS = [ BASE_DIR / 'static',]스타일시트 파일은 장고의 스태틱 디렉터리에 저장해야 한다. config/settings.py 파일에 등록하여 사용한다.static이라는 디렉터리에 스타일시트 파일을 넣어야 하므로, static 폴더가 존재해야 한다. 이를 만들어준다.mkdir static2. 스타일 시트// static/style.csstextarea {width:100%;}input[type=submit] {margin-top:10px;}style.css 파일에는 상세화면에 적용할 스타일을 정의했다. 답변 등록시 사용하는 텍스트 창의 넓이를 100%로 하고 "답변등록" 버튼 상단에 10 픽셀의 ..

Tistory

[Django] 페이지네이션 구현하기

페이지네이션은 보여주고자 하는 데이터가 많을 때 구현한다. 페이지네이션을 구현하기 위해서 데이터를 많이 생성하고자 한다.1. 가짜 데이터 만들기python manage.py shell데이터가 없으므로 장고 셸을 구동하여 데이터를 만들어주자!>>> from pybo.models import Question>>> from django.utils import timezone질문 데이터를 생성하기 위한 모듈을 임포트한다.for i in range(300):... q = Question(subject='테스트 데이터입니다:[%03d]' % i, content='내용무', create_date=timezone.now())... q.save()q변수를 선언할 때 shift+enter를 써서 내려쓰기를 ..

Tistory

[Django] 장고에서 템플릿 파일 사용하기

1. 질문 목록: 등록한 질문들을 게시물 목록으로 조회하는 기능// mysite/projects/pybo/views.pyfrom django.shortcuts import renderfrom .models import Questiondef index(request): question_list = Question.objects.order_by('-create_date') context = {'question_list': question_list} return render(request, 'pybo/question_list.html', context)질문 목록 데이터는 Question.objects.order_by('-create_date') 로 얻을 수 있다.order_by : 정렬하는 함..

Tistory

[Django] URL 별칭 사용하기

먼저 question_list.html 템플릿에 사용된 다음 링크를 보면{{ question.subject }}질문 상세를 위한 URL 링크이다. URL 링크의 구조가 자주 변경된다면 템플릿에서 사용한 모든 URL들을 일일이 찾아가며 수정해야 하는 리스크가 발생한다. 링크의 주소가 하드코딩되어 있기 때문이다.실제 링크 대신 링크의 주소가 1:1 매핑되어 있는 별칭을 사용해야 한다. {% url %} 템플릿 태그를 사용하면 이러한 문제를 해결할 수 있다.1. URL 별칭 지정하기// pybo\\urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [ path('', views.index, name='index'), path('/..

Tistory

[Django] 데이터 전달과정 알아보기

1. 폼 등록하기기본적으로 우리는 데이터를 주고 받을 때 form이용하여 받고는 한다. 이를 이용해서 장고에서 데이터 전달과정을 보고자 한다.// pybo\\question_detail.html{% csrf_token %}우리가 이전에 question을 등록했으므로 이에 대한 답변을 받기 위한 form을 만들어 준다. 그리고 이는 textarea에 적으면 button을 클릭하면 넘어가는 형식을 구현하였다.답변 저장을 위한 URL : form 태그의 action 속성에 {% url 'pybo:answer_create' question.id %}로 지정했다.{% csrf_token %} : 보안에 관련된 항목으로 form으로 전송한 데이터가 실제 웹 페이지에서 작성한 데이터인지를 판단하는 가늠자 역할을 한다..

Tistory

[Django] 장고 CRUD 사용하기

python manage.py shell위와 같이 명령어를 입력하면 장고 셸을 사용할 수 있다. 위와 같이 manage.py를 이용하여 사용하여야지만 장고에 필요한 환경들이 자동으로 설정되어 실행된다.1. Question 생성하기>>>from pybo.modelsimport Question, AnswerQuestion과 Answer 모델은 장고 셸에서 다음처럼 import하여 사용할 수 있다.>>>from django.utilsimport timezone>>> q = Question(subject='pybo가 무엇인가요?', content='pybo에 대해서 알고 싶습니다.', create_date=timezone.now())>>> q.save()Question 모델의 create_date 속성은 Dat..

Tistory

[Django] 장고 관리자 사용하기

1. 슈퍼유저 생성하기python manage.py createsuperuser장고 관리자를 사용하기 위해서는 장고 관리자 화면에 접속할 수 있는 슈퍼유저(superuser)를 먼저 생성해야 한다. 위와 같은 명령어로 생성한다.슈퍼유저 생성 정보항목값사용자 이름admin이메일 주소[email protected] 2. 장고 관리자 화면 보기슈퍼유저가 생성되었으니 로컬 서버를 구동한 후 http://localhost:8000/admin/ 페이지에 접속한다. 그러면 위와 같은 화면이 나온다.아까 위에서 생성한 username과 password를 입력해준다.3. 장고관리자에서 모델 관리하기위에서 Question 모델을 만들었다. 이를 Question모델을 관리자에 등록한다.// mysite/..

Tistory

[Django] 장고 앱 만들고 URL 맵핑하기

1. 장고 앱 만들기1) 장고 앱이란?장고 프로젝트에서 여러 개의 앱을 개발하고 관리할 수 있다. “앱”이란? 특정한 기능을 수행하는 웹 어플리케이션을 의미한다. 프로젝트에 기능을 추가하기 위해서는 앱을 생성해야 하므로, 아래를 따라해서 생성하도록 한다.2) 앱 생성하기django-admin startapp 위의 명령어를 치면 장고 앱이 생성되게 된다.2. URL 맵핑하기브라우저에서 http://localhost:8000/pybo 페이지를 요청했을 때 "안녕하세요 pybo에 오신것을 환영합니다."라는 문자열을 출력하도록 만들어 보자.python manage.py runserver해당 명령어를 써서 서버를 구동하도록 한다.그리고 나서 http://localhost:8000/pybo 페이지를 요청해보면위와 ..

Tistory

[Django] SQLite 설치하기

1. migrationpython manage.py runserver장고 앱을 구동시켰을 때 아래와 같은 문구가 보인다.위의 내용을 보면 18개의 적용되지 않은 migration들이 있다는 말이다. admin, auth, contenttypes, sessions 앱들과 관련된 내용이고 이것을 적용하려면 python manage.py migrate 를 실행해야 한다고 나와 있다. admin, auth, contenttypes, sessions 앱들은 장고 프로젝트 생성시 기본적으로 설치되는 앱들이다.1) INSTALLED_APPS설치된 앱들은 config/settings.py 파일에서 확인할 수 있다. 데이터베이스가 필요한 앱만 migrate가 필요하다.2) DATABASESconfig/settings.p..

Tistory

[Django] 장고 모델 생성하기

질문과 답변을 생성하여 사용하고자 한다. 생성하고자 하는 모델은 어떠한 속성을 지니고, 어떻게 생성해야 하는지 글로 쓰고자 한다.1. 모델의 속성[Question 모델]subject질문의 제목content질문의 내용create_date질문을 작성한 일시 [Answer 모델]question질문 (어떤 질문의 답변인지 알아야하므로 질문 속성이 필요하다)content답변의 내용create_date답변을 작성한 일시2. models.py 작성하기이렇게 생각한 속성을 바탕으로 질문(Question)과 답변(Answer)에 해당되는 모델을 pybo/models.py 파일에 정의한다.// mysite/projects/pybo/models.pyfrom django.dbimport modelsclassQuestion(m..

Tistory

[Django] 윈도우에 파이썬 설치하기

오랜만에 장고를 파이썬을 쓰려고 하니, 파이썬이 뜨기만 하고 버전이 안 떠져서 다시 설치하고자 한다.1. 파이썬 다운로드하기Download Python Download PythonThe official home of the Python Programming Languagewww.python.org위의 북마크를 들어가보면 아래와 같은 사진처럼 나온다.카테고리에서 Downloads > Windows > View the full list of downloads로 들어가준다.들어가보면 윈도우를 위한 파이썬 릴리즈하고 나오는데 stable release에서 제일 첫번째를 클릭해준다. Files에 description에 recommended로 써져 있는 것을 찾는다. 이를 눌러 설치해준다.2. 다운로드 받은 파일 ..

Tistory

[Django] 파이썬 가상 환경 셋팅 및 장고 설치하기

파이썬 가상 환경은 파이썬 프로젝트를 진행할 때 독립된 환경을 만들어 준다. 협업을 할 경우 각자의 환경에 따라 장고의 버전이 다를 수 있다. 그럴 경우를 대비하여 가상 환경을 이용하면 하나의 PC에 서로 다른 버전의 파이썬과 라이브러리를 쉽게 설치해 사용할 수 있다.가상 환경이 필수는 아니지만, 하나의 PC에 서로 다른 버전의 장고를 설치해야 하는 문제가 생기기에 대비하는 것도 좋을 듯하다.1. 파이썬 가상 환경 생성하기1) 파일 생성하기mkdir 본인이 만들고자 하는 파일이름으로 하여 파일을 생성한다.cd 2) 가상환경 만들기python -m venv 위와 같은 명령어를 입력하여 가상환경을 실행한다.python -m venv : 파이썬 모듈 중 venv라는 모듈을 사용한다는 의미이다.나의 경우에 ve..

Tistory

[Django] Django 프로젝트 생성하기

1. Django 프로젝트 생성프로젝트 생성 시 이름에는 되도록 python이나 django에서 사용 중인 키워드를 피해서 만드는 것을 권장한다. 또한 '-'(하이픈)도 사용하는 것을 금한다.아래와 같은 이름들은 사용할 수 없거나 사용하지 않도록 권장하는 예시이다.Djangotextclassdjango-test 등1) 생성하기C:\\>mkdir mysiteC:\\>cd mysite파일을 하나 만들어 진행한다.C:\\mysite>cd venv/Scriptsactivate그리고 나서 이전에 만들어놨던 가상환경에 진입하도록 한다.(mysite) C:\\mysite>mkdir projects하나의 파일을 만들어 가상환경과 구분되도록 한다.(venv) C:\\mysite\\projects>django-admin ..

Tistory

[Elysia] node.js로 작성한 코드 Bun.js로 바꾸기!

Bun.js가 좋다고 해서 공부를 시작했는데, 마땅히 공부할 자료들이 없었다. 그래서 내가 node.js보다 좋다고 했으니, 그동안 내가 토이 프로젝트를 하면서 작성한 코드 Bun.js로 작성하면 실력이 늘겠구나 싶어서 바꾸게 되었다. 이 글은 Bun.js에 대한 설명보다는 에러 위주로 설명되어 있으니 주의해주세요! 1. Cors 에러node.js와 express를 가지고 백엔드를 작성할 때 이 문제는 껌이였다. 그런데 express에서 작성하던 코드들이 잘 안 먹혔다. cors preflight문제 해결하니 계속적으로 Method delete가 허락이 안 된다는 것이다.1) cors preflightapp.use(cors())2) method errorapp.use( cors({ creden..

Tistory

[pnpm] 패키지 매니저 pnpm에 대해서 알아보기

나는 기본적으로 npm으로 코딩을 시작해서 npm으로 패키지등을 설치했었다. yarn으로 패키지를 설치하면 빠르다던가 그런 이야기가 있었지만, npm도 속도가 나쁘지 않은 것 같아서 계속적으로 사용하고 있었다. 그러다가 pnpm에 대해서 이야기가 많이 나오는 것을 보았다. yarn보다 빠르다길래 npm을 능가하고 yarn보다 빠르겠구나 생각해서 접해보게 되었다.Package Manager: 개발에 필요한 패키지를 설치, 업데이트, 수정, 삭제하는 작업을 편리하고 안전하게 수행하기 위해 사용되는 도구이다.pnpmnpm에 앞에 p문자만 붙었다. 여기서 앞에 붙은 p는 performant의 '승진, 성능 기준에 맞는' 이라는 뜻을 가지고 있다. 그래서 고성능, 효율적인 뜻이라고 보면 좋을 듯하다.용량의 차이1..

Tistory

[pnpm] pnpm으로 마이그레이션하기

pnpm의 속도에 대해서 들어봤다면 얼마나 빠르기에?라는 생각이 들 것이다. npm을 사용하고 있다면 pnpm을 사용할 수 있기 때문에 설치해서 사용하는 것을 추천한다.1. pnpm 설치하기1) npm이 설치되어 있는 경우(Node.js)npm install -g pnpm전역적으로 하여 pnpm을 설치할 수 있다. 그리고 나서 터미널을 껐다가 키는 것을 추천한다.만약 코드를 통해서 설치했는데 설치가 잘 안된다면 공식문서에 들어가면 다른 설치 방법이 있으니 이를 참고하여 설치하는 것을 추천한다.2) PowerShell로 설치하기Installation | pnpm Installation | pnpmPrerequisitespnpm.iopowershell로 설치하려고 하니 계속 V3가 악성코드라고 막았다. 그래..

Tistory

[Flutter] 웹에서 데이터 받아올 때

웹에서 데이터를 받아왔을 때 제대로 받아왔는지 확인하고 싶다. 이럴 경우 어떻게 하는지 작성해보고자 한다.1. if문 사용하기데이터를 서버에서 가져와서 쓰는 경우)데이터가 없는데 보여주고자 하면 에러가 난다. 서버와 통신하는 시간이 좀 걸린다. 그래서 if문을 써서 변수 안에 데이터가 있는지 체크한다.if(data.isNotEmpty){}else { return Text('로딩중'); }로딩중 대신 CircularProgressIndicator()등의 위젯을 사용하여 가독성있게 보여줄 수도 있다.return Center( child: SizedBox( width: 100, height: 100, child: Column( ..

Tistory

[Flutter] 페이지 만들기, 이미지 가져오기

1. 페이지 생성 및 나가기웹 페이지와 flutter의 페이지 이동을 비교했을 때웹 페이지 : 웹페이지가 이동하면 덮어씌워진다.flutter : 페이지가 stack형식처럼 쌓인다.페이지 만들기Navigator.push( context, MaterialPageRoute(builder: (context) => Text('안녕')), );페이지 나가기Navigator.pop(context);페이지를 만들었으면 나가기가 있어야 한다. 버튼을 눌러 나가게 하는 것이 좋다.route 생성하기MaterialApp( initialRoute: '/', routes: { '/': (context) => Text('첫페이지'), '/detail': (context) => ..

Tistory

[Bun] 그 유명한 Bun 찍먹하기

bun을 찍먹하기 위해서는 bun을 설치해야 된다. 그런데 할려고 보니 오류가 조금 많이 났다. 늘 그렇듯이 새로운 언어를 사용하기 위해서는 오류를 감안하고 해야 한다.bun 설치 오류나의 경우 윈도우에서 bun을 설치하고자 하였다. 그런데 무슨 명령어를 써도 오류가 뜨면서 설치가 되지 않았다. 참고 사이트를 보고 설치하였다. 다음과 같은 순서로 bun 설치 오류를 해결하고자 하였다.추가)bun관련 글을 찾다가 보아서 추가한다.WSL을 사용하여 Bun 개발환경 구성하기Bun은 아직 MacOS, Linux환경만 지원하고, Window는 아직 지원하지 않는다. 이에 대한 해결책으로, Window10 버전 이상부터 지원하는 WSL을 이용해야 한다.WSL은 리눅스용 윈도우 하위 시스템으로, Window10, 1..

Tistory

[Flutter] API 호출하는 두가지 방법 사용하기

flutter를 사용할 때 api를 호출하는 방법이 여러가지가 존재한다. 나는 그 중에서도 http와 dio에 대해서 글을 작성하고자 한다. 이 둘은 사용하기 편하다. 그런데 개인적으로 dio를 좀 더 선호하는 편이기는 하다. 아래에서 자세히 살펴보도록 하자. http https://pub.dev/packages/http http | Dart Package A composable, multi-platform, Future-based API for HTTP requests. pub.dev 1) 의존성 주입해서 설치하기 dependencies: http: ^1.1.0 pubspec.yaml 파일에 들어가서 종속성 부분을 찾아 http를 의존성을 주입하여 설치해준다. 2) import 해주기 import 'p..

Tistory

[javascript] 실행 지연을 시켜보자

자바스크립트에서의 실행의 지연을 시키기 위하여 쓰이는 함수들을 살펴 보자!setTimeout() 함수setTimeout() 함수는 두번째 인자로 넘어온 마이크로 초만큼 기다린 후, 첫번째 인자로 넘어온 함수를 호출해줍니다.console.log("before");setTimeout(() => console.log("after"), 3000);→ setTimeout(function/code, delay, arg1~)function/code - 실행하고자 하는 코드로, 함수 또는 문자열 형태이다. 거의 이 자리에 함수가 들어간다. 문자열을 넣을 경우 코드가 길어지기 때문에 함수를 넣는다. 문자열을 넣는 경우 익명 화살표 함수를 사용한다.delay - 실행 전 대기 시간으로, 단위는 밀리초(millisecond..

Tistory

[Firebase] Firebase Cloud Functions 로그인하기

이 포스팅에서는 이미 만들어진 프로젝트가 있으므로 연결하는 것까지 글을 작성하도록 하겠다. 1. firebase-tools 설치 npm install -g firebase-tools CLI로 Cloud Functions를 시작할 것이기 때문에 Firebase에서 제공하는 firebase-tools 패키지를 설치한다. # 패키지 업데이트 npm install firebase-functions@latest firebase-admin@latest --save 새로운 기능과 버그 수정은 Firebase CLI 및 firebase-functions SDK의 최신 버전에서만 제공되기 때문에 자주 CLI와 SDK를 업데이트 해주는 것이 좋다고 한다. 2. Firebase 로그인 firebase login CLI로 F..

Tistory

[Firebase] Firebase Cloud Functions 배포하기

파이어베이스 Functions 란? Firebase 기능과 HTTPS 요청에 의해 트리거 되는 이벤트에 응답하여 백엔드 코드를 자동으로 실행할 수 있는 서버리스 프레임워크 CLI로 프로젝트를 생성했다면 디렉토리에 index.js 파일이 생성되었을 것이다. 이 안에 배포를 하면 배포가 된다. 나는 이미 작성된 코드가 있으므로 기본적인 코드 작성하는 것은 패스하겠다. 로컬에서 테스트하기 내가 작성한 함수를 로컬에서 돌리고 테스트하기를 원한다면 firebase serve 위와 같이 작성하면 로컬에서 돌아간다. 그리고 에뮬레이터가 돌아가는 것이기에, 이에 대한 정보를 확인할 수 있다. 터미널에 나오는 주소창을 클릭하면 overview로 하여 어떤 것이 작동되고 있는지 확인이 가능하다. 그리고 postman등을 ..

Tistory

[Flutter] vscode에서 flutter 개발 환경 구축하기

플러터의 개발은 andriod studio에서 할 수 있다. 그러나 나는 개발을 vscode에서 많이 해서 이가 편하므로 이에 대해 글을 작성하고자 한다. 1. flutter 프로젝트 생성하기 vscode를 키고 명령 팔레트를 킨다. 만약 명령 팔레트가 어디 있는지 모른다면 vscode 왼쪽 하단에 톱니바퀴 모양이 존재한다. 이를 클릭하면 메뉴에 명령 팔레트를 클릭하면 된다. ctrl + shift + p 단축키를 클릭하면 된다. 명령 팔레트에 flutter라고 치면, 위의 사진같이 나온다. 플러터에 필요한 전제 조건들을 다 설치했다는 전제하에 Flutter: New Project를 클릭한다. 2. flutter template 선택하기 그러면 위와 같은 화면이 나오는데 여기서 Application을 클..

Tistory

JWT이란 무엇이고, 이에 대한 장단점을 알아보자

사용자의 인증정보를 관리하는 방식은 크게 두가지로 나뉜다. 첫째는 세션 기반 인증이다. 이는 서버 기반 인증이라고 불린다. 이 인증 시스템은 유저가 로그인을 하게 되면, 서버측에서 유저가 현재 로그인 중이라는 인증정보를 기억하고 있어야 한다. 그리고 이 정보를 세션 이라고 부른다. 서버 기반 인증의 문제점 서버기반 인증의 문제점은 크게 2가지로 있다. 첫째는, 세션을 유지하게 될 때, 로그인중인 유저의 수가 많아진다면 성능에 무리가 가게 된다. 이 정보를 메모리에 넣게 된다면 램이 과부화가 되고, 데이터베이스에 넣게 된다면 데이터베이스의 성능에 무리가 가게 된다. 두번째는, 서버 확장이 어려워진다는 점이다. 여기서 서버 확장은 더 많은 트래픽을 감당하기 위하여 여러 프로세스를 돌리거나 여러 서버 컴퓨터를..

Tistory

[Javascript] 단축 평가(short-circuit evaluation)에 대해서 알아보자

단축평가 논리곱(&&) 연산자와 논리합(||) 연산자는 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환한다. 이를 단축 평가라고 한다. 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략한다. 논리합과 논리곱 1) 논리곱(&&) 논리곱(&&) 연산자는 두 개의 피연산자가 모두 true로 평가될 때 true를 반환하며, 좌항에서 우항으로 평가가 진행된다. 아래의 첫 번째 피연산자 'Cat'은 Truthy 값이므로 true로 평가된다. 하지만 표현식은 이 시점에서 평가할 수 없다. 두 번째 피연산자까지 평가해 보아야다. 즉, 두 번째 피연산자가 논리곱 연산자 표현식의 평가 결과를 결정하며, 논리곱 연산자는 논리 연산의 결과를 결정하는 두 번째 피연산자 'Dog'..

Tistory

vercel에서 test 도메인 연동하기

홈페이지를 만들었을 때 오류를 대비하여 서브 브랜치를 가지고 테스트를 해야 한다. 그래서 main 브랜치를 메인 도메인과 연결하여 놔두고 서브 브랜치를 만들어 서브 도메인과 연동해야 한다. 이를 어떻게 하는지 글로 작성해보도록 하겠다. 1. 테스트 브랜치 만들기 위에서 설명한 것처럼 main 홈페이지는 놔두고 개발자들은 서브 홈페이지를 보고 오류를 수정을 해야 한다. 그래서 main branch와 분리하여 다른 branch를 생성해야 한다. git branch 이를 아래와 같이 push 해준다. git push --set-upstream origin test 여기서 upstream 은 로컬과 연결된 원격 저장소를 의미한다. 여기서 내가 서브 홈페이지와 연결할 브랜치의 이름을 test로 지정할 것이다. 그..

Tistory

웹 배포시 자동으로 업데이트하기

웹 페이지를 배포를 하다보면 자동으로 업데이트가 안됨을 확인할 수 있다. 그래서 각각의 사용자의 웹 페이지에 있는 캐시를 삭제하고 나서 웹 페이지가 업데이트됨을 확인할 수 있다. 그렇게 하면 각각의 사용자에게 캐시를 삭제하는 것을 요청해야 하는데, 이는 너무 비효율적이다. 그래서 이 글을 쓰게 되었다. 캐시의 생명 주기 HTTP에서 리소스(Resource)란 웹 브라우저가 HTTP 요청으로 가져올 수 있는 모든 종류의 파일을 말한다. 대표적으로 HTML, CSS, JS, 이미지, 비디오 파일 등이 이에 해당한다. HTTP 응답에 포함된 Cache-Control 헤더에 따라 받은 리소스의 생명 주기가 결정된다. 캐시의 유효 기간: max-age 서버의 Cache-Control 헤더의 값으로 max-age=..

Tistory

sentry으로 웹 모니터링 하기

우연한 기회에 sentry를 접하게 되어 글을 정리하고자 한다. 이 글에 대한 내용은 더 추가될 예정이며, 글이 길어질 경우에 나눠서 글을 쓰고자 한다. 글을 접했을 때는 내가 웹 사이트를 배포하고 아무것도 모르는 상태에서 사용자가 늘어나고, 그에 대해 오류가 일어났었다. 그런데 스타트업의 특성상 사수가 없다보니 물어볼 사람이 없어서 혼자 삽질을 엄청했다… 그래서 배포를 할 때 너무 무서웠고, 곧 react 배포할 때 똑같은 상황을 겪지 않기 위해 열심히 공부중이다. 프론트엔드 모니터링 프론트엔드 모니터링은 웹 사이트 또는 앱의 성능을 추적하는 데 사용되는 일련의 프로세스 및 도구를 말한다. 프론트엔드 모니터링은 주로 사용자가 최종적으로 보는 부분에 중점을 둔다. 아래와 같은 문제를 모니터링에서 기준으로..

Tistory

[Javascript] 버블링과 캡처링이란?

계층적 구조에 포함되어 있는 HTML 요소에 이벤트가 발생할 경우 연쇄적 반응이 일어난다. 즉, 이벤트가 전파(Event Propagation)되는데 **전파 방향에 따라 버블링(Event Bubbling)과 캡처링(Event Capturing)**으로 구분할 수 있다. 버블링 : 자식 요소에서 발생한 이벤트가 부모 요소로 전파 캡쳐링 : 자식 요소에서 발생한 이벤트가 부모 요소부터 시작하여 이벤트를 발생시킨 자식 요소까지 도달 → 즉 하위 요소에서 부모요소로 가는 것을 버블링, 반대로 부모요소에서 하위요소로 내려오는 것을 캡처링이라고 한다. 버블링과 캡처링 : 이벤트가 제일 깊은 곳에 있는 요소에서 시작해 부모 요소를 거슬러 올라가며 발생하는 모양이 마치 물속 거품(bubble)과 닮았기에 그러한 이름..

Tistory

크로스 브라우징에 대해 알아보자

: 웹 페이지 제작 시에 모든 브라우저에서 깨지지 않고, 의도한 대로 호환성에 맞게 나오게 하는 작업을 말한다. 1. 렌더링 엔진 : 페이지를 렌더할 때에 실질적으로 페이지를 작업해주는 브라우저의 엔진들을 의미한다. 엔진의 종류는 트라이던트, 게코, 웹킷, 프레스토, 블링크, 듀얼 엔진등으로 다양하다. 각 엔진은 사용되는 브라우저의 버전 혹은 지원하는 회사(ex: 구글, MS, 애플..)등에 따라 다르게 사용된다. 2. 대응 순서 타겟이 되는 (가장 점유율이 높은) 브라우저부터 맞춘다. http://gs.statcounter.com/ 위의 사이트는 전 세계 브라우저 점유율 조사 사이트(스탯 카운터)이다. 해당 사이트는 1999년에 시작된 웹 트래픽 분석 웹 사이트이다. 웹 사용 점유율을 계산하는 데 ..

Tistory

윈도우에서 MobaXterm로 리눅스 접속하기

MobaXterm의 경우 SSH, RDP, SFTP 등 다양한 네트워크 클라이언트와 터미널을 제공하는 툴이다. 이를 통해 윈도우에서 서버를 들어가 도커를 실행할 수 있다. MobaXterm 다운로드 https://mobaxterm.mobatek.net/download.html 위 링크에서 MobaXterm을 Free 버전로 다운로드할 수 있는 사이트이다. (Portable edition 은 설치 안하는 버전, Installer edition 은 설치하는 버전) 1. SSH로 Linux Server 접속 실행을 하면 다음과 같은 화면이 뜬다. 1) session 접속 접속을 하려면 접속 session 만들어야 한다. 최초 실행 화면의 왼쪽 상단 "Session" 클릭한다. 2) 계정 정보 입력 Remo..

Tistory

[Vue.js] v-show와 v-if 비교하기

v-if를 쓰면 항상 나오는 것이 v-show여서 궁금해서 정리해보게 되었다. 1. v-if : v-if 디렉티브는 조건에 따라 블록을 렌더링할 때 사용된다. 블록은 디렉티브의 표현식이 true 값을 반환할 때만 렌더링된다. Vue is awesome! Oh no 예시 Click me! Hello?! Good~ 코드 설명 button을 클릭시 isShow가 true면 Hello를 출력한다. false라면 Good~을 출력한다. 이는 클릭시 핸들러 함수를 설정하여 false면 true, true면 false를 출력하게 설정하였다. v-else-if, v-else A B C Not A/B/C → 조건이 여러개일 때 v-else-if를 설정한다. 그리고 나머지 조건은 v-else로 설정할 수 있다. 순서는..

Tistory

[Vue.js] props와 emit 개념 정리하기

1. props 란 ? : 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달할때 사용되어지는 단방향 데이터 전달 방식 2. 사용 방식 부모 컴포넌트에서 자식 컴포넌트를 호출시 자식 컴포넌트 태그 내 v-bind나 : 키워드를통해 데이터를 전달하고 자식 컴포넌트에서 props객체를 통해 데이터를 전달받는 방식이다. 1) 부모 컴포넌트 2) 자식 컴포넌트 부모 컴포넌트에서 보내고자 하는 데이터를 디렉티브를 적어 props이름을 설정한다. 그리고 보내고자하는 데이터를 이곳에 보낸다. 그리고 자식 컴포넌트에서 이를 props로 가져온다. 3) 예시 props: { listArray: { type: Array, required: true }, pageSize: { type: Number, required: fals..

Tistory

[Vue.js] v-model 양방향 바인딩하기

이전에 정리한 글인 props와 emit에 정리하면서 v-model를 활용할 수 있다는 글을 보고 정리하고자 한다. 부모 컴포넌트와 자식 컴포넌트의 데이터 바인딩 코드의 재사용을 위해 컴포넌트를 분리하면, 부모 컴포넌트와 자식 컴포넌트의 데이터 바인딩이 필요하다. 부모 컴포넌트의 값을 자식 컴포넌트에게 내려준다. 자식 컴포넌트에서 값이 변경되면, 그 사실을 부모 컴포넌트에도 알려야한다. v-model 부모 컴포넌트 parent-compo {{number}} 부모 컴포넌트에서 v-model로 number라는 값을 내려주면, 자식 컴포넌트에서는 props로 데이터를 접근할 수 있다. 자식 컴포넌트 child-compo {{value}} Add 1 단, v-model로 바인딩 한 값은props에서 valu..

Tistory

[Vue.js] Day.js 모듈로 날짜와 시간 구현하기

이전에 moment.js에서를 많이 사용했는데 요즘은 day.js로 많이 사용한다고 한다. 이전 배경 날짜 시간 계산을 하는 라이브러리는 moment.js를 사용한다. 발표한지 오래 지났다. 안정성의 이유로 더 이상의 업데이트가 없다고 밝혔다. 그러니, moment.js 사용시에는 문제가 없겠지만, 유지보수등의 문제가 생길 것으로 생각된다. 현재(day.js) 현재 많은 moment.js를 쓰던 사용자들은 day.js를 사용한다. 그래서 이에 대해 서술해보고자 한다. 1) 설치 npm i dayjs --save → 위를 쳐서 모듈을 설치하면 된다. 2) 현재 시간 가져오기 현재시간 : {{today}} 3)활용 현재시간 : {{today}} 연 : {{year}} 월 : {{month}} 일 : {{da..

Tistory

[Vue.js] vue와 express 연결하기

vue는 이미 설치되어 실행하고 있기에 이는 생략하고 설명하겠다. 1. express 설치 1) express 설치 npm i express-generator -g 위의 명령어를 쳐서 설치해준다. 2) express 프로젝트 만들기 express backend --view=pug backend라는 express 프로젝트를 만들어준다. 3) express 실행 설치가 다 되었다면 backend폴더로 이동해준다. npm install 명령어를 쳐서 기본적인 모듈을 설치해준다. 즉 package.json에 있는 모듈을 설치해주고, node_modules를 설치해주는 것이다. 그리고 express가 잘 실행되는지 확인한다. 잘 되었다면 위와 같은 화면이 보이게 된다. 2. vue와 express 연결 1) 프론..

Tistory

[Error] Vue와 express 통신시 백엔드에서 나타나는 오류 해결하기

문제 발생 백엔드에서 실행시 이러한 오류가 나면서 실행이 안되었다. 이 때 통신을 하는 것을 못 받아와서 그런가보다 하고 넘겼다. 그런데 프론트에서 할 때는 이러한 오류가 안 나서 검색을 해보았다. 문제 해결 서브 페이지에서 새로 고침하면 404 뜨는 건 개발 초기에 vue 문제라는 것을 알아냈다. 미들웨어 connect-history-api-fallback를 사용하면 이러한 오류가 없어진다. 1) 모듈 설치 npm install --save connect-history-api-fallback 모듈을 백엔드가 있는 폴더로 가서 설치해야 한다. 2) 모듈 넣기 var createError = require('http-errors'); var express = require('express'); var pa..

Tistory

[Vue.js] computed의 동작이란?

1. computed : 템플릿의 데이터 표현을 더 직관적이고 간결하게 도와주는 속성 아래 코드는 message라는 데이터 속성의 문자열 순서를 역으로 변환해주는 코드이다. message 값이 만약 Hello라면 화면에 출력되는 값은 olleH로 된다. 이와 같은 계산식이 템플릿에 많아지면 템플릿의 가독성이 현저히 떨어지게 된다. 따라서 아래와 같이 computed 속성을 활용해야 한다. 1-1) computed의 사용 computed의 사용 전 {{ message.split('').reverse().join('') }} 이렇게 템플렛안에 기술하는 것이 더 편리하다. 그렇지만, 코드가 길어지면 길어질수록 점점 보기가 힘들어지고 복잡해지게 된다. 특히, 유지보수가 어려워지게 된다. computed의 사용 ..

Tistory

[Vue.js] watch의 쓰임에 대해서

watch의 개념 :특정 데이터의 변화를 감지하여 자동으로 특정 로직을 수행해주는 속성 1. 사용법 사용자가 input에 텍스트를 입력하면 data의 message에 데이터가 동적으로 바인딩이 된다. message: function (value) { console.log("value", value); } 사용자가 input에 텍스트를 입력할때 마다 message에 데이터가 동적으로 바인딩된다. watch는 message의 값이 변경이 발생될 때마다 watch의 message 메소드가 실행되어 console.log("value", value)가 실행 된다. 주의점은 감시할 타켓명이 watch에 동일한 이름으로 사용해야한다. data에 message를 감시할려면 watch에도 동일한 이름인 messa..

Tistory

[Vue.js] created와 mounted의 차이를 알아보자

이게 이해가 안되서 라이프 사이클과 여러가지 속성을 공부했다. 개념 created 인스턴스가 작성된 후 동기적으로 호출됩니다. 이 단계에서 인스턴스는 데이터 처리, 계산된 속성, 메서드, 감시/이벤트 콜백 등과 같은 옵션 처리를 완료합니다. 그러나 마운트가 시작되지 않았으므로 $el 속성을 아직 사용할 수 없습니다. mounted el이 새로 생성된 vm.$el로 대체된 인스턴스가 마운트 된 직후 호출됩니다. 루트 인스턴스가 문서 내의 엘리먼트에 마운트 되어 있으면, mounted가 호출 될 때 vm.$el도 문서 안에 있게 됩니다. → 공식문서에 의하면 el사용여부로 둘을 분류할 수 있다. 화면 출력 부모에서 created 훅 안에서 값을 변경하는 것이 아닌 mounted에서 변경해야 한다. creat..

Tistory

[Vue.js] Vue 라이프 사이클

Vue의 인스턴스나 컴포넌트가 생성될 때, 미리 사전에 정의된 몇 단계의 과정을 거치게 된다. 이를 **라이프사이클(lifecycle)**이라 한다. 즉, Vue 인스턴스가 생성된 후 우리 눈에 보여지고, 사라지기까지의 단계를 일컫는 말이다. 공식 문서에서 다이어그램을 제공한다. 이는 위의 그림이다. Vue 인스턴스는 크게 생성(create)되고, DOM에 부착(mount)되고, 업데이트(update)되며, 없어지는(destroy) 4가지 과정을 거치게 된다. 1. Creation 컴포넌트 초기화 creation hooks은 라이프사이클에서 가장 먼저 실행된다. 컴포넌트가 DOM에 추가되기 전에 수행하며, 서버 렌더링 중에도 실행된다. 클라이언트 렌더링 및 서버 렌더링 과정 모두에서 컴포넌트를 설정할 필..

Tistory

[Vue.js] keep-alive(동적 컴포넌트) 알아보기

1. 메타 컴포넌트 동적 컴포넌트를 랜더링하기 위해서 is prop에 의해 결정된다. 이를 메타 컴포넌트라고 한다. 1) 예제 2-1. 동적 컴포넌트 1) 컴포넌트 전환과 라이프 사이클 // About.vue I'm About Component // Home.vue I'm Home Component : 8 add home count → Home.vue와 About.vue는 create훅을 가져와 콘솔에 로그를 출력해준다. // App.vue Home; About → 그리고 App.vue에서는 위의 두개의 컴포넌트를 가져온다. 그리고 클릭시 로그가 출력된다. 저기서 component는 해당 컴포넌트에서 작성한 것이 보여지는 것이다. 2) 컴포넌트 전환 실행 결과 실행 결과 화면을 보면 상단의 Home, A..

Tistory

[Vue.js] name의 쓰임 알아보기

vue를 사용하다 보면 위와 같은 코드가 있는데, name이라는 속성이 존재한다. 그런데 이 name은 있거나 없거나 상관이 없다. 그래서 이 속성을 어디에 쓰이는지 궁금해서 구글링해보았다. name속성의 명시 name 속성을 명시하는 것은 선택이나 두 가지 경우에는 꼭 명시해야만 한다. 컴포넌트 구조가 재귀적일 때 : 이말은 즉슨 재귀 컴포넌트를 말한다. 재귀 컴포넌트 : 템플릿에서 자기 자신을 호출하는 컴포넌트를 의미한다. name 속성이 없으면 컴포넌트를 재귀적으로 구성할 수 없다. Vue 개발자 도구를 사용할 때 좌 : name 속성에 "CustomComponent" 라는 값을 주었을 때 / 우 : name 속성을 명시하지 않았을 때 Vue 개발자 도구를 사용해 디버깅을 할 때는 컴포넌트의 nam..

Tistory

[Vue.js] Vue 이벤트, 모달 만들기

버튼을 클릭시에 기능을 실행하는 경우를 글로 써볼려고 한다. js와 vue의 비교 {{products[0]}} 50만원 허위매물신고 신고수 : {신고수} 자바스크립트는 onclick="" 이라는 이벤트 핸들러를 HTML태그에 달았지만, Vue에서는 @click="" 이라고 사용한다. 이벤트 종류 @click : 마우스로 클릭했을 때 이벤트가 실행된다. @mouseover : 마우스를 갖다 댔을 때 자바스크립트를 실행가능하다. @input : 인풋에 값을 입력했을 때 자바스크립트를 실행가능하다. → 이것말고도 여러 가지가 가능하다. 이는 실행하고자 하기 전에 검색해서 사용하면 좋을듯하다. 함수 사용 methods : { increase(){ this.신고수 += 1 } } 이는 script구문에서 meth..

Tistory

[Vue.js] Vue에서 기본설정하기

Vue를 초기에 프로젝트를 생성하려고 보니 만져야 되는 설정이 많았다. 까먹을까봐 적어둔다. 1. formatter 설정 나는 에디터를 vscode를 쓰고 있기에 vscode맞춰 설명하겠다. 우선 왼쪽 하단에 보면 톱니바퀴가 있는데 이는 설정이므로 클릭해보면 위와 같은 메뉴가 나온다. 이에 설정을 눌러준다. 그리고 검색에 formatter라고 검색하면 저렇게 나오니 위와 같은 사진처럼 설정해준다. 그래야 코드가 알맞게 정렬되어 보기 쉽다. 2. eslint, prettier 설정 두번째로 eslint와 prettier인데,, 이는 다른 프로젝트와 조금씩 설정이 다르므로 각각 나에 맞게 설정해준다. 공식문서에도 이와 같은 설정이 자세히 나와있으니 참고하는 것을 추천한다. 3. Vue snippets 만들기..

Tistory

[Node.js] 가짜 api 서버 만들기

가짜 api 서버는 어떻게 만드는가 궁금할 수 있다. 프론트와 백엔드 개발을 같이 하다보면 처음에는 백엔드가 없는 상태에서 가짜 데이터를 주고 받아야 한다. 그리고 나중에는 실제 api를 연결해서 데이터를 주고받아야 하는데, 이를 두번에 걸쳐 할 필요없이 가짜 api 서버를 만들어 활용하면 된다. 1. 개념 알아보기 우리가 지금 쓸 것은 json-server라는 라이브러리이다. 이는 REST API를 구축해주고, api 테스트를 할 때 편리하다. 그리고 프로덕션에서는 사용하지 않는다. 2. json-server 설치하기 2-1) 라이브러리 설치하기 npm install -g json-server 2-2) db.json 파일 만들기 //db.json { "test": [ { "id": 1, "name": ..

Tistory

[Vue.js] Vue.js 시작하기 + 확장 프로그램

우연한 글에 vue.js를 시작하게 되었다. 새로운 언어에 대해 배우고 싶고, 다른 언어는 어떻게 사용하는지 궁금하는 차였다. 그래서 vue.js를 검색해보았는데, 코딩애플에 무료강의 몇개가 있어서 듣게 되어 이렇게 글을 작성한다. node.js 설치 node.js는 내가 이전에 react를 사용하고 있어서 사용할 필요는 없지만, 환경이 다를 경우를 대비해 작성한다. node.js 홈페이지에 들어가면 여러가지 버전이 있는데 대표적으로 두개가 있다. 왼쪽은 안정화 버전, 오른쪽은 최신 버전이다. 나는 항상 안정화 버전을 사용해서 이를 설치한다. 이를 설치하는 이유는 npm을 사용하기 위해서인데, npm은 오픈소스 라이브러리를 패키지 형태로 바로 설치해서 사용할 수 있게 해주는 도구이다. 그리고 에디터가 없..

Tistory

[Vue.js] Vue 데이터 바인딩, 반복문

데이터바인딩 js와 Vue의 데이터바인딩 문법 1. javascript의 경우 document.getElementById().innerHTML = 데이터; 자바 스크립트는 위와 같이 넣을 데이터를 우변에 넣고 태그를 가져와서 좌변에 쓴다. 2. vue의 경우 vue는 데이터를 script안에 data안에 넣어준다. 그리고 html부분에 {{}}을 써서 데이터를 가져와서 사용한다. 데이터 바인딩을 하는 이유 정적 데이터가 아닌 이상 데이터는 계속적으로 변경된다. 그래서 데이터를 따로 저장해놓을 경우 수정이 편리해진다. js로 조작이 편리하다. Vue의 실시간 렌더링기능 쓰려면 데이터바인딩이 필요하다. Vue는 data가 변경되면 data와 관련된 HTML에 실시간으로 반영된다. html속성에 데이터바인딩 ..

Tistory

[Node.js] knex로 SQL문 작성하기

sql문을 작성할 때 json형식으로 해서 connection pool을 했었다. 그런데 우연히 knex로 받아오는 것을 보고 괜찮은 방법이여서 더 알고자 정리하고자 한다. 설치하기 npm install knex --save 위의 명령어를 쳐서 knex를 설치해준다. DB정보 생성하기 const knex = require('knex')({ client: 'mysql', connection: { host : HOST_ADDR, user : DB_USER, password : DB_PASSWORD, database : DB_NAME } }) client : 이 매개변수는 필수이며, 라이브러리와 함께 사용할 클라이언트 어댑터를 결정한다. CRUD 작성하기 1) select knex.select('컬럼 이름')..

Tistory

[Node.js] Joi사용해서 유효성 검사하기

Joi란 사용자가 입력한 데이터가 유효한지 검사하는 유효성 검사 라이브러리 라고 할 수 있다. 설치 및 사용하기 npm install joi joi를 사용하기 위해서 install해준다. const Joi = require('joi'); 스키마 정의하기 // validate할 schema 정의 const schema = Joi.object().keys({ username: Joi.string().min(3).max(30).required(), birthyear: Joi.number().integer().min(1900).max(2018), }); 유효성 검사를 하려면 db에 정의되어 있는 컬럼들을 가져와서 몇개의 컬럼만 유효성 검사를 할 수 있다. username: 글자이고, 길이가 최소 3글자에서 최대..

Tistory

[Node.js] Swagger로 api docs 작성하기

우연히 어떤 글을 보고 swagger로 api docs를 작성할 수 있다는 것을 알게 되었다. 혼자 프로젝트 진행할 때 api가 너무 많아서 노션으로 일일이 작성해서 봤었는데 이 방법이 더 편리할 것 같아 한번 해보고 글로 작성할려고 한다. 1. swagger 설치 이전에 있던 express 프로젝트를 가져와 아래의 모듈을 설치한다. npm install swagger-jsdoc swagger-ui-express --save-dev swagger-ui-express : API 문서 UI 렌더링을 위한 패키지 swagger-jsdoc: Swagger 태그 주석을 추가해 API 문서화를 위한 패키지 개발할 때 보기 위함이기에 —save-dev옵션을 준다. 2. swagger 파일 설정 1) swagger.j..

Tistory

[Next.js] SSG 개념 알아보기

1. CRA와 CNA 비교하기 react와 Next.js가 생성한 프로젝트를 보면 다름이 보인다. react에서는 pages폴더가 없는데, next에는 존재한다. 여기에 파일을 만들면 자동으로 라우팅되어 url에 해당 파일의 이름을 치면 해당 사이트로 이동된다. 1) 페이지 비교하기(CRA) 개발자 도구를 열어 Network 탭을 눌러, 첫 페이지의 response탭을 보면 첫 페이지 요청으로 받아온 HTML문서의 내용을 확인해볼 수 있다. 보면 우리가 App.js 파일에 적어준 내용이 하나도 들어있지 않다. id가 root인 텅 비어있는 DIV 태그만 반환하고 있음과 밑에 번들링된 static/js 경로의 'bundle.js' 파일을 전달하고 있다. CSR에서 빈 HTML 문서를 먼저 반환하고, 그 후..

Tistory

[Next.js] SWR 개념 알아보기

: SWR은 vercel에서 제작한, 데이터를 가져오기 위한 모듈이다. Next.js에서 유독 많이 보이는 개념이라, 정리하고자 한다. 아마도 swr이 서버 사이드 랜더링도 되기 때문인 것 같다. 사용 import useSWR from 'swr' function Profile() { const { data, error, isLoading } = useSWR('/api/user', fetcher) if (error) return failed to load if (isLoading) return loading... return hello {data.name}! } key : 일반적으로 API URL을 말한다. fetcher : key값을 이용해 데이터를 가져오는 함수이다. fetch 혹은 axios를 이용해..

Tistory

[Next.js] Incremental Static Regeneration의 revalidate

: Incremental Static regeneration의 request는 page가 re-generate되도록 한다. revalidate 속성은 얼마동안에 한번 regeneration이 일어날지를 설정한다. 공식문서를 보다가 revalidate를 보고 궁금하게 생겨서 정리하게 되었다. revalidate는 말 그대로 재검증한다는 말이다. 개념을 보니 초를 줘서 이 초시간이 지나면 페이지가 업데이트가 된다는 말이었다. 그런데 초마다 업데이트가 된다면 과부하되지 않을까라고 생각했다. 그런데 참고사이트에서 해답을 얻게 되었다. 1) 자동 업데이트되는가? → 화면 요청이 없는 경우에는 rebuild가 되지 않는다. 2) 사용자가 validate초 이상을 페이지에 머물러야 업데이트되는가? → 기준이 buil..

Tistory

[Next.js] 노마드코더 강의 정리 Part.2

1. Patterns layout : layout component를 생성하고 생성한 component를 상위 컴포넌트로 적용할 컴포넌트들을 감싸주면 된다. _app.js 파일이 지나치게 커지는 것을 막기 위하여 쓴다. Layout 컴포넌트를 만들어주고, App 컴포넌트에서 이를 사용한다. Head 컴포넌트 리액트에서 react-helmet으로 구현했던 것들을 Next.js에서는 간단히 Head 컴포넌트로 구현 가능하다. 2. Fetching Data public 폴더에 있는 파일들은 쉽게 import할 수 있다. Image next.js에서는 이미지 최적화를 위해 img 태그 대신 Image 태그를 사용한다. import Image from "next/image"; ... ... 3. Redirect ..

Tistory

[Next.js] 노마드 코더 강의정리 part.3

1. Dynamic Routes 동적 라우팅은 일반적으로 url을 pages/post/123으로 접근했다면 next.js에서는 pages/post/[params].js파일을 만들어서 pid를 담는다. import { useRouter } from 'next/router' const Post = () => { const router = useRouter() const { params } = router.query return Post: {params} } export default Post next/router모듈에서 useRouter를 가져와서 사용할 수 있다. useRouter에서 router로 변수를 선언해주고, router.query를 출력한다. 출력해보면 아래와 같이 나온다. 파일을 만들 때 해당..

Tistory

[Next.js] Next.js 개념 및 사용하기

Next.js는 리액트를 위해 만든 오픈소스 자바스크립트 웹 프레임워크로, 리액트에는 없는 서버 사이드 렌더링(SSR)과 같은 다양하고 풍부한 기능을 제공합니다. Next.js는 많이 말하는 것처럼 SSR을 하기 위해 사용한다고 한다. CSR과 SSR의 개념을 알아보자. CSR과 SSR의 개념 1) 클라이언트 사이드 랜더링(CSR) : 클라이언트인 브라우저가 랜더링을 처리하는 방식이다. 서버에서 받은 데이터를 통해 클라이언트인 브라우저가 화면을 그리는 주체가 된다. 2) 서버 사이드 렌더링(SSR) : 브라우저가 서버에 매번 데이터를 요청하여 서버에서 처리하는 방식이다. 클라이언트에서 요청이 들어올 때마다 매번 서버에서 새로운 화면을 만들어 제공한다. 서버가 화면을 그리는 주체가 된다. SSR의 장점 클..

Tistory

[Next.js] 하이드레이션(hydration) 개념 알아보기

hydrate : SSR을 하면서 나오는 개념이다. SSR의 경우 pre-rendering를 통해 완성된 HTML을 클라이언트에게 전달한다. 서버에서 렌더링된 정적 페이지를 클라이언트에게 보낸다. react는 번들링된 JavaScript 코드를 클라이언트에게 보낸다. 클라이언트는 전달받은 HTML과 JS코드를 매칭하는 Hydrate를 수행한다. Hydrate란 전송받은 JavaScript들이 이전에 보내진 HTML DOM 요소 위에서 한번 더 렌더링하게 되면서 각각 자기 자리를 찾아가며 매칭된다. → Next.js 프로젝트에서 개발한 리액트 컴포넌트를 프론트 엔드에서 실행하는 것을 하이드레이션(Hydration)이라 부른다. Next.js는 코드를 이미 HTML로 렌더링한 상태에서 만약 리액트 컴포넌트와..

Tistory

[Next.js] 노마드코더 강의 정리 Part.1

1. Pages react 컴포넌트를 export하는 파일들을 pages폴더 안에 넣어주면, 파일 이름으로 url을 만들어 자동으로 라우팅 해준다. 안의 function이름은 파일이름과 달라도 된다. 특징 파일 이름이 url이 된다. export default function ~ 형태로 컴포넌트 작성해야함. url에 pages폴더에 없는 파일이 보여줘도 자동으로 404페이지를 보여준다. 2. Routing 보통 페이지간 이동은 a 태그를 사용하지만, next.js에서는 사용하지 않는다. a 태그를 사용하면 처음 페이지 진입시 번들파일을 받고, a태그에 의해 라우팅 되면서 다시 번들파일을 받기 때문이다. 그래서 next에서 페이지간 이동에는 모두 Link 태그를 사용한다. 3. CSS Modules imp..

Tistory

[React] 다크모드 구현하기

1. 필요한 패키지 설치하기 npx create-react-app {app 이름} 새로운 react app을 생성하도록 한다. npm install --save styled-components npm install --save styled-reset npm install --save react-router-dom npm install react-icons styled-components : createGlobalStyle를 사용하기 위해 설치해준다. createGlobalStyle : 글로벌 스타일 적용을 도와주는 styled-components내장 메서드이다. styled-reset : styled-components와 연결되어, 여러 브라우저마다 기본적으로 설치되어 있는 스타일을 지워주는 Node.j..

Tistory

[Node.js] slack bot 만들기

우연히 글을 하나보고 만들고 싶어서 해당 기능을 구현하였다. 그리고 이에 대해 알게된 점을 간략하게 서술하고자 한다. 워크스페이스 만들기 https://slack.com/intl/ko-kr 위의 사이트에 접속하면 상단 오른쪽에 새 워크스페이스 개설이 있다. 이를 클릭한다. 나는 워크스페이스명을 slack bot test로 지정하여 만들어주었다. 앱 만들기 https://api.slack.com/apps?new_app=1 위의 사이트에 접속하면 모달창이 뜨게 된다. 그러면 From scratch를 눌러 앱 이름을 지정하고, 위에서 만들어둔 워크스페이스를 클릭해준다. 그리고 나서 Create App을 누르면 앱이 생성된다. 권한 설정 및 토큰 발급 1) 사이트 이동 앱을 생성하고 난 다음에 왼쪽에 사..

1 2