Spring Data Mongo 매핑 최적화 with Kotlin Serialization, kbson
·
spring
기존 개선 방안 Spring Boot 환경 Mongo DB 조회 성능 개선기https://www.mongodb.com/ko-kr/docs/manual/tutorial/sort-results-with-indexes/ 복잡한 Join 탈출 - 결제 내역 조회 With Mongo DB진행중인 프로젝트에선 사용자들이 Question이라는 상품을 구매할 수 있습니다. Question은 고e4g3r.tistory.com이전에 포스팅으로 Spring Boot 환경에서 MongoDB의 조회 성능을 개선한 적이 있었다. 첫번째로는, 인덱스에 대한 개념이 미흡해서, 복합 인덱스를 설정하지 않았던 것이 원인이었다.두번째로는, Spring Boot 환경에서는 일반적으로 MongoDB를 사용할 때 Spring Data Mong..
EFK에서 Loki로 전환하기 + Sentry 적용기 in Spring Boot
·
개인 프로젝트
기존 모니터링 구성프로젝트에선 Spring Actuator + Prometheus + Grafana 조합으로 모니터링 시스템을 구성하고 있었다.사실 실제 운영이 활발하게 되는 프로젝트는 아니여서, 그냥 제일 유명한, 대시보드만 적용하고 딱히 사용은 하지 않았다. 그러다가 최근에, 포트폴리오 정리도 하고, 이것저것 면접 준비도 대비하면서, 모니터링 부분을 다시 살펴보게 되었다.그러다가 뭔가 다른 대시보드들이 없을까 하다가, 이것저것 Grafana Labs에서 다른 대시보드 샘플들을 구경하고 있었는데, Loki 라는 것과 연동되는 대시보드를 알게 되었다. 이 대시보드 구성이 마음에 들어서, Loki가 무엇인지 알아보았다.Loki?Loki는 공식 홈페이지에 따르면 로그 집계 시스템이라고 한다.즉 애플리케이션에..
@Transactional의 오버헤드
·
spring
hibernate 매핑에 대한 관찰갑자기 든 의문 Mongo DB 조회 성능 개선기https://www.mongodb.com/ko-kr/docs/manual/tutorial/sort-results-with-indexes/ 복잡한 Join 탈출 - 결제 내역 조회 With Mongo DB진행중인 프로젝트에선 사용자들이 Question이라는e4g3r.tistory.com이전 포스팅에서는 hibernate가 어떻게 오버헤드를 최소화 하면서 매핑을 처리하는지 알아보았다. 위 포스팅을 작성 하기 전 여러 시험을 했었는데, 그 중 특이했던 결과가 있었다.바로 Querydsl을 이용한 조회가 JpaRepository를 이용한 조회보다 2배 가량 처리 속도가 빨랐다.이것을 알아보다가 알게 된 내용을 정리해보려 한다...
hibernate 매핑에 대한 관찰
·
spring
갑자기 든 의문 Mongo DB 조회 성능 개선기https://www.mongodb.com/ko-kr/docs/manual/tutorial/sort-results-with-indexes/ 복잡한 Join 탈출 - 결제 내역 조회 With Mongo DB진행중인 프로젝트에선 사용자들이 Question이라는 상품을 구매할 수 있습니다. Question은 고e4g3r.tistory.com위 포스팅은 MongoDB 조회 성능을 개선했던 포스팅이다. Spring Data Mongo가 기본적으로 제공하는 Mapping Converter로 인한 병목이 원인이었다.그래서 별도의 Custom Mapping Converter를 작성해서 병목을 줄였다. 최근에 위 포스팅을 다시 살펴보게 되었고, 다시 읽다보니 다른 의문이 ..
할인 기능을 포함한 결제 도메인 설계 해보기
·
개인 프로젝트
이번 포스팅에서는 개인 프로젝트의 할인 시스템을 재구성하고 설계한 내용에 대해 작성합니다.단순했던 기존 할인 그리고 다른 서비스들의 할인 기능@Componentclass QuestionPaymentCouponProcessor( private val userCouponRepository: UserCouponRepository) { fun applyCoupon(questionPayment: QuestionPayment) { if (!questionPayment.isUsedCoupon()) { return } questionPayment.applyCoupon() if (!userCouponReposit..
InnoDB MVCC
·
database
InnoDB에 대해 이것저것 알아보다가, 그냥 얕게 알고 있던 내용을 정리하기 위한 포스팅Mysql + InnoDB 환경에선 MVCC를 통해 트랜잭션 격리 수준에 따른 데이터 일관성을 보장한다는 것은 InnoDB에 대해 조금만 관심을 가지면 알 수 있다. MVCC 하면 undo log, lock 없는 읽기 등 여러 관련 키워드가 있는데 하나씩 알아보자.Undo LogUndo Log는 말 그대로 이전의 데이터를 보관하는 공간이다.만약 어떠한 트랜잭션(TRX_ID_100)이 PK가 1인 레코드의 name 컬럼을 변경한다면, Undo Log에는 변경 전 데이터가 보관된다.따라서 위 그림 기준으로 기존 데이터는 EEE고 변경한 데이터는 AAA가 된다. Undo Log는 TRX_ID와 기존 데이터 이외에도 여러 ..
결제 시스템 설계 (최종...최종..최종...)
·
개인 프로젝트
결제 로직에서 발생하는 예외 처리하기(feat.트랜젝션 의존 줄이기)예외 처리의 예외 처리 (feat. RabbitMQ 지연 큐)결제 로직에서 발생하는 예외 처리하기 2외부 API를 사용할 때 데이터 정합성을 맞추기 위한 노력 최근에 다시 결제 시스템을 보완하는 작업을 진행하게 되었습니다.개발 관련 공부를 하다보면, 많은 것을 알게 되고, 이전에 설계했던 시스템을 다시 돌아보며 부족한 부분을 매꾸어나가게 되는 것 같습니다. 직전 포스팅에서도 외부 API를 사용할 때 발생할 수 있는 여러 데이터 정합성 문제 발생 시나리오를 알아 보았는데요.이 내용에 이어서 이제 어느정도 결제 시스템이 안정적으로 설계된 것 같아, 이 시스템을 설계해나간 과정을 소개해보려 합니다.결제 실패 시나리오이제부터 언급되는 서버는 사..
외부 API를 사용할 때 데이터 정합성을 맞추기 위한 노력
·
개인 프로젝트
예외 처리의 예외 처리 (feat. RabbitMQ 지연 큐)결제 로직에서 발생하는 예외 처리하기(feat.트랜젝션 의존 줄이기)결제 로직에서 발생하는 예외 처리하기 2이전 포스팅들에서는 외부 PG API를 이용하는 포인트 충전 시스템의 성능을 최대화하고 안정성을 올리기 위해 다양한 방법들을고민해왔습니다. 그리고 어느정도 보완을 하고 나서는 괜찮다고 판단하여 포인트 충전 시스템 쪽에는 별도의 작업을 진행하지 않았는데요. 최근에 카카오페이 기술블로그의 MSA 환경에서 네트워크 예외를 잘 다루는 방법을 읽고 문득 단순히 예외가 발생했을 때 무조건 결제 실패 로직을 처리하는 것이 잘못된 것이라고 인지할 수 있었습니다.그래서 오랜만에 다시 포인트 충전 시스템의 로직을 보완했던 과정을 적어보려 합니다.포인트 충전..
UNIX는 소켓도 파일이다. (소켓 10만개 생성해보기 테스트)
·
etc
"UNIX는 모든 것이 파일이다" 라는 말을 한번쯤 들어봤을 것이다. 나도 정확히 무슨 의미인지는 몰랐지만 들어는 보았다.그런데 최근에 이것저것 공부하다보면서 c10K, c100K 문제라는 것을 알게 되었다.서버 한대로 c10K, c100K개의 TCP 소켓을 처리할 수 있는가에 대한 문제이다. 이 문제에서 가장 많이 하는 오해 중 한가지는 포트의 범위는 약 65535까지 있으니까 서버 한대는 65535 밖에 못여는거 아님?이다.하지만 이건 서버가 TCP 연결을 어떻게 처리하는지, 그리고 운영체제에서 TCP 소켓을 어떻게 처리하는지 알면 된다. 암튼 이 문제를 시작으로 이것 저것 알아보다가 모르고 썼던 소켓, FD, 간단한 10만개 소켓 생성 테스트 관련 내용을 정리하게 되었다.소켓 연결 과정int mai..
코틀린에서의 함수
·
kotlin, java
코틀린을 사용하면서 함수에 관한 새로운 개념들을 정리한 내용.Lambda와 inline Function의 Return은 특이하다.fun demo() { lam { println("Hello") 100 }}fun lam(task: () -> Int) { val result = task() println("result: $result")}코틀린에서 lambda 함수의 경우 블록의 마지막 코드가 알아서 반환된다. 즉 위 코드에서는 마지막 줄인 100이 출력된다.그럼 직접 return을 명시해주면 어떻게 될까?fun demo() { lam { println("Hello") return 100 // Error 'return' is not..