본문 바로가기

전체 글

(109)
외부 API 연동과 트랜잭션 정합성 (2PC·Saga·Outbox 비교) 결제는 끝났는데 상품이 지급되지 않았다면외부 API 연동에서 트랜잭션 정합성 지키기. 2PC, Saga, Transactional Outbox의 채택 여부와 의사결정 과정 기록들어가며외부 공급사의 상품을 중개해 판매하는 시스템을 만들고 있다. 고객이 상품을 주문하면 우리 시스템은 두 가지 일을 해야 한다.우리 DB: 주문을 만들고, 고객의 선불 잔액을 차감하고, 정산 원장에 기록한다.공급사 API: 실제 상품을 발급받는다. 우리가 재고를 들고 있는 게 아니라, 주문이 들어오면 그때 공급사에 요청해 확보하는 구조다.문제는 이 둘을 하나의 트랜잭션으로 묶을 수 없다는 것이다. 우리 DB의 커밋은 롤백할 수 있지만, 공급사에 이미 나간 발급 요청은 되돌릴 수 없다. 반대로 공급사 발급은 성공했는데 우리 커밋이..
데이터 베이스의 인덱스 인덱스와 B+ Tree데이터베이스의 인덱스란, 특정 컬럼 값을 기준으로 데이터 위치를 미리 정리해 둔 자료구조.B+ Tree 구조 채택으로 어떤 값을 찾아도 O(log n)의 시간복잡도 가짐.대부분의 RDBMS가 인덱스의 자료구조로 채택하는 B+ 트리, 실제 내용은 무엇일까?루트 노드에서부터 브랜치,브랜치에서 리프 노드까지 이어지는 트리 형태의 자료구조로B-tree와 유사하나, 리프 노드에 값이 존재하며 각 리프 노드는 연결 리스트로 연결되어 있다는 특징이 있다.Clustered Index vs Non-Clustered Index클러스터형 인덱스는 데이터 행 자체가 인덱스 키 순서로 물리적으로 저장된다.Inno DB에서 PK가 그 역할을 하고 테이블당 1개만 존재 가능하다.Leaf Node에 실제 데이터..
Strategy + Factory 패턴으로 파일 다운로드 권한 검증 설계하기 ▎ "하나의 다운로드 API, N가지 권한 규칙 — if-else 지옥 없이 해결한 이야기"1. 문제 상황최근 통신사(MVNO) 관련 백오피스 시스템을 개발하면서, 파일 다운로드 권한 검증이라는 까다로운 요구사항을 만났습니다.시스템에는 통합된 하나의 FileEntity 테이블이 있고, 이 파일은 다양한 비즈니스 도메인에 걸쳐 사용됩니다:공지사항 첨부파일 (일반 / 파트너사 전용)일반 파트너 등록 서류제휴 파트너 등록 서류각종 정산 증빙 및 보안 파일문제는 각 도메인마다 권한 검증 로직이 전부 다르다는 것이었습니다. 어떤 파일은 단순한 '읽기' 권한만 체크하면 되지만, 어떤 파일은 사용자의 소속 회사, 파트너 등급, 심지어 특정 데이터베이스 상태까지 조인해서 확인해야 했습니다.다운로드 엔드포인트는 단 하나..
Spring Boot에서 대용량 Excel을 SAX로 파싱하기 — XSSFWorkbook의 한계를 넘어서 배경Spring Boot 기반 백엔드를 개발하다 보면 관리자가 xlsx 파일을 업로드해서 대량 데이터를 등록하는 요구사항을 자주 만난다. 처음엔 Apache POI의 XSSFWorkbook으로 간단히 구현했는데, 파일 크기가 커질수록 메모리 문제가 생겼다. 이 글은 그 과정에서 SAX 스트리밍으로 전환한 경험을 정리한 것이다.문제 인식 — XSSFWorkbook의 메모리 구조XSSFWorkbook은 DOM 방식이다. 파일 전체를 한 번에 읽어 메모리에 트리 구조로 올린다.// 기존 DOM 방식Workbook workbook = new XSSFWorkbook(inputStream); // 파일 전체가 힙으로Sheet sheet = workbook.getSheetAt(0);for (Row row : she..
Spring Security 대규모 트래픽을 고려한 고성능 RBAC 권한 관리 시스템 구축기 (Redis 캐싱 & Hybrid 전략) [DevLog] Spring Security와 Redis로 구축한 고성능 RBAC 시스템0. 들어가며: 단순 Role의 한계와 RBAC의 필요성초기 프로젝트는 ADMIN, MEMBER 같은 단순한 역할(Role) 만으로 접근 제어가 가능했습니다. 하지만 시스템이 고도화되면서 요구사항은 점차 복잡해졌습니다."영업팀 김 대리는 '공지사항'은 읽을 수만 있고, '영업 실적' 메뉴는 엑셀 다운로드까지 가능해야 합니다."단순 Role(ROLE_ADMIN)만으로는 메뉴별로 세분화된 기능(Read, Write, Delete, Excel)을 제어할 수 없었습니다. 그렇다고 매 API 요청마다 DB에서 복잡한 권한 테이블을 조인해서 가져오는 건 성능상 허용될 수 없었습니다.오늘 저는 Spring Security와 Red..
실전 Redis 도입 가이드: 아키텍처 선정부터 redis.conf 최적화까지 서비스의 권한 관리 시스템이 복잡해짐(N:M 구조)에 따라, 기존의 Stateless JWT 방식에서 Redis를 활용한 Hybrid 방식으로 전환하기로 결정했습니다. 오늘은 이 과정에서 고민했던 배포 아키텍처와 Docker 구성, 그리고 운영 환경에서 필수적인 redis.conf 설정 내용을 정리해 봅니다.1. Redis 배포 아키텍처 선정Redis를 도입하기 앞서, 우리 프로젝트 규모에 맞는 구성 방식(Architecture)을 먼저 고민했습니다.1-1. 구성 방식 비교구성 방식구조특징적합한 상황Standalone서버 1대설정이 가장 간단함. SPOF(단일 장애점) 존재.개발 및 초기 운영ReplicationMaster + Replica읽기 성능 분산(Read Scaling). 자동 장애 복구 불가...
🚀 동적 권한 관리, JWT에 다 넣을까? 매번 DB를 조회할까?(feat. N:M 권한 구조에서의 Stateless vs Stateful 아키텍처 고민) [JWT] 복잡한 권한 관리(RBAC), DB 조회 vs 토큰 탑재 중 정답은?서비스가 고도화되면서 단순한 ROLE_ADMIN, ROLE_USER 수준의 역할 기반 접근 제어(RBAC)로는 부족함을 느끼게 되었습니다. 결국 "사원(N) : 권한 그룹(M) : 상세 권한(N)"으로 이어지는 동적 권한 관리(Dynamic Permission) 시스템을 도입하기로 결정했습니다.하지만 설계 단계에서 큰 딜레마에 빠졌습니다."이 수많은 권한 정보를 어디서 검증해야 할까?"오늘은 JWT 토큰 기반 환경에서 복잡한 권한을 처리하는 두 가지 전략(Stateless vs Stateful)을 비교하고, 우리가 선택해야 할 방향에 대해 정리해 봅니다.1. 문제의 정의: N:M 구조의 복잡성우리가 구현하려는 모델은 사원이 여..
Spring Boot API 개발 중 겪은 "어? 이게 왜 이러지?" 2가지 해결기 (JSON 필드명, Auto Increment) API를 개발하다 보면 코드는 분명 맞게 짠 것 같은데, 결과가 예상과 다르게 나와 당황스러울 때가 있습니다. 오늘은 제가 최근 프로젝트를 진행하며 겪었던 두 가지 '소확당'(소소하지만 확실히 당황스러운) 이슈와 그 해결 방법을 공유합니다.isUsed가 왜 used로 나가니? (JSON 직렬화 이슈)부서 관리 API를 만들면서 DepartmentResponse DTO에 사용 여부를 나타내는 필드를 추가했습니다. 분명 변수명을 isUsed로 지었는데, 프론트엔드에서 "isUsed 필드가 없어요!"라는 연락을 받았습니다.😱 문제 상황작성한 코드 (DTO) @Getter public class ResponseDto { // ... private boolean isUsed; // 분명 isUsed로 선..