company Pinned Post 확신을 설계하고, 가치를 실현하는 넥스트리 다양한 도메인에서 쌓아온 실전 경험을 바탕으로, 고도의 안정성과 무한한 확장성을 동시에 갖춘 시스템 엔지니어링을 제공합니다.
company Pinned Post Vizend - 개발 방식과 조직을 혁신하는 엔터프라이즈 애플리케이션 플랫폼 소프트웨어 생산 방식(Methodology) 자체를 바꾸는 플랫폼, 비젠드(Vizend)를 소개합니다.
company Pinned Post DevLime - 원격 업무를 하나의 흐름으로 연결하는 스마트 워크 플랫폼 DevLime은 '도구'가 아닌,조직 운영 플랫폼입니다. 프로젝트 관리, 인력 운영, 업무 흐름, 조직 데이터를 하나로 연결해 원격 업무 환경에서도 흔들림 없는 운영 체계를 만듭니다.
blog Shared Ubiquitous 라이브러리 환경 분리 적용기 1. Shared Ubiquitous의 환경 간 간섭과 운영 리스크 제가 담당한 시스템은 MSA 구조로 이루어져 공통 도메인이나 유틸리티성 로직을 ‘Shared Ubiquitous’라는 라이브러리로 묶어 여러 서비스에서 공유해왔습니다. 문제는 이 라이브러리가 개발계와 운영계 구분 없이 동일한 버전을 바라보고 있었다는 점입니다. 개발 단계에서 기능을 수정하고 테스트를 위해 Nexus에 스냅샷이나 새 버전을 올리면, 같은
blog Devlime에서 Time zone 설계 경험 1. 배경 Devlime의 개발 목적 중 하나는 시간과 장소에 제약 없이 협업이 가능한 글로벌 개발 환경을 구축하는 것입니다. 이에 따라 다국어 및 Time zone 도입을 포함한 글로벌 환경 구축을 담당하게 되었으며, 여러 국가의 사용자가 동일한 시스템에서 함께 작업할 수 있도록 하는 것이 목표였습니다. 초기 시스템은 모든 시간을 UTC 기준으로 저장하거나,
blog 실시간 채팅 시스템 및 알림의 멀티 인스턴스 문제, Redis Pub/Sub으로 해결하기 Communication 서비스 · WebSocket + STOMP + Redis 1. 들어가며 — 문제는 서버가 늘어나면서 시작됐다 Communication 서비스는 의료진과 환자 간 실시간 채팅을 WebSocket + STOMP로 처리한다. 개발 초기, 서버가 1대일 때는 모든 게 정상이었다. 메시지를 보내면 상대방이 받았고, 읽음 처리도 즉각 반영됐다. 문제는 서버를 2대 이상으로 늘리면서 발생했다. 서로 다른 서버에 연결된 사용자 사이에서 메시지가
blog 마이크로 프론트엔드(Micro-Frontend, MFE) 도입 전략 1. 마이크로 프론트엔드(Micro-Frontend, MFE)의 이해 마이크로 프론트엔드는 백엔드의 마이크로서비스 아키텍처(MSA) 개념을 프론트엔드로 확장한 패러다임입니다. 거대하고 복잡한 하나의 프론트엔드 애플리케이션을 더 작고 독립적으로 배포 가능한 여러 개의 애플리케이션으로 분할하여 조립하는 방식입니다. 주요 특징 * 독립적인 배포 (Independent Deployment): 특정 기능이나 메뉴를 수정했을 때 전체 애플리케이션을 다시 빌드하고 배포할 필요
blog 이벤트 및 스케줄링 기반의 CQRS 패턴을 활용한 데이터 집계 최적화 서론: 런타임 재집계의 한계와 능동적 데이터 축적의 필요성 이전의 프로젝트에서는 대량의 데이터를 조회할 때마다 실시간으로 전체 재집계를 수행하는 방식을 주로 사용해 왔습니다. 이러한 방식은 데이터 소스가 늘어날수록 쿼리 연산 부하를 증가시켰고, 결과적으로 시스템 전체의 응답 속도를 저하시키는 고질적인 성능 병목의 원인이 되었습니다. 본 프로젝트에서는 이러한 구조적 한계를 극복하고자 팀 내
blog Flyway 사용 중 마주한 문제와 해결 과정 1. Flyway 사용 배경 프로젝트를 진행하다 보면 데이터베이스 스키마 변경은 필연적으로 발생한다. 그러나 수동 SQL 관리나 환경별 개별 반영 방식으로 인해 환경 간 스키마 불일치, 변경 이력 추적의 어려움, 각종 휴먼 에러와 같은 문제가 발생하곤 한다. 이러한 문제를 해결하기 위해 Tenant 팀에서는 데이터베이스 변경 이력을 체계적으로 관리할 수 있는 Migration
blog MongoDB 트랜잭션 타임아웃 해결을 위한 프로세스 구조 개선 1. 개요 프로젝트 수행 중 대용량 데이터를 처리하는 배치 프로세스에서 발생한 트랜잭션 장애를 해결하기 위해 처리 구조를 개선한 경험을 정리하였습니다. 무거운 연산 작업이 포함된 트랜잭션의 기술적 제약을 파악하고, 이를 극복하기 위해 선택한 지연 변환 방식의 적용 과정을 공유하고자 합니다. 2. 배경 초기 설계와 달리 고도화 과정에서 요구사항이 변화함에 따라 배치
blog SpreadJS 엑셀 로딩 성능 최적화 1. 문제의 시작: 파일을 읽었는데, 왜 브라우저가 멈추지? SpreadJS를 이용해 엑셀 파일을 임포트 하는 과정에서, 파일 크기는 약 680KB로 크지 않았음에도 불구하고 브라우저가 멈추는(Freezing) 현상이 발생했습니다. 초기에는 단순히 데이터 양이 많아서 발생하는 문제로 추측했지만, 실제 데이터는 100행 수준이었습니다. 문제의 원인은 엑셀의 사용 범위에 있었습니다. * 실제 데이터: 약 100행 * 엑셀
blog [Troubleshooting] Jackson 2.15+ 대용량 JSON 처리 시 StreamConstraintsException 해결기 1. 문제 배경 최근 프로젝트에서 메일 발송 기능을 구현하던 중, Base64로 인코딩한 이미지 데이터가 포함된 대용량 JSON을 처리하던 중 아래와 같은 예외를 마주했습니다. com.fasterxml.jackson.core.exc.StreamConstraintsException: String value length (20032631) exceeds the maximum allowed (20000000, from StreamReadConstraints.getMaxStringLength()) 2. 원인 분석 원인은 Jackson 2.15 버전부터 도입된
blog 웹소켓을 활용한 실시간 데이터 반영 및 하이라이팅 기능 구현 1. 개요 프로젝트 수행 중 리스트 형태의 화면에서 데이터 변경 사항을 실시간으로 반영하기 위해 웹소켓을 적용한 사례를 정리해보았습니다. 해당 기능은 사용자가 데이터를 추가하거나 수정했을 때, 다른 사용자 화면에서도 즉시 반영되고 변경된 row를 시각적으로 강조해야 하는 요구사항에서 시작되었습니다. 초기에는 폴링(Polling) 방식을 우선적으로 고려하였지만, 요구사항을 충족하기에 한계가 있다고 판단하여 웹소켓 기반
blog JSON 컬럼 처리 전략 변경을 통한 조회 성능 개선 1. 문제상황 실무 중에 한 조회 API의 개선 요청이 있었습니다. 해당 API는 분 단위로 적재되는 데이터(하루 약 1,440건)을 조회한 뒤, 각 row에 포함된 JSON 컬럼에서 특정 key-value를 추출한 뒤 가공하여 반환하는 구조였습니다. Native Query를 사용해 인터페이스 기반 Projection에 매핑해 이를 파싱하는 형태로 구현된 상태였습니다. 문제는 한 번의
blog Google AI Studio 활용 웹사이트 제작 경험과 인사이트 바이브 코딩이 화두로 오른 요즘, ‘단 00분 만에 만드는 사이트’ 혹은 ‘비전공자도 가능한 웹사이트 제작’과 같은 썸네일이 눈에 자주 띄었습니다. 클릭을 유도하기 위해 과장된 멘트를 넣는 것임을 알면서도 실제로 어디까지 가능할지 궁금증을 불러일으켰습니다. 그러다 AI툴을 활용해 홍보용 웹사이트를 제작해볼 기회가 생겼고, 작업을 진행해보면서 AI가 어떤 기능까지 자동으로 수행할 수
blog JPA @PostLoad를 활용한 개인정보 마스킹 처리 실무 적용기 1. 배경: 분산된 마스킹 로직이 가져온 위기 관리자 화면에서 사용자 정보를 조회할 때 이름, 전화번호, 이메일 등 민감한 개인정보를 마스킹 처리해야 한다는 요구사항을 접수했습니다. DB에는 원본 데이터를 유지하되 화면과 API 응답에서는 비식별 조치가 이루어져야 했습니다. 초기에는 서비스 레이어에서 DTO로 변환할 때마다 마스킹 로직을 삽입하는 방식을 사용했습니다. 하지만 조회 기능이 늘어날수록
blog Keycloakify : React에서 에러 메시지 동시 노출을 위한 시행착오와 최적화 Keycloakify[1]: React에서 에러 메시지 동시 노출을 위한 시행착오와 최적화 1. 배경 기본적인 인증 페이지는 보안상 이유로 혹은 레거시[2] 방식에 따라 한 번에 하나의 에러 메시지만 노출하는 경우가 많습니다. 예를 들어 아이디와 비밀번호를 모두 잘못 입력했더라도 "아이디가 잘못되었습니다"라는 메시지만 먼저 보여주는 식입니다. 하지만 회원가입 절차가 복잡하고
blog Jotai + MMKV로 React Native 상태 관리 및 영속화 구현기 - 한의원 모바일 앱 프로젝트 적용 사례 1. 배경 및 기술 선택 이유 React Native(Expo) 기반으로 개발하면서, 인증 상태를 포함한 전역 상태를 안정적으로 관리하고 앱 재시작 시에도 유지해야 하는 요구사항이 있었다. 초기에는 React Context + AsyncStorage 조합을 검토했으나, 두 가지 문제가 있었다. 첫째, Context 기반의 전역 상태는 Provider 중첩이 깊어지면서 관리의 복잡도가 급격히 증가했다. 둘째, AsyncStorage는 비동기
blog 전략 패턴을 활용한 파일 암복호화 로직 리팩터링 들어가며 최근 프로젝트 내 파일 암호화 솔루션을 기존 DRM에서 새로운 MIP로 전면 교체하는 작업을 진행했습니다. 단순히 모든 파일만 MIP로 처리한다면 간단했겠지만, 과거에 다운로드된 기존 DRM 파일들의 업로드 호환성도 함께 유지해야 하는 것이 요구사항에 있었습니다. 즉 파일 업로드 시 DRM과 MIP라는 두 가지 암복호화 체계가 공존하며 상황에 맞게 동작해야 했습니다. 이러한
blog IA List & UI 가이드 시스템 구축 퍼블리싱 넥스트리에 합류한 후 기업 프로젝트에 투입되어 퍼블리싱 인수인계를 받으며 가장 먼저 든 생각은 '만들어진 컴포넌트는 많은데, 왜 개발팀에서 이를 원활하게 활용하지 못할까?' 였습니다. 에이전시에서 여러 프로젝트를 거치며 직관적인 UI 자산 관리의 중요성을 알기에, 당시의 작업 환경은 아쉬움이 컸습니다. 당시 프로젝트는 레포지토리가 존재하긴 했지만, 실제 구현된 화면을 보려면 개별
blog 소프트웨어 모델링의 진화 소프트웨어 설계의 단위가 객체(Object) 에서 마이크로서비스(Microservice)로 진화해온 과정은, 단순히 코드를 짜는 방식의 변화를 넘어 '거대하고 복잡한 시스템을 인간이 어떻게 통제할 것인가'에 대한 끊임없는 해법 찾기의 역사였습니다. 이는 작은 벤처 기업이 성장을 거듭하며 글로벌 대기업으로 성장하면서 겪는 조직의 성장과정을 모델링 기술의 발전과정에 비추어 이야기해 보겠습니다.
blog Kubernetes 기반 시스템 점검 페이지 자동 전환 구현 1. 배경 시스템 운영 중 정기·비정기 시스템 점검은 불가피하며, 점검 시간 동안 사용자에게 안내 페이지를 노출해야 하는 요구사항이 있었습니다. 기존 방식은 점검 때마다 운영자가 공지를 하는 것이 다였습니다. 이 과정에서 인적 오류(Human Error)의 위험이 있었습니다. 이를 해결하기 위해 공지사항 등록만으로 점검 페이지 전환부터 원복까지 전 과정을 자동화하는
blog 동적 권한 관리 작년 한 프로젝트에서 Admin이 직접 리소스별 접근 권한을 제어할 수 있는 기능을 구현하며 얻은 인사이트를 나누고자 합니다. 서비스 중단 없는 권한 갱신부터 DB 설계까지, 실제 적용 사례를 통해 동적 권한 관리를 어떻게 효율적으로 구현했는지 단계별로 알아보겠습니다. 도메인 설계 - 동적 권한 관리를 위한 DB 구조 먼저, 동적 권한 관리를 적용하기
blog 대용량 JSON 대용량 JSON 이번 프로젝트를 진행하면서 대용량 JSON 을 어떻게 처리했는지 간략하게 정리해보려고 합니다. 데이터 처리 방식 Request : JSON 을 받아서 Attribute 별로 Parsing 하여 DB 에 저장 Response : Attribute 별로 조회하여 Parsing 후 Return 해결 해야될 문제 1. Request 받은 JSON 이 저용량 (100MB 이하)인 경우 : 사용자가 많아 한번에
blog Execution Context 자바스크립트는 싱글 스레드 인터프리터 언어로, 각 브라우저는 자체 자바스크립트 엔진을 사용하여 코드를 스캔하고 해석합니다. 이 과정에서 중요한 역할을 하는 것이 바로 실행 컨텍스트(Execution Context) 입니다. 실행 컨텍스트는 코드의 변환과 실행을 담당하는 환경으로, 실행할 코드에 필요한 모든 정보를 담은 객체라고 할 수 있습니다. 🔎 Execution Context 실행 컨텍스트를 알아야하는 이유? * 자바스크립트를