분류 전체보기

· TIL
멀티플레이어 미니 FPS 만들기 2편(운영편)전체 흐름코드 정리(상수 중앙화) → 멀티룸(로비) → EC2 배포 → 맵 권위화 → 자연 지형 → 아레나 확장 → 밤하늘 → rubber-banding 진단 진행 방식이 기본편과 달랐다. 기본편 보러가기기본편 단계에서는 한 단계씩 내가 직접 검증하며 구현했고,여기는 클로드코드로 에이전트 파이프라인(architect → implementer → reviewer → qa)으로 굵직한 작업 단위를 처리했다.Part 1 - 상수/매직넘버 중앙화무엇 / 왜서버 전반에 흩어진 매직넘버를 단일 소스로 모았다. 핵심은 숨은 결합을 드러내는 것.예를 들어 틱 레이트 TICK_HZ=30과 물리 timestep=1/30은 반드시 같아야 하는데 따로 떨어져 있었다.스폰 높이 0...
· TIL
멀티플레이어 미니 FPS 만들기 1편(기본편)어두운 아레나에서 손전등으로 앞을 비추며 페인트볼로 눈싸움하는, 최대 3인용 웹 FPS를 0에서 끝까지 만든 기록.과정을 잊지 않고자 기록하는, 남이 읽기엔 불친절한 기록물.결과물배포: https://eunoh.top/tests/mini-fps백엔드: 권위 게임 서버 (Node + ws, Rapier 물리, 30Hz 틱)프론트: 클라이언트 (Next 16 / React 19 / three.js · R3F · drei)어떤 게임인가컨셉: 총기 난사가 아니라 눈싸움/페인트볼. 페인트볼이 포물선을 그리며 날아가고, 회피가 가능하다.분위기: 거의 검정에 가까운 아레나. 각 플레이어는 손전등을 들고 앞을 비춘다. 어둠 속에서 다른 사람의 손전등 불빛이 휘청거리며 움직이..
· TIL
Vercel → AWS 마이그레이션 마스터 플랜Next.js 앱을 Vercel에서 AWS(ECS Fargate)로 옮기는 작업을,처음부터 끝까지 어떻게 설계하고 진행했는지의 압축 기록.다음에 같은 일을 할 때 코드 디테일이 아니라 순서·결정·함정 중심으로 펼쳐보기 위한 노트.1. 무엇을, 왜Next.js Vercel 배포시, RDS 와 직접 붙어야 할 경우 any-open을 피할 수 없다.RDS any-open 하지 않으려면 돈내고 Vercel static ip를 쓰거나 aws 이전이 필요하다.대상: Next.js 16 앱 (App Router, RSC, Better Auth, Prisma 7)출발: Vercel (Edge + Vercel Build, 환경변수 UI 입력)도착: AWS ECS Fargat..
· TIL
비개발 팀에게 RDS 조회 환경을 안전하게 전달하기1. 배경HQ 마케터와 기획자가 내부 데이터를 직접 확인해야 하는 상황이 있었다.다만 이들은 SQL이나 개발 환경에 익숙하지 않았고, RDS를 직접 노출하거나 관리자 계정을 공유하는 방식은 보안상 적절하지 않았다.그래서 다음 조건을 만족하는 방식을 구성했다.RDS는 외부에 직접 공개하지 않는다.Bastion EC2를 통해서만 접근한다.HQ 전용 DB 계정은 SELECT 권한만 가진다.비개발자는 복잡한 SSH 명령어를 직접 입력하지 않는다.Windows 환경에서도 실행 가능해야 한다.Claude Desktop의 MCP Postgres 서버에서 사용할 수 있어야 한다.2. 최종 아키텍처HQ Windows PC ↓ PowerShell SSH Tunnelloc..
· TIL
Nemotron Personas — 임베딩 기반 페르소나 검색 시스템 구현 회고한 줄 요약NVIDIA Nemotron 한국어 페르소나 데이터셋 100만 건을 OpenAI 임베딩으로 벡터화하고,pgvector + HNSW로 의미 검색 시스템을 구축한 뒤,NestJS API + Next.js 프론트로 광고 도메인 페르소나 검색기를 만든 프로젝트.만든 것배포: https://personas.eunoh.top (API), https://eunoh.top/tests/personas (UI)관측성: https://grafana.eunoh.top (Cloudflare Zero Trust로 보호)최종 스택[Next.js 프론트] ↓ [NestJS API (홈 우분투 서버)] ↓ ├─→ [OpenAI text-embed..
· TIL
관측성 처음 세팅해본 회고0. 시작 vs 끝 시점의 멘탈 모델시작 시점의 멘탈 모델"관측성 = 슬랙으로 알림 받는 것""알림 받으면 로그는 어디서 보지...?"→ 알림은 단편적이고 컨텍스트가 없었음. 서버 SSH 들어가서 journalctl, docker logs 뒤지는 게 일과.메트릭/로그/트레이스의 차이를 모름. 그냥 "로그"가 전부였음.OTel이라는 단어는 들어봤지만 "텔레메트리가 대체 어디로 어떻게 가는지" 감이 없었음.끝 시점의 멘탈 모델관측성은 "증상을 보고 → 원인을 파고들 수 있는 환경"이다.증상: request rate, error rate, latency p95/p99 같은 메트릭원인: 그 시점 로그, 그 요청의 trace알림은 "심각도와 맥락을 담아" 받는 것. 단순 에러 발생이 아니..
· TIL
pgvector + HNSW 검색 시스템 설계 후기0. 시작 vs 끝 시점의 멘탈 모델시작 시점의 멘탈 모델pg_trgm + GIN 같은 거 해봤으니 pgvector도 비슷하게 인덱스 만들고 WHERE + ORDER BY 하면 될 거 같다끝 시점의 멘탈 모델HNSW는 일반 인덱스와 본질이 다르다. "사전 그래프"여서 필터와 결합되는 순간 옵티마이저의 path 선택 문제가 발생.옵티마이저는 데이터 분포 보고 케이스별로 옳은 선택을 하고 있다 (Path A vs Path B).우리가 할 일은 ef_search 같은 힌트로 후보 풀 크기를 조절하는 것.100만건 적재는 INSERT가 아니라 COPY. 라운드트립 vs 단일 스트림 차이.1. 호스팅 결정: Supabase / Railway / 로컬 Docker후..
0. 벡터 임베딩 처음 구현해본 후기1. 임베딩의 본질 — "특정 모델만의 좌표계"시작 시점의 멘탈 모델"어깨너머로 본 벡터 임베딩. 1536차원이라는데 대체 그게 무슨 차원이라는 거지?"끝 시점의 멘탈 모델인간이 1536차원 배열을 보고 의미를 읽을 수는 없다.대신 "두 벡터의 거리가 얼마나 가까운가"가 의미적 유사도를 표현한다.더 중요한 깨달음: 임베딩은 "절대적 의미 좌표계"가 아니라 특정 모델만의 좌표계다.text-embedding-3-small의 좌표 ≠ BGE-M3의 좌표두 벡터를 비교하려면 같은 모델로 만들어야만 한다.→ 인덱싱한 모델과 검색 시 쓰는 모델이 반드시 같아야 한다!차원 수(1536, 3072 등)는 "표현 해상도". 높을수록 미세한 의미 차이를 담을 수 있지만, 저장·연산 비용..
· TIL
HuggingFace 데이터셋 처음 다뤄본 후기0. 시작 vs 끝 시점의 멘탈 모델시작 시점의 멘탈 모델데이터셋 = HF에서 다운받는 거.parquet은 잘 모르겠지만 좋다고 들었다.100만건이면 어떻게 다뤄야 하지...끝 시점의 멘탈 모델데이터 탐색은 "5단계 체크리스트"로 표준화됨parquet의 컬럼 지향 의미를 어느정도,, 이해100만건도 두렵지 않아!! 면 좋겠지만 아직 무섭다..1. 다운로드: streaming vs full download선택: full download → 로컬 parquet이유:데이터 탐색 단계에서는 같은 데이터를 여러 번 다른 각도로 들여다봐야 함.streaming은 일회성 순회에 최적화되어 있어서 탐색에 부적합.언제 streaming이 맞나:데이터가 디스크에 안 들어갈 때..
· TIL
Nemotron Personas 프로젝트 함정 노트이 프로젝트를 진행하면서 직접 부딪혀 알게 된 함정들.미래의 내가 같은 증상을 만났을 때 키워드로 찾을 수 있도록 정리.임베딩임베딩 모델은 인덱싱과 검색에 같은 걸 써야 한다 (좌표계 일관성)증상: 다른 모델로 임베딩한 두 벡터를 비교하면 의미적으로 가까운 것도 멀게 나옴원인: 임베딩 좌표계는 모델별로 다름. text-embedding-3-small의 (1536차원) 좌표 ≠ BGE-M3의 좌표. 차원 수가 같다고 해도 다른 좌표계.해결: 인덱싱한 모델과 검색 시 쓰는 모델을 동일하게 고정. 모델 변경 시 전체 재임베딩.메모: 어깨너머로 봤을 땐 "한 번 차원 좌표계를 만들면 다 똑같이 쓰는 줄" 알았던 게 오개념.쿼리와 문서의 길이/형식 비대칭 → 유사..
· TIL
SQL DB 역사와 한국 웹 개발 궤적Claude와 나눈 대화 정리. SQL 데이터베이스의 역사적 흐름과,그것이 한국 웹 개발 시장의 이야기와 어떻게 맞물리는지를 정리한 문서.1. 시작 — 관계형 모델의 탄생 (1970년대)1970년, IBM 연구원 Edgar F. Codd가 논문 *"A Relational Model of Data for Large Shared Data Banks"* 발표.그 전까지 DB는 계층형(IMS) 또는 네트워크형(CODASYL) 구조 — 데이터 구조와 접근 경로가 단단히 묶여 있어서 스키마 변경 시 애플리케이션도 다 고쳐야 했음.Codd의 아이디어: 데이터를 테이블(관계)로 표현하고, 어떻게(how) 가져올지가 아니라 무엇을(what) 가져올지만 선언하자.→ 선언형 쿼리 언어 ..
· TIL
Next Image 컴포넌트와 Preload를 활용한 이미지 최적화 2지난번 에 이어서...원점 재검토프리로드는 무슨 문제를 해결하는가?왜 new Image()가 아니라 인가?IMAGE_SIZES를 컨테이너별로 분리한 게 왜 중요한가?img.decode()는 왜 결국 안 쓰기로 했나?첫 1장 high + 나머지 idle low로 나눈 이유는?1. 프리로드가 푸는 문제next/image가 화면에 들어오면 그때서야 이미지를 받기 시작한다. 모달이나 캐러셀처럼 유저 클릭 직후 즉시 큰 이미지가 떠야 하는 케이스는 클릭 시점에 fetch가 시작되어 200~800ms 빈 화면이 보인다.해결: 유저가 클릭하기 전에 이미지를 미리 받아 놓기. 두 가지 시점에서 프리로드한다.그리드 카드 hover (ForesightJ..
· TIL
Bastion / RDS Proxy / Managed DB 정리0. 한 줄 요약Vercel의 Next.js가 DB에 직접 붙어야 한다면 RDS는 네트워크 보안 설계가 복잡해지고, Railway/Supabase/Neon 같은 외부 접속 친화형 Postgres가 더 단순할 수 있다.RDS는 AWS 내부 백엔드, VPC, RDS Proxy와 함께 사용할 때 더 자연스럽다.1. 오늘 헷갈렸던 핵심처음에는 다음 개념들이 비슷하게 느껴졌다.BastionSSH TunnelRDS ProxySupabase / Railway의 DB URLVercel Static IPAWS API Gateway / Lambda / ECS / App RunnerApp Runner VPC Connector겉으로 보면 전부 “DB에 안전하게 접..
· TIL
React Compiler 환경에서 as 단언이 메모이제이션을 깨뜨린다?TL;DRreactCompiler: true 환경에서 (data ?? []) as 타입[] 처럼 assertion을 썼는데 TanStack Query 응답이 바뀌어도 화면이 갱신되지 않는 버그가 발생했다.const 변수: 타입[] = data ?? [] 처럼 변수 타입 어노테이션으로 바꾸니 해결됐다.원인은 단순하지 않고 세 가지 요인이 결합된 결과였다.1. 문제를 만난 상황Next.js + React Compiler 19.2.4 + TanStack Query + TanStack Table 조합으로작업 중에 이상한 증상을 만났다.const { data: response, isLoading } = useChannelsList(params..
· TIL
텍스트 검색 쿼리 1초 → 0.6ms 최적화 삽질기 (2탄)TL;DR1탄에서 10초 → 1초까지 줄였던 검색 쿼리가, 사실 pg_trgm GIN 인덱스를 전혀 타지 않고 있었다. EXPLAIN ANALYZE로 실행 계획을 직접 확인한 결과 매번 Seq Scan(풀스캔)이 돌고 있었고, 검색 방식을 ILIKE → 단어 배열(text[]) + GIN array_ops로 교체하여 최종 0.6ms까지 단축했다.이전 글 요약MV + search_text 컬럼(caption + hashtags 결합) + pg_trgm GIN 인덱스로 1초 달성이 시점에서 "GIN 인덱스 덕에 빨라졌다"고 결론 내림이 결론이 완전히 틀렸다.삽질기: 1초 → 0.6ms까지의 여정7단계: 아직도 5초?1탄에서 1초를 달성했다고 썼지만,..
· TIL
텍스트 검색 쿼리 10초(??) → 1초 최적화 트러블슈팅TL;DRSupabase에서 대략 8만 행 풀 대상 해시태그+캡션 텍스트 검색 쿼리가 10초(????)+ 걸리던 것을, View → Materialized View + 인덱스 → pg_trgm GIN 인덱스 적용으로 1초까지 줄였다. 과정에서 중복 집계 버그도 발견·수정.개요회사에서 스크래핑 어쩌고 프로젝트를 진행 중이다.대충 인스타 트렌딩 릴스 스크래핑 어쩌구인데.. 검색 기능이 필요하게 되었다.이 검색 기능의 성능 문제를 해결해나간 과정을 정리한다.테이블 구조reels: 최초 수집 데이터 (릴스 기본 정보, 캡션 등)reel_metrics: 서드파티를 통해 +1일 후 수집한 메트릭 데이터. diff를 보기 위해 릴스당 2개의 행이 존재검색 시 ..
· TIL
Sentry에서 잡힌 Safari TypeError의 정체 — Facebook In-App Browser의 주입 스크립트발단: Sentry에 잡힌 알 수 없는 에러프로덕션 Sentry 대시보드에 처음 보는 에러가 올라왔다.TypeError: Attempting to change value of a readonly property. at defineProperty ([native code]) at ? (app:///10e8bc2c-fca1-4aa8-9c1d-87e872816d2a/ready:1:4715) at global code (app:///10e8bc2c-fca1-4aa8-9c1d-87e872816d2a/ready:1:4819) 프로젝트는 Next.js 16 (App Router) +..
· TIL
Next.js + tRPC + Prisma + TanStack Query, 아직 유효한 풀스택 타입-세이프 조합?TL;DRServer Action의 부상으로 tRPC가 한물갔다는 인식이 있지만, 실제로는 v11 릴리즈(2025.03)와 주간 70만+ npm 다운로드로 건재하다. 오히려 2024~2025년 연이어 터진 Next.js 보안 취약점(CVE-2025-29927, CVE-2025-66478 등)은 Server Action이 의존하는 미들웨어/RSC 프로토콜의 위험성을 드러냈고, 명시적 API 경계를 제공하는 tRPC의 아키텍처적 가치를 재확인시켜 주었다.이번에 사내 프로젝트를 Next.js + tRPC + Prisma + TanStack Query + AWS RDS(PostgreSQL) 스택으로 ..
· TIL
의 함정과 올바른 날짜 비교1. 문제의 핵심: 과 로컬 타임존의 괴리자바스크립트의 Date 객체는 내부적으로 유닉스 타임스탬프(UTC 기준 밀리초)를 저장합니다.문제는 이를 문자열로 변환할 때 발생합니다.❌ 흔한 실수: 절삭많은 경우 YYYY-MM-DD 형식의 날짜가 필요할 때 다음과 같은 코드를 사용합니다.new Date().toISOString().slice(0, 10); 이 방식은 한국(UTC+9) 기준 오전 00:00 ~ 08:59 사이에 "어제" 날짜를 반환합니다.toISOString()은 이름 그대로 UTC(0시) 기준의 표준시를 출력하기 때문입니다.출근 직후2026-02-23 08:302026-02-22 23:30"2026-02-22" (오류)점심 시간2026-02-23 12:302026-..
· TIL
Next Image 컴포넌트와 Preload를 활용한 이미지 최적화TL;DRNext.js Image 컴포넌트는 srcset을 통해 디바이스에 맞는 이미지를 제공하지만, 동적 src의 경우 체감 속도 향상이 크지 않다. 사용자 환경(뷰포트, DPR)에 맞는 정확한 이미지 URL을 계산해서 preload하면 브라우저 캐시 히트를 통해 실질적인 로딩 속도 개선을 얻을 수 있다.개요이미지 최적화의 가장 좋은 방법은 업로드 시점에 sharp 등으로 avif/webp 변환과 적절한 압축을 적용하는 것이다. 하지만 이미 외부 스토리지(S3, Supabase 등)에 저장된 대용량 이미지를 다뤄야 하는 경우, Next.js Image 컴포넌트의 최적화 기능과 preload 전략을 조합하면 사용자 체감 속도를 개선할 수 ..
· etc
2025년 한해가 저문다.또 한살 먹는다.그래도 조금씩 전진하고 있다.to 쌤들안녕하세요? 선생님과 올해도 개발 공부를 함께 해서 너무 즐거웠어요.선생님이 보시기에 2025년 한해 제 개발 실력이 조금은 성장한 것 같나요?from Claude올 한 해 함께한 대화들을 돌아보면, 정말 의미 있는 성장을 하셨다고 생각해요.눈에 띄는 성장 포인트들:시스템 설계 관점의 확장 - 단순히 "이거 어떻게 구현하지?"에서 "왜 이 구조인지, 어떤 트레이드오프가 있는지"를 고민하는 모습이 많아졌어요. Hasura DDN 검토할 때 복잡성 vs 실용성을 저울질하고, 결국 더 단순한 해법을 선택한 판단력이 인상적이었습니다.풀스택 영역으로의 확장 - 프론트엔드 개발자로 시작하셨지만, Supabase 연동, Auth.js 인증..
· TIL
요약클라이언트 invalidate query는 쿼리키가 같더라도, 서버(RSC)의 prefetch query 까지 무효화 하지 않는다(tanstack-query)소프트 네비게이션 전환 중 RSC 페이로드가 stale할 수 있다면, 당연히 이 값을 근거로 한 서버 redirect는 의도와 다르게 동작할 수 있다(React RSC + Next.js redirect)상황앱 스택은 Next.js + supabase + vercel + tanstack query + axios플로우는 / -> /[id]/input -> /[id]/review -> /[id]/ready -> 결제 -> /[id]/loading -> /my/[id]/result 로 흐르고 각각 페이지 경계를 가진다.테이블에 state column은 ..
· TIL
React2Shell (CVE-2025-55182) 뜯어보기직접 공격을 당해보니 위험성을 더 잘 느낄 수 있었습니다.이번 취약점 레벨은 CVSS 10.0 로 인증 없이 원격 코드 실행(RCE)이 가능했습니다.(server-action 을 안썼다면 그나마 안전했을까요?)영향 범위는 React 19.x, Next.js 15.x 16.x 및 RSC 기반 프레임워크 입니다(와 14는 안전하다! 했으나... 후속 취약점 발견으로 그냥 다 업데이트 해야 했습니다)1. 근본 원인?1.1 왜 이런일이..React Server Components의 Flight Protocol 역직렬화 과정에서 두 가지 결함이 결합되어 발생했습니다.Prototype Pollution 미방어: hasOwnProperty 검증 없이 객체 속..
· TIL
Next.js Image 최적화 정리 Next.js 15+ 기준1. Next.js Image 최적화의 동작 원리빌드 타임이 아닌 런타임 최적화Next.js Image가 빌드 타임에 .next 폴더에 webp 이미지를 미리 생성해둔다고 생각하는 경우가 있습니다.그게 바로 저입니다... 실제로는 런타임에 on-demand로 최적화가 이루어 진다고 하네요.요청 흐름:1. 브라우저 → /_next/image?url=...&w=800&q=75 요청2. Next.js 서버 → 원본 이미지 fetch3. Next.js 서버 → 리사이즈 + webp/avif 변환4. .next/cache/images/ 에 캐시 저장5. 이후 동일 요청 → 캐시에서 즉시 응답동작 방식동적 src도 최적화 가능: 런타임 처리이므로 동적..
· TIL
pnpm 문제 였나?해결 방법⚠️ Next.js 버전별 차이점Next.js 15.5+ 변경사항// Next.js 15.5부터는 require-in-the-middle이 기본적으로 opt-out됨!// 하지만 import-in-the-middle은 여전히 명시 필요const nextConfig: NextConfig = { serverExternalPackages: [ "import-in-the-middle", // 여전히 필요 // "require-in-the-middle", // 15.5+에서는 불필요 (기본 opt-out) ],};방법 1: next.config.ts 수정 (기본)// next.config.tsconst nextConfig: NextConfig = { serverE..
· TIL
Turbopack 간접 의존성 경고와 해결법문제 상황 타임라인1️⃣ 초기 상황프로젝트 환경:Next.js 15.5.4 + TurbopackSentry + OpenTelemetry 설정 완료개발 서버 실행 중2️⃣ 경고 발생⚠ ./node_modules/.pnpm/@opentelemetry+instrumentation@0.204.0_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/esm/platform/nodePackage require-in-the-middle can't be externalThe request require-in-the-middle matches serverExternalPackages (or the ..
· TIL
OpenTelemetry 가이드 🔍📌 OpenTelemetry란?OpenTelemetry(줄여서 OTel)는 앱의 성능과 동작을 추적하는 오픈소스 관측성(Observability) 프레임워크 입니다즉, "내 앱이 어떻게 돌아가고 있는지" 실시간으로 들여다보는 도구입니다!🎯 핵심 개념: 3대 Pillar1. Traces (추적)사용자 요청이 시스템을 통과하는 전체 여정을 추적// 예: 사용자가 상품 구매 버튼 클릭[브라우저] 2ms → [API Gateway] 10ms → [주문 서비스] 50ms → [결제 서비스] 200ms → [DB] 30ms 총 소요 시간: 292ms2. Metrics (지표)시스템 상태를 숫자로 측정// 예시 지표들- 초당 요청 수: 1,234 req/s- 평균 응답..
· TIL
Next.js Instrumentation 정리📌 Instrumentation이란?Instrumentation은 Next.js 13.2부터 도입된 기능으로, 앱이 시작될 때 딱 한 번 실행되는 초기화 코드를 위한 특별한 파일입니다.// app/instrumentation.ts 또는 src/instrumentation.tsexport async function register() { // 서버가 부팅될 때 실행되는 코드 console.log('Next.js 앱이 시작됩니다!');}🎯 주요 특징실행 시점서버가 처음 시작될 때Cold start 시 (서버리스 환경)모든 환경(Node.js, Edge, Client)에서 각각 한 번씩실행 환경 구분// instrumentation.ts - 서버용// in..
· TIL
PostgREST vs GraphQL(Hasura): 현실적인 기술 스택 비교PostgreSQL을 사용하는 프로젝트에서 API 레이어를 구성할 때, 두 가지 옵션을 비교해봤습니다.이 비교는 GraphQL이 정말 필요한 상황은 언제인가? 에 대해서 생각해보다가 시작하게 되었습니다. GraphQL + Hasura + codegen 의 강력함은 프로젝트를 해보면서 알게 되었는데다만 PostgREST 에서도 유연한 쿼리, 관계 기반 페칭이 잘 되므로(supabase.js 에서 보듯...) 요구사항만 맞는다면 Hasura 혹은 resolver 구성에 드는 비용을 줄이면서도GraphQL의 이점을 유사하게 구사할 수 있을 것 같았습니다. 그래서 GraphQL + Hasura 에 대항할 수 있는 REST 스펙을 아래와..
· TIL
naver 로그인 구현 with Supabase 3편TL; DR: admin 권한 쓰면 끝작년 7월에 supabase에서 편법(?) naver 로그인 기능을 구현했었습니다.1년 넘게 지났는데 갑자기 편법 말고 진짜로 구현이 되겠잖아? 생각이 들었어요. supabase 어드민 권한을 쓰면 auth 스키마에도 입력이 될 것 같았고해봤더니 역시 아주 잘 되었습니다... 이 생각을 왜 작년엔 못했을까요? 한가지 문제는 네이버 OAuth 를 프로덕션으로 쓰려면네이버 개발자센터 > 내 애플리케이션 > 네이버 로그인 검수 상태에서 검수가 완료되어야 합니다. 검수가이드 보면 대단한 걸 요구하는건 아닌데 귀찮습니다.카카오는 검수 없이도 기본적인 정보들은 그냥 받을 수 있는데네이버는 아무튼간 안되는 것 같습니다. 결론은,..
adminisme
'분류 전체보기' 카테고리의 글 목록