{
    "componentChunkName": "component---src-templates-blog-js",
    "path": "/blog/page/4",
    "result": {"data":{"allMdx":{"nodes":[{"frontmatter":{"title":"[Redis] ZSet 자료구조 개요","description":"레디스에서 제공하는 Sorted Set 자료구조에 대해 정리해보겠습니다. ZSet을 활용하면 온라인 게임의 랭킹 시스템이나 투표 시스템 등을 쉽게 구현할 수 있습니다.","date":"November 21, 2023","category":"development","tags":["redis","zset","sorted-set","data-structure","database"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/9cfd558d626ab35db831f3761b03981e/12a3e/redis-zset-wide.png","srcSet":"/static/9cfd558d626ab35db831f3761b03981e/9d9e0/redis-zset-wide.png 225w,\n/static/9cfd558d626ab35db831f3761b03981e/cc174/redis-zset-wide.png 450w,\n/static/9cfd558d626ab35db831f3761b03981e/12a3e/redis-zset-wide.png 900w,\n/static/9cfd558d626ab35db831f3761b03981e/4dd11/redis-zset-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/9cfd558d626ab35db831f3761b03981e/3f003/redis-zset-wide.webp 225w,\n/static/9cfd558d626ab35db831f3761b03981e/ba134/redis-zset-wide.webp 450w,\n/static/9cfd558d626ab35db831f3761b03981e/e7f7d/redis-zset-wide.webp 900w,\n/static/9cfd558d626ab35db831f3761b03981e/fc420/redis-zset-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"redis zset image"},"id":"1bbb4e07-843a-51bd-8107-2041cbe90a74","slug":"development/redis-zset-basics/"},{"frontmatter":{"title":"[Redis] Hash 자료구조 개요","description":"레디스에서 객체를 관리하는 방법인 Hash 자료구조에 대해 간략하게 정리해보겠습니다. 레디스 공식문서와 레디스 공식 유튜브의 영상을 참고하였습니다.","date":"November 18, 2023","category":"development","tags":["redis","hash","data-structure","database"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/f76ef8db9ddb9929d22f13f3698ea756/12a3e/redis-hash-wide.png","srcSet":"/static/f76ef8db9ddb9929d22f13f3698ea756/9d9e0/redis-hash-wide.png 225w,\n/static/f76ef8db9ddb9929d22f13f3698ea756/cc174/redis-hash-wide.png 450w,\n/static/f76ef8db9ddb9929d22f13f3698ea756/12a3e/redis-hash-wide.png 900w,\n/static/f76ef8db9ddb9929d22f13f3698ea756/4dd11/redis-hash-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/f76ef8db9ddb9929d22f13f3698ea756/3f003/redis-hash-wide.webp 225w,\n/static/f76ef8db9ddb9929d22f13f3698ea756/ba134/redis-hash-wide.webp 450w,\n/static/f76ef8db9ddb9929d22f13f3698ea756/e7f7d/redis-hash-wide.webp 900w,\n/static/f76ef8db9ddb9929d22f13f3698ea756/fc420/redis-hash-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"redis hash image"},"id":"d9255480-f691-5312-a1cd-3154e71220e9","slug":"development/redis-hash-basics/"},{"frontmatter":{"title":"[Redis] Set 자료구조 개요","description":"셋과 리스트의 차이를 설명하고 레디스에서 제공하는 Set 자료구조에 대해 정리해보겠습니다. 레디스의 set을 활용하면 게시글별 좋아요 기능이나 친구 요청 기능을 쉽게 구현할 수 있습니다.","date":"November 17, 2023","category":"development","tags":["redis","set-data-structure","data-structure","database"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/7a81a91a1d3b0b0d957c2637318f1e11/12a3e/redis-set-wide.png","srcSet":"/static/7a81a91a1d3b0b0d957c2637318f1e11/9d9e0/redis-set-wide.png 225w,\n/static/7a81a91a1d3b0b0d957c2637318f1e11/cc174/redis-set-wide.png 450w,\n/static/7a81a91a1d3b0b0d957c2637318f1e11/12a3e/redis-set-wide.png 900w,\n/static/7a81a91a1d3b0b0d957c2637318f1e11/4dd11/redis-set-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/7a81a91a1d3b0b0d957c2637318f1e11/3f003/redis-set-wide.webp 225w,\n/static/7a81a91a1d3b0b0d957c2637318f1e11/ba134/redis-set-wide.webp 450w,\n/static/7a81a91a1d3b0b0d957c2637318f1e11/e7f7d/redis-set-wide.webp 900w,\n/static/7a81a91a1d3b0b0d957c2637318f1e11/fc420/redis-set-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"redis set image"},"id":"c3c429cb-e401-58de-bd6e-8bf0f6ff32df","slug":"development/redis-set-basics/"},{"frontmatter":{"title":"[Spring] @ControllerAdvice로 에러 처리하기","description":"HTTP 상태코드 400, 401, 403, 404, 500에 대해 설명하고, HTTP API를 구현할 때 @ControllerAdvice와 @ExceptionHandler 어노테이션으로 에러를 처리하는 방법에 대해 정리합니다.","date":"November 12, 2023","category":"development","tags":["spring","controller-advice","exception-handler","error","http","authentication","authorization"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/69762aa78037912560b08415926e4da8/12a3e/spring-exception-handling-wide.png","srcSet":"/static/69762aa78037912560b08415926e4da8/9d9e0/spring-exception-handling-wide.png 225w,\n/static/69762aa78037912560b08415926e4da8/cc174/spring-exception-handling-wide.png 450w,\n/static/69762aa78037912560b08415926e4da8/12a3e/spring-exception-handling-wide.png 900w,\n/static/69762aa78037912560b08415926e4da8/4dd11/spring-exception-handling-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/69762aa78037912560b08415926e4da8/3f003/spring-exception-handling-wide.webp 225w,\n/static/69762aa78037912560b08415926e4da8/ba134/spring-exception-handling-wide.webp 450w,\n/static/69762aa78037912560b08415926e4da8/e7f7d/spring-exception-handling-wide.webp 900w,\n/static/69762aa78037912560b08415926e4da8/fc420/spring-exception-handling-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"spring exception handling image"},"id":"0c91709e-99c3-5883-b652-50a39ed21d8b","slug":"development/spring-exception-handling-with-controlleradvice/"},{"frontmatter":{"title":"[Bash] 10초만에 파일 수백 개 대조하기","description":"휴먼 에러 방지를 위해 파일 수백 개를 대조하는 작업을 자동화하였습니다. bash, makefile, 깃헙 액션을 어떻게 활용했는지 튜토리얼 형식으로 정리해보았습니다.","date":"October 20, 2023","category":"development","tags":["bash","makefile","github-action","set","shopt","associative-array"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/12fc592e3920c9a3e3e0d01ad0f2c4f5/12a3e/compare-files-with-bash-wide.png","srcSet":"/static/12fc592e3920c9a3e3e0d01ad0f2c4f5/9d9e0/compare-files-with-bash-wide.png 225w,\n/static/12fc592e3920c9a3e3e0d01ad0f2c4f5/cc174/compare-files-with-bash-wide.png 450w,\n/static/12fc592e3920c9a3e3e0d01ad0f2c4f5/12a3e/compare-files-with-bash-wide.png 900w,\n/static/12fc592e3920c9a3e3e0d01ad0f2c4f5/4dd11/compare-files-with-bash-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/12fc592e3920c9a3e3e0d01ad0f2c4f5/3f003/compare-files-with-bash-wide.webp 225w,\n/static/12fc592e3920c9a3e3e0d01ad0f2c4f5/ba134/compare-files-with-bash-wide.webp 450w,\n/static/12fc592e3920c9a3e3e0d01ad0f2c4f5/e7f7d/compare-files-with-bash-wide.webp 900w,\n/static/12fc592e3920c9a3e3e0d01ad0f2c4f5/fc420/compare-files-with-bash-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"compare files with bash image"},"id":"fa7c548f-497c-574e-ae3d-fcfa1ed4f5d1","slug":"development/bash-compare-files/"},{"frontmatter":{"title":"[OS] 멀티쓰레딩 모델","description":"유저 쓰레드와 OS 쓰레드 간의 관계가 Many-to-One, One-to-One, Many-to-Many일 때 각각 어떠한 차이를 지니는지 압축적으로 정리합니다. 고루틴, 코루틴, 쓰레드풀, 자바의 가상 쓰레드 등의 아키텍처를 이해하는 데 필요한 배경지식을 다룹니다.","date":"October 15, 2023","category":"computer-science","tags":["operating-system","thread","thread-pool","multi-threading","concurrency","java","virtual-thread","go","goroutine"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/9a9ee4c1b7551795a6ccd83fdf99b36f/12a3e/multi-threading-models-wide.png","srcSet":"/static/9a9ee4c1b7551795a6ccd83fdf99b36f/9d9e0/multi-threading-models-wide.png 225w,\n/static/9a9ee4c1b7551795a6ccd83fdf99b36f/cc174/multi-threading-models-wide.png 450w,\n/static/9a9ee4c1b7551795a6ccd83fdf99b36f/12a3e/multi-threading-models-wide.png 900w,\n/static/9a9ee4c1b7551795a6ccd83fdf99b36f/4dd11/multi-threading-models-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/9a9ee4c1b7551795a6ccd83fdf99b36f/3f003/multi-threading-models-wide.webp 225w,\n/static/9a9ee4c1b7551795a6ccd83fdf99b36f/ba134/multi-threading-models-wide.webp 450w,\n/static/9a9ee4c1b7551795a6ccd83fdf99b36f/e7f7d/multi-threading-models-wide.webp 900w,\n/static/9a9ee4c1b7551795a6ccd83fdf99b36f/fc420/multi-threading-models-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"multi threading models image"},"id":"698eb25a-2091-5276-b13d-cb2378ba7232","slug":"computer-science/multi-threading-models/"},{"frontmatter":{"title":"[OS] 쓰레드의 종류","description":"하드웨어, OS 커널, 유저 레벨에서의 쓰레드들이 서로 어떻게 다른지 가볍게 정리합니다.","date":"October 14, 2023","category":"computer-science","tags":["operating-system","thread"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/c82337dd4e60e45728ec82ca7c7a5089/12a3e/thread-types-wide.png","srcSet":"/static/c82337dd4e60e45728ec82ca7c7a5089/9d9e0/thread-types-wide.png 225w,\n/static/c82337dd4e60e45728ec82ca7c7a5089/cc174/thread-types-wide.png 450w,\n/static/c82337dd4e60e45728ec82ca7c7a5089/12a3e/thread-types-wide.png 900w,\n/static/c82337dd4e60e45728ec82ca7c7a5089/4dd11/thread-types-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/c82337dd4e60e45728ec82ca7c7a5089/3f003/thread-types-wide.webp 225w,\n/static/c82337dd4e60e45728ec82ca7c7a5089/ba134/thread-types-wide.webp 450w,\n/static/c82337dd4e60e45728ec82ca7c7a5089/e7f7d/thread-types-wide.webp 900w,\n/static/c82337dd4e60e45728ec82ca7c7a5089/fc420/thread-types-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"thread types image"},"id":"b8c257fb-11d7-5599-ba19-a3bf71f4535b","slug":"computer-science/thread-types/"},{"frontmatter":{"title":"서킷 브레이커 패턴의 필요성과 구조","description":"재시도 패턴과 연쇄적 실패 문제를 토대로 서킷 브레이커 패턴의 필요성에 대해 설명하고, 서킷 브레이커의 기본 구조에 대해 간략히 정리하겠습니다.","date":"October 12, 2023","category":"computer-science","tags":["circuit-breaker","finite-state-machine","retry-pattern","cascade-failure","design-pattern"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/ffb8725258230949a365619c88539c44/12a3e/circuit-breaker-pattern-wide.png","srcSet":"/static/ffb8725258230949a365619c88539c44/9d9e0/circuit-breaker-pattern-wide.png 225w,\n/static/ffb8725258230949a365619c88539c44/cc174/circuit-breaker-pattern-wide.png 450w,\n/static/ffb8725258230949a365619c88539c44/12a3e/circuit-breaker-pattern-wide.png 900w,\n/static/ffb8725258230949a365619c88539c44/4dd11/circuit-breaker-pattern-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/ffb8725258230949a365619c88539c44/3f003/circuit-breaker-pattern-wide.webp 225w,\n/static/ffb8725258230949a365619c88539c44/ba134/circuit-breaker-pattern-wide.webp 450w,\n/static/ffb8725258230949a365619c88539c44/e7f7d/circuit-breaker-pattern-wide.webp 900w,\n/static/ffb8725258230949a365619c88539c44/fc420/circuit-breaker-pattern-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"circuit breaker pattern image"},"id":"5b9f3852-5d55-57f0-875f-b4dd1294d52b","slug":"computer-science/circuit-breaker-pattern/"},{"frontmatter":{"title":"[Couchbase] CAS 기반 낙관적 락킹","description":"낙관적 락킹과 비관적 락킹에 대해 정리하고, 카우치베이스에서 제공하는 CAS 기반 낙관적 락킹에 대해 실습 코드와 함께 정리해봅니다.","date":"October 10, 2023","category":"computer-science","tags":["couchbase","cas","concurrency-control","optimistic-lock","database"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/7d22098201c7fadb5d72fb1391a883dd/12a3e/optimistic-locking-with-cas-wide.png","srcSet":"/static/7d22098201c7fadb5d72fb1391a883dd/9d9e0/optimistic-locking-with-cas-wide.png 225w,\n/static/7d22098201c7fadb5d72fb1391a883dd/cc174/optimistic-locking-with-cas-wide.png 450w,\n/static/7d22098201c7fadb5d72fb1391a883dd/12a3e/optimistic-locking-with-cas-wide.png 900w,\n/static/7d22098201c7fadb5d72fb1391a883dd/4dd11/optimistic-locking-with-cas-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/7d22098201c7fadb5d72fb1391a883dd/3f003/optimistic-locking-with-cas-wide.webp 225w,\n/static/7d22098201c7fadb5d72fb1391a883dd/ba134/optimistic-locking-with-cas-wide.webp 450w,\n/static/7d22098201c7fadb5d72fb1391a883dd/e7f7d/optimistic-locking-with-cas-wide.webp 900w,\n/static/7d22098201c7fadb5d72fb1391a883dd/fc420/optimistic-locking-with-cas-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"optimistic locking with cas image"},"id":"a135440e-2f93-5edb-8f52-89f95537ee6c","slug":"computer-science/optimistic-locking-with-cas/"},{"frontmatter":{"title":"[Couchbase] 도커 컨테이너 기반 환경 셋업","description":"실습 및 테스트 환경 셋업을 위해 카우치베이스 서버 구동, 클러스터 및 버켓 생성 작업을 자동화시켜주는 Dockerfile 및 배쉬 스크립트를 정리하였습니다. 배쉬 스크립트에서는 쉘옵션 설정 및 작업 제어(job control) 등의 기능을 활용하였습니다.","date":"October 9, 2023","category":"development","tags":["couchbase","setup","docker","bash","set","job-control","database"],"hero_image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#f8f8f8","images":{"fallback":{"src":"/static/cbdf6ceb6a55582045b41036741f6eec/12a3e/couchbase-setup-with-docker-wide.png","srcSet":"/static/cbdf6ceb6a55582045b41036741f6eec/9d9e0/couchbase-setup-with-docker-wide.png 225w,\n/static/cbdf6ceb6a55582045b41036741f6eec/cc174/couchbase-setup-with-docker-wide.png 450w,\n/static/cbdf6ceb6a55582045b41036741f6eec/12a3e/couchbase-setup-with-docker-wide.png 900w,\n/static/cbdf6ceb6a55582045b41036741f6eec/4dd11/couchbase-setup-with-docker-wide.png 1800w","sizes":"(min-width: 900px) 900px, 100vw"},"sources":[{"srcSet":"/static/cbdf6ceb6a55582045b41036741f6eec/3f003/couchbase-setup-with-docker-wide.webp 225w,\n/static/cbdf6ceb6a55582045b41036741f6eec/ba134/couchbase-setup-with-docker-wide.webp 450w,\n/static/cbdf6ceb6a55582045b41036741f6eec/e7f7d/couchbase-setup-with-docker-wide.webp 900w,\n/static/cbdf6ceb6a55582045b41036741f6eec/fc420/couchbase-setup-with-docker-wide.webp 1800w","type":"image/webp","sizes":"(min-width: 900px) 900px, 100vw"}]},"width":900,"height":450}}},"hero_image_alt":"couchbase setup with docker image"},"id":"1f242f2a-cfcf-5d06-b263-39f959ac71c8","slug":"development/couchbase-setup-dockerfile/"}],"pageInfo":{"currentPage":4,"hasNextPage":true,"hasPreviousPage":true,"pageCount":9,"totalCount":86}}},"pageContext":{"skip":30}},
    "staticQueryHashes": ["1903006949","272758454"]}