프로그래밍 381

[Next.js] 개발 모드에서 useEffect가 두 번 호출될때

yarn dev로 development 모드에서 개발 중일때 useEffect 내의 코드가 두 번 호출된다. hydration 이후에 업데이트를 하므로 2번 호출되는 것은 정상적인 동작이지만, 이러한 behavior를 원하지 않을 때가 있다. 그럴경우 next.config.js에서 reactStrictMode를 false로 바꾸어주면 된다. /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: false, } module.exports = nextConfig 관련해서 더 많은 정보를 얻고싶다면, github 이슈를 참고하면된다.

[Next.js] process.env가 undefined로 나올때

환경변수를 프론트에서 사용하려 했을때 .env.*에 선언되어있음에도 불구하고 undefined로 나올 것이다. 다음과 같이 환경변수가 선언되어있다고 가정하면, MY_NAME="lou" Next.js Version 9.4 이상 Next.js 버전이 9.4+ 인경우, 환경변수 이름에 NEXT_PUBLIC_을 프리픽스(prefix) 붙여주면 사용가능해진다. 따라서, MY_NAME 환경 변수명을 NEXT_PUBLIC_MY_NAME으로 바꾸어준다면 해결된다. Next.js Version 9.4 미만 그렇지 않을 경우 next.confg.js에 사용할 환경변수를 설정해주어야한다. module.exports = { env: { MY_NAME: process.env.MY_NAME, }, }

Docker에서 shellscript crontab으로 돌리기

docker container내의 crontab에서 scripts/batch.sh를 실행시키고자 한다. 5분마다 실행을하고, 필요한 환경변수를 crontab 작업에 등록시켜준다. SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin TZ=Asia/Seoul */5 * * * * /batch/scripts/batch.sh 2>&1 | tee -a /proc/1/fd/1 /batch/logs/batch.cron.log # SHELL=/bin/bash 등록된 작업을 실행시킬 쉘을 직접 지정한다. 기본값은 /bin/sh이다. # PATH=/user/local/sbin... 쉘에서 쓰는 환경변수와 crontab에서 사용하..

Youtube 자동완성 연관 검색어를 가져오는 방법

다음 2개의 API들을 사용하면 유튜브의 연관 검색어를 쉽게 얻어올 수 있다. 둘 다 뭐 비슷하니 편한 걸로 쓰면될듯! Google API 예시로 지금 재밌게 즐기고있는 디아블로를 넣어보았다. Endpoint /complete/search Request method GET http://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q=디아블로&hl=ko Query parameters 이름 설명 옵션 client / output 브라우저 json결과를 얻으려면 firefox xml 결과를 얻으려면 toolbar q 쿼리 키워드 q=디아블로 jsonp JSONP 콜백 함수 설정 자신의 JSONP 콜백함수명 ds 서비스 제한, 없을 경우 구글 ..

2 > &1의 진짜 뜻

# stdin, stdout, stderr "2>&1"를 알아보기전에 이들이 무엇인지 먼저 알아보아야한다. 표준입력(stdin), 표준출력(stdout), 표준에러(stderr)는 unix 커맨드를 실행할때 생성되는 3가지 데이터 스트림(data stream)이다. 스트림은 데이터를 전송할 수 있는 어떤 것인데, 여기서 세 데이터 스트림이 전송하는 데이터는 텍스트(text)다. # File Descriptor 알다시피, unix의 모든 것은 파일이다. 위 표준입/출력/에러 3가지도 unix에겐 파일인데, 프로세스가 열려있는 파일들을 관리하고 이 파일들에 접근하도록 하기 위해서 파일 디스크립터(File Descriptor)라는 추상 개념을 이용하게된다. 이름은 숫자가 아닐것처럼 생겼지만, 파일 디스크립터는..

CLI로 Python 실행시 No module named 오류 해결방법

# ModuleNotFoundError PyCharm같은 통합개발환경(IDE)에서 편하게 개발할때는 이슈가 없었는데, VS code로 docker에 띄울 배치 스크립트를 개발하던 중 문제가 생겼다. 가상환경(Virtual Environment)을 구성하여 활성화시키고, 실행시켰는데 모듈을 찾을 수 없다는 것이다. python .\my_game\batch1.py Traceback (most recent call last): File "C:\Users\ASUS\PycharmProjects\RankingServer\batch\my_game\batch1.py", line 6, in from libs.task.TaskManager import TaskManager ModuleNotFoundError: No mod..

[Docker] swarm을 알아보자

What is a swarm? Swarm은 여러 swarm mode로 동작하는 Docker 호스트들로 구성되어있다. 그들의 역할은 크게 매니저(manager)와 워커(worker)로 구분되는데, 두 가지 역할을 모두 수행하도록 할 수도 있다. 이들은 swarm에서 각각의 노드(node)가된다. 서비스(service)를 만들때 이 태스크(task)을 수행하려면 어떤 정도의 레플리카의 개수나 네트워크나 저장소 자원등을 필요로 하는지 기술하게 되는데, 이에 따라 태스크를 수행중인 어떤 노드가 망가진다면 서비스 수행이 가능한 다른 노드가 이 일을 맡게 된다. 이렇듯 Docker swarm은 클러스터링과 오케스트레이션을 쉽게 도와준다. Nodes 노드는 swarm에 참여하고 있는 Docker engine이다. 하..

[MongoDB] upsert시 E11000 duplicate key error 해결

unique index가 걸린 컬렉션에 bulkWrite를 통해서 upsert를 하고 있었는데, E11000 duplicate key error가 떴다. 내가 작성한 코드는 다음과 같았는데, 주목해보면 filter 부분에 내가 집어넣으려는 모든 데이터가 들어있다. tasks.append(UpdateOne(item, {"$set": item}, upsert=True)) Upsert는 다음과 같은 3개의 스텝으로 이루어진다. 1. filter에 따라 식별되는 도큐먼트를 찾는다. 2. 도큐먼트가 존재하면, 해당 도큐먼트를 atomic하게 업데이트한다. 3. 존재하지 않는다면, atomic하게 도큐먼트를 삽입한다. 나는 filter를 제대로 설정하지 않았다. filter에는 중복값을 식별할 수 있을만한 최소의 ..