본문 바로가기

분류 전체보기29

대량 데이터 저장, 어떻게 처리할까? 1. 상황백오피스 시스템에서 1000건 이상의 대량의 데이터를 저장할 때, 3초라는 처리 속도 기준을 충족시키지 못했고, 이를 개선해야 했습니다. 해당 데이터를 저장할 때, 트랜잭션의 정합성이 보장되어야 했고, 처리 도중에 실패 발생 시 전체 롤백을 해야 하는 상황이었습니다. INSERT 건수 : 1000건 이상기술 스택 : Java, Spring Boot, JPA, MyBatis트랜잭션 처리 도중 실패 발생 시 전체 롤백 필요처리 속도 : 3초 이하 2. 문제처음에는 대량의 데이터를 저장할 때, 성능을 높이기 위해 CompletableFuture를 활용하여 멀티스레드로 병렬처리를 하여, 각 스레드에서 병렬적으로 데이터 저장 작업을 처리하게끔 하려고 했습니다. 그러나 JPA 트랜잭션은 ThreadLoca.. 2025. 6. 1.
Redis echo 명령어를 변형해보자. Redis는 echo 명령어 기능 변형을 통해 Redis와 어떤 방식으로 통신하는지 알아보자. [상황]이전 글에서는 echo와 동일한 기능을 하는 새로운 명령어를 추가하는 것이었다면, 이번에는 echod의 명령어 기능을 변형해서 다음과 같이 이 명령어가 주어지면echo_kmularise hello 다음과 같이 두번째 파라미터 변수 앞에 abc_를 붙여야 했다. abc_hello [문제] 이렇게 명령어를 변형하기 위해서 server.c의 명령어를 실행하는 부분에서 명령어 정보를 어떻게 받는지 알 필요가 있었다. 첫번째로 이를 위해서 Redis는 어떤 프로토콜로 통신하는지 알아야 했다. RESP 프로토콜Redis는 RESP 프로토콜로 통신한다. 즉, 다음과 같은 형식이다. 예를 들면 make로 컴파일한 후.. 2025. 5. 21.
Redis 소스코드에 echo_kmularise 명령어를 추가해봤습니다. 최근 Redis 프로젝트가 valkey와 redis 두 오픈소스 레포지토리로 나뉘게 되었습니다. 저는 이 중 valkey 레포지토리를 직접 포크하여, 기존 echo 명령어와 동일한 기능을 하는 새로운 명령어 echo_kmularise를 추가해보는 실습을 진행했습니다. 이를 통해 Redis에서는 명령어가 어떻게 추가되는지, 전체적인 소스 코드 구조는 어떤지 직접 파악할 수 있었습니다. 파악한 Redis(valkey) 소스코드 구조echo_kmularise 명령어를 추가하기 위해 변경한 파일은 다음과 같습니다. 1. server.h: 명령어 함수 선언새로운 명령어 함수의 선언을 추가하는 것입니다. server.h에 Redis 서버 전체에서 사용하는 함수가 선언되어 있어, echoKmulariseCommand.. 2025. 5. 12.
Git 명령어에 따른 Git 내부구조 변화를 알아보자! 이때까지는 Git을 사용해보기만 하고, 정확히 git이 명령어 실행에 따라 어떤 원리로 동작하는지는 몰랐습니다.2025 오픈소스 컨트리뷰션 Git 활용 및 Reids 아카데미 체험형 멘티로 참여하면서 강대명 멘토님의 Git 구조에 대한 강의를 듣고 Git 명령어를 실행함에 따라 Git 내부구조가 어떻게 동작하는지 직접 파악해보게 되었습니다. 각각의 Git 명령어를 실행시키면서 .git 폴더의 변화를 통해 어떤 식으로 버전 관리를 진행할 수 있는지 알게 되었습니다.제가 주요하게 파악한 Git 명령어는 다음과 같습니다.1. git initmkdir git_testcd git_testgit init git_test란 실습용 폴더에서 git init을 실행시킨 결과 .git 폴더가 생성됨을 확인할 수 있었습니다.. 2025. 5. 3.
조회수 집계 동시성 문제, CQRS 패턴과 이벤트 소싱으로 해결하기 상황채용공고 플랫폼에서 사용자가 공고를 클릭할 때마다 조회수를 실시간으로 업데이트하고, 이를 기반으로 인기 공고를 정렬해서 보여주는 기능을 개발하고 있었습니다. 이때 채용공고 플랫폼 서비스에서 서비스의 특성은 채용공고에 대한 조회가 채용공고를 클릭하는 횟수에 비해 많았습니다. 또한 팀원들과 논의한 결과, 조회수 집계 시 다음과 같은 요구사항들을 충족시키기로 결정했습니다.최근 조회수와 전체 조회수를 구분하여 관리하여야 합니다.전체 조회수 기반으로 공고 크기가 조정되어야 합니다.여러 사용자가 동시에 같은 공고를 클릭하더라도 조회수가 정확히 집계되어야 하며, 조회수 업데이트 중에 다른 사용자가 해당 공고 조회수를 조회할 때 일관된 데이터를 볼 수 있어야 했습니다.문제기존의 방식으로는 다음과 같은 문제점들이 발.. 2025. 3. 25.
페이지 방문 기반 사용자 식별 : 일회성 고유 ID 생성과 사용자 행동 데이터 수집 상황 : 사용자 로그인 없이 사용자 행동 데이터 수집 필요프로젝트를 진행하며 사용자의 행동 데이터를 수집해야 했습니다. 각 사용자가 페이지를 언제 방문하며, 평균적으로 몇개의 공고를 보는지에 대한 데이터를 수집하여 서비스를 개선하고자 했기 때문입니다. 이때, 사용자가 채용공고들을 조회하고 관심있는 채용공고를 클릭하는데 있어 로그인을 강제하는 것은 사용자 경험을 저하시킨다고 판단했습니다. 그래서 사용자 로그인 없이 사용자를 식별하고 행동데이터를 수집할 수 있는 시스템이 필요했습니다. 문제사용자 인증 없는 환경에서 사용자를 식별하기 위해 아래 세가지 이슈를 검토해야 했습니다.사용자 식별 기준 설정 : 각 페이지 방문마다 새로운 사용자로 볼 것인지 VS 일정 시간 동안의 방문을 동일 사용자로 볼것인지사용자 .. 2025. 3. 17.
Redis와 캐시 데이터 조회 시 데이터베이스(DB)에 부하를 줄이고 성능을 높이기 위해 캐시를 활용하는 것이 효과적이라는 판단을 하게 되었고, 이를 위해 Redis를 캐시로 활용하는 방법을 정리하고자 합니다.  1. 캐시란?캐시란 원본 데이터 저장소보다 더 빠르게 접근할 수 있는 임시 데이터 저장소입니다.    2. 언제 캐시를 도입하면 좋을까?캐시는 다음과 같은 경우에서 도입하면 효과적입니다.원본 데이터 저장소에서 검색하는 시간이 오래 걸리거나, 추가적인 연산이 들어갈 때데이터가 잘 변하지 않을 때자주 검색되는 데이터일 때캐시를 통해 원본 데이터 저장소의 커넥션을 줄일 수 있고, 원본 데이터 저장소에서 데이터를 가져올 때 드는 리소스를 줄일 수 있습니다. 또한 원본 데이터 저장소에서 장애가 발생해서 접근할 수 없더라도.. 2024. 11. 2.
선착순 쿠폰 이벤트 참여 기능 개발 회고 1. 선착순 쿠폰 이벤트 참여 기능 설계 상황 Dailyge 프로젝트를 진행하며 선착순 쿠폰 이벤트 참여 기능을 개발하게 되었습니다. 처음에는 사용자가 선착순 쿠폰 이벤트에 참여하면 바로 사용자가 당첨자인지 확인 후 쿠폰을 발급해주는 구조로 설계했습니다. 즉, 단계 별로 선착순 쿠폰 이벤트 참여 시, 다음과 같은 과정을 거치게 됩니다. 1. 쿠폰 테이블에서 사용자의 id로 발급된 쿠폰이 있는지 확인하여 중복 참여를 검증합니다. 2. 사용자가 선착순 쿠폰 이벤트에 참여하면 쿠폰 테이블을 조회하여 해당 이벤트에 대해 발급된 쿠폰 수량을 확인합니다.3. 당첨자 수만큼 쿠폰 발급이 이루어지지 않았다면 사용자를 당첨자로 선정하고 쿠폰을 발급합니다. 2. 기존 설계의 문제점 그러나 이러한 설계는 두가지 문제점이 .. 2024. 9. 26.
JVM이란?. Java Virtual Machine(JVM)은 Java 애플리케이션을 실행하는데 필요한 가상 머신입니다. JVM은 자바 코드(.java 파일)를 바이트코드(.class 파일)로 컴파일한 후 이를 운영체제에 맞게 해석하고 실행합니다. JVM의 주요 역할 요약바이트코드를 운영체제에 맞는 기계어로 변환하여 실행메모리 관리리소스 관리JVM의 구성 요소ClassLoader:자바 클래스 파일(.class)을 메모리로 로드하는 역할을 합니다. ClassLoader는 프로그램이 실행될 때 필요한 클래스들을 동적으로 로드하며, 이를 통해 자바는 런타임 시에도 새로운 클래스를 로드할 수 있습니다.Runtime Data Areas (런타임 데이터 영역):JVM이 실행될 때 메모리를 여러 영역으로 나누어 관리합니다.Meth.. 2024. 9. 15.
[스프링 서버 구현하기] 템플릿 메소드 패턴과 템플릿 콜백 패턴 사람들과 스프링 서버를 직접 구현해보는 프로젝트를 하며 JDBC를 이용하여 외부 데이터베이스와 연결되는 레포지토리를 작성하게 되었습니다. 구현하는 과정에서 SQL 작성 부분만 바뀜에도 불구하고, 데이터베이스 Connection을 얻어오는 부분 같이 변경되지 않는 부분이 하나의 메소드에 있게 되었습니다. 따라서 변경되는 부분과 변경되지 않는 부분을 분리할 필요가 있다고 생각했고, 그에 대한 방법으로 템플릿 매소드 패턴과 템플릿 콜백 메소드 패턴 두가지를 떠올렸고, 최종적으로 템플릿 콜백 메소드 패턴을 적용했습니다. 또한 PR에서 관련 질문을 받았기에, 좀 더 확실히 익히고자 해당 글을 작성하게 되었습니다.   1. 템플릿 메소드 패턴템플릿 메소드 패턴이란 상속을 통해 기능을 확장해서 사용하는 패턴입니다. .. 2024. 3. 28.