본문 바로가기

전체글139

네이버페이 주문/결제 DB 전환 이슈 우리팀은 네이버페이 주문/결제에 사용중인 Oracle DB 를 nBase-T 라는 분산 DB(사내 솔루션)로 전환 하고 있다. 1. DB 전환이란? 기존 애플리케이션 서버는 Oracle DB 를 사용하고 있다. 새로운 애플리케이션 서버와 nBase-T DB 로 문제없이 전환하기 위해선 실시간 DB 복제가 이뤄져야 한다. cf) 기존 데이터 마이그레이션은 당연히 되어 있다는 전제 cf) DB 전환할 때 꼭 새로운 애플리케이션 서버가 필요한건 아니다. 우리팀은 DB 전환 뿐만 아니라 애플리케이션도 새롭게 개발하고 있다. 새로운 애플리케이션 서버와 nBase-T DB 가 준비되면 사용자 요청을 스위칭해서 전환을 시작한다. 이때 역동기화 복제를 해주는데 롤백을 대비한 조치다. 만약 신규 서버에 문제가 생기면 기.. 2023. 1. 23.
DB 장애로 인한 EDA 기반 이벤트 보정처리 지난주 갑자기 모든 애플리케이션 서버들이 DB 서버와의 네트워크 연결을 실패했다. 전면장애인 상황이다. DB 에 문제가 생기면 내가 담당하는 주문서 서버는 어떤 문제가 발생하고 왜 보정처리가 필요한지 알아보자. // api 응답 에러 메세지 Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Cannot get a connection, pool error Timeout waiting for idle object 사용자가 주문서 화면에서 결제 버튼을 누르면 유효성 검사를 거쳐 결제가 진행되고 최종적으로 주문완료 작업을 수행한다. 만약 결제가 수행되기 전에 DB 문제가 생긴다면 사용자는 불편함을 겪.. 2023. 1. 15.
나는 하루 5분만 바꾸기로 했다 예전 아웃퍼포머 책리뷰에서 '마이루틴' 에 대해 잠깐 언급한적이 있었다. '마이루틴' 은 내가 정한 삶의 루틴들을 잘 수행할 수 있게 도와주는 앱이다. 그땐 시작한지 5일 밖에 안됐지만 지금은 300일을 넘길 정도로 잘 활용하고 있다. 그러던 중 해당 스타트업 대표가 책을 썼다고 해서 '마이루틴' 사용 후기를 남기고 책을 선물 받았다. 내가 느낀 이 앱의 매력은 유연함에 있다. 루틴들을 지키지 못해도 포기하지 않고 꾸준히 할 수 있게 도와준다. 이 앱은 달성을 의미하는 초록불 기준이 러프하다. 루틴을 수행 못하면 못했다고 표시하고 넘어가면 된다. 물론 못하는게 계속 반복되지 않도록 신경은 써준다. 이 책은 루틴을 만들어 실천하고 싶지만 마음처럼 잘 안되는 사람들에게 도움이 될 거 같다. 나도 요즘 회사일.. 2023. 1. 15.
index 가 필요해도 자바 고전 for 문 안쓰는 방법 먼저 Product 는 item 리스트를 갖고 있다(Product 는 여러개일 수 있다). @Value @Builder public class Product { List items; } item 은 id 필드만 존재한다. @Value @Builder public class Item { String id; } 이제 각 Product 안의 모든 Item id 를 검사하는 로직을 만들어보자. 그런데 2가지 조건이 있다. 1. 모든 Item 들을 다 검사하고, 실패하는 것들은 예외 리스트로 담아서 전달. 2. 예외 객체에 담을 때 item index 정보가 필요. index 정보가 필요하니 가장 먼저 생각나는것은 고전 for문 방식이다. 이중 for문 으로 각 Product 안의 모든 Item 을 검사하고 예외.. 2023. 1. 14.
WebClient 프록시(CONNECT HTTP Method) 이전 글에서 간단히 설명한 WebClient 프록시 방식에 대해서 자세히 살펴보려한다. 먼저 우리는 보안 요구사항으로, 네이버망에 있는 서버와 API 통신을 할 때 프록시 서버를 거치도록 수정했다. 코드 작업은 간단하다. reactor.netty HttpClient 에서 제공하는 proxy 메서드를 사용해 프록시 host 와 port 만 적어주면 프록시를 거쳐서 baseUrl 에 등록된 서버로 호출된다. HttpClient httpClient = HttpClient.create() .proxy(it -> it.type(Proxy.HTTP) .host(프록시 서버 주소) .port(443) ); WebClient webClient = WebClient.builder() .clientConnector(new.. 2022. 11. 27.
주문 동시성 이슈 정리 상황 설명 주문서 서버는 이벤트 기반으로 동작한다. 주문서를 만들고 결제 프로세스를 진행하면 '주문 완료 이벤트'를 발행한다. 그러면 해당 이벤트를 consume 해서 아래 그림 1번 작업이 수행된다. 문제는 1번 작업에서 API 를 호출해, 주문/결제 서버로 요청을 보냈는데 Read Timeout 에러가 발생했다. 2번 주문 완료 요청중 에러가 발생하면 주문 실패 이벤트가 발행되고, consumer 가 4번 작업을 수행하면서 새롭게 API 를 호출한다. 여기서 기존 2번 작업과 동시성 이슈가 발생하면서 실제로는 주문이 완료 처리 됐지만 완료 되지 않았다는 결과를 받게 된다. 그래서 주문서 서버는 주문이 이미 완료 됐는지 확인하는 방어로직이 있음에도 불구하고 롤백 프로세스가 진행됐다. 주문서 서버 입장에.. 2022. 11. 14.