Redisson 분산락
·
프로젝트/개발
들어가며 학부 시절 마인크래프트 서버 포럼을 개발해 보면서 각 서버별 인원수 체크를 위한 검사를 위해 크론잡을 수행한 경험이 있다. 당시 개발 경험을 위해 클러스터링 환경으로 구성했는데, 문제는 배치가 수행되면서 모든 서버가 일괄적으로 크론이 실행되는 문제가 있었다. 너무 당연하지만, 당시 하나의 서버만 구성해 운영하는 것을 생각하던 버릇이 있던 나에겐 꽤 신선한 충격이었다. 당시엔 레디스의 클러스터링 환경 분산락 구현체인 RedLock으로 문제를 해결했는데, 조금 많이 과하기도 하고, RedLock 알고리즘의 경우 각 레디스가 위치한 서버 간에 시간 동기화와 락 획득에 실패한 경우 실패한 클라이언트는 획득한 부분 락을 모두 푸는 작업을 요청하는 등 매우 특별한 상황에서 문제를 해결하는 알고리듬인 것을 ..
동시성 이슈 없는 조회수⏳ 기능 개발 고민
·
프로젝트/개발
조회수는 많은 서비스에서 이용되며 사용자의 콘텐츠 선택에 많은 도움을 주는 요소 중 하나이다. 하지만 단순한 기능이라도 복잡한 요구사항이 추가된다면 재미난 기능을 만들 수 있다. 조회 시 증가 구현 가장 간단하게 구현하는 방법은 게시글 상세 조회 시 대상 데이터에 조회수를 의미하는 컬럼 데이터를 1 증가하는 것이다. 예를 JPA를 사용한다면 다음과 같이 구현할 수 있다. final Post post = repository.findById(1L); post.increaseViewCount(); 문제 트랜잭션이 종료되면 변경 감지에 의해 변경 내용이 DB에 반영되는 구조로 흔히 구현할 수 있다. 하지만 조회수가 서비스에 중요한 요소라 누락이 되면 안 되는 경우, 이 구현은 예상하지 못한 동작을 할 수 있다..
I am메모리에요~ 🤗
·
프로젝트/개발
백수가 주말에 장애대응을 할 수 있다? 여느 날과 같이 구직에 쫓기며 폭풍 개발을 하던 와중에 홈랩 서버가 갑자기 이륙을 하기 시작했다. 무슨 상황인지 싶어 모니터링 도구를 보니 메모리가 매우 화나있었다. 일단 평소 1Gb RAM으로 충분히 동작하고 있어서, 단순히 "팀원이 빌드 실행하셨나 보다.." 정도로 생각하고 신경을 안 쓰다가 시간이 지나도 계속된 엔진 소음으로 문제를 확인하니 이상한 점이 있었다. 첫 번째로 갑자기 높아진 메모리 사용량이다. 처음엔 단순히 빌드 작업 중이시구나 생각했지만, 빌드를 하는거면 메모리보단 CPU가 더 높아야 하는데 CPU는 굉장히 잔잔했다. 왼쪽이 문제 상황에서 CPU 상황이고, 오른쪽은 문제를 해결한 후 테스트로 빌드를 실행할 때 CPU 상황이다. 메모리 사용량이 갑..
첫 번째, TL;DR
·
프로젝트/개발
TL;DR 코드로 하루를 빛내며, 미래를 채워가는 여정에 함께하세요. 내가 놓치고 있던 개발 경험을 데이터화 해보자! 처음 이 프로젝트를 구상한 단계에서 내가 겪은 문제는 파편화된 개발 경험을 관리하기 어려웠던 것이다. 예를 들어서 jira, wakatime, github commit, 알고리즘 문제 등등 내가 했던 경험들이 모두 파편화되어서 이 문제를 어떻게 해결하면 좋을까? 라는 생각이 들었다. 1. 타켓 유저 선정 개발 경험을 가장 외부에 들어냈으면 하는 유저층은 개발 직군으로 취업을 희망하는 관련 학과 학생, 취준생 등등으로 유추했다. 관련해 에브리타임, 카카오톡 IT 직군 취업 준비생, 국비 수강생 등을 대상으로 설문조사를 진행했다. 많은 인원은 아니지만, 총 32명의 설문 결과를 기반으로 서비..
프로젝트 회고 #작성중
·
프로젝트/개발
최근 주어진 요구사항에 맞게 구현하는 프로젝트를 하나 진행했는데, 그동안 잘 만들어진 프레임워크에 익숙해져 뭔가 착각을 하고 있었던 것 같다. 또 타입스크립트를 사용하면서 단순한 형태의 타입 시스템만 이용해 어중간한 코드를 작성하고 있었다는 생각이 들었다. 그래서 이 글은 이펙티브 타입스크립트를 읽으며 타입스크립트를 어떻게 더 타입스크립트답게 사용할 수 있을지 고민? 회고? 하는 글이다. 아이템 33. string 타입보다 더 구체적인 타입 사용하기 type RecordingType = 'studio' | 'live'; // OR enum RecordingType { STUDIO = 'studio', LIVE = 'live', } 타입스크립트에서 문자열 타입인 string 외에도 유니온으로 문자열 리터럴..