전체 글159 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. [sharp] VipsJpeg: Invalid SOS parameters for sequential JPEG sharp는 이미지 프로세싱에 있어 사용되는 라이브러리로 서비스에서 이미지 업로드 기능을 지원하는 경우 이미지 사이즈를 줄이기 위해 자주 사용된다. 이번 포스팅에는 sharp 사용 시 마주친 오류와 어떻게 처리하였는지에 대해 정리해보겠다. 나의 경우 sharp를 업로드한 이미지를 조회 시 리사이징하기 위해 사용하고 있다. CloudFront + Lambda@Edge 스택을 사용하여 업로드한 이미지 조회 시 sharp를 사용하여 리사이징 된 이미지를 생성하고 있다. (참고: AWS 인프라 위에서 채팅 이미지 업로드부터 조회까지) 기능 오픈 이후 문제가 없었는데 갑자기 아래와 같이 VipsJpeg: Invalid SOS parameters for sequential JPEG 라는 오류 메세지가 나왔다. 관련.. 2022. 10. 2. 이전 1 ··· 9 10 11 12 13 14 15 ··· 27 다음