[MSA] Transactional Outbox Pattern
·
Web
트랜잭셔널 아웃박스 패턴이란? 메시지를 DB 로컬 트랜잭션과 묶어서 커밋하여 비동기적으로 메시지 브로커 (message Relay)에 전달하는 방식 1. 아웃박스 패턴의 등장 배경: '이중 쓰기'의 비극모놀리식 환경에서는 결제가 완료되면 주문 테이블 저장과 배송 테이블 저장을 하나의 @Transactional로 묶어서 처리하면 끝이었습니다. 하지만 MSA 환경에서는 이를 분리해야 합니다. 아래 상황을 예시로 들겠습니다 주문 서비스가 주문 DB에 데이터를 저장한 뒤, 배송 서비스가 알 수 있도록 카프카(Kafka)에 이벤트를 던져야 합니다.@Transactionalpublic void createOrder(OrderRequest request) { // 1. DB에 주문 저장 (성공) order..
[DB] Materialized View
·
Database
Materialized View 란?Materialized View는 데이터베이스에서 쿼리의 결과를 미리 계산하여 저장하는 실제 테이블로, 데이터량이 많거나 복잡한 쿼리를 실행할 때 발생하는 성능 문제를 완화하기 위해 사용된다. 많은 양의 데이터를 처리해야 하는 경우, 복잡한 쿼리의 실행은 데이터베이스 서버에 부하를 줄 수 있고, 응답 시간이 길어질 수 있다. 특히, 필자의 경우에는 프로덕트에서 해당 API에 직접 요청을 주는데, 추후 트래픽이 증가하면 데이터베이스의 성능이 저하되어 서비스 중단이 발생할 위험이 있다고 판단했다. 결론적으로, Materialized View를 사용하면 쿼리의 결과를 사전에 계산하여 테이블에 저장함으로써, 쿼리 실행 시 원본 데이터베이스에 매번 접근하지 않고 저장된 결과를 ..
[DB] Lost Update 문제 해결
·
Database
Lost Update(갱신 손실)는 두 트랜잭션이 동시에 같은 데이터를 읽고 수정할 때, 나중에 커밋된 결과가 먼저 커밋된 결과를 덮어써버리는 문제입니다. 예를 들어, X의 계좌에는 50만원이 있고 Y의 계좌에는 10만원이 있습니다. 만약 X에서 Y에게 40만원을 이체하는 트랜잭션 1과 X에게 30만원을 입금하는 트랜잭션 2가 동시에 실행됐다고 가정해봅시다. 그러면 시간 타이밍에 따라 여러 결과가 나올 수 있는데, 아래는 그중에 한 가지 예시입니다. 트랜잭션1트랜잭션2start transaction start transaction read(X) => 50read(X) => 50 write(X = 80)write(X = 10) commitread(Y) = 10 write(Y = 50) commit ..
[SQL] Oracle 문법 톺아보기
·
Language/SQL
Oracle 문법에 대해 파헤쳐보자. 조회 쿼리MySQL과 동일함. 오라클 주요 내장 함수문자 데이터 가공하기 (문자 함수)1. 대소문자 변환 (UPPER, LOWER) 검색할 때 대소문자가 섞여 있어서 찾기 힘들 때 주로 사용합니다. -- 소문자를 대문자로, 대문자를 소문자로 변환합니다.SELECT UPPER('oracle'), LOWER('ORACLE')FROM DUAL; 2. 글자 잘라내기 (SUBSTR) 가장 많이 쓰이는 함수 중 하나입니다. -- 'Hello World'라는 글자에서, 1번째 글자부터 시작해서 5글자만 잘라옵니다.SELECT SUBSTR('Hello World', 1, 5) AS "자른 글자"FROM DUAL; 3. 글자 바꿔치기 (REPLACE) 특정 단어를 다른 단어로 ..
[SQL] 실행 계획 분석 (Explain Analysis) 과 쿼리 튜닝
·
Language/SQL
MySQL의 EXPLAIN ANALYZE는 쿼리 실행 계획을 단순히 예측하는 것을 넘어, 실제로 쿼리를 실행한 뒤 각 단계에서 소요된 시간과 처리된 행 수(Row count)를 측정하여 보여주는 강력한 프로파일링 도구입니다. MySQL 8.0.18 버전부터 도입되었으며, "왜 내 쿼리가 느린가?"라는 질문에 가장 정확한 답을 줄 수 있는 기능입니다.1. EXPLAIN vs EXPLAIN ANALYZE특징EXPLAIN (기본)EXPLAIN ANALYZE실행 여부실제로 실행하지 않음 (예측치)실제로 쿼리를 실행함정확도통계 정보를 바탕으로 한 추측실제 측정된 수치 (정확함)용도실행 계획의 구조 확인성능 병목 구간 및 실제 부하 지점 파악부하매우 낮음실제 실행되므로 쿼리만큼의 부하 발생 2. 사용 방법 및 결과..
[Spring] JPA "Row size too large" 문제와 VARCHAR vs TEXT 타입 분석
·
Web/Spring
간혹 가다가 Entity String Type의 속성 길이를 디폴트보다 길게 하고 싶을 때 다음과 같이 하는 경우가 있을 것이다. Document entity의 content의 길이가 늘어나는 것을 대비해, @Column 어노테이션의 length = 50000으로 하여 길이를 늘리고 실행을 해보면 다음과 같은 에러가 발생한다. engine=InnoDB" via JDBC [Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or..
[Java] n진수 변환 및 비트마스킹 메서드
·
Language/Java
10진수 -> n진수 변환 2진수: Integer.toBinaryString(int i)8진수: Integer.toOctalString(int i)16진수: Integer.toHexString(int i) int decimal = 255;String binary = Integer.toBinaryString(decimal); // "11111111"String octal = Integer.toOctalString(decimal); // "377"String hex = Integer.toHexString(decimal); // "ff" n진수 -> 10진수 Integer.parseInt(str, n);String binaryStr = "11111111";String hexStr = "ff";..
프론트엔드 어플리케이션 배포하는 방법
·
Web
1️⃣ Netlify, Vercel, Cloudflare와 같은 서버리스 플랫폼 사용하기장점서버리스 플랫폼을 사용하면 자체 서버를 구성하지 않아도 플랫폼에서 제공해 주는 클라우드를 사용해 프론트엔드를 간편히 배포할수 있다.배포 자동화 기능(CI/CD) 또한 자동으로 제공해주며 빌드, 배포, 호스팅 서비스 등 다양한 서비스들을 쉽게 사용할 수 있다는 장점이 있음.단점메모리, 실행시간, 페이로드 제한이 있을 수 있으며 사용 플랜에 따라 비용이 부과될 수 있습니다.간편한만큼, 자유도가 낮습니다.비교 : Netlify vs Vercel vs Cloudflare(1) netlify vs Vercel두 플랫폼은 상당히 유사하나, 좀 더 큰 프로젝트는 vercel이 좋을 것 같다.그 이유는, vercel은 하루 빌드..