AI는 정말 빠를까? 바이브코딩으로 만든 서비스를 3주 만에 다시 만들며
·
개발 이야기
어느 날 대표와 기획자가 하나의 데모 서비스를 가져왔다.기획자가 다른 개발자의 도움과 AI를 활용해 만든 서비스였다. 데이터베이스를 연결하고, 화면을 만들고, 기능까지 구현한 상태였다.시연은 성공적이었다.모든 기능이 정상적으로 동작했고, 회의실에는 박수가 나왔다. 나 역시 같은 생각을 했다."이제 정말 AI만 있어도 뭐든 만들 수 있는 시대가 왔구나."하지만 진짜 이야기는 그다음부터 시작됐다."다 됐으니까 그대로 서비스로 배포하죠."시간은 많지 않았다.큰 수정은 어렵고, 필요한 부분만 조금 손봐서 운영에 올리자는 결정이 내려졌다. 개발팀은 통보만 받았거나, 지나가는 말로 전해들었을 가능성이 크다.프로토타입은 자신의 역할을 완벽하게 해냈다.프로토타입의 목적은 분명하다.아이디어를 빠르게 검증하는 것.그 역할..
DB 커넥션 풀
·
개발 이야기
들어가며최근에 회사에서 javascript nodejs 기반 서버를 nestjs 기반 k8s로 마이그레이션 했다. 대부분 Prisma ORM을 사용했다. Prisma에는 DB 커넥션 풀 기능을 기본적으로 제공한다. 그래서 사실 Monolithic 서버에서는 크게 신경쓸 필요는 없었다. 한 서버에서 커넥션 풀을 관리하면 되니까. 근데 쿠버네티스는 한 인스턴스에 여러 개의 Pod들이 붙는다. 그래서 풀 개수를 시스템 레벨에서 관리해야한다. DB 커넥션 풀이란커넥션 풀은 미리 일정 수의 커넥션을 열어두고 재사용하는 것이다. 애플리케이션이 DB에 쿼리를 날리려면 먼저 커넥션을 맺어야 한다. TCP 3-way handshake, SSL 협상, DB 인증까지 거치면 커넥션 하나 만드는 데 수십 밀리초가 걸린다. 요..
Unity Asset Bundle 셰이더 메모리 최적화
·
Unity 3D
들어가며3D 아바타 기반 소셜 앱을 라이브 서비스하면서 마주친 가장 까다로운 문제 중 하나는 셰이더 메모리였다. 기능을 추가한 것도, 리소스를 더 넣은 것도 아닌데 앱이 죽었다. Memory Profiler를 열어보고 나서야 원인을 알았다 — 같은 셰이더가 수십 번 중복 로드되고 있었다.이 글에서는 Addressable Asset Bundle 환경에서 셰이더가 왜 중복되는지, 그 구조적 원인을 어떻게 진단했는지, 그리고 Shared Shader Bundle 도입으로 메모리를 99.8% 줄인 과정을 정리한다.문제 발견 — "셰이더가 왜 이렇게 많아?"서비스하는 앱은 1,000개 이상의 아바타 파츠(모자, 상의, 하의, 신발, 액세서리 등)를 지원한다. 각 파츠는 에셋 번들로 관리되며, 개별 Asset Bu..
법규 모자이크하기 (Mediapipe)
·
개발 이야기
개요영상이나 실시간 카메라에서 중지 손가락 제스처를 자동으로 감지하고 모자이크 처리하는 AI를 만들어보려고 한다.유튜브나 방송에서 욕설과 함께 등장하는 불쾌한 손동작, 편집자가 일일이 찾아서 모자이크를 씌우는 건 꽤나 번거로운 작업이다. 이걸 AI가 자동으로 해준다면 어떨까?이 프로젝트의 핵심 아이디어는 간단하다.손을 인식한다손가락 상태를 분석한다"중지만 펴진 상태"를 판별한다해당 영역에 모자이크를 적용한다복잡한 딥러닝 모델을 직접 학습시키는 대신, Google의 MediaPipe로 손 랜드마크를 추출하고, 간단한 KNN 클러스터링으로 제스처를 분류하는 방식을 사용했다.MediaPipe가 뭐야?MediaPipe는 Google에서 개발한 오픈소스 머신러닝 프레임워크입니다. 얼굴 인식, 포즈 추정, 손 추적..
내 서버는 지금도 해킹 시도 당하고 있다 – 집에서 운영한 우분투 서버의 보안 로그 분석기
·
개발 이야기
1. 서론 – 왜 집에 서버를 띄웠는가집에 미니 PC로 개인 서버를 구성해 다양한 서비스를 운영 중이다.nginx로 열려 있는 서비스는 총 3가지가 있다:1. n8n self hosted2. coupon system (nestjs)3. coupon system (vite)2. 사건의 발단 – 이상한 로그 발견어느날 문득 혹시 내 서버에 접속한 사람이 있을까? 하는 궁금증이 생겼다. Nginx는 접속 및 에러 로그를 모두 남긴다./var/log/nginx/access.log/var/log/auth.log우연히 /var/log/nginx/access.log 또는 /var/log/auth.log 등을 보다가 이상한 요청 감지접속한 IP의 지역 (중국, 러시아, 미국 등)요청 패턴 예시 (admin/login...
[nestjs] Swagger 설정
·
깜지
설치$ npm install --save @nestjs/swagger설정const docConfig = new DocumentBuilder() .setTitle('Coupon Service') .setVersion('0.1') .addServer('/couponsystem/back') .build();const document = SwaggerModule.createDocument(app, docConfig);SwaggerModule.setup('/docs', app, document, { swaggerOptions: { docExpansion: 'list', defaultModelsExpandDepth: 99, // Schemas 섹션 펼침 defaultModel..
NestJS, MongoDB, Redis로 만드는 안전한 쿠폰 발급 시스템 (feat. Lua 스크립트)
·
개발 이야기
한정 수량의 쿠폰을 뿌리는 이벤트를 할 때, 지정된 수량만큼만 풀리게 하려면 어떻게 해야할까? 단순히 db에 있는 데이터의 숫자를 줄이거나 하는 방법으로는 올바르게 처리하지 않으면 쿠폰이 중복 발급되거나 수량이 음수가 되는 문제가 발생할 수 있다. NestJS, MongoDB, Redis를 활용하여 동시성 이슈 없이 한정 수량 쿠폰을 발급하는 시스템 설계 및 구현 과정을 공유하고자 한다. 관련 코드는 GitHub 저장소 링크에서 확인할 수 있습니다!도메인 설계시스템은 크게 두 도메인으로 나뉜다:1. Coupon (쿠폰 정의): 발급 가능한 쿠폰의 종류와 총 수량을 정의{ "couponId": "WELCOME2025", "quantity": 100,} 2. UserCoupon (실제 발급 내역): 어떤..
AWS Presigned URL: 쉽고 빠르게 파일 업로드/다운로드하기
·
개발 이야기
AWS S3를 사용할 때 Presigned URL을 활용하면, 별도의 서버 프로세싱 없이도 안전하게 파일을 업로드하거나 다운로드할 수 있다. 이번 글에서는 Presigned URL이 무엇이고, 어떻게 구현하는지 파일 업로드로 예를 들어 간단히 정리해보려고 한다.Presigned URL이란?Presigned URL이란 특정 객체에 대해 일정 시간 동안만 유효한 접근 권한을 임시로 부여하는 URL을 말한다. 예를 들어, 파일 업로드를 위해 서버에서 생성한 Presigned URL을 클라이언트에게 넘겨주면, 클라이언트는 이 URL을 통해 S3 버킷에 직접 파일을 업로드할 수 있다. 이를 통해 서버는 파일 전송 업무를 맡지 않고 S3와 클라이언트를 바로 연결해주기만 하면 되므로, 트래픽과 서버 부하를 크게 줄일..
Unity Addressable : MissingMethodException 해결법
·
Unity 3D
유니티에서 Addressable Assets을 사용한 앱을 빌드하고 iOS에서 실행했을 때 다음과 같은 에러가 발생했다.MissingMethodException: Default constructor not found for type UnityEngine.ResourceManagement.ChainOperation...처음에는 리소스 이슈인줄 알고, 몇 번이고 재빌드를 했지만 해결이 안됐다. 다행히도 비슷한 문제를 겪고 있는 사람들이 있어서 오랜 삽질 끝에 해결방법을 찾아냈다. 어드레서블 리소스를 원격으로 로드하는 과정에서 발생했으며, 원인은 Code stripping이었다. Code stripping은 사용하지 않는 코드를 제거하여 앱 용량을 줄이는 유용한 기능이지만, asset을 외부에서 로드하여 사용..
디바운싱과 쓰로틀링: 이벤트 핸들링 기법
·
개발 이야기
프론트엔드 개발에서 자주 마주치는 문제 중 하나는 사용자의 연속적인 이벤트를 어떻게 효율적으로 처리할 것인가 하는 것이다. 검색창에 텍스트를 입력할 때마다 API를 호출하거나, 창 크기 조절할 때마다 무거운 계산을 수행한다면 어떻게 될까? 이러한 상황에서 디바운싱(Debouncing)과 쓰로틀링(Throttling)이 해결책이 될 수 있다.1. 디바운싱이란?디바운싱은 연속적으로 발생하는 이벤트를 그룹화하여 마지막 또는 첫 이벤트만 처리하는 기법이다.디바운싱에는 두 가지 방식이 있다:Leading Debounce연속된 이벤트의 첫 번째 이벤트만 처리설정된 대기 시간 동안 추가 이벤트는 무시대기 시간이 지난 후 다시 새로운 이벤트를 받을 수 있음이벤트가 발생했을 때 먼저 실행시킨 후, 일정 시간 동안 추가 ..