InnoDB 락 모드. RECORD, X, GAP, REC_NOT_GAP의 관계
performance_schema.data_locks를 조회하면 LOCK_TYPE과 LOCK_MODE라는 두 컬럼이 나온다. 이 글을 읽으면 각 값이 무엇을 잠그는지, 서로 어떤 관계인지, 왜 이렇게 설계되었는지를 이해할 수 있다. 먼저 혼동을 정리하자 data_locks 테이블의 결과를 처음 보면 이런 의문이 생긴다. | LOCK_TYPE ...
performance_schema.data_locks를 조회하면 LOCK_TYPE과 LOCK_MODE라는 두 컬럼이 나온다. 이 글을 읽으면 각 값이 무엇을 잠그는지, 서로 어떤 관계인지, 왜 이렇게 설계되었는지를 이해할 수 있다. 먼저 혼동을 정리하자 data_locks 테이블의 결과를 처음 보면 이런 의문이 생긴다. | LOCK_TYPE ...
TCP 3-way Handshake와 Connect Timeout TCP 3-way Handshake란 HTTP 요청을 보내기 전에, 클라이언트와 서버는 먼저 TCP 연결을 수립해야 합니다. 이 과정이 3-way Handshake입니다. 클라이언트 서버 | ---- SYN --------> |...
리뷰 복사 기능은 상위리뷰 데이터를 그대로 복사하는 기능으로, 데이터 양에 따라 최대 2시간 이상 소요되는 무거운 작업이에요. 이 기능을 동기 API에서 Kafka 기반 비동기 처리로 마이그레이션한 과정을 공유합니다. 왜 비동기 처리가 필요했나? 기존에는 리뷰 복사 요청이 들어오면 API 서버에서 직접 복사 작업을 수행하고, 완료될 때까지 응답...
TL;DR Kafka 컨슈머들이 동일 테이블에 DELETE + INSERT를 병렬로 수행하면서 REPEATABLE READ의 gap lock 때문에 데드락이 발생했다. 처음에는 서브쿼리가 원인이라고 판단했다. 하지만 performance_schema.data_locks로 실제 락을 비교한 결과, 서브쿼리 제거는 효과가 없었다. 근본 원인은 격리 수...
문자열 키(“korName”)로 객체의 프로퍼티 값을 가져와야 한다면, 어떻게 하시겠어요? 리플렉션? ObjectMapper? 이 글에서는 Spring MVC가 @ModelAttribute에서 사용하는 BeanWrapper를 인사카드 시스템에 활용한 경험을 공유합니다. 왜 런타임에 필드를 결정해야 했나? API 응답 구조의 특징 클라이언트에 내...
문제 상황 로컬 환경에서 할일 알림이 DB에 저장되지 않는 문제가 발생했습니다. 신기하게도 DEV, PROD 환경에서는 정상적으로 동작하고 있었고, 최신 DB 스냅샷과 dev 브랜치로 업데이트해도 문제가 지속되었습니다. 디버깅 과정 먼저 디버거를 통해 데이터 흐름을 확인했습니다. 디버깅 결과 데이터가 정상적으로 저장되는 것을 확인할 수 있...
들어가며 서비스를 운영하면서 크고 작은 장애들을 경험했다. 처음엔 당황스러웠지만, 이제는 어느 정도 패턴이 보이기 시작했다. 특히 “코드를 어느 계층에서 수정해야 할까?”라는 고민이 가장 어려웠는데, 나름의 판단 기준을 정리해보고자 한다. 주요 장애 유형 지금까지 경험한 장애 유형들이다. 비즈니스 로직 오류 (70%) - VOC, QA...
6개월간의 취준 끝. 2024년 8월 초부터 12월까지 flab 멘토링을 들은 후, 4월까지 취준을 마치고 원하는 조건들을 갖춘 서비스회사에 인턴을 시작했다. flab이 개발 방향을 잡는데에 가장 큰 역할을 했기에, 오랜만에 회고를 해보려한다. 멘토링을 시작하게 된 계기 나는 예전부터 멘토링 방식의 학습을 선호해왔다. 학교 멘토링 프로그램이나 개...
Spring에서 @Transactional이 어떻게 동작하는지, 전파 속성별 트레이드오프는 무엇인지, 실무에서 자주 발생하는 함정은 무엇인지를 정리한다. 이 글을 읽으면 트랜잭션 전파 설정을 상황에 맞게 선택할 수 있다. 왜 트랜잭션 전파를 이해해야 하는가? @Transactional을 붙이면 트랜잭션이 적용된다는 것은 대부분 안다. 문제는 서...
리팩토링을 시작하게 된 배경 오래된 제 코드를 살펴보면서 리팩토링의 필요성을 느꼈습니다. 리팩토링을 하려는 이유는 숨겨진 버그나 취약점을 발견하고 수정하기 위함과 가독성을 높여 확장성을 향상시키기 위함 입니다. 리팩토링을 시작하려 했지만, 오래된 코드의 내용이 기억나지 않아서 먼저 코드를 보면서 어떤 요구사항이고 도메인이었는지 떠올려야 했습니다. ...