전체 글 197

FCM 토큰 토픽 방식을 활용하여 푸시알림 전송하기

현재 우리가 사용하는 FCM 기반으로 푸시알림 보내는 기능은 다음과 같이 구현되어있다.// 푸시 전송 public void sendPush(Map param) { String title = (String)param.getOrDefault("title", ""); String body = (String)param.getOrDefault("body", ""); String link = (String)param.getOrDefault("link", ""); Map data = new HashMap(); data.put("title", title); data.put("body", body); data.put("link", link); Object pushTokenObj = param.get("pu..

프로젝트 2025.09.28

채팅 시스템 구현 중 대규모 트랜잭션 처리 방법

문제 상황채팅을 입력할때 많은 사람들이 동시에 request를 보낸다.이걸 어떻게 해야 효율적으로 처리할 수 있는가.결국 이 고민은 대규모 트랜잭션 처리를 어떻게 하는가에 대한 물음이고 어느정도 레벨로 처리할지 현재 주어진 상황에 맞게 구축하면된다. 자원이나 시간이 여유가 있으면 높은레벨로 거는거고, 그게 아니면 단순한 락정도로만 처리하는 거고.물론 개개인의 역량에 따른 차이가 존재한다.그래도 대규모 채팅 입력 request 처리는 티케팅 시스템 보다는 쉽다.티케팅 시스템은 대규모 처리 + 하나의 좌석에 대한 선점 여부 까지 알아야해서 락 거는게 더 높은 수준이고, 방법도 더 여러가지다. 예를 들어 한 좌석을 행으로 만들어서 들어온 리퀘스트를 순서대로 저장하고 현재 예약중인 사람이 누구인지 순서대로 세울..

프로젝트 2025.09.25

스프링 BEAN 1부

스프링 컨텍스트에서 관리하는 빈(bean)을 쿼츠 잡에서 사용하려면, 스프링의 AutowireCapableBeanFactory를 사용하여 수동으로 의존성을 주입빈을 공부하게 된 배경.스프링 사용하면서 서비스들을 빈 객체로 등록해서 사용하는건 알음.근데 자세한 동작원리를 모르겟음.이제는 알아야하지 않을까.그런데 다른 구글 정보들을 보면 이론적으로 설명되어있음. 코드단부터 설명해둔게 없음.내가 코드단부터 정리하면서 파보기로 마음먹음.시작.🔍 우리가 함께 살펴볼 방향 예시✅ Step 1: @Component 혹은 @Service를 붙이면 무슨 일이 벌어질까?→ @ComponentScan은 어떤 클래스를 찾고?→ AnnotationConfigApplicationContext는 뭘 등록하고?→ BeanDefin..

프로젝트/JAVA 2025.08.19

디비 아키텍처 - Undo

undo 는 롤백용임.redo 와 마찬가지로 빠른 읽기/쓰기 를 위해 버퍼 캐시에 캐싱.데이터 유실 방지를 위해 변경사항을 redo 로그에 로깅.각 트랜젝션 별로 undo 세그먼트를 할당 (한 세그먼트를 두개의 트랜젝션이 공유가능)총 3가지 목적을 위해 사용된다.transaction rollback롤백 시 사용transaction recovery장애 상황 발생 시 redo 를 통해 최종 커밋되지 않은 변경사항까지 복구된다.read consistency다른 sql 들은 lock을 통해 읽기 일관성 구현오라클은 undo 데이터를 이용해 읽기 일관성 구현redo 는 로그에 저장되는데 undo는 세그먼트에 저장된다고?뭐가 다른데..?🛠️ 쉽게 비유하면Undo 세그먼트: 바뀌기 전 상태의 데이터를 보관하는 비밀..

랜덤엑세스에 대하여…

테이블에 접근할때 랜덤엑세스를 줄여야 효율이 높아지는거 맞니?ChatGPT의 말:네, 맞습니다.랜덤 액세스(Random Access)를 줄이는 것은 성능 최적화에 매우 중요합니다. 특히 디스크 I/O가 병목이 되는 상황에서는 더욱 그렇습니다.📌 개념 정리용어 설명랜덤 액세스 (Random Access)테이블의 임의 위치에 접근하는 방식. 디스크 헤드가 여러 위치로 이동해야 함.순차 액세스 (Sequential Access)연속된 위치에 접근하는 방식. 디스크 헤드 이동이 거의 없음.💡 왜 랜덤 액세스를 줄여야 할까?1. 디스크 I/O 비용이 높음HDD의 경우 디스크 헤드가 여러 위치를 이동해야 하므로 랜덤 액세스는 시간이 오래 걸립니다.SSD도 빠르긴 하지만, 여전히 순차 읽기/쓰기보다 랜덤 액세스가..

CS 2025.08.19

해시란? 뭘까…?

