전체 글54 [DB] JPA Dirty Checking에서 Lost Update가 발생하는 이유 사내 서비스에서 동시성 문제를 해결한 경험이 있었다.기존에는 JPA의 Dirty Checking을 사용해 데이터를 수정하고 있었는데, Atomic Update 방식으로 변경하자 문제가 해결되었다. 그런데 한 가지 의문이 생겼다. 두 방식 모두 결국 데이터를 수정하는 코드인데, 왜 하나는 동시성 문제가 발생하고 다른 하나는 발생하지 않을까? JPA Dirty Checking을 사용한 코드에는 @Transactional도 적용되어 있었고, 코드만 봐서는 특별한 문제가 없어 보였다.왜 트랜잭션을 사용했는데도 동시성 문제가 발생했을까?Atomic Update는 무엇이 달라서 문제를 해결할 수 있었을까? 이번 글에서는 그 원인과 해결 과정을 정리해보려고 한다.1. 문제 상황다음은 실제로 많이 작성하는 JPA 코드.. 2026. 6. 29. [DB] 데이터베이스 락(DB Lock)에 관하여 💡 최근에 동시성 문제를 해결한 적이 있다. 수많은 요청이 동시에 하나의 데이터를 수정하려고 할 때 발생하는 동시성 문제는 데이터베이스 락(DB Lock)으로 해결할 수 있었으나 해당 개념의 이해도가 떨어져 빠르게 해결하지 못했었다. 따라서, 데이터베이스 락에 대해 정리하며 개념을 이해해보고자 한다.1. 락(Lock)이 없다면 무슨 일이 벌어질까? (갱신 손실 문제)DB Lock이 왜 필요한지 이해하려면 Lock이 전혀 없는 상황을 먼저 확인해 볼 필요가 있다. DB에 재고가 1개 남은 한정판 신발이 있다고 가정하자.이때 사용자 A와 사용자 B가 거의 동시에 '구매하기'버튼을 누른다.사용자 A가 DB에서 재고를 조회한다.(현재 재고: 1)거의 같은 시점에 사용자 B도 재고를 조회한다.(현재 재고: 1).. 2026. 2. 27. [트러블슈팅] 504 Gateway Timeout : 15초→0.1초 성능 개선기 💡 입사 6개월 차, 당시 사내 유일한 백엔드 개발자였던 제가 실제 커머스 서비스 장애를 겪고, 아키텍처 개편과 쿼리 최적화를 통해 서비스를 개선한 경험을 정리한 회고록에 가까운 글입니다. 공포의 "504 Gateway Timeout"문제는 앱 서비스를 웹 플랫폼으로 전환하여 서비스를 오픈한 지 보름정도 된 시점에 발생했다. 본격적으로 서비스를 운영하기 위해 고객들에게 이벤트성 쿠폰을 보내며 플랫폼 접근성을 높여가던 때, 상품 페이지 접근이 되지 않는다는 문의가 다수 발생하였다. 게다가 원인을 찾을 새도 없이 504 Gateway Timeout이 발생하여 서버가 다운되고 말았다.삽질의 서막: 이거 서버 문제 아냐?당시 경험이 부족한 6개월 차 개발자였던 나는 대표님의 말씀"이거 서버 문제 아니야? 서.. 2025. 11. 5. [트러블슈팅] 트랜잭션이요? 알죠! o.o (... 전혀 모르겠어) 💡 이 글은 트랜잭션을 사용하면서 겪은 지극히 개인적인 일(초보적인 실수)에 대해 정리한 글입니다.이론적인 설명보다는, 실무에서 부딪히고 깨지며 얻은 날것의 깨달음을 중심으로 작성했습니다.문제의 시작: 단순했던 나의 생각대량 등록 API를 개발하던 중, 다음과 같은 요구사항이 생겼다..“작업의 성공 여부와, 실패한 경우 그 원인을 DB 로그로 남겨야 한다.” 나는 아주 단순하게 생각했다.'전체 로직을 try-catch로 감싸고, 예외가 터지면 catch 블록에서 실패 로그 상태를 업데이트하면 되잖아?'@Transactionalfun postBatchProduct(...) { val bulkUploadLog = bulkUploadLogService.createBulkUploadLog(... PEND.. 2025. 8. 17. [Spring] 따닥으로 인한 중복 요청 방지하기 - 2 https://hyeri-dev.tistory.com/55 에서 이어집니다. 💡 Kotlin + Spring boot로 작성된 글입니다. 1. 문제@PatchMapping("/{order-id}")fun cancelOrders( httpRequest: HttpServletRequest, @AuthenticationPrincipal user: User, @PathVariable("order-id") orderId: String): ResponseEntity> { // 중복요청인지 확인 duplicateRequestService.isDuplicateRequest( user = user, request = httpRequest ) // 실질적인 비즈니스 로직 val response = or.. 2025. 7. 22. [Spring] 따닥으로 인한 중복 요청 방지하기 - 1 💡 Kotlin + Spring boot 로 작성된 글입니다.1. 문제사내 서비스에서 일명 따닥으로 인하여 중복 요청이 들어오는 경우가 발생하였다. GET 요청은 멱등성을 보장하기 때문에 큰 문제가 발생하지는 않지만, POST, PATCH 와 같은 데이터의 변경이 있는 요청에는 여러가지 문제가 발생할 수 있다.사내에서 발생한 문제는 결제가 정상적으로 취소되었음에도 불구하고 중복 요청에 의하여 Exception이 발생하였고 요청 실패 창이 뜨는 문제였다. 사용자 입장에서는 정상적으로 처리되지 않았다는 인식을 하게 되어 관련된 문의가 다수 발생하였다.해당 문제는 화면단에서도 처리 해야 하는 문제이지만 서버 내부에서도 체크할 필요가 있다고 판단하여 작업을 진행하였다.2. 요구사항문제를 해결하기 위한 방안에.. 2025. 7. 20. 이전 1 2 3 4 ··· 9 다음