본문 바로가기

전체 글118

AX에 돈을 쓰면 정말 매출이 오를까? 요즘 많은 회사들이 AX를 이야기합니다.ChatGPT를 도입하고,Cursor를 구매하고,Claude를 사용하고,사내 MCP를 만들고,AI 예산도 점점 커지고 있습니다.그런데 문득 이런 생각이 들었습니다."그래서 정말 매출이 늘고 있을까?"저는 아직은 아니라고 생각합니다.AI는 개발 속도를 높여주지만, 서비스를 성장시키지는 않습니다.AI를 사용하면코드 작성은 빨라지고문서는 금방 작성되고테스트 코드도 자동으로 생성됩니다.생산성은 확실히 좋아졌습니다.하지만그렇다고 사용자가 갑자기 늘어나지는 않습니다.결국서비스를 성장시키는 것은 AI가 아니라 사용자입니다.사용자는 AI를 쓰는 회사가 아니라 좋은 서비스를 선택합니다.아무리 AI를 잘 사용해도사용자가 원하는 기능을 만들지 못하면서비스는 성장하지 않습니다.결국기획은.. 2026. 7. 18.
AI 시대, 이제 개발자의 경쟁력은 구현 능력이 아니라 '검증 능력'이다. — Context Engineering과 커뮤니케이션이 더 중요해지는 이유최근 몇 달 동안 ChatGPT, Claude, Cursor 같은 AI 코딩 도구를 업무에 적극적으로 활용하면서 한 가지 생각이 들었습니다.예전에는 개발자의 경쟁력이 어떻게 문제를 해결하고 얼마나 빠르게 사이드 이펙트 없이 구현하는지 였다면,이제는AI가 만든 결과를 얼마나 빠르게 이해하고, 검증하고, 올바른 방향으로 이끌 수 있는지가 더 중요한 시대가 오고 있다.물론 AI가 개발자를 대체한다는 이야기는 아닙니다.오히려 AI를 제대로 활용할수록 개발자가 갖춰야 할 능력은 조금씩 달라지고 있다고 생각합니다.구현 능력은 사라지는 것이 아니라 '평준화'된다예전에는 CRUD API 하나를 만들기 위해서도Entity를 만들고DTO를 만들고Se.. 2026. 7. 18.
NestJS 크론 작업이 두 번 실행되던 이유 Service 중복 등록으로 인한 인스턴스 이중 생성 이슈운영 중이던 서비스에서같은 시간에 같은 크론 배치가 두 번 실행되는 이상 현상이 발생했다.더 이상했던 점은,크론 스케줄은 하나코드도 하나그런데 batchId만 다른 작업이 동시에 두 개 실행결론부터 말하면 원인은 아주 단순하지만,NestJS 구조를 정확히 이해하지 않으면 꽤 오래 헤매게 되는 문제였다.📝 문제 요약동일한 시간대에batchId가 다른 두 개의 ‘빈 인벤토리 데이터 생성’ 크론 작업이 실행결과적으로같은 배치 로직이 두 번 호출두 번째 실행에서 duplicate entry error 발생🔍 문제 분석1️⃣ 근본 원인: Service 중복 등록문제의 핵심은 이거였다.PlacePlaceService가 두 개의 Module에 각각 prov.. 2026. 1. 11.
🧨 TypeORM upsert 동시 호출 시 발생한 에러 Cannot update entity because entity id is not setTypeORM을 사용하다 보면**“첫 요청은 잘 되는데, 거의 동시에 들어온 두 번째 요청에서만 터지는 에러”**를 만나는 순간이 있습니다.이번 글에서는 실제로 겪었던 upsert + 동시 호출 상황에서 발생한 에러를TypeORM 내부 동작 관점에서 정리해봅니다.📱 문제의 코드async putUserDevice( account: AccessTokenPayload, body: PutUserDeviceDtoType,) { const { accountId } = account; const lastUsedAt = new Date(); await this.placeUserDeviceRepository.upsert( .. 2025. 12. 18.
대규모 조회 API 성능 이슈 — JOIN이 모든 것을 망치던 날 최근 운영 중인 서비스에서 가게 정보를 조회하는 API 두 개가 심각한 성능 문제를 일으켰습니다.지도 뷰 조회 API → 응답 시간 약 3분가게 리스트 조회 API → 응답 시간 약 30초처음엔 서버나 인프라 문제라고 생각했지만, 원인은 쿼리 설계 방식에 있었습니다.❗️문제의 핵심: “JOIN이 많으면 똑똑한 쿼리가 아니다”우리가 만든 쿼리에는 다음과 같은 패턴이 있었습니다.가게 테이블 1개메뉴 테이블 (1:N)가게 리뷰 (1:N)태그 테이블 (1:N)운영 시간 테이블 (1:N)👉 이 모든 걸 한 번의 SELECT + 여러 개의 LEFT JOIN 으로 묶어 가져오려 했습니다.“JOIN 한 번이면 다 가져오니까 효율적이겠지?”라고 생각했지만 실제로는 폭탄을 던진 것과 같았습니다.왜 느려지는가? — 카디널.. 2025. 12. 3.
🗺️ 퍼블릭/프라이빗 서브넷 라우트 테이블 분리해야 하는 이유 AWS VPC를 사용하다 보면 누구나 한 번쯤 궁금해하는 주제가 있습니다.“퍼블릭 서브넷과 프라이빗 서브넷, 라우트 테이블을 왜 굳이 나눠야 하지?”“같이 써도 되는 거 아닌가?” 이 글에서는 실제 실무 네트워크 설계 경험을 바탕으로,퍼블릭/프라이빗 라우트 테이블이 왜 분리되어야 하는지, 그리고 트래픽 흐름은 어떻게 동작하는지 까지 아주 쉽게 설명해보려고 합니다.1. 퍼블릭 서브넷 vs 프라이빗 서브넷 간단 정리✔ 퍼블릭 서브넷외부 인터넷과 직접 통신 가능한 서브넷라우트 테이블에 **인터넷 게이트웨이(IGW)**가 등록되어 있음→ 0.0.0.0/0 → IGW✔ 프라이빗 서브넷외부 인터넷과 직접 통신 불가능인터넷으로 나갈 때는 NAT Gateway를 통해 우회→ 0.0.0.0/0 → NAT Gateway2.. 2025. 11. 26.