Java/Mini-Pay 프로젝트
코드리뷰 적용, 다시 Redis로.. - MiniPay(5)
코드 리뷰이전에는 굳이 Redis를 사용할 필요가 없다고 생각해서 MySQL을 사용하여 기능을 구현했다. 해당 기능은 이체 트랜잭션을 분리하여 발생한 데이터 정합성 문제를 해결하기 위해 이체 발생 로그를 저장하는 기능이다. 하지만 코드 리뷰에서 데이터가 오래 유지되지 않고 금방 사라져도 되는 데이터라는 점에서 Redis와 같은 메모리 기반의 DB 사용하면 좋겠다는 리뷰를 받았다. 이전에도 Redis를 사용하면 된다고 생각했지만 delete 연산 때문에 사용하지 않은 것인데 뭔가 다른 방법이 필요했다. 현재 producer, consumer 구조를 사용하고 있기에 Redis를 해당 구조에서 사용할 방법을 찾아보았다.Redis Stream찾아보니 Redis가 지원하는 많은 데이터 형식 중 Stream이라는 ..

ThreadPoolTaskExecutor를 사용한 비동기 처리로 이체 서비스 만들기 - MiniPay(3)
Mini Pay step 2 간단 설명 step 1을 끝내고 step 2로 넘어왔다. step 2는 다른 사람의 메인 계좌에 이체를 하는 것과 매일 00시에 이체 한도를 초기화 하는 것이었다. 개인적으로 페이 서비스의 step 중에서 가장 고민을 많이 했으며 가장 재밌어 보이는 step 이었다. step 2에서 고민해야 할 점은 사용자들이 동시에 요청을 보냈을 때 돈의 정합성 문제와 다수의 요청을 동시에 효율적이게 처리해야 할 방법이었다. 효율적이고 정확한 처리를 위한 고민 먼저 돈과 관련되어 있기 때문에 정합성이 가장 중요했다. 왜냐하면 내가 이체를 했는데 나의 계좌에는 돈이 빠져나갔지만, 상대는 돈이 들어오지 않은 상황이 발생하면 안되기 때문이다. 그래서 잠깐 생각을 해 봐도 A→B 라는 돈의 흐름에..
Github Action CommunicationsException: Communications link failure, profile 설정과 @SpringBootTest 동작 방식 이해로 해결하기 - MiniPay(2)
문제 로컬 환경에서 테스트하고 빌드까지 잘 되는 것을 확인했지만, github action을 사용한 build에서 데이터베이스와 연결이 안 된다는 에러가 발생했다. 해결 과정 1. Github Actino에서 MySQL을 사용하기 Github Action 환경이 어떻게 되어 있는지 간단하게 살펴 보았다. 이벤트를 발생시키면 Runner에서 동작하는 원리였는데 얘가 컨테이너 내부에서 작업을 실행한다. 해당 컨테이너 환경에 MySQL이 없어서 발생하는 에러였고, MySQL을 사용할 수 있는 설정을 포함해서 해결할 수는 있었다. 하지만 그러면 전체 작업 수행 시간이 늘어나는 문제가 있어서 다른 방법을 고민해 보았다. 만약 이 방법을 사용할 것이라면 아래처럼 작업을 추가해 주면 된다 services: mysql..
프로젝트 설계, 이체 시 동시성과 DB Isolation Level 고민 및 적용 - MiniPay(1)
프로젝트 소개 최근 좋은 기회를 얻어서 작은 스터디를 시작하게 됐다. 스터디 운영하시는 분께서 너무 감사하게도 평소 프로젝트를 할 땐 신경 쓰지 않았던 부분들을 고민할 수 있는 주제로 프로젝트 아이디어를 제공해 주셨다.(동시성 문제, 성능 문제 등) 최근 CS의 중요성을 깨닫고 이걸 프로젝트에 어떻게 적용할지 고민이 많았는데 제공해준 프로젝트를 진행하면서 이런 고민을 해결할 수 있었다. 4개의 주제 중 페이 서비스를 만드는 것이 마음에 들었다. 평소 CRUD만 했던 DB를 Isolation Level과 락을 어떻게 걸지 고민하며 적용해 보는 것이 좋은 경험이 될 것이라고 생각했다. 또한 트랜잭션을 학습할 때 항상 이체를 예시로 들었는데 공부할 땐 예시만 보고 그렇구나~ 했던 것을 어떻게 해결할 것인지 고..