본문 바로가기

TWIL8

[3기] 잇츠 스터디 (IT’s Study Crew) : TWIL 스터디 회고 2월부터 4월말까지 10주동안 서울 우먼 잇츠에서 진행하는 글쓰기 스터디(TWIL : This Week I Learn)에 참여했다. 이번 스터디에 참여한 이유는 크게 세 가지였다.첫 번째는, 다른 사람이 읽어도 이해하기 쉬운 글쓰기 연습을 하고 싶었다. 평소 공부한 내용을 정리할 때 나만 알아볼 수 있게 대충 써두는 경우가 많았는데, 이번 기회를 통해 다른 사람에게도 전달될 수 있는 글을 써보고 싶었다.두 번째는, 스스로 공부한 내용을 기록으로 남기고 싶었다. 단순히 머릿속으로만 이해하고 넘기는 것 보다 글로 한 번 정리하면 더 오랫동안 기억에 남으니까..그리고 자세한 내용은 분명히 까먹을 미래의 나를 위해 기록을 남기는게 좋을 것 같았다.세 번째는, 꾸준히 글을 쓰는 습관을 들이고 싶었다. 스터디를 통.. 2025. 4. 27.
Spring @Transactional - 프록시 기반 동작방식과 예외상황재현 테스트 @Transactional noRollback 옵션을 줬는데 왜 롤백이 되죠..예외를 catch 했는데 왜 롤백이 되는거죠…..일하면서 겪었던 문제들을 언젠가는 정리해야지 하고 안했었는데.. 최근 또 의도대로 동작하지 않는 코드때문에 아까운 시간을 날려버려서.. 이제는 한번 정리해보기로 했다. @Transactional 의 프록시 기반 작동방식을 간단하게 정리하고 실무에서 겪었던 예외상황을 간단하게 코드로 재현해보았다. 스프링 @Transactional 스프링의 @Transactinal은 TransactionInterceptor 이라는 AOP Advice를 통해 다음 순서로 작동한다.* Advice : 프록시가 호출하는 부가기능이다. 1.클라이언트가 프록시 객체의 메서드 호출 2.프록시가 Transact.. 2025. 4. 13.
MariaDB의 READ COMMITTED vs REPEATABLE READ 격리 수준과 부정합 문제들 자주 사용되는 MariaDB의 READ COMMITTED와 REPEATABLE READ의 차이는 무엇이고, 어떤 문제가 각각 발생할 수 있을까? 🔍 READ COMMITTED항상 "커밋된 최신 데이터"를 조회한다.다른 트랜잭션에서 커밋된 최신 결과가 반영됨발생 가능한 문제:❗ Non-Repeatable Read → 같은 row를 두 번 조회했을 때 중간에 다른 트랜잭션이 값을 바꾸면 다른 값이 반환됨❗ Phantom Read → 같은 조건으로 select했을 때 중간에 insert(커밋)된 row로 인해 row 개수가 달라짐❗ Lost Update → 두 트랜잭션이 같은 데이터를 수정하고 한 쪽이 덮어쓰는 문제  🔍 REPEATABLE READ (MariaDB의 기본 설정)트랜잭션 시작 시점의 커밋된.. 2025. 3. 30.
JPA 더티체킹 사용시 주의할점 : REPEATABLE READ 격리 수준에서 발생한 동시성문제 해결하기 JPA는 자바 개발자들에게 매우 강력한 ORM 도구다. 특히 더티 체킹이라는 기능은 개발자가 명시적으로 업데이트 쿼리를 작성하지 않아도 엔티티의 변경사항을 감지하여 자동으로 DB에 반영해주는 아주 편리한 기능이다. (하지만 이런 편리함 뒤에는 생각지 못한 위험이 숨겨져 있을수도 있다…….)  실제 배송 시스템에서 발생한 동시성 문제를 통해 JPA의 더티체킹과 데이터베이스의 트랜잭션 격리 수준이 어떻게 작동하는지와 이로 인해 발생할 수 있는 문제와 해결에 대해 알아보도록 하자. ⚠️ 문제상황 문제가 발생한 배송 프로세스는 다음과 같다사용자가 상품을 주문하면 시스템은 배송 요청을 생성하고 외부 배송사에 주문 정보를 전달합니다.외부 배송사로부터 배송 접수 완료 콜백이 오면, 시스템은 해당 요청의 배송 접수 상.. 2025. 3. 22.
Spring Cloud Stream으로 Kafka 메시지 처리하기 - 1 Spring Cloud Stream?- 마이크로 서비스 아키텍처에서 이벤트 기반 메시징을 쉽게 처리할 수 있도록 도와주는 프레임워크- Kafka, RabbitMQ, AWS SQS 와 같은 메세지 브로커와의 통합을 단순화하고, 프로듀서와 컨슈머를 쉽게 구현할 수 있도록 지원한다. Spring Cloud Stream 구성 요소1. Binder : 특정 메세지 브로커와 연결을 담당한다. Spring cloud stream 의 바인더를 사용하면 메세지를 발행하고 소비하기 위해 플랫폼마다 별도의 라이브러리와 API를 제공하지 않고도 메세징을 사용할 수 있다.  - Kafka, Kafka Stream, AWS SQS, RabbitMQ 등 다양한 바인더가 구현되어 있다.  - 메세지 브로커가 변경돼도 코드 수정을 최.. 2025. 3. 17.
API 성능 최적화하기 - 1 Pinpoint 확인 결과 특정 조회 API의 응답시간이 평균 1초 이상, 최대 3초인 것으로 API 성능이 좋지 않다는 것을 확인할 수 있었다.내부 서버간 호출 API의 경우 적절한 API 응답 시간은 200ms ~ 300ms수준으로 평균 600ms ~ 1000ms 이상 걸리는 API를 최적화할 필요가 있었다.더욱이 해당 API는 회원가입시 호출하는 API이므로 회원가입 속도가 느리면, 유저 경험이 좋지 않을 뿐더러 이탈 가능성도 있기 때문에 해당 API 성능 개선을 해보기로 했다.Pinpoint의 트레이스를 분석한 결과, DB 조회 단계에서 응답 속도가 느려지고 있음을 확인했다.쿼리 실행 과정을 분석해보면1. 특정 문자열로 DB조회 → 인덱스 있음  2. 1번의 조회 결과가 없는 경우, 다른 조건으로.. 2025. 3. 16.