본문 바로가기

끄적끄적

(20)
[끄적끄적] 결제 중복 롤백 방지하기 현재 진행중인 프로젝트에서는 분산환경에서 데이터 정합성을 맞추기 위해, 유저의 결제로직이 중간에 실패할경우, 보상트랜잭션을 발행하도록 구성되어 있는데요. 이때, 보상트랜잭션 처리중 메시지가 유실되면 해당 메시지를 일정 시간후에 재처리 하게 됩니다. 주문의 상태를 "FAILED" 처럼 바꾸는 멱등한 API의 경우 메시지를 재처리해도 문제가 되지 않습니다. 그러나, "유저가 결제한 포인트를 복구" 하는것과 같이 멱등하지 않은 API는 유저에게 포인트가 중복해서 더해질 수 있으므로 재처리 과정중 멱등성을 보장해줘야 합니다. 실제로, 주문 - 결제 로직을 spike test 해보면, 아래 사진과 같이 (서버 다운 등의 이유로) 유실된 메시지를 재처리하게 되어서, 유저가 원래 갖고있던 1000 포인트 보다 더 많..
[끄적끄적] @Transactional 안에서 retry 사용을 주의하세요 TL;DR이것외에도, 트랜잭션 안에서 retry를 할 경우 여러가지 문제가 발생할 수 있는데요. 저와 마찬가지로 jitter 방식의 retry정책을 구현할 경우, 해당 스레드는 커넥션을 든채 jitter 시간만큼 대기하게됩니다. 즉, 동시성 처리에 안좋은 영향을 끼칠 수 있어요. (이것은 Webflux와 같은 reactive 프로그래밍에서도 마찬가지입니다. 비동기환경에서도 context에 커넥션이 묶인채로 jitter시간동안 대기하게되어요.) 반면, retry로직을 로컬 트랜잭션 밖으로 빼줄경우, 해당 이벤트가 jitter 만큼 대기할때, 다른 이벤트가 커넥션을 재사용할 수 있다는 이점이 있습니다. 또한, MySQL InnoDB의 Isolation level을 REPEATABLE READ 이상으로 설정할..
[끄적끄적] ProtocolBuffer로 API 문서 작성기 최근에, 강남언니 기술블로그에 기술된 글을 재미있게 본 적이 있습니다. 강남언니 블로그에서는, 프론트엔드와 백엔드 간의 api를 protocol buffer로 정의 하면서 아래와 같은 이점을 얻을 수 있었다고 합니다. 1. API 문서를 유지보수하지 않아도 되게 되었습니다. 기존에는 api가 변경되면, api 문서도 업데이트 해줘야했는데, protocol buffer로 관리하면서, api 변경이 곧 문서의 변경으로 바로 이어졌습니다. 2. 단일 진실 공급원(Single Source Of Truth) 환경이 구축됩니다. 프론트엔드와 백엔드가 각각 똑같은 IDL(protocol buffer) 를 공유하면서, 휴먼에러가 발생할 확률이 줄어듭니다. 저 또한 이런 이점에 공감해, 새롭게 진행하고 있는 프로젝트에 ..
[끄적끄적] E2E(API) 테스트 자동화 도입기 (운영환경과 비슷한 환경에서 API 사용자 입장에서 종단까지 테스트 한다는 의미로 E2E 테스트와 API 테스트를 혼용해서 사용하고 있습니다.) 최근, 테스트의 중요성을 깨닫게된후 TDD나 ATDD 방법론에 따라 개발을 진행하고 테스트 커버리지를 도입하는등 더 안정적인 서비스를 구축하기 위해서 노력을 기울이고 있습니다. 실제로, 이러한 방법론을 적용하니, 목표 커버리지 70%를 훨씬 넘는 수치를 달성하고 꼼꼼한 테스트를 작성했다는 생각을 하기도 했었습니다. 그렇다면, 이러한 노력이 (QA 단계에서) 적은 버그로 이어졌을까요? 창피하게도 여전히 버그는 발생했고, 심지어 꼼꼼히 테스트를 하고 버그가 발생하지 않을것 이라 예상한 API에서도 버그가 발생했었습니다. 문제의 원인은 다음과 같은 예측하지 못한 여러..
[Sonarqube] Sonarqube 설치 + PR decoration 하기 Sonarqube 설치 + PR decoration 하기 이번 포스팅에서는 docker로 sonarqube를 설치하고 PR decoration까지 하는법을 알아보겠습니다. 최종적으로 아래 사진과 같이 PR에 sonarqube가 리포트를 달아줍니다. 스펙 1. Ubuntu 18.04 LTS 2. Docker version 20.10.17 3. Sonarqube version 9.9.1-community (포스팅 시점에서 10.x까지 나왔는데, 10 버전부터는 PR decoration을 플러그인으로 적용할 수 없습니다. 아직 10 버전을 지원하는 플러그인이 나오지 않았어요. PR decoration을 위해서 9.9.1버전을 다운해줍시다.) Sonarqube 설치 docker는 설치되었다고 가정하고 넘어가겠습..
[끄적끄적] Rust로 PS 후기 Rust로 PS 후기 😣 원래는 자바, C++로 PS를 했었는데, 요즘 핫한 Rust에 익숙해질 겸, Rust로 PS를 시작했다. 이 글을 쓰는 시점에서 4-5문제 정도 푼 거 같은데.. 후기를 쓰기에는 좀 이르나 어쨌든 적어보려고 한다. Rust로 푼 문제 https://dlwnsdud205.tistory.com/347 [백준 / BOJ] 14575 뒤풀이 (Rust)문제 출처 : https://www.acmicpc.net/problem/14575 14575번: 뒤풀이 첫째 줄에 대회 참가자의 수 N과 술의 총량 T가 주어진다. (1 ≤ N ≤ 1000, 1 ≤ T ≤ 109) 둘째 줄부터 N개의 줄에 걸쳐, 각 사람에 대한 Li와 Ridlwnsdud205.tistory.com 장점 1. 생각보다 빠른..
[끄적끄적] SpringBoot에서 가장쉽게 Xss filtering을 하는 방법 SpringBoot에서 가장쉽게 Xss filtering을 하는 방법 SpringBoot프레임워크 안에서 사용할 수 있는 Xss filtering 라이브러리를 소개합니다. 이 라이브러리를 사용하면, 어떠한 설정 없이도 다음과 같이 어노테이션 기반으로 Xss Filtering을 진행할 수 있습니다. @RestController public class Example{ @XssFiltering @GetMapping("/example") public Object helloworld(@Xss String param1, @Xss("json") SomeObject param2, @Xss("string") String param3, String param4){ } } @Xss 어노테이션을 설정함으로써 필터링에 포함시킬..
[Tistory Skin] CERULEAN_BLUE 무료 배포 Tistory Skin CERULEAN_BLUE 무료 배포 블로그에 "개인적으로 한 프로젝트를 홍보할 방법이 없을까" 고민하던중, 광고 배너 형식으로 블로그를 만들어 홍보하면 좋겠다 라는 생각을 하게 되어 만든 스킨입니다. 아래 사진과 같이 Banner 영역에 자신이 홍보하고싶은것을 사진형식으로 넣을수 있습니다. 여러가지 Banner를 넣을 수 있으며, 자동으로 인식하여 스크롤 및 하단의 "몇번째 배너인지 알려주는 점" 이 증가하게 됩니다. 자신의 배너를 삽입하는 방법은 아래와 같습니다. 1. 블로그 관리의 스킨편집에 들어갑니다. 2. 'html편집' 버튼을 누릅니다. 3. html편집창을 클릭하고 ctrl+f를 눌러 검색창을 연 후, Banner-tag를 입력하여 다음 코드를 찾습니다. 4. 위 코드 ..