안녕하세요. Club & Discount Engineering 팀에서 지마켓 할인/쿠폰 개발 업무를 맡고 있는 윤영택입니다. 저희 팀은 할인/쿠폰/수수료 등 돈과 관련된 도메인을 다루다 보니 코드를 작성할 때 BigDecimal 타입을 굉장히 많이 쓰고 있습니다. 본 포스팅을 통해 BigDecimal을 사용해야 하는 이유와 개념, 그리고 사용법을 간단하게 소개해보고자 합니다. 1. 서론 float와 double의 문제점 여러분은 혹시 소수(decimal)를 다룰 때 다음과 같은 경험이 있으신가요? 아래 코드를 보면 특정 조건에 맞춰 함수가 실행되는 것을 기대했는데, 실제론 실행되지 않습니다. 결괏값을 출력해보면 기대와 다른 값이 나오는 것을 확인할 수 있습니다. double a = 0.1; double ..
docker-compose를 이용하여 로컬 개발환경 구성하기 Part 1 : docker-compose를 이용하여 로컬 개발환경 구성하기 Part 2 : docker-compose를 이용하여 spring boot 프로젝트 연결하기(예정) 배경 최근 Gmarket Member Engineering 팀에서 Quilt - 로그인 개선 프로젝트를 진행하였습니다. 기존 닷넷 기반의 레거시 어플리케이션을 Java + Container 기반으로 전환하는 것을 시작으로, 수년간 쌓여온 기술 부채를 해결하고 보다 나은 회원 인증 체계를 개발하기 위한 첫 발을 내디뎠습니다. 이를 위하여 저희 팀에서는 지속 가능 하고 확장 가능한 개발환경 구성을 고민하였고, docker를 로컬 개발환경 구성에 이용했습니다. 그동안 Java..
버그와 함께 알아보는 RecyclerView 에서 wrap_content 사용을 조심해야 하는 이유 안녕하세요. G마켓에서의 첫 돌이 지난 Mobile Application 팀 전계원입니다. 작년 여름, 지마켓 내부코드 리팩토링 과정에서 버그를 만났었습니다. 버그의 원인을 이해하기 위해 분석하고 공부했던 내용들을 이번 글을 통해 공유해보고자 합니다. 0. 프롤로그 - 버그 발견 G마켓 Mobile Application 팀에서는 원활한 유지보수와 Android 시장의 개발 트렌드를 따라가기 위해 리팩토링 작업을 매우 권장하고 있습니다. 당시 신규 입사자였던 저도 G마켓의 코드에 빠르게 적용하기 위해 코드를 분석하며 간단한 화면 리팩토링 프로젝트를 진행했었습니다. 그리고 개발한 내용을 홀로 테스트하던 중 이..
들어가기 전에 안녕하세요, Shopping Service API팀 강희정입니다. 작년 여름쯤 입사하여 낯선 환경과 도메인에 적응하고, 새롭게 접한 기술들을 익혀 가느라 정신없는 나날을 보냈습니다. 업무가 어느 정도 적응되었나 싶을 겨울쯤, 저에게 굉장히 낯선 업무가 주어졌습니다. Master/Slave 구조의 Redis에서 Cluster 구조의 Redis로 migration 되니, 관련 코드 작업을 진행해 주세요. 업무를 받자마자 저는, 이런 생각을 했던 것 같습니다. 큰일 났다. 하나도 모르겠는데 어떡하지? 전통적인 SQL 방식의 RDBMS만 사용해 본 제게 Redis는 굉장히 낯선 존재였습니다. Redis도 모르겠는데 Cluster 구조로 migration하라는 코드를 작성하라니, 어디서부터 어떻게 ..
안녕하세요. Item Engineering 팀 박상윤입니다. 이번 글에서는 상품 엑셀 등록 서비스 개발하고 컨슈머에서 사용할 API Rate Limiter 개발하면서 발생한 이슈를 정리한 글입니다. 이 글은 아래와 같이 구성되어 있습니다. API Rate Limiter 도입 필요성 API Rate Limiter 적용 API Rate Limiter 동시성 문제 Lua script 실행시켜서 atomic 연산을 보장하도록 개선 정리 1. API Rate Limiter 도입 필요성 상품 엑셀 등록 서비스는 상품 정보를 엑셀에 입력하여 최대 500개의 상품을 동시에 등록할 수 있는 서비스입니다. 상품 엑셀 등록 서비스는 엑셀을 파싱 해서 상품등록 모델로 생성시켜 주는 프로듀서와 등록 모델을 수신해서 상품 등록 ..
서론 자바스크립트로 프론트엔드 웹 코딩을 하면서 Key - Value 쌍의 데이터를 저장하고 조회할 때 어떤 자료구조를 이용하시나요? 열이면 여덟 아홉 객체(Object)를 이용하는 듯합니다. interface Kimchi { name: string; alias: string; score: number; ingredients: string[]; } const kimchis: Record = { 1: [ { name: "백김치", alias: "맵린이", score: 1, ingredients: ["소금", "무", "양파", "배", "배추", "설탕"] }, { name: "나박김치", alias: "깍두기먹을바엔나박김치", score: 1, ingredients: ["소금", "무", "배추", "미..
안녕하세요. Advanced Technology 팀 박규민입니다. 오늘은 Java, Kotlin, Scala와 같은 JVM 언어에서 사용할 수 있는 오픈소스 경량 로깅 프레임워크를 소개드리려고 합니다. Log4j, Logback에 비해 상대적으로 빠른 로깅 속도와 간단한 구성, 다양한 출력 옵션 등의 메리트가 있는 tinylog에 대해 알아보겠습니다. What is tinylog? tinylog는 Java 플랫폼에서 동작하는 로깅 프레임워크입니다. JVM, GraalVM(Oracle에서 만든 OpenJDK 기반 JVM), Android에서 동작이 가능합니다. 보통은 Slf4j라는 Logging API와 바인딩하여 Log4j, Logback과 같은 로깅 프레임워크를 많이 쓰는데요. tinylog도 Slf4..
서론 안녕하세요. 지마켓의 원활한 서비스 운영을 위해 쿠버네티스 인프라를 운영 업무를 하고 있는 Platform Technology 팀 김지형입니다. Red Hat Openshift 기반의 쿠버네티스 클러스터를 운영하게 되면서 자연스럽게 적용하게 된 쿠버네티스 오퍼레이터에 대한 사례와 경험을 기술하고자 합니다. 오퍼레이터에 대한 간단한 설명과 쿠버네티스 오퍼레이터에 대해서 설명하고, 현재의 오퍼레이터 패턴이 가져다주는 이점과 한계에 대한 내용을 포함합니다. 오퍼레이터 디자인 패턴 오퍼레이터(Operator)는 2016년 CoreOS 블로그 포스트에서 공개된 디자인 패턴으로, 단어 그대로 운영자의 역할을 소프트웨어에 새긴 개념이라고 할 수 있습니다. SRE 엔지니어는 소프트웨어를 개발해 애플리케이션을 운영..