본문 바로가기

분류 전체보기154

Read Consistency with Database Replicas by Shopify Shopify의 Read Consistency with Database Replicas에 대한 짧은 분석 read-heavy한 애플리케이션이 있을 때, DB의 쓰기(Write) 기능에 성능 저하를 막기 위해 DB replication을 구성하는 경우가 많다. 즉, 서버에서 쓰기 쿼리는 Primary DB에 보내되 읽기 쿼리는 Replica DB에 보내는 식으로 구성하여 쓰기 성능에 영향을 덜 주는 것이다. 위와 같은 환경에서 Shopify의 포스팅에서 얘기하는 문제는 Replica가 2대 이상으로 구성하였을 때 생기는데, 서버가 여러 번의 쿼리를 통해 조회한 데이터를 aggregation 하는 경우이다. 아래와 같이 2대의 Replica DB를 운용하는 경우를 예를 들어보자. - Replica 1 DB는.. 2022. 12. 9.
BigDecimal이 소수를 다루는 방법 정산 시스템과 같은 정확한 숫자 계산을 다뤄야하는 시스템에서는 Java의 숫자를 다루는 가장 기본적인 타입인 Long이나 Double을 사용하는게 아니라 BigDecimal을 사용하라고 권고한다. 이 포스팅에서는 왜 BigDecimal을 사용해야하는지에 대해알아보기 위해 먼저 컴퓨터에서 실수를 표현하는 방식에 대해 알아보고, BigDecimal은 어떻게 정확한 계산을 처리할 수 있는지에 대해 알아보도록 하겠다. 소수점 방식 - 부동 소수점 (floating point) 먼저 컴퓨터에서 2진수로 실수를 표현하는 방식에 대해 알아보도록 하겠다. 그 방식은 크게 고정 소수점(fixed point)과 부동 소수점(floating)으로 나눠볼 수 있는데, 프로그래밍 언어에서 일반적으로 사용되는 방식인 부동 소수점.. 2022. 12. 8.
[Bash] &&를 쓰는 이유 먼저 bash에서 &&는 일반적인 고수준 프로그래밍 언어에서 지원하는 AND 연산자와 동일한 역할을 한다. Bash Reference Manual - 3.2.4 Lists of Commands https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Lists AND 이기 때문에 - 앞서 실행된 커맨드의 결과가 성공(zero exit status)인 경우, 뒤의 커맨드를 실행시켜야지 AND 연산 결과를 알 수 있기 때문에 뒤의 커맨드를 실행한다. - 앞서 실행된 커맨드의 결과가 실패(non-zero exit status)인 경우, AND 연산 결과가 failure이기 때문에 뒤의 커맨드를 실행시키지 않고 연산이 종료된다. 즉, &&를 쓰면 앞의 .. 2022. 11. 28.
[Refactoring] 여러 역할을 갖는 엔티티 리팩터링하기 레거시 시스템을 살펴보다보면 하나의 엔티티(테이블)에 서로 다른 역할의 데이터 필드(컬럼)가 모여있도록 모델링 된 경우가 있다. 초기에는 하나의 역할의 데이터만 있었지만, 서비스가 확장되면서 기존 시스템을 재활용하다보니 기존의 엔티티(테이블)에 다른 역할의 데이터 필드(컬럼)를 추가한 경우이다. 이번 포스팅에서는 여러 역할을 갖으면서 SRP를 위반하는 엔티티와 그 문제점을 알아보고 이를 어떻게 리팩터링하면 좋을지에 대한 방법을 설명하도록 하겠다. (예제 코드는 여기에서 살펴볼 수 있다) SRP를 위반하는 엔티티와 그 문제점 예를 들어 처음에는 물리적인 굿즈를 팔기 위한 상품을 담기 위한 상품 엔티티를 만들었다고 하자, class Product( id: ProductId, name: String, pric.. 2022. 11. 16.
[MockK] mock 객체가 호출되지 않았음을 검증하기 기능 개발을 하다보면 상태 값에 따라 특정 기능을 실행할지 말지 분기를 탈 필요가 있다. class SomeService( private val someFeature: SomeFeature, ) { fun executeIfFlagIsOn(flag: Boolean) { if (flag) { this.someFeature.execute() } } } class SomeFeature { fun execute() {} } 위와 같이 SomeService#executeIfFlagIsOn 메서드는 flag 파라미터를 통해 SomeFeature기능을 실행할지 말지를 결정하는 코드가 있을 때, MockK를 사용하여 SomeFeature의 기능이 실행되거나 안되었음을 테스트하기 위해서 wasNot(called: Call.. 2022. 10. 21.
Types of Time-sequential ID generator 일단 시작에 앞서 auto increment ID를 피하는 이유로는 How to Do UUID as Primary Keys the Right Way의 Why You Should Avoid Auto-Incremented Integers를 참고하길 바란다. 그렇지만 DB의 auto increment ID를 사용하는건 이미 널리 쓰이고 있고 그다지 나쁜 선택이 아니다. 하지만 여러 측면을 고려하였을 때, DB의 auto increment ID를 사용하는 것은 아무래도 좋지않다는 판단을 한 경우라면 이제 ID를 어떻게 ID를 만들지가 중요해진다. UUID v4와 같이 random한 ID의 경우 ID 충돌에 있어 큰 문제는 없지만, random한 값이기에 DB의 Primary Key로 사용하기엔 무리가 있을 수 .. 2022. 10. 17.