728x90
반응형
saveOrUpdate 구현 시 동시성 이슈2025-06-02 01:12:19기존 코드@Tarnsactionalpublic Long saveOrUpdate(CodePostBookmarkSaveRequestDto requestDto, String email) { Member member = memberCommand.findByEmail(email); Optional existingBookmark = codePostBookmarkRepository.findById(requestDto.codePostId(), member.getId()); return existingBookmark .map(CodePostBookmark::update) .orElseGet(() -> codePostBookmarkReposito..
초당 수천 건의 결제를 처리하는 API 만들기2025-05-28 01:33:42✅ 목표: 트래픽 처리를 위한 큐/비동기 처리 학습요구 사항POST /payments 로 결제 요청을 받는다.내부에서 큐 (예: ConcurrentLinkedQueue) 또는 비동기 작업으로 저장/처리동시에 100000개의 요청을 보내도 처리 가능해야 함처리 시간과 결과 로그 기록🔧 키워드: @Async, ThreadPoolTaskExecutor, ConcurrentLinkedQueue, ExecutorService, CountDownLatch✅ 개발 환경Java 버전: Java 17 (최신 LTS)Spring Boot: 3.x (Spring Web 사용)빌드 도구: Gradle 또는 Maven (Gradle 추천)IDE: IntelliJ IDEA (Community Edition 이상)✅ 필수 라이브..
단순 CRUD를 넘어 진짜 백엔드로 가는 길2025-05-27 14:35:41✅ 학습할 주제 정리1. 고성능 트래픽 처리Java: Thread, ExecutorService, CompletableFuture, ReentrantLock, synchronized 등 동시성 제어Spring: WebFlux 기본 개념 (reactive)기타: Rate Limiting, Queue 기반 처리, Load Shedding 개념2. 정산 로직 및 정확한 계산Java: BigDecimal, 날짜 및 시간 처리 (LocalDateTime, ZonedDateTime)Spring: Batch 처리 (Spring Batch)기타: 트랜잭션 관리, 분산 락 (e.g. Redis-based Lock)3. 무중단 배포 및 MSA 환경Java: 인터페이스 분리, 모듈화 설계Spring: Spring Cloud..
어떤 이유로 코루틴을 사용한 작업 처리가 기존 스레드 방식보다 가벼운지 설명해주세요.2025-05-26 13:00:11메모리 사용량 차이스레드: 각 스레드는 자체 스택 메모리를 필요로 하며, JVM에서 기본적으로 약 1MB의 스택 크기를 할당합니다. 이 메모리는 스레드가 생성될 때 예약되며 스레드가 종료될 때까지 유지됩니다.코루틴: 코루틴은 스레드 내에서 실행되며 자체 스택을 필요로 하지 않습니다. 일반적으로 코루틴은 단지 몇 KB의 메모리만 사용합니다.컨텍스트 스위칭 비용스레드: 스레드 간 전환은 운영체제 수준의 컨텍스트 스위칭을 필요로 하며, 이는 CPU 레지스터, 메모리 맵 등의 상태를 저장하고 복원하는 비용이 큽니다.코루틴: 코루틴 간 전환은 운영체제의 개입 없이 사용자 공간(user space)에서 발생하며, 단순히 실행 지점과 로컬 변수 상태만 heap 메모리에 저장하면 됩니다. 생성 및 관리 비용스레드: 새..
🔍 Java 동시성 제어와 테스트 로드맵 요약2025-05-23 21:47:131. ReentrantLock 기본 개념과 사용 이유🔑 개념ReentrantLock은 Java의 java.util.concurrent.locks 패키지에 속한 클래스입니다.synchronized 키워드보다 세밀한 락 제어가 가능하며, 재진입(reentrant)을 지원합니다.✅ 장점락 획득 시도 (tryLock)락 대기 시간 지정 (tryLock(timeout, TimeUnit))공정성 정책 설정 가능 (FIFO 순서 등)✅ 기본 사용 예ReentrantLock lock = new ReentrantLock();lock.lock(); // 락 획득try { // 임계 영역} finally { lock.unlock(); // 락 해제}2. tryLock() vs lock() 차이점메서드설명lock..
Java에서 ReentrantLock을 활용한 동시 입금 제어 및 실패 테스트 정리2025-05-23 21:20:27동시 입금 요청이 들어왔을 때, 하나만 성공하고 나머지는 실패하도록 제어하는 로직을 테스트하던 중 예상과 다르게 모든 요청이 처리되는 문제가 있었다. 아래는 해당 이슈를 해결한 과정이다.🧩 문제 상황다음은 특정 사용자 계좌에 입금을 처리하는 credit 메서드이다.입금 시 ReentrantLock을 활용해 동시에 여러 요청이 처리되지 않도록 제어하고 있다. public Wallet credit(Long id, int amount) { checkAmount(amount); ReentrantLock lock = getReentrantLock(id); boolean locked = lock.tryLock(); if (!locked) { throw new HttpClientE..
💼 프로젝트 과제 예제: “은행 계좌 관리 시스템”2025-05-21 15:59:22다음은 GPT를 통해 계좌 시스템에 관련되어 토이 프로젝트를 구현해보기 위해 요구한 과제 개요이다.서비스 설계 및 개발 역량을 기르기 위한 계좌 관리 시뮬레이션 예제입니다.특히 동시성 문제, 락 처리, 트랜잭션 일관성 등 백엔드 핵심 개념을 직접 다뤄볼 수 있도록 구성했습니다.🧩 요구사항📌 기능 설명GET /wallet/{id}/balance→ 특정 사용자 계좌의 현재 잔액을 조회합니다.POST /wallet/{id}/credit→ 계좌에 금액을 입금합니다. 입금 처리 로직을 완성하세요.POST /wallet/{id}/debit→ 계좌에서 금액을 출금합니다.출금 요청 금액이 현재 잔액보다 클 경우 실패 처리되어야 합니다.⚙️ 동시성 제약 조건✅ 동일 사용자에게 동시에 2개 이상의 입금 요청이 들어올 ..
RDB에서 페이징 쿼리의 필요성을 설명해 주세요.2025-05-19 12:23:56페이징 쿼리(Paging Query) 는 전체 데이터를 부분적으로 나누어 데이터를 조회하거나 처리할 때 사용됩니다.데이터를 상대적으로 작은 단위로 나누어 처리하기 때문에 데이터베이스나 애플리케이션의 리소스 사용 효율이 증가하며, 로직 처리 시간을 단축 시킬 수 있습니다.MySQL에서 페이징 쿼리는 일반적으로 LIMIT, OFFSET 구문을 사용하여 작성합니다.select *from subscribelimit 500offset 0;LIMIT, OFFSET 방식 페이징 쿼리의 단점은 무엇이고, 어떻게 해결할 수 있나요?LIMIT, OFFSET 방식의 페이징 쿼리는 뒤에 있는 데이터를 읽을 수록 점점 응답 시간이 길어질 수 있는데요.왜냐하면, DBMS는 지정된 OFFSET 수만큼 모든 레코드를 읽은 이후에 데..
728x90
반응형