목록전체 글 (385)
만족
서비스 장애 발생 시 빠른 인지를 위해 일정 시간마다 서버 상태를 체크하기 위한 스크립트를 작성하고이것을 AWS lightsail에서 가장 저렴한 인스턴스에 올려 cron으로 동작시키고 있다. https://satisfactoryplace.tistory.com/403 [사이퍼즈 서포터] 헬스체크 정책 추가얼마 전부터, 불명의 원인으로 서버의 CPU수치가 100%로 치솟으면서 내려오지 않아 서버가 요청을 전혀 처리하지 못하는 현상이 발생하고 있다. 특정 프로세스, 특정 시간이나 특정 주기로 발현되satisfactoryplace.tistory.com 그런데 아무리 저렴한 인스턴스라지만, 실제로는 5분에 한 번 서버 상태를 체크하는 기능 외 아무것도 하는 일이 없는데instance 하나를 할당해서 헬스체크만 ..
2024년 5월 1일자로 라이트세일 가격이 인상되었다. https://library.gabia.com/contents/aws-contents/13171/ 가비아 라이브러리IT 콘텐츠 허브library.gabia.com 엄청나게 인상된 것은 아니지만, 하위 라인업(5~20달러) 인스턴스를 사용하고 있다면 인상폭이 부담스러울 수 있다. 구체적으로 어떻게 오른걸까?정확히는 ipv4, ipv6를 모두 사용할 수 있는 듀얼스택 인스턴스만 가격이 인상되었다. 만약 ipv4가 필요하지 않다면, ipv6 only를 사용하여 인상 전 가격으로 이용할 수 있다. ipv4의 경우 우리가 익히 알고 있는 ip의 형태(ex: 123.123.123.123)를 가지고 있고,ipv6는 비교적 난해한 2416:de12:1ab:9..
프로젝트 루트에 .github/workflows 폴더 안에 yml 파일을 추가하여 github action을 추가할 수 있다. github action을 이용해 특정 브랜치에 푸쉬가 발생했을 때 작업을 정의하는 등 자동화에 이용할 수 있다. croncron은 특정 시간마다 지정한 스크립트를 실행하는 기능이다. 이 기능을 이용해 5분마다 헬스체크를 하는 작업을 생성해볼 것이다. # .github/workflows/health-check.ymlname: health-check# 어떤 작업을 진행할지?on: schedule: - cron: "*/5 * * * *"# ... 이렇게 선언함으로써 매 5분마다 이 action이 실행되도록 할 수 있다. cron 문법은 리눅스에서 crontab과 동일하다. h..
생성된지 24시간 이내라면 저장된 파일을 사용하고, 캐시가 존재하지 않거나 24시간을 초과했다면 파일을 overwrite 하는 식으로 이미지 캐시를 운영하고 있다. 그런데 뒤늦게 캐시가 정상적으로 작동하지 않았다는걸 알았다. birthtime과 mtimebirthtime은 파일의 최초 생성 시간을 의미한다.mtime은 파일의 마지막 업데이트(modified) 시간을 의미한다. 이미 존재하는 파일에 append모드로 파일을 '쓰기'하면birthtime은 변경되지 않지만 mtime은 현재 시간으로 업데이트된다 overwrite file?그렇다면 파일을 overwrite 하면 어떻게 될까? 파일 내용을 완전히 대체하는 작업이기에 내 생각에는 birthtime이 변경된다고 생각했다. 하지만 write 모드로 o..
const str= '😅';console.log(str.length); 위 코드를 실행하면 콘솔에는 어떻게 표시될까? '1글자니까 1이겠지' 라고 생각할 수 있지만 2가 표시된다. 왜 이렇게 표시되는지 알아보자 써로게이트 페어 (surrogate pair) 기본적으로 js에서 string은 UTF-16으로 다뤄진다. UTF-16은 문자를 표현할 때 2바이트 또는 4바이트를 가변적으로 사용한다. 한국어 문자(가, 나, 다...)는 2바이트로 표현이 가능하지만일부 한자나 이모지 등은 2바이트로 표현이 불가능해 2바이트를 더 사용해야 한다, 따라서 기본적으로는 2바이트를 사용하되, 2바이트로 표현 가능한 범위 바깥의 문자열들은 2바이트를 더 사용하여 표현한다. 두 글자만큼의 공간을 한 글자를 표현하는데 사..
지난번에 독거미 키보드를 구매해서 산 이후로 사무실에서 쓸 커스텀 키보드를 하나 더 마련하고 싶어서 알아보다가닌자87 하우징을 저렴하게 판매하고 있길래 하나 구매했다. https://smartstore.naver.com/monstarkorea/products/4766961551?NaPm=ct%3Dlx4pnsu7%7Cci%3Dcheckout%7Ctr%3Dppc%7Ctrx%3Dnull%7Chk%3D78b40d7009bde36d59bd8fafc7d603465f52e8be 닌자87 v2 RGB DIY키트 핫스왑 기계식키보드 커스텀키보드 : 몬스타기어#닌자87 #커스텀키보드 #축교체 #기계식키보드 #데빌스킬 #닌자키보드 #측각키캡 #조립식키보드 #아크릴키보드 #닌자87RGBsmartstore.naver.com 판..
tsc 로 컴파일할때 항상 ts 파일만 컴파일하지는 않는다. ts + js 가 섞인 프로젝트에서 allowJS 옵션을 통해 js 파일도 tsc input으로 사용될 수 있다. 그러나 이렇게 js 를 tsc 인풋으로 사용할 때는 일부 오류들이 표시되지 않아 문제를 인식할 수 없다. 그 중 얼마 전 발견한 하나의 케이스를 소개한다. iterator + for-of iterator는 iterable(반복 가능) 한 객체로 Array, Map 도 iterable 객체다. iterable 객체는 for-of 를 이용해 순회 가능하다. for (const str of ['1', '2']){ console.log(str);} 이런식으로 of 뒤에 iterable 객체를 두고, of 앞의 변수에 할당하여 반복한다...
가성비 키보드로 유명한 AULA F87 PRO, 일명 독거미 키보드를 구매했다. 쿠팡같은 국내 쇼핑몰에서 해외직구 대행으로 판매하기도 하지만,직접 직구하는 것 보다 2만원 이상 비싸기도 하고 배송기간은 훨씬 길었기 때문에 직접 직구했다. 물론 국내정발판도 있지만 재고가 들어오자마자 나가는 수준이라 포기했다. Qoo10에서 해외직구 https://plus.wish.com/gmkt.inc/Goods/Goods.aspx?goodscode=925066902 구매시점(2024.05.07)에 가장 저렴한 Qoo10 에서 해외직구를 진행했고약 44000원에 구매했다. 요즘 늘어나는 해외직구 때문에 세관이 바쁘다더니 세관 통과까지 꽤나 시간이 걸렸다. 타임라인을 정리하면 다음과 같다. 05.07 구매05.12 판매자..
https://startatage30.tistory.com/12 [MongoDB] 우분투(ubuntu 20.04)에 (몽고디비)mongodb 설치 1. wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - 2. echo "deb [ arch=amd64, arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list 3. sudo ap startatage30.tistory.com
웹 어플리케이션에서 데이터 패칭, 캐싱, 서버 상태와 동기화 및 업데이트(fetching, caching, synchronizing and updating server state)를 쉽게 만들어주는 library 이 포스트에서는 react-query의 기초적인 개념 몇 가지에 대해 다룬다. Installation yarn add @tanstack/react-query eslint와 함께 사용하는 것을 추천, 세팅은 아래 링크 참조 https://tanstack.com/query/latest/docs/eslint/eslint-plugin-query ESLint Plugin Query | TanStack Query Docs tanstack.com Quick Start: queryClient https://t..
const normalDoc = await MyModel.findOne(); mongoose를 이용하여 쿼리할 때 위와 같은 형태로 쿼리한다. https://mongoosejs.com/docs/index.html mongoose 의 quick start에서도 위와 같이 소개하고 있어 계속 이렇게 사용해왔지만, 클러스터링까지 사용하게 되면서 cpu, memory 사용량이 증가하여 조치를 취해야만 한다. 쿼리 시 어떤 데이터를 반환하는가? const normalDoc = await MyModel.findOne(); 이 코드를 사용했을 때 normalDoc에는 어떤 데이터가 할당될까? util.inspect와 console.log를 이용해 normalDoc을 찍어보면 { _id: 659bc8cc415b117a..
얼마 전부터, 불명의 원인으로 서버의 CPU수치가 100%로 치솟으면서 내려오지 않아 서버가 요청을 전혀 처리하지 못하는 현상이 발생하고 있다. 특정 프로세스, 특정 시간이나 특정 주기로 발현되는 증상도 아니고, 어쩔 땐 하루에 두번이나 저랬다가 또 어쩔 땐 몇주동안 발생하지 않는다. 아직 원인을 찾지 못해서 장애를 인지하면 문제가 되는 프로세스를 재시작하고 있다. 현재 서버 내 서비스 구조를 간단히 요약하면 위와 같다. 백엔드 프레임워크들끼리도 특정 기능을 의존하고 있고, DB는 거의 모든 api에서 사용하고 있기 때문에 이들 중 하나만 장애가 발생하더라도 연쇄적으로 장애가 발생한다. 장애가 발생할 경우 빠른 인지, 수정, 복구가 가능해야 하는데, 이 상황에서 가장 중요한 것은 '빠른 인지'기 때문에 ..
2023년 9월 18일 새벽 2시경부터 ssh 접속이 불가능한 문제가 발생했다. OS 업데이트 중 실패하여 발생한 문제로 파악하고, 매일 0시에 스냅샷을 백업하게 설정해 두었기 때문에 크게 생각하지 않고 복구 작업에 들어갔다. 그러나 17일, 16일... 12일까지 저장된 모든 스냅샷을 이용해 새 인스턴스를 만들었지만 전부 ssh 접속이 불가능했다. 문제는 ssh 접속뿐만 아니라 대부분의 서비스(apache, mysql 등)이 동작하지 않고 있었다. 부팅 자체가 실패했는가? 에 대해서는 서버 모니터링 시스템에선 정상적으로 트래픽이 들어오고 있었기 떄문에 부팅은 성공했지만 일부 서비스 구성에 실패한 것으로 보인다. 서버 복구를 위해 어떤 일들을 했는지 정리해보고 같은 문제를 겪고 있는 사람들에게 도움이 되..
웹 배포 후 정상적으로 작동하는지 확인해보기 위해 직접 몇몇 url들로 들어가, 정상적으로 웹사이트가 동작하는지 확인하고는 한다. 그러나 매 배포마다 모든 페이지를 확인하기는 번거로우며, 그렇다고 테스트 코드를 빡빡하게 작성하기에는 부담스럽다. cypress를 사용하면 이 작업을 간단히 자동화할 수 있다. 가령 특정 url로 접근하기만 해도 웹사이트가 터져버리는데 미처 확인하지 못해 한참 뒤에나 알아차린 경험이 있다면 아주 간단한 cypress test를 적용하는 것 만으로도 그런 상황을 막을 수 있을 것이다. 샘플 프로젝트 세팅 # 리액트 프로젝트 생성 npx create-react-app simple-cypress-with-react cra로 리액트 프로젝트를 생성해준다. yarn add react-..
아파치 설정 튜닝 후, 동시 연결을 테스트할 때 발생했다. 한 번에 열 수 있는 파일 갯수에 대한 제한이 있는데, 이것을 늘려 주면 해결된다. ulimit -n 현재 설정된 동시 오픈 수 확인 (1024로 확인됨) ulimit -n 4096 뒤에 원하는 동시 오픈 제한 수를 입력해주면 늘릴 수 있다.
어느 순간부터 AWS lightsail의 기본 CPU core 사양이 2core 로 변경되었다. 분명 20달러부터 2코어였는데, 아무도 모르게 2core로 변경되었다. 문제는 기존 플랜을 사용하던 사용자의 사양은 자동으로 변경되지 않았다는 것인데... CPU가 더 낮은 사양으로 변경되고 코어를 하나 추가해 준 것인지, 아니면 동일한 CPU에 그냥 코어를 하나 덤으로 추가해 준 것인지에 대한 정보는 알 수가 없어 직접 확인해 보았다. 기존 플랜과 신규 플랜의 CPU cat /proc/cpuinfo | grep 'name'| uniq 위 명령어로 CPU 모델 정보를 가져올 수 있다. 기존 플랜의 CPU는 Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz 이고, 신규 플랜의 CPU는 ..
yarn classic yarn classic(v1) 과 npm에서 의존성을 추가하면 node_modules 에 설치된다. 새로운 프로젝트를 생성하고, yarn init 으로 초기화한 후 yarn add react 를 이용해 react 의존성을 추가하면 node_modules에 react 패키지가 추가된 모습을 볼 수 있다. 그런데 분명 추가한 것은 react 하나뿐이지만, js-tokens 와 loose-envify 패키지도 존재하는 것을 확인할 수 있다. node_modules/react/package.json의 dependencies를 살펴보면 loose-envify를 사용하고 있고, node_modules/loose-envify/package.json의 dependencies를 살펴보면 js-to..
음식점/카페업종 부가가치세 신고를 도와주면서 많은 도움이 되었던 영상이다. 아래 영상을 보면서 차근차근 따라하면 쉽게 신고를 마칠 수 있다. https://www.youtube.com/watch?v=kyPQGtt_u00&ab_channel=%EC%84%B1%EC%8B%A4%ED%95%9C%ED%8B%B0%EB%B9%84 빠진 내용이 있어 몇 가지만 첨언하고자 한다 1. 현금매출(현금영수증, 세금계산서를 발행하지 않은 건)은 직접 입력해 주어야 한다. -> 물론 증빙이 없으니 국세청에서 100% 잡지는 못하겠지만... 괜히 걸리면 피곤해진다. 2. 매입 전자세금계산서를 발급받은 신용카드 매입분은 제외시켜야 한다. -> 사업용 신용카드 등록을 하면 어떻게 되는지는 모르겠지만, 이번에는 등록하지 않아서 직접 ..
기본스킨에 약간 수정한 스킨을 3년정도 썼는데, 질려서 새로운 스킨을 찾아봤다. 그 중, hELLO 라는 스킨이 예뻐보여서 적용해봤다. https://pronist.dev/5 hELLO 티스토리 스킨을 소개합니다. hELLO 스킨은 본래 기능의 많이 없었다가, 티스토리 블로거 여러분의 호응에 힘입어 기능의 추가와 함께 업데이트를 여러 번 하게 되었습니다. hELLO 1.0 때와 비교하면 비교할 수도 없을 만큼의 기 pronist.dev 외부 스킨 추가 방법 관리자 메뉴로 들어가서, 스킨 변경-> 스킨 등록 버튼을 클릭한다. hELLO 스킨 기준으로 설명하자면, 스킨을 다운받고 압축 파일이라면 해제한다. 그리고, 해당 폴더 안에 있는 모든 파일을 선택해서 추가한다. hELLO의 경우 스킨 폴더 내에 파일들..
https://twojobschool.co.kr/871 애드센스 종합소득세 신고 방법(직장인 투잡) 오늘은 애드센스 수익의 종합소득세 신고 방법과 유의사항에 대해 알아보겠습니다. 5월은 종합소득세 신고/납부의 달입니다. 티스토리나 워드프레스 블로그를 운영하시거나, 유튜브 크리에이 twojobschool.co.kr 종합소득세 신고의 달이 다가왔다... 위 링크를 참고해서 진행하면 된다. 참고했던 링크 중에서 가장 잘 설명한 포스트라고 생각한다. 요약 및 추가내용 Q. 애드센스(애드몹) 수익은 사업소득? 기타소득? A. 일시적으로 발생하는 수익(복권 당첨 등)은 기타소득, 꾸준히 발생하는 소득은 사업소득이다. 따라서, 사업소득으로 신고한다. 직장을 다니고 있다면 사업소득, 근로소득 두 가지로 신고하면 된다...