전체 글(208)
-
Saga 패턴
🌀 Saga 패턴 개념 정리상황: 주문 → 결제 → 재고 차감 → 배송문제: 서비스마다 DB가 다르므로 "한 번에 커밋/롤백"이 불가능 ❌해결: 각 서비스는 자신의 로컬 트랜잭션만 처리하고, 실패 시 보상 트랜잭션을 실행 → 전체 일관성 유지👉 구현 방식 2가지Choreography (이벤트 기반, 각 서비스가 이벤트 듣고 반응)Orchestration (중앙 오케스트레이터가 순서 관리)✅ 예제: 주문 → 결제 → 재고 차감Choreography 방식(Kafka 이벤트 기반)1. 주문 서비스 (Order Service)// 주문 생성 후 Kafka 이벤트 발행@Service@RequiredArgsConstructorpublic class OrderService { private final Ord..
2025.08.26 -
클라우드 네이티브 마이크로서비스 아키텍처
1. 클라우드 네이티브 (Cloud Native)정의: 클라우드 환경(예: AWS, Azure, GCP, Kubernetes)에 최적화되도록 설계된 애플리케이션 개발/운영 방식핵심 특징컨테이너 기반 → Docker, Kubernetes 등을 이용해 애플리케이션을 독립적 단위로 실행탄력적 확장 → 트래픽 증가 시 자동으로 스케일 아웃(서버 개수 증가)자동화된 배포/운영(CI/CD) → 코드 변경이 빠르게 프로덕션까지 전달관찰 가능성(Observability) → 로그, 메트릭, 트레이싱을 통해 모니터링/장애 대응불변 인프라 → 서버 수정이 아니라 새로운 인스턴스를 배포하는 방식 (Immutable Infrastructure)2. 마이크로서비스 아키텍처 (Microservices Architecture)정의..
2025.08.26 -
Redis 분산
✅ 1. Redis 분산락이란?여러 사용자가 동시에 같은 리소스를 조작하려고 할 때,오직 1명만 먼저 락(lock)을 잡고 나머지는 대기하거나 실패하게 만들어데이터 충돌이나 중복 처리를 방지하는 기술입니다.보통 Redisson 라이브러리를 통해 Java에서 구현합니다.✅ 2. Redis & Redisson 기본 세팅🔧 1) Redis 설치 (로컬 테스트용)가장 추천: 도커(Docker)로 실행① Docker 설치https://www.docker.com/products/docker-desktop/설치 후, Docker Desktop 실행② Redis 컨테이너 실행docker run --name redis -p 6379:6379 -d redis 🔧 2) Gradle 의존성 추가implementation ..
2025.08.03 -
낙관적 락 (Optimistic Lock), 비관적 락 (Pessimistic Lock)
✅ 1. 개념 비교구분 낙관적 락 (Optimistic Lock) 비관적 락 (Pessimistic Lock)전제“충돌이 잘 안 날 거야”“충돌이 자주 날 거야”접근 방식먼저 수정 → 충돌 났는지 확인수정 전에 잠금부터락 방식락 없음 (버전으로 충돌 감지)DB에 락 걸림 (for update)성능충돌이 적을 때 유리충돌이 많을 때 유리트랜잭션 충돌 시예외 발생 → 재시도대기 or 블로킹DB 부하낮음높음 (락, 블로킹) ✅ 2. 낙관적 락 (Optimistic Lock)🔸 특징실제 락을 걸지 않음대신 버전 번호(version)를 사용해서 충돌 여부를 확인JPA에서는 @V..
2025.08.03 -
@Transactional(readOnly = true)
조회만 하는 쿼리에 @Transactional(readOnly = true) 사용@Transactional(readOnly = true)public UserDto getUser(Long id) { return userRepository.findById(id);} 🔹 readOnly = true 를 붙이면 다음과 같은 이점이 있어요:효과 설명Flush 방지JPA는 트랜잭션 커밋 전에 변경사항을 flush함 → readOnly면 생략성능 최적화Hibernate, JPA가 dirty checking을 하지 않음일부 DB 드라이버 최적화(예: Oracle) 읽기 전용 힌트를 전달하기도 함명시적 의미 전달해당 메서드는 ..
2025.08.03 -
Lazy Loading
✅ Lazy Loading이란?연관된 엔티티를 즉시 가져오지 않고, 실제로 사용할 때(load 시점에) 쿼리를 날려서 로딩하는 방식입니다.즉,A 객체를 가져오면서,A가 가지고 있는 B 객체(예: 연관된 리스트, 다른 엔티티)는 “지금 필요 없으면 안 가져옴”대신, 진짜 그걸 사용할 때 SELECT 쿼리를 실행해서 가져옴 ✅ 예시@Entitypublic class User { @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) private List orders;}@Transactionalpublic void example() { User user = userRepository.findById(1L).get(); // 여기서 orders는 로딩..
2025.08.03