달리는 인증 서비스의 NoSQL을 바꾸자. - 실전편
안녕하세요. Seller & SD Engineering 팀 박명훈입니다. 지난번의 전략편에 이어 이번에는 실제 서비스 전략에 대해서 이야기하려고 합니다. 실제 서비스를 배포하며 사용했던 전략, 그리고 그 과정에 대해서 이번 글에 서술합니다. 달리는 인증 서비스의 NoSQL을 바꾸자. - 전략편 달리는 인증 서비스의 NoSQL을 바꾸자. - 실전편 배포 전략과 설계 지난 전략편에서 이야기했듯이 서비스에 이슈가 없이 배포하기 위해서 여러 스텝으로 작업을 분리했습니다. 이를 도식화시키면 다음과 같습니다. 1차 배포 1차적으로는 도식에서의 1 ~ 3번까지의 작업입니다. 배포 서버 판매자 페이지 관리자 페이지 배포 사항 Couchbase의 데이터를 MongoDB, MSSQL로 마이그레이션 합니다. 기존에 Couc..
BackendDatabaseDevOps
전체 읽기 →달리는 인증 서비스의 NoSQL을 바꾸자. - 전략편
안녕하세요. Seller & SD Engineering 팀 박명훈입니다. 최근 개발자로서 직접 기안한 프로젝트를 완료했습니다. 팀에서는 Couchbase를 통해 인증 서비스의 데이터를 제공하고 있었는데, 낮은 사용성 이슈와 비즈니스 정책, 서비스 관리의 여러 이유로 인해 불편함이 많았고, 이로 인해 기획자들이 업무를 진행할 때 성능 이슈로 인해 거의 사용이 불가능할 정도로 문제가 많았습니다. 대표적인 예시로 검색을 하면 5분씩 걸렸습니다. Couchbase는 MongoDB와 같이 Key-Document 구조를 가진 NoSQL 입니다. 이번 기회에 개선을 진행하며 기존의 문제를 해결하고, 성능적으로나 서비스적으로 아쉬웠던 부분을 개선했습니다. 그 과정과 결과에 대해서는 내용이 많아 크게 전략편과 실전 편으..
BackendDatabaseDevOps
전체 읽기 →Testcontainers로 통합테스트 만들기
안녕하세요. Shopping Service Backend팀 안재열입니다.저희 팀에서는 여러 팀에서 세심하게 생성하고 관리한 상품과 관련된 데이터를 고객에게 적절하게 가공하여 상품 목록 정보를 제공하는 API를 개발하는 업무를 담당하고 있습니다. 이 과정에서 다양한 모듈을 결합하여 데이터를 가공하는 작업들을 수행하게 됩니다. 그러한 작업 중 통합 테스트를 진행하게 되는데요, 이번 글에서는 TestContainers를 활용한 통합 테스트 작성 방법에 대해 알아보겠습니다.통합테스트는 무엇인가요?통합 테스트(Integration Test)란, 서로 다른 부분들이 원활하게 작동하는지 확인하기 위해 여러 모듈을 같이 테스트하는 과정입니다. 여기서 모듈은 웹서버, WAS, DBMS, 메시지 브로커, 파일서버 등이 포..
BackendDatabaseTesting
전체 읽기 →BigDecimal A to Z: 정확한 계산을 위한 숫자 처리 클래스
안녕하세요. Club & Discount Engineering 팀에서 지마켓 할인/쿠폰 개발 업무를 맡고 있는 윤영택입니다. 저희 팀은 할인/쿠폰/수수료 등 돈과 관련된 도메인을 다루다 보니 코드를 작성할 때 BigDecimal 타입을 굉장히 많이 쓰고 있습니다. 본 포스팅을 통해 BigDecimal을 사용해야 하는 이유와 개념, 그리고 사용법을 간단하게 소개해보고자 합니다. 1. 서론 float와 double의 문제점 여러분은 혹시 소수(decimal)를 다룰 때 다음과 같은 경험이 있으신가요? 아래 코드를 보면 특정 조건에 맞춰 함수가 실행되는 것을 기대했는데, 실제론 실행되지 않습니다. 결괏값을 출력해보면 기대와 다른 값이 나오는 것을 확인할 수 있습니다. double a = 0.1; double ..
BackendTestingTools
전체 읽기 →docker-compose를 이용하여 로컬 개발환경 구성하기(Part1)
docker-compose를 이용하여 로컬 개발환경 구성하기 Part 1 : docker-compose를 이용하여 로컬 개발환경 구성하기 Part 2 : docker-compose를 이용하여 spring boot 프로젝트 연결하기(예정) 배경 최근 Gmarket Member Engineering 팀에서 Quilt - 로그인 개선 프로젝트를 진행하였습니다. 기존 닷넷 기반의 레거시 어플리케이션을 Java + Container 기반으로 전환하는 것을 시작으로, 수년간 쌓여온 기술 부채를 해결하고 보다 나은 회원 인증 체계를 개발하기 위한 첫 발을 내디뎠습니다. 이를 위하여 저희 팀에서는 지속 가능 하고 확장 가능한 개발환경 구성을 고민하였고, docker를 로컬 개발환경 구성에 이용했습니다. 그동안 Java..
BackendDevOpsInfra
전체 읽기 →버그와 함께 알아보는 RecyclerView 에서 wrap_content 사용을 조심해야 하는 이유
안녕하세요. G마켓에서의 첫 돌이 지난 Mobile Application 팀 전계원입니다.작년 여름, 지마켓 내부코드 리팩토링 과정에서 버그를 만났었습니다.버그의 원인을 이해하기 위해 분석하고 공부했던 내용들을 이번 글을 통해 공유해보고자 합니다.0. 프롤로그 - 버그 발견G마켓 Mobile Application 팀에서는 원활한 유지보수와 Android 시장의 개발 트렌드를 따라가기 위해 리팩토링 작업을 매우 권장하고 있습니다.당시 신규 입사자였던 저도 G마켓의 코드에 빠르게 적용하기 위해 코드를 분석하며 간단한 화면 리팩토링 프로젝트를 진행했었습니다.그리고 개발한 내용을 홀로 테스트하던 중 이상한 경험을 마주하게 됩니다. 위 화면에서 이상한 점을 느끼셨나요?123현재 검색어 리스트가 나열되어 있는 상태..
MobileTestingTools
전체 읽기 →초보 개발자를 위한 Redis Cluster Migration 가이드라인
들어가기 전에안녕하세요, Shopping Service API팀 강희정입니다.작년 여름쯤 입사하여 낯선 환경과 도메인에 적응하고, 새롭게 접한 기술들을 익혀 가느라 정신없는 나날을 보냈습니다. 업무가 어느 정도 적응되었나 싶을 겨울쯤, 저에게 굉장히 낯선 업무가 주어졌습니다.Master/Slave 구조의 Redis에서 Cluster 구조의 Redis로 migration 되니, 관련 코드 작업을 진행해 주세요.업무를 받자마자 저는, 이런 생각을 했던 것 같습니다.큰일 났다. 하나도 모르겠는데 어떡하지?전통적인 SQL 방식의 RDBMS만 사용해 본 제게 Redis는 굉장히 낯선 존재였습니다. Redis도 모르겠는데 Cluster 구조로 migration하라는 코드를 작성하라니, 어디서부터 어떻게 시작해야 할..
BackendDatabaseTools
전체 읽기 →Redis Lua Script를 이용해서 API Rate Limiter개발
안녕하세요. Item Engineering 팀 박상윤입니다. 이번 글에서는 상품 엑셀 등록 서비스 개발하고 컨슈머에서 사용할 API Rate Limiter 개발하면서 발생한 이슈를 정리한 글입니다. 이 글은 아래와 같이 구성되어 있습니다. API Rate Limiter 도입 필요성 API Rate Limiter 적용 API Rate Limiter 동시성 문제 Lua script 실행시켜서 atomic 연산을 보장하도록 개선 정리 1. API Rate Limiter 도입 필요성 상품 엑셀 등록 서비스는 상품 정보를 엑셀에 입력하여 최대 500개의 상품을 동시에 등록할 수 있는 서비스입니다. 상품 엑셀 등록 서비스는 엑셀을 파싱 해서 상품등록 모델로 생성시켜 주는 프로듀서와 등록 모델을 수신해서 상품 등록 ..
BackendDatabaseDevOps
전체 읽기 →자바스크립트 Map 자료구조 적극 이용하기
서론자바스크립트로 프론트엔드 웹 코딩을 하면서 Key - Value 쌍의 데이터를 저장하고 조회할 때 어떤 자료구조를 이용하시나요? 열이면 여덟 아홉 객체(Object)를 이용하는 듯합니다.interface Kimchi { name: string; alias: string; score: number; ingredients: string[];}const kimchis: Record = { 1: [ { name: "백김치", alias: "맵린이", score: 1, ingredients: ["소금", "무", "양파", "배", "배추", "설탕"] }, { name: "나박김치", alias: "깍두기먹을바엔나박김치", ..
FrontendTools
전체 읽기 →Java Logger의 또다른 식구, tinylog
안녕하세요. 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..
BackendTools
전체 읽기 →쿠버네티스 오퍼레이터 적용하기
서론안녕하세요. 지마켓의 원활한 서비스 운영을 위해 쿠버네티스 인프라를 운영 업무를 하고 있는 Platform Technology 팀 김지형입니다.Red Hat Openshift 기반의 쿠버네티스 클러스터를 운영하게 되면서 자연스럽게 적용하게 된 쿠버네티스 오퍼레이터에 대한 사례와 경험을 기술하고자 합니다. 오퍼레이터에 대한 간단한 설명과 쿠버네티스 오퍼레이터에 대해서 설명하고, 현재의 오퍼레이터 패턴이 가져다주는 이점과 한계에 대한 내용을 포함합니다. 오퍼레이터 디자인 패턴오퍼레이터(Operator)는 2016년 CoreOS 블로그 포스트에서 공개된 디자인 패턴으로, 단어 그대로 운영자의 역할을 소프트웨어에 새긴 개념이라고 할 수 있습니다. SRE 엔지니어는 소프트웨어를 개발해 애플리케이션을 운영하는 ..
ArchitectureDevOpsInfra
전체 읽기 →Handling-request-binding-exception in webflux
이번 글에서는 Spring Webflux + Kotlin 기술 스택에서 Request Binding Exeption에 대한 처리를 예제코드를 통해서 구현해 보도록 하겠습니다.Controller 처리Controller에서는 @Valid annotation을 사용해서 request Object 대한 validation을 체크합니다. @ApiOperation("xxx") @GetMapping("/main") suspend fun getMainDeals( @Valid retrieveMainDealRequest: RetrieveMainDealRequest ) = superDealGoodsService.readSuperDealMain(retrieveMainDealReq..
BackendTestingTools
전체 읽기 →API Management PaaS에서 Multi-tenancy 구현하기
개요 안녕하세요. 지마켓에서 개발자분 업무의 편의를 도모하기 위한 클라우드 플랫폼 업무를 담당하고 있는 김지형입니다. 이번 글에서는 API 관리형 서비스인 Red Hat 3Scale 제품을 이용해 개발 팀 간 멀티테넌시 구축을 위해 고려한 부분과, 실 적용 과정에 대해 글을 쓰고자 합니다. 멀티테넌시 (Multi-tenancy) 멀티테넌시 (Multi-tenancy)는 하나의 소프트웨어 어플리케이션을 여러 고객에게 일관된 경험으로 서비스할 수 있게 하는 아키텍처를 말합니다. 클라우드 컴퓨팅이 발전하면서 가상화 및 컨테이너화를 통해 각각의 고객이 분리된 각각의 데이터를 이용할 수 있게 되었고 동일한 호스트 노드 내 단일 인스턴스지만 각각 별도의 앱을 이용하는 것처럼 구현할 수 있게 되었습니다. 인프라 멀티..
ArchitectureBackendDevOpsInfra
전체 읽기 →Thread의 개인 수납장 ThreadLocal
안녕하세요. Fulfillment Engineering 팀의 백정현입니다.Thread에 개인 수납장이 있다는데 들어보셨나요?이번 포스팅에서는 ThreadLocal에 대해서 가볍게 살펴보러 들어가 보겠습니다.ThreadLocal은 무엇인가요?이름을 살펴보면 “Thread가 로컬 환경에서의 어떤 것과 연관이 있다.”라는 것을 가늠할 수 있습니다.공식 문서에서는 java.lang 패키지에 있는 ThreadLocal 클래스를 다음과 같이 요약해서 설명할 수 있습니다.Thread에 대한 로컬 변수를 제공한다.각각의 Thread가 변수에 대해서 독립적으로 접근할 수 있다.그렇다면 우리는 ‘각자가 독립적으로 사용할 수 있는.. 로컬 변수(물품)’라고 생각하면,이것에서 수납장을 연상할 수 있습니다.ThreadLocal..
BackendTools
전체 읽기 →기획전 a11y 개선 프로젝트
Intro안녕하세요. 사회복지학과 출신 개발자 Web Frontend팀의 이민하입니다.저는 입사 4개월 차에 설레는 첫 업무를 받게 되었고 이내 운명을 느꼈습니다.그것은 바로 제 전공과 관련된 a11y 개선 프로젝트였기 때문이죠. a11y?k8s 라는 말 들어보셨나요? 백엔드 개발자에게는 친숙한 Kubernetes의 줄임말입니다. 첫 글자 k와 마지막 글자 s 사이에 8개의 문자가 있어 k8s라고 표현합니다. 이를 숫자약어(Numeronym)라고 하는데요, 이 유래가 참 재미있습니다.지금은 HP(Hewlett-Packard)사에 합병된 DEC(Digital Equipment Corporation) 사의 Jan Scherpenhuizen라는 직원이 입사하게 되었습니다.전통적으로 이름을 이메일 계정으로 하..
AI/MLFrontendUX/UI
전체 읽기 →Sharded MySQL Cluster 도입 배경과 개발기 (부제: 우당탕탕 좌충우돌 개발기)
Sharded MySQL Cluster 도입 배경과 개발기 (부제: 우당탕탕 좌충우돌 개발기)안녕하세요, 지마켓 Item Engineering 팀입니다. 저희는 지마켓 & 옥션의 상품 등록/관리와 관련된 플랫폼을 담당하고 있습니다!저희 팀은 대량의 상품 데이터와 대규모 트래픽을 처리해야 하며 로직이 (꽤) 복잡한 부분이 있는 상품 데이터들을 운영하고 있습니다. MSSQL을 주로 사용하지만 이번에 샤딩 기법을 사용한 MySQL 클러스터를 도입하게 되었습니다!이름하야 '루미큐브' 프로젝트!하지만 해당 프로젝트를 진행하며 많은 시행착오가 있었는데요..왜 MySQL을 도입하게 되었는지, 샤딩 기법을 사용하고 있는데 샤딩이란 무엇인지, 샤딩을 쉽게 처리하기 위해 사용한 '샤딩스피어'란 무엇인지,그리고 저희의 시행..
AI/MLBackendDatabaseInfra
전체 읽기 →Gmarket Hadoop Platform Baikal 소개
안녕하세요 Data Platform Engineer 조광진입니다.저희 Platform Technology 팀은 지난 수년간 On-premise Hadoop 기반의 빅데이터 플랫폼인 'Baikal' 이란 서비스를 사내에 제공하여 전사에서 활용되는 데이터의 수집, 적재, 분석에 대해 편의성을 제공하고 있습니다.빅데이터 플랫폼 Baikal은 On-premise 에서 Cloud Lakehouse Platform으로 전환을 앞두고 있습니다.Cloud Lakehouse Platform으로 전환하기 앞서 On-premise Hadoop 기반인 Baikal에 대해 소개하고자 합니다.Gmarket BaikalBaikal 이란 이름은 잘 아시다시피 러시아 시베리아 남쪽의 있는 세계에서 가장 오래되고 깊은 담수호 이름입니다..
AI/MLBackendDatabaseInfra
전체 읽기 →성능 테스트를 위한 격리 - 시뮬레이션
시뮬레이션이전 글을 통해 테스트에 사용할 기록들을 캡처하여 확보했습니다. 이렇게 캡처한 내용을 바탕으로 mock service 를 띄워 이제는 시뮬레이션할 수 있습니다. 이제 테스트를 수행해 봅시다. hoverfly dashboard 에서 simulate 모드로 변경하거나 기록한 파일을 import 하여 hoverfly 를 재기동하면 테스트 환경으로 활용할 수 있습니다. 하지만 몇 가지 좀 더 수월한 테스트 조력을 원하였습니다. hoverfly 는 매우 디테일하게 기록하지만 실제 테스트에 적합한 동작은 덜 디테일하거나 추가적인 디테일이 필요할 수 있다.mocking 하는 서비스의 특징을 흉내 낼 때, 각 config 가 서비스 단위로 관리할 수 있는 게 편했다.hoverfly 는 가볍고 빠르다고 하지만 ..
InfraTestingTools
전체 읽기 →지마켓 OCR 기술 소개
OCR : Optical Character RecognitionOCR은 손글씨로 작성되거나 인쇄된 종이 문서를 스캐너와 같은 디지털 영상 획득 장치로 이미지화한 것들로부터 문자(열)를 인식/추출 하는 이미지 분석 기술로부터 시작되었습니다.최근에는 일상 생활에 스마트 폰이나 태블릿 같은 디지털 기기를 활용하는 문화가 대중화 되면서 이미지 편집 도구로 생성된 디지털 이미지나 디지털 카메라로 찍은 다양한 이미지에 포함된 문자(열)을 인식하는 기술로 발전하고 있습니다. OCR의 간략한 역사컴퓨터가 개발되기 이전부터 이미 시각 기호를 문자에 대응시키려는 개념이 있었으며, 컴퓨터가 발명된 이후 다양한 활용 방법을 모색하기 시작하였고, 일반 사진을 컴퓨터에서 이용할 수 있도록 하는 디지털 이미지 표현/변환 기술을 연..
AI/MLFrontendTools
전체 읽기 →AOP , Swagger를 이용한 인증 로직 구현하기
안녕하세요. SmilePay Engineering 팀 문한국입니다. 이번 포스팅에서는 Spring의 주요 특징 중 하나인 AOP를 이용하여 인증 로직을 구현한 예시와 Swagger를 활용하여 header를 자동으로 연동한 내용을 공유하려고 합니다. AOP 활용 하기 AOP는 기술 면접에서 Spring에 관한 부분에서 단골질문으로 나올 만큼 Spring에서는 중요한 개념이라고 생각합니다. 관점 지향 프로그래밍인 AOP(Aspect Oriented Programming)는 proxy 패턴을 활용한 기술로 공통된 기능을 구현하여, 필요한 상황에 사용할 수 있도록 하는 개념으로 코드의 중복을 피하고 기능을 모듈 형태로 사용할 수 있는 좋은 기능이라고 생각합니다. 아래 이미지는 AOP를 설명하기 위하여 많이 활용..
BackendSecurityTools
전체 읽기 →