Category
백엔드
Spring, JPA, 인증, 아키텍처 · 38개의 글
-
아웃박스로 EDA를 시작하며 마주한 네 가지 질문
Transactional Outbox를 도입하며 payload, event_type 네이밍, 하위호환성, 버저닝 전략을 어떻게 정했는지 정리합니다.
-
학습 기록: gRPC와 Protocol Buffers, 그리고 그 너머
proto 계약 저장소를 읽으며 gRPC와 Protocol Buffers의 층위를 구분하고, 코드 생성, 이진 인코딩, 스트리밍 모드, 스키마 진화, 대안 기술까지 정리한다.
-
레거시 API를 한 번에 갈아엎으려다 멈춘 이유
Go/Gin 레거시 API를 Spring Boot로 이관하려다 빅뱅 컷오버 대신 path-based Strangler Fig 방식으로 방향을 바꾼 과정을 회고합니다.
-
모듈러 모놀리스와 Spring Modulith 학습 기록
Spring Boot 기반 WAS에서 모듈러 모놀리스를 선택하는 이유와 Spring Modulith로 모듈 경계, public API/internal 규칙, 이벤트, 검증 테스트를 어떻게 다룰지 정리합니다.
-
Spring Boot 4 Java WAS 서버 학습 정리
Java 기반 Greenfield WAS 서버를 Spring Boot 4로 구축할 때 우선 확인할 starter 구성, MVC API 설계, HTTP Service Clients, API Versioning, 관측성, RestTestClient, Jackson 3, Virtual Threads를 정리합니다.
-
부채 해결 회고: MSA로 넘어가기 전에 무엇을 고치고 무엇을 일부러 남겼나
Phase 4 MSA 전환을 앞두고 22개의 기술 부채를 트리아지하고, 즉시 고칠 항목과 의도적으로 남길 항목을 나눈 기준을 회고합니다.
-
PeekCart 학습 기록 19: "조건부 UPDATE 한 방"이면 분산 락이 필요 없을까
단일 행 재고 차감에서 조건부 UPDATE, Redis 분산 락, JPA 낙관적 락의 적정 구간을 비교하고 PeekCart에 남길 ADR 판단 기준을 정리합니다.
-
PeekCart 학습 기록 18: Phase 4로 넘어가기 전에 - 글을 쓰다 발견한 22개의 부채
Phase 4 MSA 진입 전에 글쓰기 과정에서 드러난 22개의 기술 부채를 보안, 관측성, 발행 경로, 동시성, CI와 배포 관점에서 정리합니다.
-
PeekCart 학습 기록 16: 캐시 효과를 어떻게 증명할까
Redis Cache Aside 도입 효과를 GKE 부하 테스트에서 캐시 ON/OFF 단일 변수 실험으로 검증하고, 목표 x3에 못 미친 x2.31 결과를 baseline으로 남긴 과정을 정리합니다.
-
PeekCart 학습 기록 13: "내 머신에선 되는데"를 닫는다 - CI와 Docker 이미지 빌드
PeekCart의 GitHub Actions CI, Testcontainers 통합 테스트, 멀티스테이지 Docker 이미지 빌드, GHCR 발행 흐름과 검증 공백을 정리합니다.
-
PeekCart 학습 기록 12: Pod이 셋이면 스케줄러도 셋이 돈다 - ShedLock
여러 Pod에서 중복 실행되는 Spring 스케줄러를 ShedLock과 MySQL 락 레코드로 조율하는 원리, 설정, SQL, 한계를 정리합니다.
-
PeekCart 학습 기록 11: 같은 이벤트가 두 번 왔다 - Consumer 멱등성과 DLQ
Kafka의 at-least-once 전달에서 생기는 중복을 Consumer 멱등성으로 흡수하고, 재시도해도 처리할 수 없는 메시지를 DLQ로 격리하는 흐름을 정리합니다.
-
PeekCart 학습 기록 10: DB는 커밋됐는데 이벤트가 사라진다면 - Kafka와 Transactional Outbox
Kafka 발행과 DB 저장 사이의 dual-write 문제를 Transactional Outbox로 줄이고, polling, at-least-once, Debezium CDC의 트레이드오프를 정리합니다.
-
PeekCart 학습 기록 9: 오버셀링을 두 겹으로 막기 - 분산 락과 낙관적 락
Redis 분산 락과 JPA 낙관적 락을 함께 사용해 재고 오버셀링을 막는 이유, 트랜잭션 경계의 한계와 테스트 범위를 정리합니다.
-
PeekCart 학습 기록 8: 상품 조회를 캐시 뒤로 옮기기
PeekCart의 상품 목록과 상세 조회를 Redis Cache Aside로 옮기며 재고 제외, self-invocation 회피, 목록 캐시 무효화, CachedPage 래퍼를 정리합니다.
-
PeekCart 학습 기록 7: 15분 후에 돌아와서 주문을 취소하는 일
PeekCart의 결제 타임아웃 스케줄러, REQUIRES_NEW 건별 트랜잭션, 상태 경합 격리, ShedLock 도입 이유를 정리합니다.
-
PeekCart 학습 기록 6: 알림 발송이 실패해도 주문은 살아남아야 한다
PeekCart Notification 도메인의 Kafka Consumer 전환, SlackPort 위치, 멱등성, Slack Webhook 실패 격리, Phase 4 MSA 분리를 정리합니다.
-
PeekCart 학습 기록 5: 결제 승인이 실패하면 누가 주문을 취소하는가
PeekCart의 Payment 생성, Toss 결제 승인 실패 처리, Outbox 이벤트, 웹훅 멱등성, Order 상태 연결을 정리합니다.
-
PeekCart 학습 기록 4: 주문 생성 트랜잭션 안에서는 어떤 일이 일어나는가
PeekCart의 장바구니부터 주문 생성, 가격 스냅샷, 주문 상태 전이, 취소와 보상 트랜잭션 흐름을 정리합니다.
-
PeekCart 학습 기록 3: 상품과 재고는 왜 따로 관리해야 할까
PeekCart의 Product와 Inventory 분리를 재고 동시성, 낙관적 락, Redis 분산 락, 캐싱 전략 관점에서 정리합니다.
-
PeekCart 학습 기록 2: 인증, 인가의 갈림길에서 무엇을 선택할 수 있을까
PeekCart의 인증과 인가 설계를 비밀번호 저장, JWT, 토큰 회수, 재발급 전략, 서비스 간 신뢰 관점에서 정리합니다.
-
PeekCart 학습 기록 1: 4-Layered + DDD 구조를 어떻게 읽어야 할까
PeekCart의 단일 Spring Boot 모놀리스 구조를 4-Layered Architecture, DDD, Hexagonal, Clean Architecture와 비교하며 읽어봅니다.
-
Spring Boot에서 MDC 로깅 필터는 어떻게 동작할까?
트래픽이 많은 Spring Boot 서버에서 요청별 로그를 추적하기 위해 MDC와 Servlet Filter가 어떻게 연결되는지 정리합니다.
-
PeekCart 학습 기록 0: 왜 모놀리스에서 MSA로 가는 흐름을 먼저 봐야 할까
PeekCart를 MSA 프로젝트로 바로 보기 전에, 모놀리스에서 출발해 단계적으로 문제를 확인하는 흐름을 정리합니다.
-
접근 범위를 제한해서 보안 강화시키기
AWS, GCP 등 다양한 클라우드 플랫폼에서 활용되는 필수적인 보안 정책으로 무언가에 액세스 할 때 필요한 최소한의 권한만 가지도록 제한하는 보안 원칙이다. 이 원칙에 따라 불필요한 권한을 제거하여 보안 사고를 예방할 수 있다. PoLP를 어긴 예시 AWS 클라우드에서의
-
SpringBoot 애플리케이션에 .env 통합하는 방법 세가지
안녕하세요. 저는 요즘에 합세랑 솦커톤, 과제로 인해서 프로젝트를 새로 세팅해야 하는 상황이 많았는데요! 특히 환경 설정을 하면서 환경 변수를 분리하게 되는데 저는 분리하는 방법이 다양하다고만 알고 있지 어떤 장단점이 있는지 모르고 그냥 익숙한 방법을 쓰고 있었습니다.
-
서버 개발자가 알아야 하는 회원 정책과 개인정보 처리방침
개발자라면 매번 구현하게 되는 회원관리 로직. 아이디, 비밀번호, 이메일 입력받고 DB에 저장하면 끝이 아닙니다. 회원 정보는 개인정보이고 이를 다루는 순간 법적 책임이 생깁니다. 실제로 개인정보보호법을 위반하면 최대 5년 이하 징역 또는 5천만원 이하의 벌금이 부과될 수
-
Spring WebSocket + Google STT 구조 설계: 실시간 음성 인식 피드백 시스템 만들기 (1)
실시간 음성 인식 서비스를 만든다고 했을 때, 가장 먼저 떠오르는 건 "STT API"일지도 모른다.하지만 정말 중요한 건 API를 언제 어떻게 호출하고,사용자 음성을 실시간으로 전달하고,그 결과를 사용자에게 다시 어떻게 돌려주는가 하는 데이터 흐름의 구조다. 이 글은 내가
-
Spring WebSocket + Google STT 구조 설계: 실시간 음성 인식 피드백 시스템 만들기 (2)
이전 글 요약:1편에서는 WebSocket 기반 구조 설계, SttSessionContext, SttSessionManager를 통해사용자 세션을 어떻게 분리하고 안전하게 유지할 수 있는지에 대해 다뤘다. 이번 글에서는 **Google Cloud Speech-to-Text
-
JWT 인증의 보안 고도화 전략 – 단순 토큰에서 실전 대응까지
최근 백엔드 개발에서는 JWT(Json Web Token)를 활용한 인증 방식이 일반화되고 있습니다. RESTful API, SPA(Single Page Application), 모바일 앱 등 다양한 아키텍처에서 세션 기반 인증보다 JWT가 선호되는 이유는 분명합니다. 하지만
-
Spring Boot SSR 환경에서 JWT 사용의 적절성에 대한 고찰
Spring Boot 기반의 SSR(Server-Side Rendering) 웹 애플리케이션에서 인증 및 인가 기능을 구현할 때, JWT(Json Web Token)를 사용할 것인지, 혹은 세션(Session) 기반 인증을 사용할 것인지에 대한 선택은 매우 중요하다. 최근
-
Spring Boot로 로그인을 구현해보기 1
스프링 공부를 시작한지 어언 1달 지금 나는 그동안 따로 유튜브 강의를 보거나 선배님들의 대면 세션 및 과제를 수행하면서 자신감과 스프링에 대한 애정이 오를대로 오른 상태이다. 그래서 이번에 스프링 프로젝트의 첫 걸음으로 스프링 로그인 기능을 만들어보기로 했다. 그 여정을
-
Spring Boot 프로젝트에 Redis를 도입하며
현재 Spring Boot를 기반으로 웹 애플리케이션을 개발하고 있는 학생으로서, 이번 프로젝트를 진행하면서 Redis를 처음으로 도입하게 되었다. 그간 이름만 익숙했을 뿐, 실제로 사용해 본 경험은 없었기에 Redis가 무엇인지, 왜 필요한지, 그리고 Spring
-
스프링 annotation, 의존성 정리
어노테이션 설명 어노테이션 설명 어노테이션 설명 어노테이션 설명 어노테이션 설명 어노테이션
-
스프링의 ORM 표준과 JPA
요즘은 대부분의 서비스를 개발할 때 데이터를 저장하고 빠르게 읽어오기 위해 데이터베이스를 사용하는데 사용되는 데이터베이스의 대부분은 RDB(관계형 데이터베이스)이다. 객체를 관계형 데이터 베이스에 빠르게 저장하는 방법이 없을까 하는 개발자들의 고민의 ORM의 시작이었다.
-
[Spring] MVC와 REST API 차이
MVC와 REST API에 대해 알아보려고 한다. 개념 공통점 1. 역할 분리 (Separation of Concerns) 두 아키텍처 모두 기능별로 역할을 나누어 구조화한다. 2. 클라이언트-서버 구조 MVC든 REST API든 기본적으로 클라이언트-서버 구조이다. 3.
-
소셜 로그인 OAuth 플로우를 이해해보자
현재의 소셜 로그인의 대부분은 OAuth2.0 인증 방식을 기반으로 동작한다 OAuth는 유저가 다른 서비스에 내 비밀번호를 주지 않고 다른 곳이 이미 있는 자신에 정보에 대해 그 사이트가 접근할 수 있도록 허용하는 절차이다. OAuth2.0 인증 방식은 위와 같은 흐름을
-
python django 프로젝트에서 네이버 로그인 api 활용해 보기
이번엔 프로젝트를 진행하면서 만들게 됐던 python django에서 네이버 로그인 기능 구현하는 법을 알아보자 네이버 로그인을 구현한다는 건 시작 전에는 어려워보이지만 막상 해보면 네이버 개발자들이 만들 서비스에 숟가락만 얹는 것임을 알 수 있다. 먼저 Naver