알림 기능 고찰 🤔
·
메모
최근 알림 기능에 대한 고민을 했다. 그러면서 가진 몇 가지 고민을 정리해 보자. 외부 도메인 의존성 알림은 그 자체가 이벤트를 가지기보단, 외부 도메인에서 발생한 이벤트에 관심사가 있다. 그리고 외부 도메인에 필요한 알림 문구, 정보 등은 도메인 별 알림 성격마다 제각각이다. 최근 팀원과 고민했던 부분은 알림 도메인에 의존성이 과하게 늘어나는 것이다. 문구 데이터 댓글 알림 우주먼지님이 "나 완전 짱세다" 게시글에 댓글을 남겼습니다. 이벤트 대상 유저, 이벤트 발행 주체 유저, 게시글 제목, 이벤트 타입 포인트 알림 우주먼지님이 100 포인트 정립했습니다. 이벤트 대상, 포인트, 이벤트 타입 위 예시를 보면 알 수 있듯 알림 유형에 따라 데이터 모델링이 반정규화된다. 댓글 알림에는 포인트 정보가 필요 ..
extends JpaRepository<Cookie, String>
·
메모
날 것의 SQL을 작성하며, 개발하던 개발자가 처음스프링에서 spring-data-jpa를 접한 순간 가장 신기한 부분은 다름 아닌 인터페이스로 repository를 만드는 것이다. 단순히 XXXRepository를 하는 것 만으로 기본적으로 필요한 메서드가 자동으로 만들어주기 때문이다. 하지만 인생사가 그러하듯 득이 있으면 실이 있고, 그 사이를 저울질하며 어떤 것이 더 이득인지 결정하듯 이 또한 비슷한 것이 아닌가 생각이 든다. Wingardium Leviosa spring-data-jpa는 어떻게 아무것도 없는 구현부를 마법처럼 만들어줄까? 그 시작은 Bean 생성에서 시작된다. Spring은 시작하며 관련된 bean을 생성하게 된다. 이때 JpaRepository를 하위 클래스들은 @NoRepos..
🍎 레디스 톺아보기 - pub/sub
·
공부
레디스의 pub/sub은 순서가 보장되는 at-most-once(최대 한 번) 성격을 가진 pub/sub 메시징 구현으로, 구독자(subscriber)는 하나 이상의 채널을 구독하고 메시지를 전달받을 수 있다. 이때 채널을 구독한 RESP2 클라이언트는 SUBSCRIBE, UNSUBSCRIBE를 제외한 명령어를 수행하면 안 된다. (RESP3은 구독 중이라도 명령어를 수행할 수 있다.) 앞서 언급했듯 레디스의 pub/sub은 메시지 전달 시 누락될 가능성이 있다(at-most-once) 따라서 메시지 전송에 있어 조건이 있다면 레디스의 stream을 활용하는 것이 좋다. 레디스의 pub/sub은 데이터베이스와 상관없이 채널명으로 분류된다. 즉 DB 0에 게시해도 DB 10의 구독자는 메시지를 수신받을 수..
🍎 레디스 톺아보기 - 데이터 타입 이해하기
·
공부
왜 레디스를 공부하게 되었는가? 내가 개발 공부를 하면서 가장 처음 Redis(이하 레디스)를 접한 계기는 로그인 기능 개발을 하면서다. 대부분 인증 세션을 레디스에 저장해서 사용하거나, pub/sub을 이용해 실시간 채팅을 구현 등을 경험했다. 이전 회사에서도 인증을 담당하면서 비교적 레디스와 관련된 일을 경험했지만, 당시 레디스를 적극적으로 활용하기 어려웠다. 이유는 일단 서비스 내에서 레디스를 이용할 요구사항이 없었고, 레디스 서버를 인증 세션을 저장하는 용도로 사용하고 있어서 만약 해당 레디스가 특정 기능으로 인해 죽는다면, 서비스 전체에 장애가 발생할 수 있어서 비교적 쉽게 접근하기 어려웠다. 그런데 최근 레디스를 활용할 일이 생겼는데 보면 볼수록 활용성이 높고, 매력적이라 공부하게 되었다. 레..
연결 요소의 개수
·
독서/알고리즘
출력 이 문제는 간선으로 연결된 정점을 모두 탐색하며, 그래프의 개수를 구하는 문제다. 정답 import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { final var br = new BufferedReader(new InputStreamReader(System.in)); final var bw = new BufferedWriter(new OutputStreamWriter(System.out)); final String[] nm = br.readLine().split(" "); final int n = Integer.parseInt(nm[0]); final..
🚀 데이터베이스 이전 대작전! 📊 클라우드로의 여정 🌐
·
메모
들어가며.. 최근 운영 환경 데이터베이스의 저장소를 NFS에서 분산 스토리지 시스템 CephFS를 도입해 이관하는 작업을 진행했다. 이관 목적은 NFS를 사용하던 경우 PV 추가를 하는 경우 관리가 어렵고, 현재 NFS를 구성한 위치가 host에 구성해서 불필요하게 접근 포인트가 늘어난 기분이 들었다. 간단한 방법 가장 단순한 방법은 새로운 데이터 변경점이 없도록 서비스를 일시적으로 중단하고, 기존 데이터베이스의 모든 데이터를 복제해 이관할 수 있다. 적은 트래픽을 가진 서비스에선 비용 측면이나, 시간적으로 빠르고 진행할 수 있어 계획만 잘 수립하면 부담 없이 시도해 볼 수 있는 방법이라고 생각된다. 무중단 데이터베이스 이관 작업 앞서 소개한 서비스 이용 시간대가 낮은 새벽 시간대에 서비스 일시중단을 하..