목록분류 전체보기 (198)
밤빵's 개발일지
프로젝트에서 외부 API 데이터를 가져오는 기능을 구현하면서 RestTemplate과 WebClient 두 가지 방법을 비교해 보았다.현재 WebClient를 사용하고 있지만, "만약 원래 사용하던 방식처럼 RestTemplate으로 구현했다면 어땠을까?"라는 궁금증이 생겨서 비교해 보았고, 두 방법의 차이를 이해하면서 또 하나 배웠다. 이번에 리액티브 프로그래밍이라는 개념도 제대로 접하게 되어서, 간단히 정리하기로했다.1. 리액티브 프로그래밍리액티브 프로그래밍은 데이터를 비동기적이고 이벤트 기반으로 처리하는 프로그래밍 방식이다.비동기적 처리프로그램이 어떤 작업을 수행하는 동안 다른 작업이 병렬적으로 진행될 수 있도록 한다.이벤트 기반데이터의 변경이나 외부 이벤트가 발생했을 때 자동으로 반응하도록 설계된..
PUBG 프로젝트에서 API를 여러 번 호출하거나 데이터를 저장하는 과정에서 중복 처리를 방지해야 할 필요가 있었다. API 호출이 실패하거나 여러 번 요청되면 중복 데이터가 저장되거나 시스템의 데이터 정합성이 깨질 수 있기 때문에, 해결하기 위해 Redis의 SETNX 명령어를 활용한 멱등성(Idempotency) 구조를 설계했다. 아직 Redis를 적용하지는 않았지만, 나중에 도입할 때를 대비해 중복 처리 방안과 구현 가능성을 구상했다.1. 멱등성이란?멱등성은 같은 요청을 여러 번 수행하더라도 결과가 변하지 않는 성질을 의미한다.동일한 matchId로 PUBG 매치 데이터를 여러 번 요청하더라도 결과적으로 하나의 데이터만 저장되어야 한다.2. 멱등성이 필요한 이유API 재시도 처리네트워크 지연이나 서..
프로젝트를 진행하면서 시스템의 상태를 명확하게 관찰할 방법에 대해 고민하게 되었다. 이전까지는 로그만으로 문제를 찾아보는 방식이였는데, 사용자에게 다양한 데이터를 제공하고 외부 API를 활용하는 프로젝트를 진행하다 보니, 단순한 로그 기록만으로는 문제의 원인이나 병목 구간을 파악하는 데 한계가 있었다. Observability(관측성) 라는 개념은, 단순한 로그 확인을 넘어 시스템의 상태와 흐름을 종합적으로 분석하는 능력을 의미한다. 이번 개발일지에서는 Observability의 개념과 이를 학습하며 느낀 점을 정리하려고 한다! ObservabilityObservability는 시스템의 내부 상태를 관찰하고 분석해 문제를 파악하는 개념으로, 세 가지 Pillar로 구성된다:로그시스템이 남기는 기록으로 에..
1. 벨루가 추천 시스템이란?벨루가 추천 시스템은 당근마켓에서 자체적으로 개발한 개인화 추천 엔진이다. 사용자가 당근마켓에서 더 빠르게 자신에게 맞는 상품을 찾을 수 있도록 돕는 것이 이 시스템의 핵심 목적이다. 벨루가는 대규모 데이터를 기반으로, 사용자 개개인의 취향과 행동 패턴을 학습해 맞춤형 추천을 제공한다. 이는 사용자 경험을 크게 향상시키는 요소로, 당근마켓이 커뮤니티 중심의 로컬 마켓플레이스에서 더 강력한 플랫폼으로 자리 잡는 데 기여하고 있다. 주요특징데이터 기반 개인화사용자가 검색한 키워드, 클릭한 상품, 관심 등록, 구매 기록 등 행동 데이터를 활용하여, 각 사용자가 선호할 가능성이 높은 상품을 실시간으로 추천한다.추천 알고리즘→ 협업 필터링유사한 취향을 가진 다른 사용자가 선호한 상품을..
도메인 주도 설계(Domain-Driven Design, DDD)는 비즈니스 도메인을 깊이 이해하고 코드 설계에 적극 반영하는 개발 방법론이다. 단순히 기능 구현에만 초점을 맞추는 것이 아니라, "도메인 전문가와 협력하여, 도메인의 개념을 코드 구조와 언어에 녹여내는 것"을 목표로 한다. 코드와 비즈니스 로직이 일관된 모델을 가지며, 변화하는 요구사항에도 유연하게 대응할 수 있다. 나는 이전에 "도메인이라는 개념은 무엇인가?"라는 주제로 개발일지를 작성한 적이 있는데, 도메인을 "문제를 풀기 위해 설계된 소프트웨어의 특정 영역"으로 이해하려고 노력했다. 하지만 이번에는 한 단계 더 확장해서 DDD라는 개념을 학습하며, 도메인이 소프트웨어 개발에서 어떤 역할을 하는지 더 깊이 이해하려고 한다.DDD의 핵심..
개발을 시작하고 "클러스터링"이라는걸 종종 듣긴 했지만, 어떤 개념인지 정확히 이해하지 못한 채 지나쳐왔다. 지금 진행중인 프로젝트에서도 헬스체크가 구현되면서 서버 상태를 확인하는 기능을 보게됐고, 클러스터링이 어떻게 연결되는지 궁금했다. 그래서 이번에 클러스터링을 학습하면서 내가 이해한 내용을 정리해봤다.클러스터링클러스터링은 여러 대의 서버나 시스템을 하나의 그룹으로 묶어 함께 동작하도록 만드는 기술이다. 이렇게 묶인 서버들의 그룹을 클러스터라고 부른다. 클러스터링은 크게 두 가지 목표를 가지고 있다.고가용성(High Availability, HA)서버 중 하나가 다운되더라도 나머지 서버가 대신 역할을 수행해서 시스템이 멈추지 않도록 한다.부하 분산(Load Balancing)하나의 서버에 모든 요청..
프로젝트를 잠시 쉬어가는 동안, 능동적으로 무언가를 해보고 싶어 설계와 공부에 집중하고 있었다. 그중에서도 평소 흐린눈하며 넘어갔던 테스트 코드를 작성해보기로 하면서, 작성하다 보니 유닛 테스트와 통합 테스트의 경계를 명확히 구분하는 일이 생각보다 쉽지 않았다. 이론적으로는 둘의 차이를 알고 있지만, 실제 코드에 적용하는 과정은 항상 어려운 도전처럼 느껴진다. 이번 개발일지에서는 테스트 코드를 작성하면서 겪었던 고민들과 어떻게 해결했는지 정리했다.1. 유닛 테스트와 통합 테스트유닛 테스트는 개별 메서드나 클래스 단위로 동작을 검증하는 테스트이다. 의존성을 Mock으로 처리해 테스트의 초점이 대상 코드에만 맞춰지도록 한다. 반면, 통합 테스트는 여러 모듈이나 계층이 함께 동작하는지를 확인하는 테스트로, 실..
이전 개발일지에서 Redis를 활용한 캐싱과 갱신 요청 처리 방안을 고민했다. 이번에는 모든 샤드 클래스에 대해 갱신 요청 기능을 추가해야 하는 상황의 다른방법을 찾기 위해 효율적인 설계 방안을 찾아야했다. 모든 샤드 클래스를 의존성 주입 방식으로 관리하는 방법도 있지만, 비효율적이고 유지보수에 불리하기 때문에, 여러 설계 방안을 비교하고, 가장 적합한 방안을 선정했다. 1. 문제 기존 방식의 한계의존성 주입 방식모든 샤드 클래스를 컨트롤러나 서비스 레이어에 직접 의존성 주입하면, 클래스가 많아질수록 복잡도가 증가한다.새로운 샤드 클래스가 추가될 때마다 기존 컨트롤러나 서비스 로직을 수정해야 하니까 확장성이 낮다.요구사항각 샤드 클래스는 고유의 갱신 로직을 유지해야 한다.갱신 요청 처리는 공통된 흐름으로..
Redis를 프로젝트에 적용하기 위해 공부하면서, 캐싱과, 데이터 저장소로 활용하는 방법을 고민했다. Redis는 메모리 기반의 빠른 데이터 접근이 가능하다는 장점이 있기때문에, 프로젝트의 성능 최적화와 외부 API 호출 비용 절감에 적합하다고 판단했다. 오늘 개발일지에서는 Redis를 캐싱과 데이터 저장소로 활용하기 위한 설계 과정과 고민했던 내용들을 정리했다. 특히, 데이터 특성에 따라 적합한 설계 방식을 선택하는 데 중점을 두었다.1. 고민캐싱을 왜 사용해야 할까?PUBG 외부 API를 호출하는 프로젝트에서 요청 제한과 비용 문제를 해결하기 위해 캐싱이 필요하다. 특히, 반복적으로 조회되는 데이터나 변경되지 않는 데이터는 캐싱을 통해 외부 API 호출을 줄이고, 사용자 경험을 개선할 수 있다.캐싱이..
지금 진행하고 있는 프로젝트에서 다루고 있는 데이터들이 익숙하지않고, 잘 알고있는 게임이 아니라서 주도적으로 개선할 방법에 대한 고민이 많아졌다. 기능 추가나 최적화 외에 더 나은 사용자 경험을 제공할 수 있는 방향을 고민하다가 알림 기능은 사용자에게 중요한 정보를 전달하고 서비스의 활용도를 높일 가능성이 있지않을까란 생각에 이번 글에서는 알림 기능을 추가하려는 고민과 그 과정에서의 생각을 정리하고, 앞으로의 계획을 기록했다.1. 왜 알림 기능을 떠올렸을까?현재 프로젝트는 게임 관련 데이터를 사용자에게 제공하는 서비스로, 사용자가 데이터를 조회하는 데서 그치는 것이 아니라, 중요한 정보를 능동적으로 전달한다면 서비스가 더 유용해지지 않을까 생각했다. 몇 가지 예시를 생각해봤는데,클랜 초대 알림 클랜장이 ..