해시를 사용한적이 많다.알고리즘을 할때나. 맵에 넣어서 사용할때.해시가 빠르다고 알고잇으니까 그냥 사용했다.키 맵 구조인것도 알고.주소를 해시값 변환해서 사용한다는 것도 안다.빅오표기법으로 1 의 시간이 걸려서 빠르다는것도 안다.그런데 왜? 빠를까?갑자기 이런 궁금증이 생겼다.공부하다가 해시 조인이라는것도 있다고 하는데.나는 해시라는 단어에 대해 완벽히 파악하고 있었는가…….그래서 오늘은 해시에 대해서 이해해 보는 시간을 가져보자.✅ 해시(Hash)란?임의의 데이터를 일정한 규칙(해시 함수)에 따라 고정된 크기의 값(해시값)으로 변환하는 것.예를 들어 문자열 "apple"을 해시 함수에 넣으면 3e23e816 같은 고정된 길이의 숫자/문자열로 바뀌는 거야.해시의 핵심 목적은 데이터를 빠르게 찾거나(탐색)..

CS 2025.08.19

디비 아키텍처 - Redo

Redo 로그는 무엇을 담는 로그일까데이터파일과 컨트롤 파일에 가해지는 모든 변경사항을 기록함.Online Redo 와 Archived Redo 로그로 구성.Online Redo 와 Archived Redo 가 뭘까…??✅ 1. 온라인 리두 로그 (Online Redo Log)📌 정의데이터베이스의 변경 사항을 실시간으로 기록하는 파일Oracle은 트랜잭션 발생 즉시, 변경 내용을 Redo Log Buffer에 기록하고 → Online Redo Log 파일로 플러시함장애 복구(Crash Recovery) 시 이 파일을 읽어 데이터를 복구함📁 특징일정 개수의 로그 파일 그룹으로 구성 (ex: redo01.log, redo02.log, ...)순환 구조로 사용됨: 로그 파일이 다 차면 다음 파일로 교체되며..

디비 아키텍처 - 버퍼 LOCK

버퍼 상태는 총 3가지가 있다프리 버퍼 = 말그대로 프리함. 비어있다는 뜻. 여기에 이제 데이터를 언제든지 덮어써도 무방한 버퍼임.더티 버퍼 = 사용자가 무엇인가 수정했다? 그러면 일단 버퍼 캐시에 수정이 되잖슴? 그런데 아직 데이터파일에는 반영이 안된 상태임.핀 버퍼 = 읽기 쓰기 작업을 위해 현재 엑세스 되고 있는 버퍼 블록임. 앞에서 말햇듯 sga영역은 여러 서버 프로세스가 공유하기에 래치라는 블락 매커니즘을 적용함. 이때 버퍼 상태는 핀 버퍼 상태임!!! ㅇㅋ?버퍼 Lock ( 다른 말로 버퍼 핀 ) pin 꼿앗다 할때 그거버퍼 캐시에서 버퍼 블록을 찾으면 빨리 래치 해제해야함.안그러면 래치에 여러 해시 체인이 달렸으니까 래치 경합 발생!!!아니 근데 왜 버퍼락이 필요한거지… 래치를 통해서 어차피..

블루/그린 배포 방식

서버 이중화의 필요성무중단 서비스 제공하나의 서버에 장애가 발생해도 다른 서버로 연결이 가능함.부하 분산로드 밸런서를 통해 여러 서버로 부하를 분산시킬 수 있음.로드밸런서란?클라이언트 요청을 여러 서버로 분산시켜주는 중간 장치주요목적가용성 : 특정 서버 장애 시 다른 서버가 요청 처리.확장성 : 서버 대수를 늘려 트래픽 급증에 대응.성능 최적화 : 과부하를 방지해 응답 속도 유지.무중단 배포 방식의 필요성서비스 연속성 유지배포 중에도 사용자 요청을 처리할 수 있어, 서비스 이용경험을 최대화 시킬 수 있음.비즈니스 손실 최소화짧은 다운타임도 거래 실패, 수익 손실로 이어질 수 있음.안정적 롤백 및 단계적 배포문제가 발견되면 신속하게 이전 버전으로 되돌릴 수 있음.운영, 유지보수 편의성배포 전용 시간을 따로..

디비 아키텍처 - 버퍼 캐시

디비 아키텍처데이터베이스는 우리가 사용하는 ‘워드 프로세서’ 같은 편집툴과 작동이 매우 비슷하다.무슨 뜻이냐면, 작은 파일을 편집할때 해당 파일에 직접 I/O 하면 시간이 오래걸리지만 중간에 캐시메모리를 통해 빠르게 수정가능.디비도 같은 원리로 동작한다.캐시 메모리 기능을 하는것을 SGA 영역이라고 한다. (시스템 글로벌 에리아)가장 큰 차이점은 디비는 많은 프로세스가 동시에 데이터를 엑세스한다는 점이다.그래서 필요한 기능이 동시에 공유 메모리 영역 SGA에 접근을 막는 Lock. (lock 은 latch라고도 함)오라클은 블록단위로 읽고, 쓴다.그런데 오라클 뿐만 아니라 다른 디비들도 블록단위라는 개념을 사용하긴 함.각각의 블록의 용량이 조금씩 다를뿐.✅ 요약 (출처 : 지피티)DBMS기본 블록/페이지..