uhee-12의 등록된 링크

 uhee-12로 등록된 티스토리 포스트 수는 186건입니다.

[Kubernetes] taint & toleration 개념 알아보기 [내부링크]

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

[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들에..

[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 하..

[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일부 스냅에는 시스템 리소스에 대한 무제한 액세스를 허용하는 클래식 제한이 필요하다. 그러므로 클래식 제한을 활성화하려면 다음 ..

[Kubernetes] Volume 개념 적립하기 [내부링크]

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

[Kubernetes] kubernets NFS server 알아보기 [내부링크]

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

[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..

[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..

[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 서비스의 상태를 확인하여..

[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..

[Kubernetes] metalLB로 ingress-nginx-controller external ip로 접속하기 [내부링크]

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

[Docker] docker volume 연결하기 [내부링크]

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

[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..

[Docker] docker compose 알아보기 [내부링크]

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

[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: ..

[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..

[Kubernetes] microk8s 설치하고 사용하기 [내부링크]

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

[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..

[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..

[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" } ] ..

[React] 이미지 슬라이드 쉽게 구현하기 [내부링크]

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

[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..

[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 실행한다면, 서로 다른 버전을 가지..

[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. 사이트 도메인 설정하기내 애플리케이션 > 앱 설정 > 플랫폼에 들어가면 맨 하단에 설정할 수 있다.나중..

[Node.js] 세션 알아보고 적용하기 [내부링크]

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

[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를 앱에 맨 위..

[React] Global Style 적용하기 [내부링크]

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

[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..

[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..

[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를 설치해준다...

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

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

[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..

[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폴더 경로를 추가해준다.

[Django] 검색 기능 구현하기 [내부링크]

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

[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..

[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 : 계정이 삭제되면 이 계정이 작..

[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..

[Django] 로그인, 로그아웃 구현하기 [내부링크]

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

[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를 써서 내려쓰기를 ..

[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 픽셀의 ..

[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으로 전송한 데이터가 실제 웹 페이지에서 작성한 데이터인지를 판단하는 가늠자 역할을 한다..

[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('/..

[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 : 정렬하는 함..

[Django] 장고 관리자 사용하기 [내부링크]

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

[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..

[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..

[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..

[Django] 장고 앱 만들고 URL 맵핑하기 [내부링크]

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

[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 ..

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

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

[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. 다운로드 받은 파일 ..

[pnpm] pnpm으로 마이그레이션하기 [내부링크]

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

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

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

[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..

[Bun] 그 유명한 Bun 찍먹하기 [내부링크]

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

[Flutter] 페이지 만들기, 이미지 가져오기 [내부링크]

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

[Flutter] 웹에서 데이터 받아올 때 [내부링크]

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

[javascript] 실행 지연을 시켜보자 [내부링크]

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

[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..

[Flutter] vscode에서 flutter 개발 환경 구축하기 [내부링크]

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

[Firebase] Firebase Cloud Functions 배포하기 [내부링크]

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

[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..

vercel에서 test 도메인 연동하기 [내부링크]

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

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

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

JWT이란 무엇이고, 이에 대한 장단점을 알아보자 [내부링크]

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

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

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

sentry으로 웹 모니터링 하기 [내부링크]

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

웹 배포시 자동으로 업데이트하기 [내부링크]

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

윈도우에서 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..

크로스 브라우징에 대해 알아보자 [내부링크]

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

[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..

[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..

[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로 설정할 수 있다. 순서는..

[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..

[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) 프론..

[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..

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

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

[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..

[Vue.js] computed의 동작이란? [내부링크]

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

[Vue.js] name의 쓰임 알아보기 [내부링크]

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

[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..

[Vue.js] Vue 라이프 사이클 [내부링크]

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

[Vue.js] Vue에서 기본설정하기 [내부링크]

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

[Vue.js] Vue 이벤트, 모달 만들기 [내부링크]

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

[Vue.js] Vue 데이터 바인딩, 반복문 [내부링크]

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

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

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

[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": ..

[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..

[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글자에서 최대..

[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('컬럼 이름')..

[Next.js] Incremental Static Regeneration의 revalidate [내부링크]

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

[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를 이용해..

[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 문서를 먼저 반환하고, 그 후..

[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를 출력한다. 출력해보면 아래와 같이 나온다. 파일을 만들 때 해당..

[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 ..

[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..

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

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

[Next.js] Next.js 개념 및 사용하기 [내부링크]

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

[Express] 3 Layer Architecture 적용하기 [내부링크]

express로 코드를 짜서 깃에 올리기 전에 3계층 레이어를 적용하면 좋다는 말에 여러 글을 보고 정리한 글이다. 1. 3 layer architecture란? 3 layer architecture는 비즈니스 로직을 분리하는 것을 목적으로 한다. Controller, Service Layer , Data Access Layer 세개의 층으로 나뉜다. Controller : client와의 통신에서 필요한 req, res를 다룬다. Service layer : business logic을 Data Access Layer은 DB와의 직접적인 통신을 한다. Business logic : client와 Data Acees Layer 사이에서 데이터를 관리한다. 2. 3 Layer Architecture을 적용..

[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) 사이트 이동 앱을 생성하고 난 다음에 왼쪽에 사..

[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..

[React] 무한스크롤 구현하기 [내부링크]

https://velog.io/@yiyb0603/React에서-무한스크롤-구현하기-8rdmbhtj 위의 사이트를 따라하며 쓴 글입니다. 1. 파일 생성 및 코드 작성하기 임의의 폴더를 만들어 파일을 생성한다. InfiniteScroll.js을 만들어준다. InfiniteScroll.js import React, { useState, useCallback, useEffect } from 'react'; import { getPostList } from './postList'; const InfiniteScroll = () => { const [page, setPage] = useState(1); const [posts, setPosts] = useState(getPostList(1)); return (..

axios 모듈화하기 [내부링크]

프론트랑 백엔드단에서 데이터를 가져올 때 axios모듈을 많이 사용한다. 그런데 axios를 쓰게 되면, url을 사용해서 데이터를 가져오고 넘겨주고 해야 한다. 만약 url이 같다면 똑같은 코드를 계속적으로 쓰게 된다. axios를 모듈화하여 사용하면 코드를 한결 덜 길게 사용할 수 있다. axios 기본 코드 import axios from 'axios'; function Other() { const [data, setData] = useState([]); useEffect(() => { useEffect(() => { axios.get("").then((res) => setData(res.data)); }, []); return ( {JSON.stringify(data.userId)} ) } exp..

[React] Scroll Progressbar 만들기 [내부링크]

지금 작성하는 Scroll Progressbar는 아래의 사이트를 따라하여 만들었습니다. https://velog.io/@yiyb0603/React에서-Scroll-Progressbar-만들어보기 1. 컴포넌트 생성하기 components라는 폴더를 만들어, ScrollProgress파일을 만들어 이곳에서 progressbar를 만들어줄 것이다. 그에 대한 style을 css파일 넣어 따로 관리해준다. 2. 기본 셋팅하기 1) components/ScrollProgress.js import React, { useState, useCallback, useEffect, useRef, MouseEvent, } from "react"; import "./ScrollProgress.css"; const Scr..

[React] 간단한 검색 기능 구현하기 [내부링크]

검색 기능은 한번도 구현해본 적이 없는데 우연히 어떤 글을 보다가 따라하게 되었다. 색깔 배열 우선은 검색 기능을 구현하려면 검색할 대상이 있어야 하기 때문에 배열을 만들어 색깔 목록을 만들어주었다. const colorList = ["red", "orange", "yellow", "green", "blue", "purple"]; 색깔 목록을 만들어서 div태그로 보여주고자 한다. 컬러 목록 보여주기 ColorData.js import React, { useState } from "react"; function ColorData() { const colorList = ["red", "orange", "yellow", "green", "blue", "purple"]; return ( {colorList.m..

[React] 콘솔에 코드 출력시 두개의 콘솔 뜰 때 해결 [내부링크]

문제 발생 console.log(data); 위와 같은 코드를 쳤을 때 콘솔에 두개로 출력이 되었다. ️ 문제 해결 이러한 현상은 StrictMode 때문이다. React로 만든 파일에 들어가면 index.js 파일이 존재한다. 아래는 index.js 파일이다. // index.js import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; const root = ReactDOM.createRoot(document.getElementById('root')); roo..

[React] SWR을 활용하기 [내부링크]

글을 쓰다가 글의 길이 길어져 활용하는 부분은 다른 페이지로 만들어 작성하고자 한다. SWR 활용하기 우선은 파일을 새로 만든다. 아래의 코드를 작성하여 새로운 react 파일을 만든다. npx crate-react-app {생성하고자 하는 파일 이름} 폴더 셋팅 위와 같이 폴더를 셋팅하였다. pages/Main.js import React from "react"; const Main = () => { return Main; }; export default Main; pages/Detail.js import React from "react"; const **Detail** = () => { return **Detail**; }; export default **Detail**; pages/index.js ..

[React] SWR의 개념 알아보기 [내부링크]

개념 SWR은 vercel에서 제작한 모듈이며, 데이터를 가져올 때 쓰인다. vercel의 SWR 공식문서 "SWR"이라는 이름은 HTTP RFC 5861(opens in a new tab)에 의해 알려진 HTTP 캐시 무효 전략인 stale-while-revalidate에서 유래되었습니다. SWR은 먼저 캐시(스태일)로부터 데이터를 반환한 후, fetch 요청(재검증)을 하고, 최종적으로 최신화된 데이터를 가져오는 전략입니다. SWR을 사용하면 컴포넌트는 지속적이며 자동으로 데이터 업데이트 스트림을 받게 됩니다.그리고 UI는 항상 빠르고 반응적입니다. 장점 단 한 줄의 코드로 프로젝트 내의 데이터 가져오기 로직을 단순화할 수 있다. 빠르고, 가볍고, 재사용 가능한 데이터 가져오기 내장된 캐시 및 요청 ..

[React] Redux(리덕스)란 무엇인가? [내부링크]

: 상태관리 라이브러리redux 등장배경MVC패턴 형식으로 state가 변화되면 Model, View, Controller에 이벤트가 발생하고 값이 변화하는 구조였다. 이를 양방향 데이터 흐름이라고 한다. 이는 복잡하며 데이트 흐름이 한번에 판단하기 힘들다. 이러한 단방향 데이터 흐름이 있다.즉 redux이다. redux는 MVC패턴의 단점을 개선하는 것이 목적이다.리덕스를 사용하면 컴포넌트들의 상태 관련 로직들을 다른 파일들로 분리시켜서 더욱 효율적으로 관리 할 수 있으며, 글로벌 상태 관리를 쉽게 할 수 있다.Redux의 3가지 원칙리덕스 사용을 위해서는 다음의 3가지 원칙을 지켜야 한다.단일 스토어 : 하나의 애플리케이션 내부에는 하나의 스토어를 만들어 사용해야 한다. 여러 개의 스토어를 만들어 사..

[React] useReducer 개념 살펴보기 [내부링크]

reducer : 현재 상태와 액션 객체를 파라미터로 받아와서 새로운 상태를 반환해주는 함수이다. function reducer(state, action) { // 새로운 상태를 만드는 로직 // const nextState = ... return nextState; } reducer 에서 반환하는 상태는 곧 컴포넌트가 지닐 새로운 상태가 되게 된다. action : 업데이트를 위한 정보이다. 주로 type값을 지닌 객체 형태로 사용되기도 한다. useReducer useReducer를 쓸려면 reducer의 구조를 알아야 되서 살펴보았다. useReducer()함수는 첫번째 인자로 넘어오는 reducer 함수를 통해 컴포넌트의 상태(state)가 행동(action)에 따라 어떻게 변해야하는지를 정의한다..

[React] PropTypes 개념 알아보고 활용하기 [내부링크]

1. 사용 이유 공식문서에 따르면 앱이 커짐에 따라 타입체킹을 통해 많은 버그를 잡을 수 있습니다. 일부 어플리케이션에서 Flow나 TypeScript같이 어플리케이션 전체에서 타입체크를 할 수 있는 자바스크립트 확장을 사용할 수도 있습니다. 하지만 이런 것들을 사용하지 않는다면 React에서 빌트 인 타입 체킹이 가능합니다. 컴포넌트의 props에서 타입을 체크하고싶다면 특별한 propTypes 속성을 할당할 수 있습니다. 위의 같은 이유가 대표적이다. 자바스크립트의 유연한 특성 때문에 작성이 편한 반면, 파일이 많아지면 생산성이 떨어진다는 점 때문에 타입스크립트를 많이 사용한다. 자바스크립트를 이용해 앱을 개발해야 하는 상황에서는 이러한 문제점을 피하기 위해 PropTypes를 활용하는 것을 권장한다..

[React] 로그인 시간 설정하기 [내부링크]

로그인을 구현하기만 하면 될 줄 알았더니 몇일간 로그인이 유지된다는 말을 듣고 수정해야겠다는 생각이 들어 홈페이지를 봤다. 그런데 나는 매번 로그인하고 로그아웃을 해서 몰랐던 것 같다. 그래서 localstorage에 로그인 정보를 입력하고 그에 대한 값을 삭제하지 않아 계속 로그인이 유지되는 것이었다. 이에 대해 글을 써보려고 한다. LocalStorage 홈페이지를 구성하다보면 cookie나 session등 저장소를 저장하게 된다. 이도 하나의 종류이며 만료시간은 존재하지 않는다. 그러나 Javascript를 사용하여 TTL(Time to Live)을 추가하여 일정 시간이 경과한 후 localStorage의 항목을 무효화할 수 있다. 만료시간 설정 후 저장 function setWithExpiry(k..

[React] 부모 컴포넌트에서 자식 컴포넌트에 값 전달하기 [내부링크]

navigate도 많이 쓰고 여러가지 쓰는데 부모 컴포넌트에서 자식 컴포넌트에 값 전달하는 방법도 있을 것 같아, 찾아보다가 정리하게 되었다.props의 개념상위 컴포넌트에서 하위 컴포넌트로 값을 전달하는 수단.하위 컴포넌트에서 상위 컴포넌트가 전해준 값에 접근을 할 수 있게 한다.하위 컴포넌트에서 상위 컴포넌트로 값을 전달할 수 없다.props의 사용1. 상위 컴포넌트에서 하위 컴포넌트로 값 전달1) 상위 컴포넌트(부모 컴포넌트)function 함수=()=>{ const [변수, set변수] = useState('')}const 상위페이지이름 =()=>{ }2) 하위 컴포넌트(자식 컴포넌트)전달 받은 값 : {props.value}값이 전달되는 방식상위 컴포넌트에서 넘겨주고자 하는 값을 선언한다. ..

[Flutter] flutter 3.7에 따른 element embedding 활용하기 [내부링크]

2023년 1월 25일 유튜브 Flutter 공식 채널에서 Flutter forward 2023이 진행되었다. Flutter는 3.7.0로, Dart는 3.0으로 업데이트가 되었다. Element Embedding의 개념 Flutter 콘텐츠를 모든 표준 웹에 추가할 수 있습니다. 이러한 방식으로 통합하면 Flutter는 단순히 웹 구성 요소로 전환되어 웹 DOM과 원활하게 통합되고 CSS 선택기 및 변환을 사용하여 부모 Flutter 개체의 스타일을 지정할 수도 있습니다. → 플러터에서 제공한 웹을 보았을 때, 웹에서 플러터앱을 사용할 수 있는 기능을 말한다. Element Embedding을 사용할 수 있는 웹 https://flutter-forward-demos.web.app/#/ 위의 사이트는..

[Flutter] linkify와 url_launcher로 텍스트와 링크 연결하기 [내부링크]

linkify 개념 : 텍스트 URL과 이메일을 Flutter용 텍스트의 클릭 가능한 인라인 링크로 바꿔준다. linkify 설치하기 pubspec.yaml파일에 들어가서 종속성에서 다음 항목을 추가해준다. 항상 말하지만 들여쓰기를 주의해야 한다. dependencies: flutter_linkify: ^5.0.2 사용하기 import 'package:flutter_linkify/flutter_linkify.dart'; Linkify( onOpen: (link) => print("Clicked ${link.url}!"), text: "Made by ", ); url_launcher 개념 : 브라우저/OS에서 링크를 열 수 있도록 도와준다. url_launcher 설치하기 dependencies: url_..

[Flutter] safeArea 개념 알아보기 [내부링크]

개념 충분한 패딩(들여쓰기)으로 자식(child)을 삽입하는 위젯이다. 예를 들어, 화면 상단의 상태표시줄, 노치, 카메라영역등이 존재하면 해당 영역을 포함하여 패딩처리를 수행 합니다. 최소 패딩이 지정된 경우에는 최소 패딩 또는 안전 영역 패딩 중 더 큰 패딩이 적용됩니다. 사용이유 아래의 왼쪽 사진처럼 ui를 제대로 보여지지 않는 경우가 생길 수 있다. 그럴 경우를 대비하여 safeArea로 감싸주는 것이다. 옵션 설명 위의 사진에 보면 SafeArea의 옵션들이 나와있다. key : key를 설정할 수 있다. top, bottom, right, left 에 boolean값으로 SafeArea를 개별적으로 설정할 수 있다. minimum : SafeArea를 지키기 위한 최소한의 padding을 설정..

[Flutter] FocusNode과 TextEditingController 개념 알아보기 [내부링크]

텍스트 필드가 선택되고 input에 입력을 하게되면 focus, 즉 초점이 맞춰진다. 포커스 관리는 직관적인 흐름으로 양식을 만들기 위한 기본 도구입니다. 예를 들어 텍스트 필드가 있는 검색 화면이 있다고 가정합니다. 사용자가 검색 화면으로 이동할 때 검색어의 텍스트 필드에 포커스를 설정할 수 있습니다. 이를 통해 사용자는 텍스트 필드를 수동으로 누를 필요 없이 화면이 표시되는 즉시 입력을 시작할 수 있습니다. 표시되는 즉시 focus 주기 앱에서 텍스트 필드가 표시되자마자, focus를 주려면 이 autofocus속성을 사용해야 한다. TextField( autofocus: true, ); 버튼을 누를 때 focus 주기 1) FocusNode 생성하기 class MyCustomForm extends ..

[Flutter] FlutterFire 사용 및 오류 해결하기 [내부링크]

FlutterFire 사용하기 Google 에서 Flutter를 조금 더 강력하게 지원한다. FlutterFire라는 이름으로 Flutter를 위한 firebase 기능과 문서를 제공한다. Flutter에서 Firebase 기능을 사용하기 위해 firebase를 초기화 하는 방법이 변경되었다. FlutterFire CLI 사용 Firebase 서비스를 사용하려면 먼저 FlutterFire를 초기화해야한다. FlutterFire를 초기화하려면 클래스 initializeApp에서 메서드를 호출해야 한다. 이를 위해서 다음의 CLI 명령어를 실행해야 한다. dart pub global activate flutterfire_cli cli를 설치하고, configure를 설치한다. flutterfire confi..

[Flutter] DefaultTabController 개념알고 사용하기 [내부링크]

공식문서에 따르면DefaultTabController는 TabController 를 TabBar 또는 TabBarView 와 공유하는 데 사용되는 상속된 위젯입니다 . 명시적으로 생성된 TabController를 공유하는 것이 편리하지 않을 때 사용됩니다. 그 이유는 탭 바 위젯이 stateless 부모 위젯 또는 다른 부모 위젯에 의해 생성되기 때문입니다.DefaultTabControllerlength : 필수로, 아이템의 갯수가 들어가야 한다. 탭바의 갯수를 넣으면 된다.child : 필수로, 자식이 들어가야 한다. 활용 home: DefaultTabController( length: 4, child: Scaffold( body: TabBarView(..

[Flutter] Hero 개념 알고 사용하기 [내부링크]

: 위젯 애니메이션이다. 한 화면에서 다른 화면으로 넘어갈 때, 위젯에 애니메이션 효과를 준다. 이 방법은 두 화면을 이어주는 시각적 연결 고리를 만들어 준다. 1. 같은 이미지를 보여주는 2개의 화면 만들기 같은 이미지를 두 개의 화면 모두에 보여줘야 한다. 첫 번째 화면에서 사용자가 이미지를 탭하면 두 번째 화면으로 전환되면서 애니메이션이 발생하게 된다. class MainScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Main Screen'), ), body: GestureDetector( onTap: () { Navigat..

[Flutter] Shared preferences 알고 사용하기 [내부링크]

: 상대적으로 적은 양의 키-값 데이터를 저장하려고 할 때 사용한다. 사용하고 보니 웹의 localStorage와 비슷하다. Shared preferences 알아보기 1. 의존성 추가하기 https://pub.dev/packages/shared_preferences/install 위의 사이트에 들어가 최신 버전의 플러그인을 가져온다. 그리고 flutter 파일에서 pubspec.yaml 파일을 찾는다. 아래와 같이 shared_preferences 플러그인을 붙여넣으면 된다. 항상 의존성을 추가하고자 할 때는 들여쓰기를 주의해야 한다. dependencies: flutter: sdk: flutter shared_preferences: "" 2. 데이터 저장하기 SharedPreferences 클래스..

[Flutter] FutureBuilder 알아보기 [내부링크]

: 비동기 함수에서 리턴하는 Future 받아 먼저 Build하고 비동기 함수 계산이 완료되면 실제 리턴 값을 보여준다. FutureBuilder를 쓰는 이유 API와 통신을 할 때 서버와 모바일 기기는 데이터를 대표적으로 JSON으로 통신한다. 데이터 단위가 크면 클수록 서버에서 기기로 송신하고 수신하는 데 시간이 오래 걸린다. 이 때 모바일 기기 입장에서 다른 일도 많은데 데이터 수신만 기다릴 수 없다. 따라서 기기는 다른 일을 먼저 처리하고 만약 데이터가 완전하게 도착하면 그 때 미뤄왔던 일을 처리한다. 앱 사용자들은 이 모든 과정을 로딩 화면으로 인식한다. 서버에서 데이터를 받아올 때 어플리케이션 측에서는 정보를 언제 다 받는지 알수가 없다. 그렇기 때문에 future의 상태를 확실히 확인하는..

[Flutter] Vscode로 flutter 코딩할 때 셋팅해야 하는 것 [내부링크]

VSCode로 flutter를 코딩하다보면 불편한 점이 존재한다. 그래서 VSCode로 코딩했을 때 불편한 점을 줄이고자 간단한 셋팅을 하고자 한다. 1. warning 줄 없애기 1) 설정 전 flutter 코딩을 하다보면 위의 사진과 같이 파란줄이 표시된다. 이는 warning인데, 거의 const를 붙이라는 warning이다. 2) 설정 하기 2-1) 명령 팔레트 들어가기 warning을 없앨려면 VSCode 왼쪽 하단에 톱니바퀴 즉 설정을 눌러 명령 팔레트를 누른다. 혹은 ctrl + shift +p 단축키를 눌러도 된다. 그리고 setting이라고 쳤을 때, 아래 사진과 같이 나오면 이를 클릭한다. 간혹 아래와 같이 두개가 나오는데, (JSON)이 아닌 (JSON)이 없는 것을 누르면 안된다. ..

[Flutter] static, outlinedButton 설정하기 [내부링크]

static static이란 일반 객체를 만들 때 같이 메모리에 저장하는 것이 아닌 따로 메모리를 두어 static 구문을 객체가 공유하여 사용할 수 있게 해주는 구문이다. 즉, 인스턴스에 귀속되지 않고, 클래스 통째로 귀속이 되는 것을 의미한다. class Family{ static String House; String name; Family( String name, ):this.name = name; void printMySweetHome(){ print('저는 ${this.name}이고, ${House}에 살고 있습니다.'); } } Family클래스에서 House변수에 static을 사용하여 선언하였고, name변수는 static을 사용하지 않고 선언하였다. printMySweetHome()함수에..

[Flutter] showDatePicker 사용하기 [내부링크]

DatePicker는 날짜를 선택하는 모달을 표시한다. DatePicker의 경우 showDatePicker 메소드를 호출해서 DatePicker 표시할 수 있다. 변수 알아보기 Future _selectDate() async { DateTime? picked = await showDatePicker( context: context, initialDate: DateTime.now(), firstDate: DateTime(2016), lastDate: DateTime(2029)); builder: (BuildContext context, Widget? child) { return Theme( data: ThemeData.dark(), //다크 테마 child: child!, ); }, if (picked ..

[Flutter] ListView와 ListView.builder, separated 구분하기 [내부링크]

ListView ListView: Creates a scrollable, linear array of widgets from an explicit List. This constructor is appropriate for list views with a small number of children because constructing the List requires doing work for every child that could possibly be displayed in the list view instead of just those children that are actually visible. → ListView의 생성자에서 아이템(ListTile)을 직접 구현하여 ListView를 구성하는 방..

[Flutter] tableCalendar에 마크표시 오류 고치기 [내부링크]

todo앱 만들면서 캘린더에 마크 표시가 안되어 해결방법을 적어보려고 한다. 1. 문제 파악하기 위의 사진은 마크 표시가 안 된 캘린더를 표시한 것이다. 원래 todo앱에 일정이 등록되면 해당 날짜에 마크 표시와 슬라이딩업패널에 일정보기 아래에 해당 날짜의 일정이 보여야 한다. 그러나 둘다 표시가 안 되었다. 그래서 다른 날짜를 클릭했을 때도 그런가 확인했다. 확인해보니 앱을 제일 처음 구동했을 때만 안되는 것이었다. 그렇다는 것은 해당 기능이 된다는 것은 변수를 잘못 선언했다는 말이었다. 2. 디버그 콘솔에 출력하기 디버그 콘솔에 앱 구동하고 바로 일정을 등록하면 어떻게 출력되는지 확인하고자 하였다. 그리고 나서 다른 날짜를 클릭하고 일정을 등록시 날짜가 어떻게 출력되는지 확인하였다. → 여기서 둘다 ..

[GetX] 상태 관리 알고 사용하기 [내부링크]

Flutter에서 상태를 관리하기 위해서 Bloc패턴이나 Provider와 같은 패키지를 사용하게 된다. 그러나 시간이 흘러 GetX가 나와 사람들이 많이 쓰는 추세이다. GetX GetX설치와 관련해서는 따로 정리해놓은 글이 있기 때문에 이를 첨부해놓겠다. 2023.02.24 - [Flutter] - [GetX] getX 사용해서 snackbar 구현 [GetX] getX 사용해서 snackbar 구현 snackbar는 앱에서 수행했거나 앞으로 수행할 작업을 사용자에게 알려주는 UI 요소이다. 일시적으로 화면 하단에 나타난다. getX 사용하기 1. 종속성 추가 flutter파일에 pubspec.yaml파일이 존재한다. 여 uhee-12.tistory.com 상태 관리 내 경우에는 GetX없이 부모 위..

[GetX] getX 사용해서 snackbar 구현 [내부링크]

snackbar는 앱에서 수행했거나 앞으로 수행할 작업을 사용자에게 알려주는 UI 요소이다. 일시적으로 화면 하단에 나타난다. getX 사용하기 1. 종속성 추가 flutter파일에 pubspec.yaml파일이 존재한다. 여기에 들어가서 dev_dependencies탭에 아래의 명령어를 추가해준다. get: ^4.6.5 그러면 종속성이 알아서 추가된다. 가끔가다가 추가가 안되는 경우가 존재하는데, 이럴 경우에는 flutter pub get 명령어를 쳐서 종속성을 설치해준다. 2. import 하기 import 'package:get/get.dart'; getX를 사용하고자 하는 파일에 상위에 import를 하여 패키지를 가져온다. 3. GetMaterialApp로 사용하기 이를 바로 사용하려면 안되고 m..

[Flutter] Widget Tree, Element Tree, RenderObject Tree 알아보기 [내부링크]

widget: Flutter에서 화면에 표시된 모든 요소가 위젯이라 한다. 눈에 보이지 않지만 화면을 구성하는 레이아웃(Layout)도 위젯이라고 한다.위젯은 크게 두 가지로 분류할 수 있다.Stateful WidgetStateless WidgetStateful, Stateless Widget1) Stateless Widget: 어떠한 상태도 가지고 있지 않은 정적인 위젯이다. 어떠한 상태값도 가지고 있지 않기 때문에 Stateless Widget은 화면에서 어떠한 움직임이나 변화가 없다.예: 텍스트, 이미지 등.Stateless Widget은 화면에는 표시되지만, 사용자와 어떠한 인터렉션도 하지않는다. Stateless Widget은 StatelessWidget을 상속하여 생성한다.2) Stateful..

[Flutter] SingleChildScrollView, GestureDetector, decoration, Align, datetime 개념 및 활용하기 [내부링크]

1. overflow에러(SingleChildScrollView) 왼쪽 사진은 화면의 크기보다 위젯이 더 큰 경우 발생하는 overflow 에러이다. 이 경우에는 사용하고자 하는 위젯의 최상위 Class를 SingleChildScrollView로 감싸주면 된다. 하나뿐인 자식이 너무 커서 화면에 다 안나오고 삐져나간다던지 할 때 스크롤을 해서 자식을 다 볼 수 있도록 해준다. 그렇게 되면 password 인풋을 눌렀을 때 왼쪽같은 오류가 났었다가 이제는 오른쪽처럼 스크롤이 가능하게 된다. 그래서 키보드에 의해서 인풋창이 가려지지 않게 된다. 2. 키보드 밖 클릭시(GestureDetector) 이와 관련된 강의를 여러번 봤지만 안 익혀져서 다시 정리한다. @override Widget build(Buil..

[Flutter] final, generics, future에 대한 개념 적립하기 [내부링크]

1. final과 const1) final 과 const 선언final 과 const 는 아래와 같은 방식으로 선언한다.final double pi = 3.141592;const double e = 2.71828;2) final과 const 공통점, 차이점final과 const 공통점한 번 설정한 값을 변경할 수 없다. (다른 값으로 변경하려고 시도하면 컴파일 오류가 발생)final & const 차이점const의 경우, 컴파일 타임에서 상수를 정의할 수 있다. 즉, const로 정의한 상수는 런타임에서 정의되는 값을 설정할 수 없다는 의미다.예를 들어, DateTime.now()의 경우 런타임에서 호출 될 때마다 결과 값이 다른데 이러한 값은 const로 설정할 수 없다.final은 런타임에서 결정되는..

[React] react 모바일 페이지 구현하기 [내부링크]

홈페이지는 나혼자 구현해서 시간이 없기에 모바일까지 코드구현하는데 시간이 소요된다. 사이트를 보고자 하는 사용자를 위하여 모바일 페이지에서 데스크톱으로 이동하여 사이트를 이동할 수 있도록 모바일 페이지에서 데스크톱 페이지로 이동하라는 문구를 구현하고자 하였다. 1. react-device-detect 설치 npm i react-device-detect react-device-detect를 설치하여 모바일에 보일 화면을 만든다. 2. 모바일에 보일 화면 준비 import React from "react"; import styled from "styled-components"; const Outer = styled.div` display: flex; justify-content: center; `; cons..

[Flutter] Stack, EdgeInsets, BuildContext 개념 및 활용하기 [내부링크]

1. Stack : stack는 자료구조에서 많이 보인다. 기본적으로 push와 pop을 사용한다. flutter에서 stack은 화면 위에 위젯을 표시하는 방식으로 화면에서 이동한다. 화면 위에서 위젯을 표시할 때 push를, 위에 표시된 화면을 제거할 때에는 pop을 사용한다. Stack의 자식 위젯 위치를 조절하는데 쓰인다. Postioned Positioned 위젯은 Stack안에서 사용되어야 하며, StatelessWidget과 StatefulWidget에서만 사용가능하다. 그런데 여기서 positioned를 사용하여 top, left, right, bottom을 이용해서 자식들을 배치할 수 있다. 내가 하면서 제일 먼저 생성한 자식위젯은 맨 아래에 쌓인다. 그리고 제일 나중에 생성한 위젯은 제..

[Flutter] 터미널에서 플러터 인식못할 때 인식시키기 [내부링크]

1. Flutter SDK path 파악하기 flutter SDK download 된 경로 파악한다. 이는 SDK경로를 터미널에서 인식하게 하기 위함으로 SDK위치를 저장해놓는다. 2. SDK경로 저장하기 1) $HOME/.zshrc 파일열기 터미널로 들어가서 아래 명령어를 친다. vi **$HOME/.zshrc** 그러면 vi에디터로 해서 insert를 할 수 있게된다. 2) 명령어를 치고 저장 $HOME/.zshrc 파일에 제일 처음에 저렇게 써져 있어서 아래에 path를 입력했다. export PATH="$PATH:pwd" 3. flutter 사용하기 추가 가끔 가다가 플러터 버전이 바껴서 코드를 못 따라하는 경우가 있다. 웬만해서 자신의 플러터 버전을 외우겠지만 버전을 확인하고 싶을 때는 flut..

[Flutter] Flutter 시작할 때 알아야 되는 개념 알아보기 [내부링크]

import와 void main import 'package:flutter/material.dart'; void main() => {runApp(MyApp())}; 처음에 플러터를 시작하게 되면 main.dart 파일을 만들게 된다. 이는 기본적으로 만들지 않아도 생성되는 파일이다. 그래서 임포트를 해서 material.dart package를 가져오면 된다. 그리고 나서 void main() {runApp(MyApp())};라는 main이라는 함수를 실행하게 된다. 여기서 MyApp()은 자기 마음대로 이름을 바꿔도 된다. materialApp class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { retu..

[AWS] AWS EC2 인스턴스 디스크 용량 확장(EBS 볼륨 확장)하기 [내부링크]

이전에 볼륨과 인스턴스를 연결했는데 잘못 연결하여 그 디스크를 못 쓰게 되었다. 그래서 루트에 있는 디스크 용량이 너무 적어 이를 파티션으로 늘리고자 한건데, 이 디스크를 확장하는 방법을 알게 되어 확장하게 되었다. 1. 볼륨 용량 늘리기 늘리고자 하는 볼륨을 선택하여 작업을 클릭해 볼륨 수정을 누른다. 그러면 아래와 같이 어느 정도 늘린 것인지 물어본다. 내 경우 16gb선택하여 늘리고자 하였다. 16gb를 써서 수정을 누르면 수정이 된다. 또한, 이는 스냅샷이라는 것이 있는데 이 스냅샷은 백업을 의미하니, 백업을 하고 하면 더 좋다. 차례로 볼륨의 상태가 저렇게 변한다. optimizing이 100%가 되면 사용중으로 변하며 이는 리눅스에서 수정을 할 수 있다는 것을 의미한다. 2. linux에서 용..

[Error] mysql연결시 나는 오류 해결하기 [내부링크]

나중에 정리해놓고 글을 보았을 때 유용하게 쓰일 것 같아 정리해보고자 한다. 문제 발생 이러한 오류가 뜨면서 db를 작업하는 tableplus에서는 드라이버가 어떠한 패킷에 대한 응답을 받지 않았다고 하여 에러가 발생하였다고 적혀있었다. 이 문제 발생시 방화벽에 대한 규제는 풀어주었기에 방화벽에 대한 에러는 아니었다. 또한 mysql의 경우 tcp/ip나 socket을 사용하여 mysql과 연결하는데, 내 경우 socket을 사용치 않으므로 tcp/ip를 사용한다. 그래서 netstat으로 하여 지금 쓰는 포트에 대한 규제가 있는지 확인하였다. 1) linux에서 규제 확인 netstat -ntlp | grep 3306 위와 같은 코드를 쳐서 확인해주었다. 2) mysql에서도 규제 확인 서버 변수에서도..

[React] react 게시글 작성해보고 구현하기 [내부링크]

table 태그를 사용하여 디자인을 구성하였다. 게시글에 대한 데이터는 db에 저장하였다. 그리고 게시글을 등록했을 경우 페이지가 이동되면서 게시판에서 내가 쓴 글을 볼 수 있도록 구현하였다. 아래는 내가 꾸민 게시판 글쓰기 페이지이다. 게시판 게시글 생성하기 게시판을 구성할 때 필요한 것은 사진을 참조해서 보면 맨 위에서부터 글 제목, 작성자, 내용, 비밀번호와 비밀글 설정, 개인정보 수집 및 동의 등이 필요했다. 이메일의 경우는 비회원과 회원을 구분하지 않으므로 비회원도 글을 작성할 수 있도록 하였다. 그래서 이는 꼭 필요한 항목이 아니기에 없어도 되고, 작성하지 않아도 alert창이 뜨지 않게 구성하였다. useInput 생성 코드가 너무 길어서 커스텀하여 useInput과 useInputRef를 ..

[React] react ToDo 리스트 생성하기 [내부링크]

간단하게 todo리스트를 생성하고 하면서 배운 점들을 서술하고자 한다. todo리스트 생성하기 1) input창에 쓴 글 반영하기 여기에 input창에 글을 쓰면 todo리스트가 생성되게 해야 한다. const [text, setText] = useState(""); const onChangeHandler = (event) => { setText(event.target.value); }; onChangeHandler(event)} placeholder="해야 할 일을 입력하세요." value={text} /> input을 만들어 입력한 글을 input창으로 변하게 해야 한다. 그럴려면 value에 useState로 선언한 변수가 들어가야 한다. 그리고 계속적으로 input창이 변하기 때문에 onchang..

[React] react 상품 위시리스트 구현하기 [내부링크]

로그인 if(localStorage.getItem("user_id") === null){ alert('로그인 후 위시리스트에 등록 해주세요.') navigate('/user/login') } 처음에 상품을 위시리스트에 담기 위해서는 로그인을 하도록 페이지이동을 하였다. 로그인이 되어 있는지 알기 위해서 로컬 스토리지에 로그인한 정보를 담아두었기 때문에 이를 가져온다. 그래서 이 정보가 null이라면 로그인이 되지 않았다는 의미로, 로그인 페이지로 로그인을 하게 하였다. 로그인이 되었다면 바로 상품이 위시리스트에 담기게 하였다. 위시리스트에 담기 axios .post(`http://localhost:3001/wish_list/wish`, { user_no: localStorage.getItem("user_..

[React] 페이지네이션(Pagination) 구현하기 [내부링크]

데이터 가져오기 페이지네이션을 하기 위해서는 데이터가 있어야 한다. 우선은 데이터가 없으므로 게시물 데이터는 JSON Placeholder라는 인터넷에 공개된 API를 통해 가져온다. fetch('') .then(response => response.json()) .then(json => console.log(json)) 이렇게 데이터를 가져온다. 사이트를 참고하면 이렇게 fetch를 사용해서 가져온 데이터는 아래와 같은 데이터로 가져와진다. { "userId": 1, "id": 1, "title": "delectus aut autem", "completed": false } 게시물 목록 구현 import { useState, useEffect } from "react"; import styled fro..

[Flutter] flutter 환경변수 설정시 오류(window) 살펴보기 [내부링크]

1. flutter 설치 flutter.dev 위의 flutter.dev를 들어가면 flutter를 설치할 수 있는 홈페이지가 나오게 된다. 자신의 컴퓨터환경에 맞게 클릭한다. 나는 window라 이를 클릭해서 압축파일을 풀었다. 그런데 압축파일이 크다보니 푸는데 너무 오래걸렸다. 그래서 아래의 git으로 푸는 방법이 존재하여 그를 사용하였다. 나는 파일위치를 보지 않고 풀어서 파일을 찾는데 시간을 조금 소요했다. git clone -b stable 윈도우라면 웬만하면 git으로 푸는 것을 추천한다. 2. Flutter 환경변수 추가 내 컴퓨터에 환경변수를 추가하면 cmd에서 폴더경로 없이 바로 exe파일을 실행할 수 있도록 도와준다. 시작 > 검색 > 시스 환경 변수 편집을 클릭한다. 고급탭에 환경 변..

[React] useMemo()와 React.memo, useCallback() 비교하기 [내부링크]

1. 성능 향상을 위한 Memoization React.memo와 useCallback(), useMemo의 개념을 이해하기 위해서는 Memoization의 정의를 알아야 한다. 정의는 다음과 같다. 결과를 캐싱하고, 다음 작업에서 캐싱한 것을 재사용 하는 비싼 작업의 속도를 높이는 자바스크립트 기술 이전 값을 메모리에 저장해 동일한 계산의 반복을 제거해 빠른 처리를 가능하게 하는 기술 캐시에 초기 작업 결과를 저장하여 사용함으로 써 최적화 할 수 있다. 만약 작업을 다시 수행해야 한다면, 어딘가에 저장되어진 동일한 결과를 단순히 반환 해준다. 메모이제이션(Memoization) 자주 사용되는 값을 받아오기 위해 반복적으로 계산을 해야 하는 상황에서, 특정 값을 캐싱하는 것을 말한다. 해당 값이 또 ..

[React] 제어&비제어 컴포넌트 알아보기 [내부링크]

모르는 개념을 알게되어서 적게되는 글이며, 항상 react에서 겪는 오류들이 줄어들었으면 하는 바람에 쓰는 글이다. 개념 1) 제어 컴포넌트 HTML에서 , , 와 같은 폼 엘리먼트는 일반적으로 사용자의 입력을 기반으로 자신의 state를 관리하고 업데이트합니다. React에서는 변경할 수 있는 state가 일반적으로 컴포넌트의 state 속성에 유지되며 setState()에 의해 업데이트됩니다. 폼을 렌더링하는 React 컴포넌트는 폼에 발생하는 사용자 입력값을 제어합니다. 이러한 방식으로 React에 의해 값이 제어되는 입력 폼 엘리먼트를 “제어 컴포넌트 (controlled component)“라고 합니다. 2) 비제어 컴포넌트 모든 state 업데이트에 대한 이벤트 핸들러를 작성하는 대신 비제어 ..

[React] location.href 와 location.replace, navigate 비교하기 [내부링크]

react에서 페이지 이동할려고 했을 때 이를 검색한 적이 있다. 각각마다 차이점이 존재하여 이에 대해서 서술해보고자 글을 적게 되었다. 개념 자바스크립트에서 페이지 이동 location.href : 새로운 페이지로 이동 location.replace : 새로운 페이지로 이동 react에서 페이지 이동 navigate : 새로운 페이지로 이동 차이점 1. 이전 페이지 이동 1) location.href와 location.replace location.href는 객체의 속성이며, loaction.replace()는 메서드(함수)로 작동된다. href는 페이지를 이동하는 것이기 때문에 뒤로가기 버튼을 누른 경우 이전 페이지로 이동이 가능하지만, replace는 이동한 페이지를 현재 페이지로 덮어 씌우기 때문..

[Flutter] Flutter 설치 및 오류 살펴보기 [내부링크]

처음 Flutter SDK 설치시 failed이라고 떠서 미국 flutter에서 설치하였다. 1. SDK 설치 압축파일을 받고 iTerm에서 unzip ~/Downloads/flutter_macos_v1.5.4-hotfix.2-stable.zip 이것은 압축파일이름을 잘 확인해야 한다. 그리고 굳이 명령어로 압축파일을 안 풀어줘도 되니 문서로 가서 압축된 파일을 바로 풀어도 된다. 2. 경로 설정 export PATH="$PATH:`pwd`/flutter/bin" 이를 쳐서 경로를 설정한다. 윈도우의 경우 환경변수 설정으로 들어가서 설정해주어야 한다. 나는 mac임으로 이렇게 경로를 설정했을 경우, 영구적으로 설정된 것이 아니기에 매번 들어갈 때마다 이를 쳐주어야 한다. 그래서 영구적으로 설정해야 한다...

[React] useState() 개념 다지기 [내부링크]

우연히 글을 보다가 useState()가 비동기방식이라는 것을 알 수 있었다. 근데 react 코드를 짜면서 느낄 수 있는 부분들이 많아 놀랍지는 않았지만, 개념으로 확인시켜주니 좋았다. 그래서 비동기방식으로 처리할 때 불편함이 있어 동기 방식으로 처리하는 방식을 알고자 정리하게 되었다. 개념 const로 선언하는 이유는? 변수의 재할당을 막기 위해서 let을 사용하면 변수의 재선언이 가능해지기 때문에, 이를 방지하고 setState를 사용한 변수 변경만을 허락하기 위해서 const로 선언 state를 사용하는 이유 변수는 변경되어도 자동으로 화면이 바뀌지 않는다. setState를 사용시 state가 변경되면 자동으로 화면이 바뀌기 때문에 state를 사용한다. 비동기 방식 우선 개념에 대해서 보면, ..

[React] StrictMode 개념 다지기 [내부링크]

우연히 글을 보다가 정리해두면 좋겠다 싶어서 정리하게 되었다. 정리하게 된 계기 React18 + StrictMode에서는 개발모드에서 data fetching이 최소 두 번이상 일어날 수 있다. 이러한 글을 계속 보았지만 왜 그런지 모르고 그냥 그런가보다하고 넘어갔다. 우리가 react를 이용하여 웹 사이트를 구현하고자 할 때 app.js는 기본적으로 생성된다. ReactDOM.render( , document.getElementById('root') ); 위와 같이 app.js가 생겼는데, 이를 아래와 같이 바꾸면 두번이나 재랜더링이 되지 않는다. ReactDOM.render( , document.getElementById('root') ); 개념 공식문서에 따르면 strictmode는 StrictM..

[React] 이미지 업로드, custom hook, 페이지 이동, props 관련 정리 [내부링크]

1. 이미지 업로드 const onClickImageUpload = useCallback(() => { imageInput.current.click(); }, [imageInput.current]); 이미지 업로드 2. hook으로 저장하여 커스텀 훅으로 사용 여기서 거의 핸들러 빼고 setter만 넣어서 value와 setter만 리턴하는 경우로 많이 쓴다. import { useState, useCallback } from 'react'; export default (initValue = null) => { const [value, setter] = useState(initValue); const handler = useCallback((e) => { setter(e.target.value); }, ..

[React] Context()알아보고 활용하기 [내부링크]

context()에 대해서 정리하는 이유는 많이 보았기에 궁금해서 찾아보다가 너무 유익해서 정리하고자 한다. context()는 언제 쓰는가 여러 글 봤었는데 유튜브의 영상이 잘 설명되어 있어서 맨아래에 첨부해놓는다. react로 개발을 하다보면 props를 가져와서 쓰고 싶은 경우가 생긴다. 즉 하위 컴포넌트에서 상위 컴포넌트의 데이터를 가져오고 싶은 것이다. 나의 경우는 https://uhee-12.tistory.com/51 위 글을 보면 알겠지만, navigate와 location을 많이 사용했었다. 또한, redux를 사용하지 않아서 아직은 상태관리에 많은 어려움을 겪고 있다. 그러던 와중 context()를 알게 된 것이다. 위에서도 말한 것 같이 데이터를 전역적으로 사용하고 싶을 때 conte..

filter() 함수 알아보고 활용 및 삭제하기 [내부링크]

개념 filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열을 반환한다. 즉 filter()메서드는 내가 원하는 값들을 말 그대로 필터링하여 사용할 수 있다. 사용법 사용법에는 여러가지가 존재하는데 두가지로 나누어 설명하겠다. 1) filter()을 활용한 검색 let users = [ { id: 11, name: 'Adam', age: 23, group: 'editor' }, { id: 47, name: 'John', age: 28, group: 'admin' }, { id: 85, name: 'William', age: 34, group: 'editor' }, { id: 97, name: 'Oliver', age: 28, group: 'admin' } ]; let re..

[React] props 개념 다지기 [내부링크]

react의 기본 개념이 부족해서 값을 전달하거나 받아오는 것에 한계를 느껴 기본 개념을 정리하다가 글을 쓰게 되었다. 개념 컴포넌트 속성을 설정할 때 사용하는 요소로, 간단히 말하자면 컴포넌트에서 컴포넌트로 전달하는 데이터이다.(단방향 데이터의 형식의 흐름을 갖는다) properties의 줄임말이다. props는 읽기 전용으로, 함수 컴포넌트나 클래스 컴포넌트 모두 컴포넌트의 자체 props를 수정해서는 안된다. 모든 React 컴포넌트는 자신의 props를 다룰 때 반드시 순수 함수처럼 동작해야한다. 순수함수 → 입력값을 바꾸려 하지 않고 항상 동일한 입력값에 대해 동일한 결과를 반환하기 때문 function sum(a, b) { return a + b; } 순수함수 → 자신의 입력값을 변경하기 ..

[React] useEffect와 useLayoutEffect 비교하여 알아보기 [내부링크]

필수 개념 Render: DOM Tree 를 구성하기 위해 각 엘리먼트의 스타일 속성을 계산하는 과정 Paint: 실제 스크린에 Layout을 표시하고 업데이트하는 과정 즉 시각적 변경 사항이 사용자에게 표시되는 것을 말함. 개념 1) useEffect useEffect는 컴포넌트들이 render와 paint된 후 실행된다. 이는 **비동기적(asynchronous)**으로 실행된다. paint된 후 실행되기 때문에, useEffect내부에 DOM에 영향을 주는 코드가 있을 경우 사용자 입장에서는 화면의 깜빡임을 보게된다. 2) useLayoutEffect useLayoutEffect는 컴포넌트들이 render된 후 실행되며, 그 이후에 paint가 되게 된다. 이 작업은 동기적(synchronous) ..

[React] 리스트와 key 개념 쌓아보기 [내부링크]

리스트 import React from "react"; const IterationSample = () => { return ( 봄 여름 가을 겨울 ); }; export default IterationSample; 위의 코드를 보면 가 반복되는 것을 알 수 있다. 지금은 ul태그 하나 뿐이라 그렇게 문제가 되지는 않아 보인다. 그렇지만 코드가 좀 더 복잡하다면 코드의 양은 더욱 늘어날 것이고, 파일 용량도 쓸데없이 증가할 것다. 코드 관리가 점점 어려워질 것이다. → 이러한 경우는 map()을 사용하여 반복적인 코드를 정리해서 정리하면 된다. import React from "react"; const IterationSample = () => { const names = ["눈사람", "얼음", "눈"..

[React] react-router-dom v6 개념 쌓아보기 [내부링크]

업데이트 날짜를 찾아볼려고 했는데 한 2021년 11월쯤 업데이트한 것 같다. 거의 다 최신 버전으로 쓰고 있고 배우기도 그렇게 배워서 정리해야된다는 생각을 못했는데, 여러 모듈을 쓰다보니 이전 버전들을 쓰는 블로그들로 인해 헷갈려서 정리하게 되었다. 업데이트를 하면서 번들 크기가 최적화가 가능해졌다. 70%정도로 줄어든다. React v16.8 React Router v6은 React Hook을 많이 사용하므로 React Router v6으로 업그레이드를 시도하기 전에 React 16.8 이상으로 설치가 되어 있어야 사용이 가능하다. React Router v5는 React >= 15와 호환된다. 내가 글을 쓰고 있는 시점은 react-router-dom은 v6.3.0이다. 설치 npm i react-..

[React] startTransition 개념 알아보기 [내부링크]

React18 버전에서 가장 크게 강조된 키워드는 동시성이다. 자바스크립트는 싱글스레드 언어이기때문에 한 번에 하나의 작업만 처리할 수 있다. 화면이 오래 멈춰있다면 사용자 경험은 악화되기 때문에 웹 개발에 있어서 큰 걸림돌이 된다. React는 렌더링 블록킹 문제를 해결하기 위해 동시성을 이용하게 되었다. 개념 해당 기능은 상태 업데이트를 함에 있어서 우선순위를 정하는데 도움을 준다. 리액트에서는 상태 업데이트 대상을 두가지로 나누었으며, 이를 통해 transition이 의미하는 바가 무엇인지 파악할 수 있다. Urgent updates(높은 우선순위) : 버튼 클릭, 키보드 입력과 같이 직관적으로 보았을 때 업데이트가 즉각적으로 일어나는 것을 기대하는 상태 값들 Transition updates(낮은..

[React] Automatic Batching(react v18) 개념 쌓아보기 [내부링크]

개념 배칭(batching)은 업데이트 대상이 되는 상태값들을 하나의 그룹으로 묶어서 한번의 리렌더링에 업데이트가 모두 진행될 수 있게 해주는 것을 의미한다. 한 함수 안에서 setState(업데이트)를 아무리 많이 호출시키더라도 리렌더링은 단 한번만 발생한다. 나오게 된 배경 이전부터 리랜더링과 관련해서 react-17v에서 이벤트 핸들러 내부에서 발생하는 상태 업데이트만 배치처리를 지원했다. 하지만 이벤트 핸들러 내부에 fetch()등 과 같은 콜백을 받아 처리하는 메소드가 존재할 경우 내부의 콜백이 모두 완료된 후에는 Automatic Batching이 처리되지 않았다. 그리고 react-17v에서 업데이트가 동기적으로 일어나지 않았다. 이전 버전과 최신 버전의 비교 1) React-17v impo..

[react] 페이지 이동시 스크롤 최상단에 위치하기 [내부링크]

페이지 이동시 임의의 페이지 화면이 보여서 눌렀을 때 최상단에 위치하게 하기 위해서 찾아보다가 이글을 정리하게 되었다. useLocation() 처음에 useLocation()을 알아야 하는데 이는 npm install react-router-dom react-router-dom 모듈을 설치하여 임포트해준다. import { useLocation } from 'react-router-dom'; const location = useLocation(); useEffect(() => { console.log(location); }, [ location ]) 그리고 나서 location 변수에 담아 이를 location이 랜더링될 때마다 콘솔에 찍어 보이게 한다. 그리고 콘솔에 보면, hash, pathname..

[React] useRef() 개념 쌓아보기 [내부링크]

개념 useRef는 리렌더링 하지 않는다. 컴포넌트의 속성만 조회&수정한다. → 개인적인 견해로 여러 글을 보았는데 위의 문장이 제일 useRef()를 잘 설명해주는 것 같다. 사용 useRef함수는 current속성을 가지고 있는 객체를 반환한다. 인자로 넘어온 초기값을 current속성에 할당한다. 이 current속성은 값을 변경해도 상태를 변경할 때 처럼 React 컴포넌트가 다시 랜더링되지 않는다. 위에서 정의한 것처럼 리랜더링되지 않기 때문이다. React 컴포넌트가 다시 랜더링될 때도 마찬가지로 이 current 속성의 값이 유실되지 않는다. import React, { useState, useRef } from "react"; function ManualCounter() { const [c..

[React] code-splitting 코드스플리팅 알아보기 [내부링크]

앞 전에 suspense를 정리하였다. suspense가 기반되어야 쓸 수 있는 코드에 대해서 정리해보고자 한다. code-splitting 영어 단어 그대로 코드를 나눈다는 것이다. 왜 이것이 필요할까? 앱이 커짐에 따라 번들도 커지게 된다. 특히 큰 third-party라이브러리를 포함하는 경우에 번들에 포함된 코드를 주의깊게 확인해야 한다. 실수로 커진 앱으로 인해 로드시간이 오래 걸리는 문제를 방지한다. 큰 번들로 묶이지 않으려면 번들을 code splitting 하는것이 좋다. code splitting 기능은 런타임시 동적으로 로드할 수 있는 여러 번들을 만들 수 있는 Webpack 및 Browserify와 같은 번들러에서 지원되는 기능이다. code splitting을 하면 사용자가 현재 필..

[React] Suspense(ft. React v18) 변경사항 제대로 알기 [내부링크]

react가 16에서 알파버전이었다가, 18버전에서는 베타버전이 되었다. 그만큼 안정화가 되었다는 것을 말해준다. 이는 우연히 블로그에서 정보를 찾으려다가 발견한 정보이다. 아직 공부가 많이 필요하다는 것을 많이 느낀다. 그래서 우연히 알게된 이정보에 대해서 공부할려고 찾아보다가 더 많은 부분까지 알게되어 개념은 어느 정도 알겠지만 정리가 안되어, 이 개념을 정리하고자 글을 써본다. 이전에 정리해놓은 글인데 이제야 올립니다. 들어가며, 위에서 말한 것처럼 react의 suspense는 이미 출시되어 있었다. 16버전에서 알파버전이어서 그만큼 불안정했다가, 18버전에는 안정화가 되었다. 여기에서 나오는 개념은 클라이언트 react server개념이 나온다. RSC(React Server Component)..

[React] useEffect 개념 제대로 알기 [내부링크]

항상 react를 쓰는데 인터넷강의로 너무 간략하게 배우다보니 이에 대한 개념이 적립되지 못해 이제야 이 개념을 적립하고자 정리한다. 개념 useEffect() 함수는 React component가 렌더링 될 때마다 특정 작업(Sied effect)을 실행할 수 있도록 하는 리액트 Hook이다. 여기서 Side effect는 component가 렌더링 된 이후에 비동기로 처리되어야 하는 부수적인 효과들을 말한다. 이러한 기능으로 인해 함수형 컴포넌트에서도 클래스형 컴포넌트에서 사용했던 생명주기 메서드를 사용할 수 있게 되었다. 클래스형 컴포넌트에서는 생명주기 메소드를 사용할 수 있었는데, 이를 함수형 컴포넌트에서도 사용할 수 있게 되었다. 즉, 라이프사이클 훅을 대체할 수 있게 되었다. component..

[Node.js] node.js에서 AWS s3연동하기 [내부링크]

node와 s3를 연동하면서 잘 되지 않았던 부분들을 정리하고자 글로 정리한다. 이는 세가지로 정리할 수 있다. s3연동하는 js하나, s3를 연동하는 js를 미들웨어로 넣어주어 사용하는 라우트 하나, 이에 대한 결과를 보여주는 컨트롤러로 이루어져 있다. 모듈 설치 npm install multer multer-s3 aws-sdk 위의 모듈은 s3와 node를 연동할 때 필요한 모듈이다. 이를 설치하고 난 후에 설치된 모듈의 버전을 확인해야 한다. 모듈과 관련하여 오류가 발생하였었다. 아래의 글을 한번 살펴보고 나서 이 글을 정독하거나 하면서 오류나는 부분들은 아래를 참고하면 좋다. 2023.02.08 - [Error] - [Error] this.client.send is not a function(no..

AWS S3(Simple Storage Service) 생성하기 [내부링크]

AWS S3(Simple Storage Service)란? Simple Storage Service의 약자로 파일 서버의 역할을 하는 서비스다. 일반적인 파일서버는 트래픽이 증가함에 따라서 장비를 증설하는 작업을 해야 하는데 S3는 이와 같은 것을 대행한다. 정보의 중요도에 따라서 보호 수준을 차등 할 수 있고, 이에 따라서 비용을 절감 할 수 있다. 저장할 수 있는 파일 수의 제한이 없다. 최소 1바이트에서 최대 5TB의 데이터를 저장하고 서비스 할 수 있다. 파일에 인증을 붙여서 무단으로 엑세스 하지 못하도록 할 수 있다. Amazon S3 용어 Buckets Amazon S3에서 생성되는 최상위의 디렉토리, Amazon S3에 저장된 객체의 컨테이너이다. S3상의 모든 객체는 버킷에 포함된다. 버킷..

[Error] this.client.send is not a function(node와 s3관련 오류 모음) [내부링크]

node와 s3를 연결하면서 나는 오류들을 정리하였다. 1. this.client.send is not a function → 구글링했을 때 이와 같이 오류난 사람들이 많았다. https://github.com/anacronw/multer-s3/issues/169 github에서 이러한 오류에 대해서 토론한 것이 있어서 이를 참조하여 문제를 해결하였다. 1) 문제 발생 원인 : multer-s3와 aws-sdk는 아마존의 s3와 node를 연결하기 위해서 깔아야 하는 모듈이다. 근데 이 둘의 버전이 아래와 같이 일치해야 한다. 내 경우는 일치하지 않아 나는 오류였다. 2) 문제 해결 : 그래서 multer-s3는 3.x으므로 이를 다운 그레이드를 하여 2.x로 설정하였다. 이렇게 하여 aws-sdk가 2..

[Node.js] 리눅스에서 mysql에 접속하기 [내부링크]

리눅스에서 mysql에 접속 sudo /usr/bin/mysql -u root -p 을 입력하여 mysql에 접속한다. use mysql; 다음과 같은 명령어를 입력하여 들어간 다음에 // 특정 ip만 접근을 허용하는 사용자 추가 create user '유저명'@'123.456.789.100' identified by '비번'; // 권한 허용 grant all privileges on *.* to '유저명'@'123.456.789.100'; 이 때 나의 경우에는 aws ec2를 만들어서 mysql을 연결하여 사용할 것이기에, 한 포트만 사용해줄 것이다. 그래서 한 ip만 허용하여 유저가 들어가게 해놨다. 그렇지만 localhost로 해서 내부접근하는 경우와 외부접근하는 경우도 있기에 아래 사이트를 참고..

[React] 페이지 이동시 값 넘겨주기 [내부링크]

useHistory() import { useHistory } from "react-router-dom"; const test = useHistory(); 처음에 이 방법을 이용하여 사용하고자 했는데, 계속적으로 오류가 나서 찾아보았다. stackflow를 들어가서 해결점을 찾게 되었다. 내가 참고한 글이 오래된 글이었으며, 지금은 useHistory대신에 useNavigate를 사용한다는 것이었다. react-router-dom 6버전에서부터 교체 된 것 같았다. useNavigate() 내가 구현하고자 하는 기능은 버튼 클릭시 페이지가 이동된다. 그리고 이동시에 값도 같이 넘겨주도록 기능을 설계하고자 하였다. import { useNavigate } from 'react-router-dom'; con..

[Node.js] RowDataPacket의 개념 알아보기 [내부링크]

mysql과 node.js를 연결하다가 이러한 데이터 형식이 나왔다. 처음에 데이터를 추출하고자 했는데 잘 안되서, 몇번 헤매다가 데이터 추출 형식에 대해서 글로 작성해야 겠다고 생각하여 글을 적는다. 이에 대한 방법이 어려운게 아니라 배열형식으로 추출되서 다음에 할 때 또 까먹을 것 같아서 작성한다. RowDataPacket 이는 위에도 작성했듯이 mysql과 node.js를 연결하면 이러한 데이터 형식으로 도출이 된다. MySQL 데이터베이스에서 RowDataPacket로 반환해주는 듯하다. connect pool을 이용해 db와 연결하고 query문을 작성한다. query문에 맞는 데이터가 나온다. https://stackoverflow.com/questions/31221980/how-to-acce..

[Node.js] mysql과 sessions 연결 [내부링크]

HTTP Stateless Protocol http 프로토콜은 상태(state)를 유지하지 않는다. 이를 stateless protocol이라 한다. HTTP 프로토콜은 요청(request)를 전송하고 응답(response)를 전송받은 시점에서 통신이 종료되며 어떠한 상태 정보도 남지 않는다. 즉, 특정 클라이언트에서 동일 서버에 반복하여 접속하여도 각각의 접속은 독립적인 트랜잭션으로 취급된다. 따라서 로그인 화면에서 아이디, 패스워드를 입력하여 사용자 인증 과정을 거친 이후에 재차 웹사이트에 접근하면 로그인 상태임을 인식(유지)할 수 없으므로 매번 사용자 인증 과정을 반복해야 하는 문제가 발생한다. 쿠키와 세션 쿠키는 웹사이트에 접속할 때 생성되는 정보를 담은 임시 파일이다. 쿠키의 데이터 형태는 ke..

[Node.js] dotenv 접근 및 설치하기 [내부링크]

환경 변수란? 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임 [위키피디아] 우리가 컴퓨터로 하는 모든 작업들은 OS라는 프로그램에 의하여 실행되는 자식프로세스이다. 환경변수는 OS입장에서 해당 프로세스를 실행시키기 위하여 참조하는 변수이다. 어느 환경에 배포하느냐에 따라서 다르게 설정해야하는 항목은 보통 운영 체제 레벨에서 환경 변수를 통해 관리하게 된다. DB password나 API key와 같은 인증 정보는 공개된 코드 저장소에 올리면 안 되기 때문에 환경 변수로 저장해놓고 사용한다. 환경 변수 접근 내가 사용할려는 node.js에서는 dotenv를 사용하여 접근한다. Dotenv is a zero-dependency module that loads environment v..

[Node.js] Sequelize Associate 알아보기 [내부링크]

Associate와 관련해서 db를 설계를 안 해서 구글링해보다가 알게되서 쓰는 글이다. Associate Sequelize CLI를 통해 Model을 정의하고, Migration으로 스키마를 관리한다. RDBMS의 Table간의 관계를 Sequelize에서 Model간의 관계로 정의하는 것을 말한다. 모델 및 마이그레이션 생성 테이블을 두개 생성할 것이다. 유저가 있으면 이 유저가 리뷰를 할 때, 이에 대한 모델 정의와 마이그레이션을 생성하고자 한다. // 유저 sequelize model:generate --name Write_user --attributes email:string,password:string,name:string // 리뷰 sequelize model:generate --name R..

[Node.js] Sequelize Seed 구현해보기 [내부링크]

정적인 데이터를 삽입해야 되는 때가 가끔씩 존재한다. 이걸로 몇번 데이터가 직접 만들어서 넣은 수고로움을 덜고자 글을 쓰고자 한다. 진작 알았더라면 좋을 것 같다. 역시 지식이 힘이다. sequelize를 install할 때, Sequelize CLI를 같이 설치 했기 때문에 이 명령어는 따로 작성하지 않아도 된다. 그렇지만 cli를 sequlize를 설치할 때 같이 작성치 않았다면 설치를 해준다. npm i —save sequelize-cli seeder파일을 삭제했다고 하더라도 generate할 때 자동으로 파일이 생성되기 때문에 삭제해도 무관하다. Seeder 개념 seeders는 생성된 각 테이블에 기본으로 필요한 데이터나 예시 데이터를 추가할 때 사용한다. 즉, 정적인 데이터 삽입 기능이다. S..

timestamps 시간 고치기 [내부링크]

mysql을 사용하다보니 계속 오전 시간을 기준으로 db에 저장되는게 보여 현재 시간을 기준으로 저장하기 위해서 구글링하였고, 답을 얻어서 이 글을 쓰게 되었다. 모델을 생성할 때 'timestamps: true' 옵션을 주게 되면, 데이터베이스에 created_at, updated_at을 자동으로 생성해준다. db에 값을 넣어주고 created_at, updated_at은 안 넣어줘도 된다. 그래서 저장된 값들을 확인하니 표준시간이 UTC+00:00이다. 한국시간보다 9시간 전 시간을 넣어준다. 그래서 이를 고쳐주기 위하여 Sequelize를 생성하면 config파일이 자동으로 생성된다. timezone 설정 config/config.json 파일에 timezone을 아래처럼 "timezone": "+..

[Node.js] morgan을 활용해 로그관리하기 [내부링크]

: 요청과 응답에 대한 정보를 콘솔에 기록 저번에 썼던 wiston과 덧붙여서 작성한다. morganMiddleware.js const morgan = require("morgan"); const Logger = require('../config/logger'); const stream = { write: message => { Logger.http(message) } }; const skip = () => { const env = process.env.NODE_ENV || "development"; return env !== "development"; }; morgan.token("status", function (req, res) { let color ; if (res.statusCode < 300)..

[Node.js] winston을 활용해 log 관리하기 [내부링크]

log를 배포하면서 중요성을 많이 느꼈는데, 이번 node.js를 이용하면서 많이 쓰일 것 같아서 정리하고자 한다. 코드 설명 const winston = require('winston'); // -----------------------(1) require('winston-daily-rotate-file'); const logDir = `${__dirname}/logs`; const levels = { // ------------------------------------------(2) error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6 } const level = () => { // --------------------------..

[Node.js] express-validator 사용법 [내부링크]

이는 회원가입 관련하여 유효성 검사하면 많이 본 모듈이다. 나는 이걸 회원가입하면서 많이 쓰지 않았고 db에 모델 구축할 때 쓴 validate로 인하여 쓰게 되었다. express-validator 클라이언트가 서버에게 특정한 요청이나 리소스를 위해 바디로 보내는 데이터를 post 형식과 put형식등으로 보낼 때 요청이나 데이터들이 유효한지 확인하는 유효성 검사 모듈이다. 미들웨어 함수로도 사용할 수 있고, API 형태로 활용도 가능하다. validator.js를 활용해 편리하게 제작된 모듈이다. npm i --save express-validator 사용하기 전에 미리 설치해줘야 한다. 유효성 검사 방법 const { check, validationResult } = require("express-v..

[Node.js] kakao login 구현하기 [내부링크]

const express = require("express"); const router = express.Router(); const cors = require("cors"); const passport = require("passport"); const KakaoStrategy = require("passport-kakao").Strategy; const models = require("../models"); const { isLoggedIn, isNotLoggedIn } = require("../middlwares/auth"); const path = require("path"); require("dotenv").config(); router.use(passport.initialize()); rout..

[Node.js] passport로 로그인 구현하기 [내부링크]

passport 개념 Node.js 를 위한 인증 미들웨어이며, Express 기반 웹에서 유용하게 사용할 수 있다. Passport는 이름 그대로 서비스를 사용할 수 있게끔 해주는 여권 같은 역할을 하는 모듈이다. 로그인을 쉽게 할 수 있게 도와준다. strategy 종류 (로그인 인증 방식) : Local Strategy(passport-local) : 로컬 DB에서 로그인 인증 방식 Social Authentication (passport-kakao, passport-twitter 등) : 소셜 네트워크 로그인 인증 방식 Passport 설치 내가 지금 구현하고자 하는 것은 local strategy로 DB에서 로그인 인증 방식을 구현할 것이다. passport-local : 직접 구현할 때 사용 ..

[Node.js] express 미들웨어(MiddleWare) 알아보기 [내부링크]

미들웨어는 양 쪽을 연결하여 데이터를 주고 받을 수 있도록 중간에서 매개 역할을 하는 소프트웨어, 네트워크를 통해서 연결된 여러 개의 컴퓨터에 있는 많은 프로세스들에게 어떤 서비스를 사용할 수 있도록 연결해 주는 소프트웨어를 말한다. express홈페이지에 가보면 미들웨어란 미들웨어함수는 요청 오브젝트(req), 응답 오브젝트 (res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한을 갖는 함수라고 서술되어 있다. 그 다음의 미들웨어 함수는 일반적으로 next라는 이름의 변수로 표시한다고 한다. app.use() 를 통해서 미들웨어를 정의할 수 있다. 미들웨어는 본인의 함수가 끝나면 next()를 통해서 다음 함수를 호출해야 한다. 미들웨어의 특징 각 미들웨어에 정..

[Node.js] node.js에서 CRUD기능 구현하기 [내부링크]

create 기능 구현하기 파일 분리를 위해 routes 폴더를 만들고 그 안에 register.js라는 파일을 만들어 넣는다. router.post('/', (req, res, next) => { models.Users.create({ email: req.body.email, // 사용자로부터 입력 받은 email name: req.body.name, // 사용자로부터 입력 받은 name }) .then((result) => { // 회원 가입 성공 시 res.send(result); }) .catch((err) => { // 회원 가입 실패 시 res.send(err); }); }); server.js에 라우터 사용을 위해 아래와 같은 코드를 작성해서 넣어준다. app.use('/register', ..

[Node.js] Sequelize 사용하기 [내부링크]

ORM(Object-Relational Mapping)은 객체지향 패러다임을 활용하여 관계형 데이터베이스(RDB)의 데이터를 조작하게 하는 기술이다. 이를 활용하면 쿼리를 작성하지 않고도 객체의 메서드를 활용하는 것처럼 쿼리 로직을 작성할 수 있다. Node.js의 대표적인 ORM인 Sequelize이 있다. Sequelize는 MySQL, PostgreSQL, MariaDB 등 많은 RDBMS를 지원하고 Promise 기반으로 구현되었기 때문에 비동기 로직을 편리하게 작성할 수 있다. Sequelize 설치 npm i sequelize sequelize-cli mysql2 sequelize : 시퀄라이즈 사용 sequelize-cli : 시퀄라이즈 명령어를 사용 mysql2 : MySQL과 연결해주는 ..

[React] Crypto로 로그인하기 [내부링크]

비밀번호가지고 로그인 password : 로그인 인증할 때의 사용자가 입력한 비밀번호 userSalt : DB에 저장되어있는 사용자의 salt userPassword : DB에 저장되어있는 사용자의 암호화된 비밀번호(해시 값) 단방향 암호화이므로 복호화를 할 수 없다. 따라서 비밀번호 암호화했을 때의 비밀번호와 salt를 가지고 동일한 방법으로 암호화를 진행하여 나온 값과 비교한다. 이때 salt는 비밀번호를 생성했을 때의 값과 똑같은 값을 사용해야 한다. 그렇지 않으면 일치하지 않는다. 만약 일치한다면 true, 일치하지 않는다면 false를 반환하도록 한다. 최신 코드 export const verifyPassword = async (password, userSalt, userPassword) => ..

[React] Crypto로 암호화하기 [내부링크]

단방향 암호화와 양방향 암호화 crypto는 단방향 암호화 방식이고, bcrypt는 양방향 암호화 방식이다. 단방향은 암호화할 수는 있어도 복호화해서 원래의 비밀번호를 알 수 없고, 양방향은 복호화해서 원래의 비밀번호를 알 수 있다. 그러나, Bcrypt는 Blowfish 알고리즘을 사용하기 때문에 해싱이 느리고 해싱에 엄청난 비용이 든다. 만약 해커가 브루트 포스같은 공격을 해대면 서버에 엄청난 부하가 가해진다. 암호화 복호화 단방향 가능 불가능 양방향 가능 가능 해시(hash) 해시(hash) : 해시 함수에 의해 얻어지는 값 해시 함수(hash function) : 해시 알고리즘(hash algorithm)이라고도 하며, 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수 키(key) : ..

[Node.js] Connection Pool의 개념과 사용법 [내부링크]

커넥션 풀(DBCP)의 개념 웹 컨테이너(WAS)가 실행되면 데이터베이스에 연결된 Connection을 미리 만들어서 pool에 저장한다. 그 후, 클라이언트 요청이 오면 pool에서 Connection 객체를 빌려준다. 해당 객체의 임무가 완료되면 다시 Connection 객체를 반납 받아서 pool에 저장하는 프로그래밍 기법이다. 커넥션 풀 순서 사용자가 DB를 사용하기 위하여 Connection을 요청한다. Connection Pool에서 사용되지 않고 있는 Connection 객체를 제공한다. 사용자가 Connection 객체를 사용 완료하면 pool로 반환한다. 커넥션 풀(DBCP)의 장점 DB 접속 설정 객체를 미리 만들어 연결하여 메모리 상에 등록해 놓기 때문에 불필요한 작업(커넥션 생성, ..

[Node.js] mysql 기본세팅 알아보기 & cors [내부링크]

body-parser npm install body-parser --save 를 하여 body-parser를 설치하여 준다. 이를 사용하는 이유는 클라이언트 POST request data의 body로부터 파라미터를 편리하게 추출하기 위해서이다. 프론트엔드에서 form등의 값을 가져올 때 undefined error를 마주하게 된다. req.body를 사용해서 가져오게 되면, body-parser를 사용하지 않는다면 기본값으로 undefined가 설정되어 있어서 그러한 오류가 난다. (Express v4.16.0 기준)express.js도 빌트인 body parser가 되어있다. 그래서 express.json, express.urlencoded도 가능하다. const bodyParser = require..