Techlist.io - 한국 테크 블로그 큐레이터

toss4분 읽기큐레이션 요약

Skill 품질 관리를 위한 Rubric 설계와 시스템 구현

Skill은 코딩 에이전트가 개발 과정에서 호출해 사용하는 문서형 도구이므로, 내용이 좋아도 호출되지 않으면 아무런 가치가 없다. 글은 Skill 품질을 6개 섹션 30개 항목으로 평가하고, 형식처럼 결정적으로 검증할 수 있는 항목은 규칙 기반으로, 호출 적합성처럼 의미 판단이 필요한 항목은 LLM 기반으로 분리해야 한다고 주장한다. 특히 BLOCKER가 하나라도 있으면 F 등급으로 처리해 Merge 차단 여부를 단순하게 판단하는 것이 핵심이다. ## Skill 평가가 어려운 이유 - Skill은 컴파일이나 테스트처럼 명확한 통과·실패 기준이 없다. - 결함이 있어도 호출되지 않거나, 호출돼도 효과가 없는 상태로 조용히 남을 수 있다. - 대표적인 문제는 다음 두 가지다. - **트리거 실패**: 호출 조건을 본문에 작성하고 `description`에는 적지 않아 에이전트가 Skill을 호출하지 못하는 문제 - **형식 위반**: `name`이 kebab-case가 아니거나, `name`과 폴더명이 달라 Skill 자체가 인식되지 않는 문제 ## 규칙 기반 검사와 모델 기반 검사의 분리 - 형식·구조처럼 결과가 명확한 항목은 정규식, 카운트, AST 파싱 등 결정적 도구로 검사한다. - 트리거의 의미나 설명의 충분성처럼 문맥 판단이 필요한 항목은 LLM이 평가한다. - 30개 평가 항목은 다음처럼 나뉜다. - 규칙 검사 17개 - 모델 검사 13개 - 역할을 섞으면 문제가 발생한다. - 결정적 결함을 LLM에 맡기면 애매한 상태를 통과시키는 False Negative가 생긴다. - 의미적 판단을 정규식으로 처리하면 표현의 다양성을 놓쳐 False Positive가 늘어난다. - 규칙 검사는 비용이 거의 없어 모든 PR에서 실행할 수 있고, LLM 검사는 규칙 검사를 통과한 Skill에만 적용해 비용을 줄인다. ## 6개 섹션 30개 항목의 평가 구조 - 각 항목은 `BLOCKER`, `MAJOR`, `MINOR` 심각도를 가진다. - 결과는 S부터 F까지 5단계 등급으로 표시한다. - `BLOCKER`가 하나라도 있으면 무조건 F다. - 세부 등급은 작성자에게 상태를 알려주는 신호로 사용하고, 실제 Merge 차단은 F 여부만으로 결정한다. - 이 방식은 등급의 미세한 차이를 두고 불필요하게 논쟁하는 일을 줄인다. ## 타당성: Skill이 정말 필요한가 - Skill을 만들 만한 가치가 있는지 평가한다. - 핵심 질문은 다음과 같다. - 반복적으로 발생하는 작업인가? - 코딩 에이전트가 일반적인 지시만으로 처리하기 어려운가? - Skill로 만들어 제공할 때 지속적인 이점이 있는가? - 일회성 작업이나 에이전트에게 그대로 시켜도 되는 작업은 Skill로 만들 필요가 없다. - 다른 섹션이 이미 만들어진 Skill의 품질을 점검한다면, 타당성 섹션은 애초에 만들지 말았어야 할 Skill을 걸러내는 역할을 한다. - 이 섹션에는 3개 항목이 있으며 모두 MAJOR 수준이다. ## 구조: 형식 오류를 결정적으로 차단 - 구조 섹션은 8개 항목으로 구성되며, 그중 5개가 BLOCKER다. - 예시로 다음을 검사한다. - frontmatter 존재 여부와 YAML 파싱 가능 여부 - `name`의 kebab-case 준수 여부 - `name`과 폴더명 일치 여부 - `description` 길이가 1~1024자 범위인지 여부 - 본문에 허용되지 않은 XML 태그가 포함됐는지 여부 - 구조 검사는 전부 규칙 기반으로 처리하며 LLM을 사용하지 않는다. - frontmatter 자체가 파싱되지 않는 경우에는 즉시 반환하지만, 그 외 오류는 가능한 한 끝까지 검사한다. - 여러 오류를 한 번에 반환해 PR 작성자가 한 번의 피드백으로 모두 수정할 수 있도록 설계했다. - 형식 검사는 정교함보다 매번 동일한 결과를 내고 누락 없이 동작하는 것이 중요하므로, 단순한 구현을 유지한다. ## 트리거: Description에 WHAT과 WHEN을 함께 작성 - 에이전트는 Skill을 호출할지 결정할 때 이름과 `description`만 본다. - Skill 본문은 호출이 결정된 뒤에 읽힌다. - 따라서 본문에만 다음과 같은 조건을 작성하면 호출되지 않는다. - “언제 사용하는가” - “어떤 상황에서 호출하는가” - `Use when ...` - `description`에는 Skill이 무엇인지뿐 아니라 언제 사용해야 하는지도 포함해야 한다. - 트리거 섹션은 6개 항목으로 구성되며, 본문에만 트리거 조건이 있는 경우 BLOCKER로 처리한다. - 처음에는 `when`, `use when`, “할 때”, “사용 시” 같은 표현을 정규식으로 검사했지만 한계가 있었다. - 한국어 표현을 놓치면 잘못된 BLOCKER가 발생한다. - 이모지, 완곡한 표현, 다양한 문장 구조를 모두 규칙으로 포괄하기 어렵다. - 최종적으로는 “Description이 본문의 트리거 조건을 의미적으로 충분히 포함하는가?”를 LLM이 판단하도록 전환했다. ## 운영 방식과 설계 원칙 - BLOCKER 구조 오류는 LLM 평가 전에 차단해 불필요한 모델 호출을 줄인다. - 구조 검사 결과를 오류 목록으로 한 번에 제공해 수정 비용을 낮춘다. - 복잡한 전략 패턴 같은 확장 설계보다 현재 요구사항에 맞는 단순한 검사 코드를 우선한다. - 규칙 기반과 모델 기반의 책임 영역을 명확히 나누는 것이 Rubric 전체의 핵심 원칙이다. 실무에서는 먼저 frontmatter, 이름 규칙, 폴더 구조 같은 형식 검사를 자동화하고, 이를 통과한 Skill에 대해서만 트리거 적합성과 내용 품질을 LLM으로 평가하는 방식을 권장한다. 특히 `description`에는 Skill의 기능(WHAT)과 사용 시점(WHEN)을 모두 명시해야 하며, BLOCKER 하나만으로도 배포나 Merge를 막도록 운영하면 호출되지 않는 Skill을 조기에 줄일 수 있다.

원문 읽기(새 탭에서 열림)
aws3분 읽기큐레이션 요약

Anthropic 및 OpenAI 호환 API에 최적화된 Amazon Bedrock의 새로운 콘솔 환경을 사용해 보세요 | Amazon Web Services

Amazon Bedrock이 Anthropic 및 OpenAI 호환 API에 최적화된 새로운 콘솔 환경을 공개했습니다. `bedrock-mantle` 엔드포인트를 기반으로 GPT, Claude, 오픈 웨이트 모델을 쉽게 비교·평가하고, 프로젝트 단위로 사용량을 분석하며 애플리케이션 개발까지 이어갈 수 있습니다. 모델 선택부터 SDK 코드 생성, AI 코딩 에이전트 연결까지 하나의 워크플로에서 처리하는 것이 핵심입니다. ## `bedrock-mantle` 기반의 새로운 콘솔 - 최신 GPT, Claude, 오픈 웨이트 모델을 지원합니다. - 다음 API 프로토콜과 호환됩니다. - OpenAI Responses API - OpenAI Chat Completions API - Anthropic Messages API - 고성능, 안정성, 보안을 목표로 하는 차세대 추론 엔진을 사용합니다. - 기존 Bedrock 콘솔은 계속 사용할 수 있으며, Agents, Knowledge Bases, Guardrails, 파인튜닝, `InvokeModel` 및 `Converse` API는 `bedrock-runtime`에서 관리합니다. ## 모델 카탈로그와 비교 기능 - 전체 모델 카탈로그를 한 화면에서 확인할 수 있습니다. - 모델별로 다음 정보를 비교할 수 있습니다. - 지원 기능과 모달리티 - 컨텍스트 윈도우 - 토큰 및 입출력 관련 정보 - 가격 - 서비스 할당량 - 리전별 제공 여부 - 최대 3개 모델을 선택해 동일한 프롬프트의 응답을 나란히 비교할 수 있습니다. - 문서와 별도의 한도 계산기를 오갈 필요 없이 모델 평가에 필요한 정보를 통합해서 볼 수 있습니다. ## 프로젝트 기반 개발 및 평가 - 프로젝트를 생성하고 사용할 모델을 지정한 뒤 API 키를 구성할 수 있습니다. - 프로젝트 대시보드에서 다음 지표를 확인할 수 있습니다. - 최근 기간별 추론 요청 수와 오류 - 총 토큰 사용량 - 분당 토큰 사용량 - 분당 추론 요청 수 - 추론 요청당 토큰 수 - 최근 사용 모델 - 이러한 지표를 활용해 모델 선택, 프롬프트 최적화, 워크로드의 일관성을 검토할 수 있습니다. - 모델 평가에서 애플리케이션 구축까지 이어지는 실제 개발 생명주기에 맞춘 구성을 제공합니다. ## 프로젝트 변수와 연동되는 실시간 문서 - 프로젝트에서 선택한 모델 ID, 리전, `bedrock-mantle` 엔드포인트 URL, API 키 참조가 문서와 코드 예제에 자동으로 반영됩니다. - Anthropic 또는 OpenAI SDK와 원하는 프로그래밍 언어, 인증 방식을 선택할 수 있습니다. - 터미널에서 바로 실행할 환경 변수 명령과 `.env` 파일에 저장할 설정을 제공합니다. - 생성된 샘플 코드를 수정하지 않고 애플리케이션에 복사해 빠르게 첫 요청을 테스트할 수 있습니다. - 모델이나 설정을 변경하면 API 레퍼런스와 코드 예제도 프로젝트 설정에 맞게 자동 갱신됩니다. ## AI 코딩 에이전트 연결 - 다음과 같은 AI 코딩 에이전트를 Bedrock을 통해 연결할 수 있습니다. - Claude Code - Cline - Codex - Cursor - OpenCode - 각 에이전트별 설치 방법과 설정 방법을 안내합니다. - AWS IAM 자격 증명 또는 Bedrock API 키를 사용할 수 있습니다. - 필요한 환경 변수를 설정해 에이전트의 요청을 `bedrock-mantle` 엔진으로 라우팅할 수 있습니다. ## 제공 리전과 시작 방법 - Amazon Bedrock 콘솔에서 **Try the Bedrock Mantle Console**을 선택하거나 새 콘솔 링크를 통해 사용할 수 있습니다. - 제공 리전에는 미국, 아시아 태평양, 유럽, 남아메리카 주요 리전이 포함됩니다. - 미국 동부: 버지니아 북부, 오하이오 - 미국 서부: 오리건 - 아시아 태평양: 자카르타, 뭄바이, 시드니, 도쿄 - 유럽: 프랑크푸르트, 아일랜드, 런던, 밀라노, 스톡홀름 - 남아메리카: 상파울루 - 실제 제공 범위는 `bedrock-mantle` 엔드포인트의 리전 목록에서 확인해야 합니다. 새 콘솔은 여러 모델을 빠르게 비교하고, 프로젝트별 사용량을 관찰하며, OpenAI·Anthropic SDK 기반 애플리케이션을 개발하려는 팀에 적합합니다. 반면 Bedrock의 관리형 기능이나 기존 `bedrock-runtime` API를 사용하는 경우에는 기존 콘솔을 계속 활용하면 됩니다.

원문 읽기(새 탭에서 열림)
cloudflare4분 읽기큐레이션 요약

AI 비용이 감당할 수 없을 정도로 늘었습니다. 이제 Cloudflare가 해결할 수 있습니다.

AI 사용이 확산되면서 기업은 막대한 토큰 비용을 부담하지만, 공유 API 키만으로는 누가 어떤 모델을 얼마나 사용했는지 파악하기 어렵다. Cloudflare는 AI Gateway에 달러 기준 지출 한도, 요청별 비용 추적, 모델 자동 전환 기능을 추가해 AI 비용을 통제할 수 있도록 했다. 또한 Cloudflare Access와 기존 IdP를 연동하면 사용자·팀·에이전트별 예산과 모델 사용 정책을 적용할 수 있다. ### 공유 API 키가 만드는 비용 관리의 한계 - 여러 엔지니어가 하나의 API 키를 사용하면 사용자별·팀별 비용을 추적할 수 없다. - 월말 청구서만 보고는 비용 증가 원인이 다음 중 무엇인지 알기 어렵다. - 머신러닝 팀의 신규 파이프라인 - 인턴의 고가 모델 사용 - CI 작업의 무한 반복 - 예산과 라우팅 기준이 없으면 사용자는 대부분 가장 강력하고 비싼 모델을 선택하게 된다. - 단순한 코드 리뷰 요약이나 로그 파싱에는 최첨단 모델이 필요하지 않으므로, 작업에 맞는 모델 선택과 비용 가시성이 중요하다. ### AI Gateway의 기본 역할 - 애플리케이션과 OpenAI, Anthropic, Google 등 AI 제공업체 사이에 위치하는 중간 계층이다. - 여러 제공업체와 모델을 하나의 인터페이스와 청구 체계로 관리할 수 있다. - 모든 요청의 로그, 토큰 수, 비용을 통합해 확인할 수 있다. - 응답 캐싱으로 반복 요청 비용을 줄일 수 있다. - Rate limiting으로 요청량을 제한할 수 있다. - PII와 비밀정보가 모델에 전달되기 전에 차단하는 콘텐츠 가드레일을 제공한다. - 기존에는 전체 계정 사용량은 볼 수 있었지만, 사용자별 비용 귀속이나 예산 설정은 어려웠다. ### 달러 기준 지출 한도 - 토큰 수가 아니라 실제 비용인 달러를 기준으로 예산을 설정한다. - 요청마다 모델 가격을 바탕으로 비용을 계산하고, 누적 지출을 실시간으로 한도와 비교한다. - 다음 기준을 조합해 한도를 지정할 수 있다. - 모델 - 제공업체 - 사용자, 팀, 애플리케이션 등 관리자가 정의한 속성 - 예산 기간은 고정형 또는 이동형으로 설정할 수 있다. - 매월 1일, 매주 월요일, 매일 자정에 초기화 - 최근 24시간·7일·30일처럼 이동하는 기간 - 일간·주간·월간 예산을 지원한다. - 한도에 도달하면 기본적으로 추가 요청을 차단한다. - Dynamic Routes를 사용하면 고가 모델 대신 저렴한 대체 모델로 요청을 전환할 수 있다. - 지출 한도 기능은 모든 요금제의 AI Gateway 사용자를 대상으로 오픈 베타로 제공된다. ### Cloudflare의 실제 사용 방식 - Cloudflare는 직원들의 AI 요청을 AI Gateway로 통합하고, 월간 수백만 건의 요청과 수십억 토큰을 처리한다. - 직원이 Cloudflare Access로 인증하면 JWT에서 신원을 추출한다. - 추출한 사용자 정보를 AI Gateway 요청의 메타데이터로 추가한다. - 이를 통해 다음을 확인할 수 있다. - 사용자별 토큰 소비량 - 팀별 사용량 - 조직 전체의 비용 귀속 - 단순히 공유 API 키를 사용하는 방식보다 비용의 책임 소재와 사용 패턴을 명확히 파악할 수 있다. ### Access 기반 사용자·팀별 정책 - 현재 폐쇄 베타로 제공되는 기능이다. - AI Gateway의 사용자 정의 메타데이터 방식과 달리, Cloudflare Access를 사용하면 인증된 신원을 자동으로 검증할 수 있다. - 사용자별 월간 예산을 설정할 수 있다. - 일반 엔지니어: 월 500달러 - 고급 엔지니어: 월 2,000달러 - 예산을 초과하면 요청을 차단하거나 저렴한 모델로 자동 전환할 수 있다. - IdP 그룹에 따라 팀별 모델 접근 정책을 설정할 수 있다. - ML 팀: Claude Opus, GPT-4o - 디자인 팀: 이미지·비디오 생성 모델 - 인턴: Workers AI 기반 오픈소스 모델 - CI/CD 파이프라인과 자율 에이전트에는 Access 서비스 토큰으로 고유한 신원을 부여할 수 있다. - 코드 리뷰 봇과 문서 생성기를 별도로 추적하고, 특정 에이전트의 폭주만 독립적으로 제한할 수 있다. - 로그에는 이메일, IdP 그룹, 서비스 토큰 이름이 포함되며, 이를 분석 플랫폼으로 내보내 사용자·팀·에이전트별 비용 보고서를 만들 수 있다. ### 인증 및 구성 방식 - AI Gateway 엔드포인트에 Cloudflare Access 애플리케이션을 구성한다. - 기존 IdP 그룹을 바탕으로 Access 정책을 설정한다. - 개발자나 에이전트는 OAuth 기반의 일반적인 CLI 디바이스 코드 흐름으로 인증한다. - AI Gateway가 토큰을 검증하고 인증된 신원을 자동으로 추출한다. - 별도의 Worker 작성, JWT 직접 파싱, 신뢰할 수 없는 메타데이터 헤더에 의존할 필요가 없다. ### 실용적인 적용 방향 기업은 먼저 AI Gateway를 모든 모델 요청의 단일 경로로 구성하고, 사용자·팀·애플리케이션별 로그와 비용을 수집하는 것이 좋다. 이후 업무 유형에 맞는 모델 라우팅과 달러 기준 예산을 설정하고, 마지막으로 Cloudflare Access와 IdP를 연동해 인증된 사용자 및 에이전트별 정책을 적용하면 비용 통제와 업무 연속성을 함께 확보할 수 있다.

원문 읽기(새 탭에서 열림)
google4분 읽기큐레이션 요약

Gemini Enterprise Agent Platform의 Agentic RAG로 신뢰할 수 있는 응답 구현하기

Google의 Agentic RAG는 단일 검색과 생성을 수행하는 기존 RAG의 한계를 넘어, 복잡한 기업 질의를 여러 단계로 분해하고 필요한 정보가 확보될 때까지 반복 검색하는 멀티 에이전트 구조다. 특히 검색 결과와 중간 답변을 검토하는 ‘충분한 컨텍스트 에이전트’를 통해 누락된 정보를 식별하고 추가 검색을 지시한다. Google은 이 방식이 사실성 평가 데이터셋에서 정확도를 최대 34% 향상시켰으며, 내부 도메인별 데이터에서도 더 나은 근거 기반 응답과 추론 정확도를 보였다고 설명한다. ## 기존 단일 단계 RAG의 한계 - 일반적인 RAG는 질문을 바탕으로 관련 문서를 한 번 검색한 뒤, 검색 결과를 LLM에 전달해 답변을 생성한다. - 기업 데이터는 여러 데이터베이스와 문서 저장소에 분산되어 있어 한 번의 검색만으로 답을 찾기 어렵다. - 예를 들어 프로젝트 문서에 서버 ID만 있고 실제 서버 사양은 별도 자산 데이터베이스에 있다면, 기존 RAG는 서버 사양을 추가로 조회하지 못한다. - 그 결과 부분적인 답변을 내놓거나, 정보가 실제로 존재함에도 “찾을 수 없다”고 응답할 수 있다. ## 멀티 에이전트 기반 검색 구조 Agentic RAG는 하나의 검색기가 모든 작업을 처리하는 대신 역할별 에이전트가 협력한다. - **Orchestrator**: 질의를 분석해 단일 검색으로 충분한지 판단하고, 복잡한 작업을 하위 에이전트에 위임한다. - **Planner Agent**: 필요한 정보의 경로와 검색 순서를 계획한다. 예를 들어 예산은 재무 데이터베이스에서, 일정은 프로젝트 관리 로그에서 조회하도록 결정한다. - **Query Rewriter**: 모호하거나 긴 질문을 여러 개의 구체적인 검색 질의로 변환한다. - **Search Fanout Agent**: 변환된 질의를 여러 검색 소스에 동시에 보내 정보를 수집한다. - **LLM 또는 Synthesis Agent**: 수집된 컨텍스트를 통합해 최종 답변을 작성한다. ## Google 방식의 차별점: 충분한 컨텍스트 검증 - 기존 멀티 에이전트 RAG와 달리, Google의 구조는 정보가 충분한지 확인하는 전용 **Sufficient Context Agent**를 포함한다. - 첫 검색 결과가 불완전해도 즉시 답변하거나 포기하지 않고, 어떤 정보가 누락됐는지 분석한 뒤 추가 검색을 수행한다. - 이를 통해 정보 부족을 이유로 한 성급한 추측이나 불완전한 답변을 줄인다. ## 의료 질의 처리 과정 예시 질의는 환자의 퇴원 약물, 식이 제한, 입원 중 알레르기 반응을 묻고 특정 입원·응급실 투여 약물은 제외하도록 요구한다. ### 1. 오케스트레이션 - Root Agent가 의사의 요청을 분석하고 하위 작업으로 분배한다. - Planner Agent는 Pharmacy, Nutrition, Clinical Notes 등 세 영역을 확인해야 한다고 판단한다. - Query Rewriter는 긴 요청을 약물, 식이, 알레르기 여부에 관한 검색 가능한 질의로 나눈다. ### 2. 초기 검색 - RAG Agent가 여러 검색 질의를 환자 기록에 동시에 실행한다. - 퇴원 약물과 식이 정보는 찾지만, 알레르기 관련 내용은 주요 문서에서 발견하지 못한다. - 일반 RAG라면 이 시점에서 불완전한 답변을 생성할 수 있다. ### 3. 충분한 컨텍스트 검증 Sufficient Context Agent는 다음 세 가지를 함께 검토한다. - **검색된 스니펫**: 실제로 검색된 문서 구간에 필요한 정보가 포함되어 있는지 확인한다. - **중간 초안**: 현재까지의 검색 결과로 작성한 임시 답변이 질문의 모든 요구사항을 다루는지 평가한다. - **누락 정보 분석**: 단순히 “정보가 부족하다”고 말하지 않고, 어떤 내용이 빠졌는지 구체적인 이유와 피드백을 생성한다. - 예: 약물 목록과 저염식 지침은 확보했지만, 알레르기 반응이나 이상 사례 정보가 없음. - 후속 지시: “알레르기 질문이 해결되지 않았으므로 ‘발진’, ‘이상 반응’ 등을 검색하라.” ### 4. 반복 검색 - 검증 에이전트의 피드백을 받은 Query Rewriter가 새로운 검색어를 생성한다. - RAG Agent는 초기 검색에서 제외했던 파일과 문서 영역을 다시 조사한다. - 이 과정에서 알레르기나 이상 반응에 관한 누락 정보가 발견될 수 있다. ### 5. 최종 합성 - Sufficient Context Agent가 약물, 식이, 알레르기 정보가 모두 확보됐는지 다시 확인한다. - 충분한 정보가 모이면 검색을 종료한다. - Synthesis Agent가 의사가 활용할 수 있는 정확하고 정리된 최종 요약을 작성한다. ## 평가와 기대 효과 - Google은 Agentic RAG를 FRAMES 논문 기반의 **FramesQA** 데이터셋에서 평가했다고 밝혔다. - 평가 대상에는 여러 단계의 추론과 서로 다른 정보 출처를 연결해야 하는 멀티홉 질문이 포함된다. - 사실성 데이터셋에서 기존 방식보다 정확도가 최대 34% 향상됐다. - 내부 데이터셋에서도 도메인별 작업에 대해 더 나은 근거 연결과 추론 정확도를 확인했다고 설명한다. - 제공된 글 본문은 실험 예시가 시작되는 부분에서 끝나므로, 세부 수치와 비교 대상별 결과는 제시되지 않았다. 실무적으로 Agentic RAG는 데이터가 여러 시스템에 분산되어 있고 한 번의 검색으로 답을 완성하기 어려운 기업 환경에 적합하다. 다만 반복 검색과 다수 에이전트 운영으로 비용과 지연 시간이 증가할 수 있으므로, 충분한 컨텍스트 검증을 적용할 질의 유형을 선별하고 검색 횟수·중단 조건을 함께 설계하는 것이 중요하다.

원문 읽기(새 탭에서 열림)
toss5분 읽기큐레이션 요약

토스팀이 AI 파도를 마주하는 방법: AI Surf Day

토스는 빠르게 변하는 AI를 따라잡기 위해 개인의 학습에만 의존하지 않고, 업무 시간과 조직 문화를 재설계하는 ‘AI Surf Day’를 운영했다. 매주 금요일을 AI 실험과 공유의 시간으로 정해 직군과 숙련도에 관계없이 누구나 AI를 업무에 적용하도록 지원했다. 이 경험은 특정 프로그램보다 자유롭게 시도하고 실패와 성과를 공유하는 문화, 그리고 이를 이끄는 사람들이 AI 전환의 핵심임을 보여준다. ## AI Surf Day의 배경과 목적 - AI 기술이 빠르게 발전하면서 개발자뿐 아니라 PO, 디자이너, 스태프 등 모든 직군에서 AI 활용에 대한 관심이 커졌다. - 반면 비개발 직군을 중심으로 다음과 같은 어려움도 나타났다. - 수많은 AI 정보 중 실제 업무에 유용한 것을 선별하기 어려움 - 새로운 기술을 학습할 별도 시간을 내기 어려움 - AI를 잘 활용하는 사람과 그렇지 못한 사람 사이의 격차와 불안 - 토스는 월요일부터 목요일까지 본업에 집중하고, 매주 금요일은 AI를 실험하고 업무에 적용하는 ‘AI Surf Day’로 운영했다. - 목표는 단순히 AI 도구 사용법을 익히는 것이 아니라, 토스 전체가 AI 기반으로 일하는 문화를 만드는 것이었다. - “파도를 멈출 수는 없지만 서핑하는 방법은 배울 수 있다”는 비유처럼, 예측하기 어려운 AI 변화에 조직적으로 대응하려는 취지를 담았다. ## AI Surf Club: 자율적인 실험과 학습 - 팀원 누구나 AI 관련 주제로 모임을 만들고 참여할 수 있는 핵심 프로그램이다. - 시작과 함께 약 200개의 클럽이 만들어질 만큼 높은 참여가 나타났다. - 대표적인 사례는 다음과 같다. - **AI 안티패턴 스터디** - AI 활용이 잘되지 않았던 시행착오와 실패 사례를 공유했다. - 프로젝트 방향을 잡고 실수를 줄이는 데 도움이 되는 ‘시행착오 방지 가이드’로 내용을 정리했다. - **LLM Wiki 활용법** - 업무 지식이 여러 곳에 흩어진 문제를 해결하기 위해 조직 공동의 지식 자산 구축을 논의했다. - 데이터 엔지니어, 머신러닝 엔지니어, 비즈니스 담당자 등 다양한 직군이 참여해 관점을 넓혔다. - **터미널 초보자를 위한 0단계 모임** - 에이전트 도구 설치나 터미널 사용처럼 기본적인 기술 장벽을 해결했다. - 초보적인 질문도 부담 없이 할 수 있는 안전한 학습 공간을 제공했다. - **금융소비자보호 업무의 AI 전환** - “상담 과정에서 미리 민원을 발견하고 싶다”는 요구에서 출발해 한 달 만에 대외민원 모니터링 포털을 개발했다. - 민원 회신문 초안 작성과 민원 분류 자동화 등 추가 결과물도 만들어냈다. - 가장 큰 성과는 구성원들이 “우리도 AI로 해볼 수 있다”는 자신감을 얻은 점이었다. - **비즈니스 마케팅 팀의 AI 워크숍** - Builder, Curator, Operator, Scouter로 역할을 나누어 AI 도구, 사례, 자동화 결과물을 만들고 공유했다. - 개인의 실험을 다른 팀원이 복제하거나 업무에 적용할 수 있는 자산으로 남기는 데 초점을 맞췄다. ## AI Surf Weekly: 사례와 아이디어의 확산 - 사내 AI 활용 우수 사례, 레슨런, 최신 AI 인사이트를 공유하는 시간이다. - 구체적인 도구 사용법을 일방적으로 교육하기보다, 실제 사례를 보여주고 새로운 아이디어를 떠올리게 하는 방식을 택했다. - 서로 다른 조직의 유사한 문제를 가진 구성원을 연결해 단시간에 결과물을 만들도록 돕기도 했다. - 영업팀의 요구와 유사한 도구를 만든 인사팀 구성원을 연결해 빠르게 업무 도구를 개발했다. - 디자인 자동화에 어려움을 겪던 마케팅 담당자를 디자인 조직의 경험자와 연결해 하루 만에 문제를 해결했다. - 잘 쓰는 사람과 실제 결과물을 공유하면, 구성원들이 자신의 업무에 맞게 응용하면서 새로운 활용 사례가 파생된다는 점을 확인했다. ## AI Surf Evangelist: 현업 중심의 전파 체계 - 조직에서 AI를 잘 활용한다는 것은 개인이 도구를 능숙하게 쓰는 것이 아니라, 기존 업무 흐름을 AI 기반으로 재설계하는 것이다. - 이를 가장 잘 이끌 사람은 실제 업무와 팀의 문제를 잘 아는 현업 구성원이라고 판단했다. - 토스는 AI 기술 전문가보다 다음과 같은 구성원을 에반젤리스트로 선발했다. - 유용한 정보를 발견하면 팀에 공유하는 사람 - 동료가 AI 활용 중 막혔을 때 함께 해결하는 사람 - AI 도입과 전파에 적극적인 사람 - 공개 추천을 통해 이미 비공식적으로 이런 역할을 수행하던 사람을 발굴했고, 총 142명이 선정됐다. - 주요 미션은 다음과 같다. - 3개월 동안 조직 내 AI 활용 사례를 공유 채널에 제보 - 팀 대상 밋업이나 워크숍을 최소 1회 개최 - 유용한 사례와 인사이트를 조직에 전파 - 문화팀은 워크숍 템플릿과 퍼실리테이션을 지원해 각 팀이 ‘업무를 AI 기반으로 재설계한다면?’을 주제로 실험하도록 도왔다. ## OpenAI 협업과 에이전틱 워크플로우 - 5월에는 OpenAI와 협업해 개발자용 Codex 세션, 비개발자용 ChatGPT Agent 자동화 세션, 미니 해커톤을 진행했다. - **iOS Simulator 자동 검증 에이전트** - Codex가 기능 구현, 빌드, 로그인, 입력, 테스트, 수정 과정을 직접 수행했다. - 계획부터 검증 영상 생성까지의 전체 루프를 자동화했다. - **토스플레이스 메뉴 분류 어드민** - AI 에이전트가 매일 상품 데이터를 조회하고 사전 정의된 기준에 따라 1차 분류한다. - 담당자는 알림 링크를 통해 결과를 확인하고 확정 또는 반려한다. - 단순 반복 업무를 재사용 가능한 Agentic Workflow로 전환한 사례다. ## 프로그램보다 중요한 문화와 사람 - AI Surf Day는 6월까지 운영될 예정이지만, 이후 동일한 형식으로 지속될지는 정해지지 않았다. - 글에서 중요하게 본 성과는 특정 프로그램 자체가 아니라 다음과 같은 변화다. - AI를 실험할 수 있도록 공식적인 시간대를 마련함 - 성공뿐 아니라 실패와 시행착오도 공유함 - 서로 다른 팀의 사례와 사람을 연결함 - 워크숍과 결과물이 실제 업무 방식의 변화로 이어짐 - AI 전환을 추진하는 조직이라면 별도 학습 시간을 보장하고, 현업의 자발적 실험을 지원하며, 결과물을 조직 자산으로 공유하는 구조부터 만드는 것이 효과적이다.

원문 읽기(새 탭에서 열림)
naver1분 읽기큐레이션 요약

비개발자가 한 달 동안 풀스택으로 개발하면서 배운 것

이 글은 NAVER의 기술 블로그인 **NAVER D2**를 소개하는 페이지로 보입니다. Hello World, D2 News, About D2, NAVER Developers, DEVIEW, OpenSource, D2 STARTUP FACTORY 등의 메뉴가 나열되어 있지만, 구체적인 기술 내용이나 주장은 포함되어 있지 않습니다. ### NAVER D2 관련 메뉴 - **Hello world**: 블로그의 시작 또는 안내 콘텐츠로 보입니다. - **D2 News**: NAVER D2의 소식과 업데이트를 제공하는 영역입니다. - **About D2**: D2의 목적과 운영 정보를 소개하는 메뉴입니다. - **NAVER Developers**: NAVER 개발자 관련 정보로 연결되는 항목입니다. - **DEVIEW**: NAVER의 개발자 콘퍼런스 관련 콘텐츠입니다. - **OpenSource**: 오픈소스 프로젝트나 관련 활동을 다루는 영역입니다. - **D2 STARTUP FACTORY**: 스타트업 지원 및 투자 관련 정보를 제공하는 메뉴입니다. ### 저작권 정보 - 콘텐츠 하단에 `Copyright © NAVER Corp. All Rights Reserved.`가 표시되어 있습니다. - 저작권자는 NAVER Corporation이며, 별도의 본문이나 기술적 설명은 제공되지 않습니다. 이 내용만으로는 특정 기술 주제나 글의 결론을 요약하기 어렵습니다. 실제 기술 글의 본문이 있다면 해당 내용을 바탕으로 섹션별 요약을 작성할 수 있습니다.

원문 읽기(새 탭에서 열림)
cloudflare4분 읽기큐레이션 요약

VoidZero가 Cloudflare에 합류합니다

VoidZero가 Cloudflare에 합류하지만 Vite, Vitest, Rolldown, Oxc, Vite+는 계속 MIT 라이선스의 오픈소스이자 벤더 중립적·커뮤니티 주도 프로젝트로 유지됩니다. Cloudflare는 프로젝트의 방향을 통제하기보다 개발 인력과 자원을 추가하고, Vite 생태계 기금에 100만 달러를 투자해 기반 도구와 기여자들을 지원할 계획입니다. 이번 합류는 Vite를 Cloudflare 전용 도구가 아니라 JavaScript 생태계 전체를 위한 공통 기반으로 더욱 확장하려는 움직임입니다. ## VoidZero의 Cloudflare 합류 - Vite, Vitest, Rolldown, Oxc, Vite+를 만든 VoidZero의 전 구성원이 Cloudflare에 합류합니다. - 해당 프로젝트들은 계속해서: - MIT 라이선스를 유지합니다. - 특정 클라우드나 호스팅 업체에 종속되지 않습니다. - 어디서나 실행할 수 있습니다. - 로드맵과 개발 과정을 공개적으로 운영합니다. - Evan You를 비롯한 기존 VoidZero 팀이 프로젝트 리드를 계속 맡습니다. - Cloudflare는 프로젝트를 자사 제품으로 전환하는 대신 엔지니어링 인력과 개발 자원을 투입합니다. ## Vite 생태계에 대한 투자 - Vite는 Vue, SvelteKit, Nuxt, Astro, Solid, Qwik, Angular, React Router, TanStack Start 등 다양한 프레임워크의 기반으로 자리 잡았습니다. - Next.js 역시 `vinext`를 통해 Vite 기반 구현을 제공하기 시작했습니다. - 따라서 Vite는 단일 프레임워크가 아니라 JavaScript 생태계 전반의 공유 기반으로 평가됩니다. - Cloudflare는 Vite의 핵심 채택 요인인 개방성, 이식성, 벤더 중립성에 대한 신뢰를 유지하는 것을 최우선 목표로 제시했습니다. - Vite 코어 팀이 관리하는 생태계 기금에 100만 달러를 출연해 유지보수자와 기여자를 지원합니다. - 앞서 Cloudflare에 합류한 Astro 역시 오픈소스와 멀티 플랫폼 배포를 유지하고 있다는 점을 선례로 들었습니다. ## Vite Environment API와 Cloudflare 연동 - Vite와 Cloudflare는 2024년부터 Vite Environment API를 함께 개발해 왔습니다. - Environment API를 사용하면 개발 중 서버 코드를 Node.js가 아닌 다른 런타임에서 실행할 수 있습니다. - Cloudflare Vite 플러그인을 사용하면 `vite dev` 실행 시 서버 코드가 프로덕션 Workers와 동일한 오픈소스 런타임인 `workerd` 안에서 동작합니다. - 로컬 개발 환경에서 다음 Cloudflare 기능을 프로덕션과 유사한 런타임 모델로 사용할 수 있습니다. - Durable Objects - D1, KV, R2 - Workflows - Workers AI - Agents - Service Bindings - Workers RPC - 특정 업체 전용 개발 서버를 강제하지 않고, Vite에 범용 확장 지점을 제공한 뒤 각 런타임이 구현하도록 설계한 점이 핵심입니다. - 이 구조를 통해 비-Node.js 런타임에서도 로컬 개발 경험이 프로덕션보다 크게 뒤처지는 문제를 줄일 수 있습니다. ## 급증하는 Vite와 Cloudflare 플러그인 사용량 - 글 작성 시점 기준 Vite는 주간 약 1억 2,900만 회 다운로드를 기록했습니다. - `@cloudflare/vite-plugin`도 주간 약 1,400만 회 다운로드에 도달했습니다. - 이는 Cloudflare 플러그인이 Vite 전체 다운로드의 10% 이상에 해당하는 규모입니다. - AI로 생성되는 소프트웨어가 급증하면서 애플리케이션을 빠르게 만들고 실행할 수 있는 기본 스택에 대한 수요도 커졌습니다. - AI가 작성한 애플리케이션이 Vite를 선택하고, 그중 일부가 Cloudflare에서 실행되면서 플러그인 사용량이 증가한 것으로 설명합니다. ## AI 에이전트 중심의 개발 루프 - 개발 서버, 번들러, 린터, 포매터, CLI는 더 이상 사람만 사용하는 도구가 아닙니다. - AI 에이전트도 다음 작업을 반복적으로 수행합니다. - 프로젝트 스캐폴딩 - 개발 서버 실행 - 오류 분석 - 테스트 작성 및 실행 - 린트와 포맷 적용 - 프리뷰 배포 - 결과 확인 후 재수정 - 에이전트 개발에서는 다음 특성이 특히 중요합니다. - 반복 횟수가 많으므로 빠른 빌드 - 지속적인 검증을 위한 빠른 테스트 - 코드 품질을 보장하는 빠른 린팅·포매팅 - 에이전트가 해석하고 조치하기 쉬운 구조화된 오류 - 불필요한 우회를 줄이는 일관된 CLI - Vitest, Rolldown, Oxc, Oxlint, Oxfmt는 각각 빠른 도구로 설계되었으며, 반복 실행이 많은 에이전트 작업에 적합합니다. - Vite+는 이 도구들을 하나의 CLI와 설정 모델로 통합해 사람과 에이전트 모두가 더 예측 가능하게 사용할 수 있도록 합니다. ## Cloudflare 내부에서의 실제 적용 - Cloudflare 대시보드는 Vite를 기반으로 구축되고 있습니다. - Cloudflare 코드베이스에서는 Oxlint가 엔지니어링 시간을 절약하는 데 사용되고 있습니다. - Astro 팀의 에이전트 하네스 프레임워크인 Flue도 Vite를 기반으로 전환 중입니다. - Flue는 Node.js, Cloudflare Workers, GitHub Actions, GitLab CI/CD 등 여러 환경에서 에이전트를 실행할 수 있습니다. - Cloudflare 대상 환경에서는 공식 Cloudflare Vite 플러그인과 `workerd` 통합을 사용합니다. - 결과적으로 Vite는 외부 생태계뿐 아니라 Cloudflare 내부 애플리케이션 개발의 기본 기반으로도 자리 잡고 있습니다. ## 실용적인 결론 이번 변화는 Vite 사용자가 Cloudflare를 선택해야 한다는 의미가 아니라, Vite를 계속 어느 환경에서나 사용할 수 있도록 지원이 강화된다는 의미에 가깝습니다. 기존 Vite 프로젝트는 플랫폼 종속성 없이 유지할 수 있고, Cloudflare Workers 기능이 필요하다면 공식 Vite 플러그인과 `workerd` 기반 로컬 개발 환경을 선택적으로 활용할 수 있습니다.

원문 읽기(새 탭에서 열림)
stripe3분 읽기큐레이션 요약

글로벌 수요를 수익으로 전환하는 새로운 방법

Stripe는 글로벌 고객 확보가 쉬워진 만큼, 국가별 결제·통화·자금 이동·세금·규제 문제를 해결해야 실제 매출로 이어진다고 설명합니다. 이를 위해 현지화된 체크아웃, 결제 승인율 및 사기 최적화, 다중 통화 자금 관리, 세무·규제 자동화 기능을 제공하며, 기업이 여러 국가로 더 빠르게 확장하도록 지원합니다. ## 현지화된 결제 경험으로 전환율 향상 - **Checkout Studio**는 국가와 업종별 데이터를 바탕으로 적합한 결제수단을 추천하고, 도입률과 성과를 추적합니다. - Stripe는 Bizum, BLIK, TWINT, Pix, UPI 등 **125개 이상의 결제수단**을 지원합니다. - 지역과 맞지 않는 결제수단 하나만 추가해도 전환율이 최대 **15% 감소**할 수 있습니다. - 반대로 브라질에서 Pix를 제공하면 전환율이 최대 **38.3%**, 인도에서 UPI를 제공하면 **19.8%** 높아질 수 있습니다. - **Adaptive Pricing**은 고객의 현지 통화로 가격을 표시하고 환전 및 운영 처리를 자동화합니다. - 평균 승인율 **5% 증가** - 국경 간 매출 **17.8% 증가** - 구독 사업자는 전환율 **4.7%**, 세션당 LTV **5.4%** 향상 - 구독 갱신 시 결제 금액이 지나치게 변동하지 않도록 보호 장치도 제공합니다. ## 결제 승인율을 높이고 사기 방지 - 국가마다 카드 발급사, 결제 네트워크, 카드 사용 행태가 달라 승인율이 다르게 나타납니다. - **Stripe Authorization Boost**는 거래별로 실시간 재시도, 발급사별 메시지, Data Only 인증 등을 적용합니다. - 기업이 직접 국가별 규칙을 관리하지 않아도 승인율과 비용을 최적화할 수 있습니다. - 평균 승인율 **3.8% 향상** - 일부 기업은 처리 비용을 최대 **3.3% 절감** - 내장된 A/B 테스트로 변경 사항을 전체 적용하기 전에 효과를 검증할 수 있습니다. - 새로운 국가와 결제수단은 새로운 사기 위험도 만들기 때문에, **Stripe Radar**가 카드뿐 아니라 계좌이체, 전자지갑, BNPL, 스테이블코인 결제까지 위험 거래를 탐지하고 차단합니다. - 비공개 테스트에서 Klarna, PayPal, Affirm, Cash App Pay 거래의 사기를 평균 **71% 감소**시켰습니다. ## 다중 통화 자금 관리와 국경 간 비용 절감 - 해외 진출 시 통화별 계좌, 현지 법인, 여러 금융 제공자를 관리해야 하는 복잡성이 커집니다. - **Stripe Treasury**는 Stripe 안에서 여러 통화와 스테이블코인을 보관·환전·송금할 수 있게 합니다. - 미국과 영국 기업은 주말이나 공휴일에도 결제 대금을 즉시 이용할 수 있습니다. - 여러 통화를 별도 환전 없이 하나의 Treasury 계정에 보유할 수 있으며, 필요할 때 24시간 환전하고 환율을 고정할 수 있습니다. - 160개국 이상에 법정화폐와 스테이블코인으로 지급할 수 있고, Treasury 잔액과 연결된 직원용 카드도 만들 수 있습니다. - 스테이블코인을 활용하면 마켓플레이스 판매자가 이를 보유하거나 현지 통화로 환전할 수 있습니다. - Treasury는 120개국 이상에서 제공되며, 스테이블코인 기반 잔액은 100개국에서 지원됩니다. ## 세금과 규제 준수 자동화 - 국가별로 세율, 등록 기준, 전자 세금계산서, 분쟁 처리 기한 등이 달라 글로벌 확장의 주요 장애물이 됩니다. - **Stripe Tax**는 기업이 판매자를 직접 유지하는 방식으로 다음 업무를 자동화합니다. - 세금 계산 및 징수 - 과세 기준액 모니터링 - 세무 등록 - 신고 지원 - 100개국 이상, 600개 이상의 상품 분류에서 세금을 자동 계산하고 징수합니다. - 세무 책임 자체를 외부에 맡기고 싶다면 **Stripe Managed Payments**를 사용할 수 있습니다. - Stripe가 판매자 대행자(merchant of record) 역할 수행 - 80개국 이상에서 세금 등록·징수·납부 처리 - 사기 방지, 분쟁 관리, 고객 지원, 현지화된 체크아웃까지 제공 - 디지털 상품 기업도 Managed Payments를 이용할 수 있어, 내부 세무·지원 조직을 구축하지 않고 시장 진입 속도를 높일 수 있습니다. Stripe의 접근 방식은 국가별 결제 현지화와 운영 자동화를 하나의 플랫폼으로 통합하는 것입니다. 해외 진출 기업은 우선 목표 국가의 선호 결제수단과 현지 통화를 적용하고, 이후 승인율·사기·자금 이동·세무 책임을 Stripe 도구로 단계적으로 자동화하는 것이 실용적입니다.

원문 읽기(새 탭에서 열림)
datadog4분 읽기큐레이션 요약

페일오버가 안전하지 않을 때: Kubernetes에서 고가용성 PostgreSQL 구축하기

Datadog은 게임데이를 통해 PostgreSQL 클러스터가 특정 가용 영역의 네트워크 장애에서 안전하게 페일오버하지 못하는 문제를 발견했다. 비동기 복제 환경에서는 장애가 발생한 리더가 계속 쓰기를 처리하는 동안 복제 지연이 커졌고, 모든 스탠바이가 안전한 승격 기준을 충족하지 못했다. 이를 해결하기 위해 Patroni가 관리하는 동기 복제 기반의 페일오버 후보를 도입해 내구성과 자동 복구 가능성을 높이려 했다. ## 게임데이로 드러난 가용 영역 장애 - 스테이징 환경에서 특정 가용 영역에 네트워크 지연을 의도적으로 유발했다. - 해당 영역에 PostgreSQL의 primary 또는 writer 노드가 위치해 있었다. - primary와 replica 간 통신이 불안정해지면서: - 복제 지연(replication lag)이 빠르게 증가 - 쓰기 작업이 멈추거나 지연 - 애플리케이션이 오래된 데이터를 조회 - 모든 replica가 primary의 최신 상태를 충분히 반영하지 못해 안전한 승격 대상이 사라졌다. - 결과적으로 지연이 해소되고 replica가 따라잡을 때까지 기다리는 것 외에는 복구 방법이 없었다. ## Kubernetes 기반 PostgreSQL 아키텍처 - 클러스터는 **leader pool**과 **read replica pool**로 분리된다. - Leader pool: - 하나의 active writer가 모든 쓰기를 처리 - 두 개의 standby 노드는 애플리케이션 읽기 트래픽에는 사용되지 않음 - leader 장애 시 standby가 승격될 수 있음 - Read replica pool: - 읽기 전용 트래픽 처리 - 읽기 확장과 쿼리 격리를 담당 - 페일오버 후보에서는 제외 - 이 구조는 읽기 용량을 독립적으로 확장하고 writer의 쓰기 지연을 안정적으로 유지하는 데 유리하다. - 그러나 장애 시 실제로 승격 가능한 노드 수가 제한되므로, 해당 후보들의 복제 상태가 중요하다. ## Patroni와 ZooKeeper의 역할 - Patroni는 PostgreSQL의 복제, 리더 선출, 페일오버를 관리한다. - ZooKeeper는 분산 구성 저장소(DCS)로 사용되며 다음 정보를 저장한다. - 현재 leader 키와 락 - 클러스터 설정 - 각 노드의 복제 상태와 최신 LSN - 새 노드는 ZooKeeper에 leader가 있는지 확인한다. - leader가 없으면 ephemeral znode를 생성해 leader 락 획득을 시도 - ZooKeeper의 단일 획득 보장으로 다중 primary(split-brain)를 방지 - leader가 이미 있으면 새 노드는 replica로 동작하며 스트리밍 복제를 시작 - 네트워크 파티션 상황에서는 상태를 확신할 수 없는 노드의 승격을 보수적으로 제한한다. - leader가 ZooKeeper와 통신하지 못하면, 적격 standby만 leader 락을 획득하도록 조정한다. - 기존 leader가 복구 후 leader 락을 다시 획득하지 못하면 스스로 강등되어 단일 leader 원칙을 유지한다. ## 비동기 복제의 한계 - 기존 환경은 PostgreSQL의 기본 복제 방식인 비동기 복제를 사용했다. - primary는 replica의 WAL 수신 확인을 기다리지 않고 트랜잭션을 커밋한다. - 장점: - 쓰기 지연이 낮음 - 높은 처리량 유지 - 단점: - primary 장애 시 아직 replica에 전달되지 않은 커밋 데이터가 유실될 수 있음 - 네트워크 지연이 커지면 replica가 primary보다 크게 뒤처질 수 있음 - 게임데이에서는 primary가 복제 지연 중에도 계속 쓰기를 수락했다. - 그 결과 모든 standby가 안전한 페일오버 기준을 초과했고, 장애 시 복구 가능한 후보가 남지 않았다. ## `maximum_lag_on_failover`와 안전한 승격 - Patroni는 standby를 승격하기 전에 복제 지연이 허용 범위 안에 있는지 검사한다. - 이 기준은 `maximum_lag_on_failover` 파라미터로 설정된다. - standby가 이 기준보다 많이 뒤처진 상태에서 승격되면 데이터 손실이나 불일치가 발생할 수 있다. - 따라서 Patroni가 승격을 거부한 것은 오작동이 아니라 데이터 일관성을 지키기 위한 정상적인 동작이었다. - 문제의 본질은 Patroni가 아니라, 장애 시 기준을 충족하는 standby가 하나도 없었다는 점이다. ## 동기 복제를 통한 개선 방향 - 동기 복제에서는 primary가 최소 한 replica의 확인 응답을 받은 뒤 클라이언트에 트랜잭션 성공을 반환한다. - 이를 통해 최소 한 replica에 커밋 데이터가 반영되었음을 보장할 수 있다. - 비동기 복제보다 쓰기 지연과 성능 비용이 발생하지만, primary 장애 시 데이터 유실 위험은 크게 줄어든다. - Datadog은 페일오버 후보에 동기 복제를 적용하고 Patroni가 이를 조정하도록 아키텍처를 재설계했다. - 목표는 성능 특성을 과도하게 훼손하지 않으면서 자동적이고 안전한 페일오버를 구현하는 것이었다. 실무적으로는 모든 읽기 replica에 동기 복제를 적용하기보다, 실제 페일오버 후보에만 동기 복제를 적용해 성능과 내구성의 균형을 맞추는 접근이 적절하다. 또한 네트워크 지연과 영역 장애를 가정한 게임데이 및 복제 지연 기반의 페일오버 테스트를 정기적으로 수행해야 한다.

원문 읽기(새 탭에서 열림)
discord5분 읽기큐레이션 요약

Discord 패치 노트: 2026년 6월 4일

Discord의 2026년 6월 4일 패치에는 모바일 통화 실수 방지, 데스크톱 시작 속도 개선, 사용자 설정 개편, 음성 초대 임베드 개선이 포함됐다. 특히 데스크톱 앱의 p50 시작 시간이 약 8%(약 650ms) 단축됐으며, 여러 플랫폼에서 접근성·레이아웃·검색·초대 흐름과 관련된 버그가 수정됐다. 모든 수정 사항은 코드에 반영됐지만 플랫폼별 배포는 진행 중일 수 있다. ## 통화 실수 방지와 음성 초대 개선 - 모바일 DM에서 통화 버튼을 누르면 바로 통화가 시작되지 않고 확인 단계가 표시된다. - 새 음성 초대 임베드는 다음 정보를 명확히 보여준다. - 초대 대상 서버와 채널 - 현재 채널의 사용자 수 - 사용자 이름에 마우스를 올렸을 때 움직이는 아바타 - 음성 채널 초대의 맥락과 참여자 정보를 더 쉽게 파악할 수 있도록 시각적 표현이 개선됐다. ## 데스크톱 성능과 설정 화면 개편 - 최근 몇 주 동안 데스크톱 앱의 p50 시작 시간이 약 8%, 약 650ms 개선됐다. - 추가적인 시작 속도 개선 작업도 계속 진행될 예정이다. - 사용자 설정의 Account 페이지가 새 디자인 체계에 맞게 개편됐다. - 다음 항목은 Account 카테고리 내부의 중첩 페이지로 정리됐다. - Devices - Family Center - Account Standing - Multi-Factor Authentication - 설정 페이지 간 시각적 일관성과 탐색 구조가 개선됐다. ## 초대·가입·이벤트 흐름 수정 - 게스트 초대로 서버에 들어갈 때 온보딩이나 “Apply to Join” 화면에 멈추던 데스크톱 문제가 해결됐다. - 초대 링크를 클릭했을 때 최대화된 창이 갑자기 복원되는 문제가 수정됐다. - Server Discovery에서 초대가 비활성화된 서버에 가입할 수 없을 때 아무 반응이 없던 문제가 해결됐다. - 이제 가입 실패 이유를 토스트 메시지로 안내한다. - iOS에서 이벤트 설명의 외부 Markdown 링크를 눌러도 이벤트 상세 시트가 남아 있던 문제가 수정됐다. - 이벤트 설명에서 사용자 멘션을 누르면 DM이 아니라 해당 사용자의 프로필이 열리도록 변경됐다. - 이벤트 공유 후 이벤트 시트가 시스템 공유 메뉴 위에 남아 있던 문제가 해결됐다. - 초대 권한이 없고 vanity URL만 있는 서버에서 iOS가 “Missing Permissions”를 표시하던 문제가 수정됐다. - 이제 데스크톱과 마찬가지로 vanity URL을 대체 경로로 사용한다. ## 검색·상태·메시지 표시 버그 수정 - Android에서 `has:forward` 검색 필터와 Media, Links, Files 같은 하위 탭을 함께 사용할 때 결과가 비거나 부정확해지는 문제가 해결됐다. - Android에서 긴 사용자 지정 상태가 삭제 버튼과 지나치게 붙던 레이아웃 문제가 수정됐다. - 모바일 Set Status 화면에서 뒤로 가기 버튼이 작동하지 않던 문제가 해결됐다. - 데스크톱의 여러 줄 `@time` 표시가 아래 텍스트와 겹치던 문제가 수정됐다. - iOS에서 글자의 하강부(descender)가 메시지 알림과 검색 결과에서 잘리던 문제가 해결됐다. - iOS에서 사용자 프로필의 서식 있는 텍스트가 일반 텍스트보다 작게 표시되던 문제가 수정됐다. - 데스크톱 커뮤니티 공지의 텍스트가 겹쳐 읽기 어려웠던 문제가 해결됐다. - 알림이 비활성화된 Unread inbox 구분선이 라벨 텍스트를 관통하던 문제가 수정됐다. ## iOS·Android UI 및 테마 개선 - iOS의 QR 코드 로그인 모달이 필요 이상으로 전체 화면을 차지하던 문제가 수정됐다. - 사용자 지정 테마에서 키보드를 열 때 배경이 잠시 기본 색상으로 깜빡이던 문제가 해결됐다. - 친구 목록의 고정 알파벳 헤더가 클라이언트 테마 색상으로 잘못 표시되던 문제가 수정됐다. - 알림 탭의 북마크 버튼이 시스템 글꼴 크기에 맞춰 확대되지 않던 문제가 해결됐다. - 설정 검색 결과의 마지막 행에서 둥근 모서리가 사라지던 문제가 수정됐다. - 서버 초대 메뉴의 모서리가 다른 UI와 달리 각지게 표시되던 문제가 해결됐다. - 서버 프로필 사진을 업로드할 때 이미지 선택기 위에 기존 아바타 업로드 요소가 남아 있던 문제가 수정됐다. - Wumpus가 사라졌던 iOS 친구 요청 빈 화면이 복구됐다. ## 접근성·입력·반응형 레이아웃 수정 - 데스크톱에서 “Paste as Plain Text”에 실제로 구현되지 않은 키보드 단축키 안내가 표시되던 문제가 제거됐다. - 비활성화된 게임 오버레이 설문에서 Tab 키로 사유 선택 항목에 접근할 수 없던 문제가 수정됐다. - 보이지 않는 서버 툴팁 내부 아이콘이 Tab 탐색 대상이 되던 문제가 해결됐다. - 초대받은 서버 모달에서 매우 긴 닉네임 때문에 UI 요소가 잘리던 문제가 수정됐다. - 높은 확대 비율에서 이벤트 상세 모달의 정보 영역이 지나치게 압축되던 문제가 해결됐다. - 작은 창과 높은 확대 설정에서 Shop 필터 패널이 화면보다 커져 “Clear Filters” 버튼을 누를 수 없던 문제가 수정됐다. - Join Game Server 안내 모달에 불필요한 스크롤바가 나타나던 문제가 제거됐다. - Student Hubs의 Add Servers 팝업에 불필요한 가로 스크롤바가 표시되던 문제가 해결됐다. ## 기타 상호작용 및 시각적 일관성 - Bluesky 연결 모달에서 핸들이 비어 있어도 Enter 키로 제출되던 문제가 수정됐다. - Nitro 결제 모달의 Nameplate 이미지에 실제 확대 기능이 없는데도 확대 커서가 표시되던 문제가 해결됐다. - 언급된 역할을 클릭할 때 역할 팝업과 채널 주제 상세 메뉴가 동시에 열리던 문제가 수정됐다. - Streamer Mode에서 Nitro 탭 헤더만 다른 탭보다 어둡게 보이던 문제가 해결됐다. - iOS Invite to Server 메뉴 요소의 모서리가 둥글게 표시되도록 통일됐다. - 데스크톱 창의 다양한 모달과 탭에서 잘못된 크기, 색상, 포커스, 스크롤 동작이 정리됐다. 이번 패치는 대형 기능 추가보다는 앱 시작 성능과 설정 구조를 개선하고, 모바일 실수 방지와 접근성·반응형 UI 문제를 폭넓게 다듬은 업데이트다. 사용자는 모바일 통화 버튼의 확인 단계와 개편된 Account 설정을 먼저 확인하면 되며, 특정 수정 사항이 보이지 않는다면 플랫폼별 순차 배포가 완료될 때까지 기다릴 필요가 있다.

원문 읽기(새 탭에서 열림)
google4분 읽기큐레이션 요약

스마트폰 카메라를 활용한 수동적 심장 건강 모니터링을 향하여

스마트폰 전면 카메라로 일상적인 얼굴 영상을 촬영해 심박수(HR)와 안정시 심박수(RHR)를 수동 개입 없이 추정하는 연구 시스템 PHRM이 소개되었습니다. PHRM은 8초 영상과 딥러닝을 활용해 심전도(ECG) 대비 HR 오차 10% 미만을 달성했고, 하루 단위 RHR도 웨어러블 수준의 정확도로 추정했습니다. 특히 다양한 피부색을 포함한 대규모 데이터로 학습해 피부색에 따른 성능 격차를 줄인 점이 핵심입니다. ## 스마트폰을 활용한 수동 심박 모니터링 - 심박수는 활동량, 스트레스, 질병 등 생리 상태를 반영하는 주요 생체 지표입니다. - 안정시 심박수는 심혈관 건강과 장기적인 건강 위험을 나타내며, 높은 RHR이나 장기적 상승은 심혈관 질환 및 사망 위험 증가와 관련됩니다. - PHRM은 얼굴 잠금 해제 직후 전면 카메라로 약 8초간 얼굴 영상을 촬영합니다. - 사용자가 별도로 손가락을 카메라에 대거나 측정을 시작하지 않아도 일상적인 스마트폰 사용 중 데이터를 수집합니다. - 스마트폰은 전 세계 약 50억 명이 사용하는 기기이므로 웨어러블 접근성이 낮은 환경에서 건강 모니터링을 확대할 가능성이 있습니다. ## 카메라 기반 PPG와 PHRM 기술 - PHRM은 광용적맥파(PPG) 원리를 사용합니다. - 혈액이 맥박에 따라 흐를 때 피부와 빛의 상호작용이 변하는 현상을 카메라로 감지합니다. - 얼굴 영상에서 심박 신호를 추출하는 원격 PPG(rPPG) 모델을 적용합니다. - 기기 내에서 실행 가능한 효율적인 시계열 이동 합성곱 신경망을 사용해 HR과 예측 신뢰도 점수를 계산합니다. - 하루 동안 얻은 여러 HR 측정값을 신뢰도 점수와 칼만 필터로 통합해 일일 RHR을 추정합니다. - 웨어러블처럼 지속적으로 착용해야 하는 센서가 아니라 스마트폰 사용 순간에 자연스럽게 측정하는 방식입니다. ## 피부색 다양성을 고려한 모델 설계 - 기존 rPPG 연구는 소규모·통제된 환경에 치우쳤고, 어두운 피부를 가진 참가자가 충분히 포함되지 않았습니다. - 멜라닌은 카메라가 PPG 신호를 감지하기 어렵게 만들 수 있어 피부색별 정확도 격차가 발생할 수 있습니다. - PHRM은 약 700명의 참가자로부터 35만 개 이상의 영상 클립을 수집했습니다. - 피부색 분포를 Monk Skin Tone 기준으로 설계했습니다. - 밝은 피부 그룹: 최소 25% - 중간 피부 그룹: 최소 25% - 어두운 피부 그룹: 최소 33% - 가장 측정이 어려운 사례에 더 많은 학습을 할당했습니다. - 피부색 그룹별 HR MAPE 차이가 5%포인트 미만이어야 한다는 비열등성 기준을 설정했습니다. ## 실험실 검증 결과 - 365명의 다양한 참가자로부터 조명과 활동 상태가 다른 환경에서 얼굴 영상과 ECG를 동시에 수집해 학습했습니다. - 별도의 104명 테스트 세트에서 최소 신뢰도 기준을 적용한 뒤 모든 피부색 그룹에서 MAPE 10% 미만을 기록했습니다. - 같은 데이터에서 비교한 15개 주요 rPPG 모델보다 우수한 성능을 보였습니다. - 모든 피부색 그룹에서 MAPE 10% 미만을 달성한 모델은 PHRM뿐이었습니다. - 신뢰도 점수가 낮은 측정값을 제외하는 confidence gating이 정확도 개선에 기여했습니다. ## 실제 생활 환경에서의 검증 - 231명이 개인 스마트폰에 연구 앱을 설치하고 8일 동안 평소처럼 사용했습니다. - 참가자들은 ECG 흉부 스트랩과 Fitbit Charge 6를 함께 착용해 비교 기준 데이터를 제공했습니다. - 얼굴 잠금 해제 직후 하루 평균 231개의 8초 영상 클립을 수집했습니다. - 참가자는 매일 영상 내용을 검토한 뒤 서버 업로드를 명시적으로 승인했습니다. - 민감한 장면이나 다른 사람의 얼굴이 포함된 영상은 제외할 수 있었습니다. - 데이터는 암호화된 보안 서버에 업로드되었습니다. - 별도로 확보한 101명 검증 세트에서 신뢰도 필터 적용 후 전체 MAPE는 6.09%였습니다. - 밝은 피부 그룹: 5.04% - 중간 피부 그룹: 5.12% - 어두운 피부 그룹: 7.84% - ECG 대비 평균적으로 HR을 0.64bpm 낮게 추정했으며, 95% 일치 한계는 -11.3~10.3bpm이었습니다. - 실제 생활 환경에서도 기존 15개 rPPG 모델보다 크게 우수했고, 모든 피부색 그룹에서 MAPE 10% 미만을 유지했습니다. ## 일일 안정시 심박수 추정 - PHRM은 하루 중 여러 번 측정한 심박수를 단순 평균하지 않고 신뢰도와 시간적 변동을 함께 고려합니다. - 칼만 필터를 사용해 잡음이 있는 개별 측정값을 통합하고 하루의 RHR을 추정합니다. - 연구 결과 일일 RHR 추정 정확도는 웨어러블 추적기와 비교해 평균 절대 오차(MAE) 5bpm 미만으로, 웨어러블 수준에 해당했습니다. - 따라서 스마트폰 사용만으로 장기적인 심박 변화와 건강 추세를 관찰할 가능성을 보여줍니다. ## 연구 데이터와 남은 과제 - 연구진은 지금까지 공개된 스마트폰 영상 기반 rPPG 데이터셋 중 가장 크고 다양한 데이터셋을 공개했습니다. - 자격을 갖춘 연구자는 데이터셋과 사전 학습 모델인 ‘PHRM-mini’에 접근을 신청할 수 있습니다. - 다만 연구 시스템은 스마트폰 전면 카메라가 얼굴을 안정적으로 촬영할 수 있어야 하며, 조명·움직임·카메라 성능에 따라 결과가 달라질 수 있습니다. - PHRM은 연구용 시스템이므로 질병 진단이나 응급 판단을 대신하는 의료기기로 사용해서는 안 됩니다. 스마트폰 카메라 기반 PHRM은 웨어러블이 없어도 심박수와 RHR을 수동적으로 추적할 수 있는 현실적인 접근입니다. 특히 피부색 다양성을 반영한 학습과 실제 생활 환경 검증이 강점이며, 향후에는 개인정보 보호, 배터리·성능 부담, 다양한 기기에서의 일관성 검증이 상용화의 핵심 과제가 될 것입니다.

원문 읽기(새 탭에서 열림)
aws4분 읽기큐레이션 요약

Amazon Cognito 다중 리전 복제로 애플리케이션 복원력 향상 | Amazon Web Services

Amazon Cognito의 다중 리전 복제는 사용자 인증과 M2M 인증을 보조 리전에서도 지속할 수 있도록 해 애플리케이션의 복원력을 높인다. 기본 리전의 사용자 프로필, 자격 증명, 머신 시크릿, 풀 설정을 보조 리전에 자동 복제하며, 장애 전환 시 기존 사용자의 재로그인이나 강제 비밀번호 재설정을 줄일 수 있다. 다만 사용자 등록·프로필 수정은 장애 전환 중 제한되며, KMS 키와 애플리케이션·주변 AWS 리소스에 대한 별도 구성이 필요하다. ## 기존 멀티 리전 인증의 문제 - 리전 간 Cognito 설정과 사용자 데이터를 일관되게 유지하려면 팀이 직접 복제 시스템을 구축·운영해야 했다. - 사용자 데이터를 수동으로 내보내고 가져오는 과정에서 다음 문제가 발생했다. - 민감한 인증 데이터 노출 위험 - 리전 간 데이터 불일치 - 장애 전환 시 강제 비밀번호 재설정 및 재인증 - M2M 인증에서는 보조 리전에 새 앱 클라이언트를 만들고, 애플리케이션과 OAuth 리소스가 새 리전의 토큰 발급자를 신뢰하도록 재구성해야 했다. ## Cognito 다중 리전 복제 방식 - 기본 리전에서 선택한 보조 AWS 리전으로 데이터를 단방향 복제한다. - 다음 항목이 복제된다. - 사용자 프로필 - 사용자 자격 증명 - 머신 인증용 시크릿 - 사용자 풀 구성 - 보조 리전은 읽기 전용으로 동작하며 인증 지속성을 제공한다. - 양쪽 리전이 서로 발급한 액세스 토큰을 인식하므로, 기존 로그인 세션을 유지할 수 있다. - 다음 인증 방식을 지원한다. - Amazon, Google, Apple, Facebook 등 소셜 로그인 - SAML 및 OIDC 연동 - API 및 M2M 인증 흐름 - 장애 전환 중에는 인증은 가능하지만 신규 사용자 등록이나 사용자 프로필 변경은 사용할 수 없다. ## 고객 관리형 KMS 키 - 복제를 구성하려면 AWS KMS에 저장된 멀티 리전 고객 관리형 키가 필요하다. - 동일한 암호화 키를 리전 간 복제해 사용자 데이터 저장 시 일관된 암호화 정책을 적용한다. - Cognito가 키를 사용할 수 있도록 KMS 키 정책에 권한을 추가해야 한다. - 고객 관리형 키를 사용하면 AWS 기본 키에만 의존하지 않고 조직의 암호화 및 키 관리 전략을 적용할 수 있다. ## 복제 설정 절차 예시로 `us-west-2`의 사용자 풀을 `us-east-1`로 복제한다. 1. **고객 관리형 KMS 키 설정** - 두 리전에 키를 생성·복제한다. - KMS 키 정책에 Amazon Cognito의 키 사용 권한을 추가한다. 2. **멀티 리전 OIDC 엔드포인트 설정** - 콘솔에서 새로운 OIDC issuer 유형을 활성화한다. - 변경된 엔드포인트를 서버 애플리케이션과 모바일 앱에 반영한다. - 서버는 재배포가 필요하고, 모바일 앱은 App Store와 Google Play에 업데이트를 제출해야 할 수 있다. - 엔드포인트를 변경하지 않으면 기존 인증 요청이 올바르게 라우팅되지 않아 사용자 장애가 발생할 수 있다. 3. **복제 대상 리전 선택** - 고객 관리형 키가 복제된 리전만 대상 리전으로 선택할 수 있다. - 데이터 규모에 따라 복제 준비 시간이 달라진다. - 복제 사용자 풀이 준비되면 관리자가 수동으로 활성화해야 한다. ## 장애 전환과 트래픽 라우팅 - 기본 리전과 보조 리전의 엔드포인트는 항상 활성 상태로 유지된다. - 애플리케이션 요구사항에 맞춰 다음 항목을 기준으로 헬스 체크를 설계할 수 있다. - 인증 오류율 - 지연 시간 증가 - 특정 AWS 서비스 장애 알림 - 장애 조건이 충족되면 DNS를 변경해 보조 리전으로 트래픽을 전환한다. - 실제 장애 전에 비업무 시간에 일부 트래픽만 보조 리전으로 보내 인증 흐름을 검증하는 것이 권장된다. - 관리형 로그인과 사용자 지정 도메인 기반 연동에서는 Route 53 헬스 체크 ID를 이용한 내장 트래픽 라우팅도 사용할 수 있다. ## 추가로 준비해야 할 리소스 다중 리전 복제 자체만으로 모든 인증 관련 리소스가 자동 복제되는 것은 아니다. - 사용자 지정 인증 흐름에 사용하는 Lambda 함수를 대상 리전에 배포해야 한다. - SMS 및 이메일 알림 설정도 대상 리전에서 별도로 구성해야 한다. - 로그 스트리밍 설정과 AWS WAF 규칙을 수동으로 복제해야 한다. - 장애 전환 절차, DNS 변경, 보안 정책을 사전에 문서화하고 테스트해야 한다. ## 가격과 제공 리전 - Essentials 및 Plus 요금제의 추가 기능으로 제공된다. - 사용자 인증 비용: - Essentials: 복제 리전별 월간 활성 사용자당 `$0.0045` - Plus: 복제 리전별 월간 활성 사용자당 `$0.006` - M2M 인증은 성공적으로 발급된 토큰의 표준 볼륨 요금에 30%가 추가된다. - 미국, 캐나다, 유럽, 아시아 태평양, 남미 등 여러 리전에서 제공되며, 지원 리전은 기본 리전과 복제 대상 리전 모두로 사용할 수 있다. ## 실용적인 권장 사항 다중 리전 복제는 인증 중단을 최소화해야 하는 고객-facing 서비스와 M2M 백엔드에 적합하다. 도입 전 KMS 키, OIDC 엔드포인트, Lambda·WAF·로그 설정을 함께 준비하고, 인증 지속성과 장애 전환 후의 읽기 전용 제약을 포함한 실제 장애 대응 테스트를 수행하는 것이 좋다.

원문 읽기(새 탭에서 열림)
meta4분 읽기큐레이션 요약

불은 꺼지고 시스템은 켜진다: 즉각적인 정전 대비 태세 검증

Meta는 데이터센터의 무경고 전력 상실에 대비하기 위해 **Instantaneous PowerLoss Storm**이라는 새로운 재해 대응 테스트 체계를 도입했다. 기존 시스템에 방어 심층화 전략을 적용하고, 지역 전체의 전원을 실제로 차단하는 단계적 검증을 통해 서비스·데이터·시설의 복원력을 확인했다. 목표는 한 지역 전체의 전력 상실을 개별 장애 도메인 손실만큼 안정적으로 처리하는 것이다. ## 무경고 재해에 대비한 새로운 테스트 패러다임 - 기존의 허리케인, 산불, 전력·네트워크 장애 대응책은 사전 경보가 있을 때 효과적이다. - 그러나 순간적인 전력 상실처럼 전혀 예고되지 않는 재해는 기존 전략만으로 대응하기 어렵다. - Instantaneous PowerLoss Storm은 Meta의 기존 Disaster Readiness(재해 대비) “Storm” 프로그램에 추가된 최종 방어선이다. - 알려진 위험뿐 아니라 새롭게 등장하거나 아직 발견되지 않은 위험까지 검증 대상으로 삼는다. ## 데이터센터 전 계층에 적용한 방어 심층화 - 전력 상실 내성을 데이터센터의 전체 스택에 내장했다. - 기계·전기 설비 - 서버 랙 - 스토리지와 컴퓨트 - Twine 컨테이너 오케스트레이터 - 랙 전원이 끊겨도 배터리와 Power Loss Siren(PLS)을 이용해 메모리 데이터를 보존할 수 있도록 했다. - Twine 서비스 간에는 지역 전체에서 동작하는 비동기 신호 체계인 Unavailability Event(UE)를 구축했다. - 기존 기능은 단일 데이터센터의 장애 도메인에서 검증되어 있었지만, 여러 데이터센터가 연결된 지역 전체 장애에서는 다음 문제가 추가로 발생했다. - 장애 규모가 일반 장애 도메인보다 약 50~60배 큼 - 서비스 복제본 배치 문제 - 수백만 개 서비스의 동시 재시작과 자동 발견 - 전원이 꺼진 지역을 스스로 부팅해야 하는 문제 ## 전체 지역 부팅과 순환 의존성 문제 - Twine의 Scheduler, Allocator, Broker, Zelos 같은 제어 플레인 서비스는 다른 서비스를 시작하기 위한 필수 구성요소다. - 전체 지역이 동시에 부팅될 때 제어 플레인 서비스끼리 서로를 필요로 하는 순환 의존성, 즉 “ouroboros” 문제가 발생할 수 있다. - 이를 해결하기 위해: - 핵심 시작 의존성을 식별했다. - CI/CD에서 Belljar 테스트를 지속적으로 실행해 의존성 문제를 조기에 발견했다. - 예기치 않은 순환 의존성을 끊을 수 있도록 Twine recovery kit을 제공했다. - 이 복구 키트는 Twine 자체를 구동하는 서비스에 대한 “jumpstart” 역할을 한다. - Belljar, Twrko, recovery kit을 함께 사용해 지역 전체 부팅 시 발생할 수 있는 순환 의존성 위험을 줄였다. ## 제어 플레인을 종료시키는 ‘부메랑’ 문제 - UE는 서비스 종료와 복구를 조정하는 신호지만, 이 신호를 생성·전달하는 제어 플레인 자체가 UE에 의해 종료될 수 있었다. - 그러면 일부 서비스가 종료 신호를 받지 못한 채 고아 상태로 남을 수 있다. - 특정 서비스를 UE 전달 대상에서 제외하는 복잡한 방식 대신, 전력 관련 UE를 제어 플레인 서비스가 무시하도록 설계했다. - 단순한 예외 처리로 시스템 복잡도와 유지보수 부담을 낮췄다. ## 신뢰성과 개발 속도 사이의 절충 - 순간 장애에 완벽히 대응하려는 설계는 과도한 엔지니어링이나 정상 운영 중 오탐 위험을 만들 수 있다. - 따라서 반드시 방지해야 할 영향과 감수할 수 있는 영향을 구분했다. - 반드시 방지해야 하는 영향: - 스토리지·데이터베이스 데이터 손실 - 데이터센터 기계·전기 설비의 영구 손상 - 단일 지역을 넘어 지속되는 광범위한 장애 - 허용 가능한 영향: - 일시적인 서비스 오류 - 사전에 정한 한도 내의 랙 장애 - 서비스 라우팅 테이블의 제한된 최신성 저하 - 지역 장애 감지의 일시적인 지연 - 사후 복구가 어렵거나 합리적인 MTTR 내에 완화할 수 없는 문제를 허용 범위 밖으로 정의했다. ## 단계적 검증으로 위험과 폭발 반경 축소 - 전원을 직접 차단하는 테스트는 큰 위험을 동반하므로 점진적인 검증 방식을 택했다. - 검증 단계는 다음과 같다. - 신규·사전 운영 지역에서 의존성 등 독립적인 문제를 먼저 테스트 - 운영 지역을 복제한 shadow 지역에서 실험 - 가장 작고 새로운 운영 지역에서 실제 전력 차단 수행 - 이후 스토리지, AI, 데이터 웨어하우스가 위치한 대규모 운영 지역까지 확대 - 최종 단계의 전력 차단 훈련을 Instantaneous PowerLoss Storm이라고 명명했다. ## 실제 Storm 실행 방식 - 전체 지역에 전력 공급 장애를 주입해 즉시 전원을 차단한다. - 실제 장애처럼 보이도록 테스트 전에 선제적인 보호 조치를 최소화했다. - 현실적인 사고 상황의 MTTR을 반영한 뒤, 영향을 받은 지역을 전역 컨트롤러와 스케줄러에서 격리하는 “drain” 조치를 수행했다. - 반복적인 훈련을 통해 인프라와 엔지니어가 지역 전체 장애를 개별 장애 도메인 장애처럼 처리하도록 개선하고 있다. ## 실용적인 결론 대규모 인프라의 무경고 장애 대비에는 단일 복구 기능보다 시설부터 오케스트레이터까지 이어지는 방어 심층화가 중요하다. 특히 전체 시스템 부팅 시의 순환 의존성과 제어 플레인 보호를 사전에 검증하고, 작은 환경에서 시작해 실제 운영 지역으로 단계적으로 확대하는 방식이 안전성과 개발 속도를 함께 확보하는 현실적인 접근이다.

원문 읽기(새 탭에서 열림)
cloudflare5분 읽기큐레이션 요약

BGP AS PATH의 첫 번째 AS 강제하기

최근 BGP 하이재킹에서 공격자는 사용하지 않는 ASN을 이용해 실제 자신의 ASN을 AS_PATH에서 제거하고, 존재하지 않는 네트워크 경로를 위조하고 있다. RPKI-ROV나 ASPA만으로는 이런 공격을 완전히 막기 어려우므로, 고객이 광고한 경로의 첫 번째 ASN이 실제 BGP 피어의 ASN과 일치하는지 검증하는 **First AS 검사**가 필요하다. 통신사업자는 이 검사를 강제함으로써 위조된 AS_PATH가 상위 네트워크로 전파되는 것을 차단할 수 있다. ## 위조된 AS_PATH를 이용한 경로 하이재킹 - Spamhaus가 보고한 여러 하이재킹 사례에서 공격자는 사용되지 않는 ASN을 활용해 비정상적인 AS_PATH를 만들었다. - 공격 목적은 다음과 같다. - 실제 공격자의 ASN을 경로에서 숨김 - 자신이 해당 prefix의 발신자인 것처럼 위장 - 트래픽을 공격자가 원하는 경로로 유도 - 트래픽 가로채기 또는 추가 공격 수행 - BGP UPDATE의 AS_PATH는 일반적으로 경로를 구성하는 네트워크들의 순서를 나타내지만, BGP 자체는 기본적으로 이 값을 신뢰한다. - 따라서 공격자가 AS_PATH를 조작해도 중간 네트워크가 별도 검증을 하지 않으면 해당 경로가 정상 경로처럼 전파될 수 있다. ## Orange S.A. prefix 사례 - Orange S.A.의 `90.98.0.0/15` prefix에 대해 다음과 같은 경로가 관측됐다. ```text 48237 1299 199524 270118 17072 41128 ``` - AS1299는 Arelion의 Tier 1 네트워크이므로, 경로 오른쪽에 있는 ASN들은 일반적으로 고객-프로바이더 관계를 나타낸다. - 이 경로를 그대로 해석하면 다음과 같은 비정상 관계가 된다. - AS41128: Orange France가 보유하지만 사용되지 않는 ASN - AS17072: 주로 멕시코에서 운영되는 ISP - AS270118: 멕시코 소재 호스팅 사업자 - AS199524: 글로벌 피어링 사업자인 Gcore - 즉, 사용되지 않는 Orange ASN이 멕시코 ISP와 호스팅 사업자를 거쳐 Gcore와 Tier 1 사업자에 연결된 것처럼 보인다. - 이 관계는 현실적으로 매우 부자연스럽기 때문에 AS_PATH가 공격자에 의해 위조됐다고 판단할 수 있다. ## Cloudflare ASN을 포함한 또 다른 사례 - `47.1.0.0/16`, `47.2.0.0/16` 하이재킹에서는 다음 경로가 관측됐다. ```text 199524 270118 17072 13335 36429 ``` - 여기에는 Cloudflare의 ASN인 `13335`가 포함돼 있었지만, Cloudflare는 Charter가 보유한 현재 미사용 ASN `36429`와 직접적인 인접 관계가 없다고 확인했다. - 따라서 Cloudflare ASN은 실제 경로에 참여한 것이 아니라 공격자가 만든 가짜 상위 경로에 포함된 것으로 보인다. - 실제 트래픽은 멕시코 ISP나 Cloudflare를 거치지 않고 Gcore의 시카고 피어링 네트워크 뒤쪽으로 전달됐다. - 이 사례에서는 왼쪽에서 처음으로 신뢰할 수 있는 공통 ASN인 Gcore의 `199524`까지는 실제 전파 경로일 가능성이 높고, 그 오른쪽의 나머지 경로는 위조된 것으로 추정된다. ## 공격자가 사용한 것으로 추정되는 방식 공격자는 다음 순서로 하이재킹을 수행한 것으로 분석된다. - 사용되지 않거나 “parked” 상태인 prefix를 직접 BGP에 광고한다. - 자신의 로컬 ASN을 AS_PATH에서 완전히 제거한다. - 실제로 존재하지 않는 고객-프로바이더 관계를 포함한 가짜 AS_PATH를 구성한다. - 해당 경로를 Gcore와 같은 상위 네트워크에 전달한다. - 상위 네트워크가 고객 ASN과 AS_PATH의 첫 ASN을 검증하지 않으면 경로가 수락된다. - 이후 해당 경로가 상위 프로바이더와 피어를 통해 인터넷 전체로 전파된다. ## First AS 검사의 역할 - BGP 피어가 경로를 광고할 때 AS_PATH의 첫 번째 ASN은 일반적으로 해당 피어의 ASN이어야 한다. - 예를 들어 AS64502가 AS64501로부터 경로를 받았다면, 경로의 첫 ASN이 AS64501인지 확인해야 한다. - 이 검사가 활성화돼 있으면 공격자가 자신의 ASN을 제거한 뒤 다른 ASN으로 시작하는 경로를 광고할 수 없다. - First AS 검사는 다음 공격을 차단하는 데 유용하다. - 자신의 ASN을 AS_PATH에서 제거하는 위조 - 다른 네트워크를 최초 발신자인 것처럼 가장하는 공격 - 가짜 상위 경로를 이용한 트래픽 유인 - BGP의 AS_PATH는 경로 선택과 루프 방지에도 사용된다. - 라우터는 AS_PATH 길이와 정책 등을 바탕으로 최적 경로를 선택한다. - 이미 자신의 ASN을 거친 경로는 루프 방지를 위해 거부할 수 있다. - 운영자는 특정 ASN을 우회하거나 선호하도록 AS_PATH를 정책에 활용할 수 있다. - 하지만 AS_PATH는 원래 신뢰 기반으로 설계됐기 때문에 AS prepend처럼 정상적인 조작도 가능하고, 공격자가 경로를 줄이거나 위조하는 것도 가능하다. ## RPKI-ROV와 ASPA만으로는 부족한 이유 - RPKI ROA는 특정 prefix를 어떤 ASN이 원점(origin)으로 광고할 수 있는지 인증한다. - ASPA는 특정 ASN의 유효한 프로바이더 목록을 선언한다. - 그러나 공격자가 다음 조건을 만족하면 기존 검증을 우회할 가능성이 있다. - RPKI-ROV상 유효한 origin ASN을 AS_PATH에 포함 - 합법적인 ASPA 상위 ASN을 경로에 포함 - 자신의 ASN은 AS_PATH에서 제거 - 예시에서는 AS64506이 ROA를 만들고, ASPA에 유효한 프로바이더로 AS64503을 등록했다. - 공격자 AS64505가 자신의 ASN을 제거하고 AS64506에서 시작하는 것처럼 광고하면, First AS를 검사하지 않는 AS64502는 이를 수락할 수 있다. - 결과적으로 경로가 RPKI-ROV상 유효하고 더 짧은 경로로 보이면서 AS64506으로 향하는 트래픽을 가로챌 수 있다. - 따라서 RPKI와 ASPA는 중요한 보안 수단이지만, 피어 ASN과 AS_PATH 첫 ASN의 일치 여부를 확인하는 First AS 검사를 대체하지 못한다. ## 실용적인 권고 - 모든 BGP 세션에서 First AS 검사를 활성화하고 강제해야 한다. - 고객 경로를 수신할 때 다음을 검증하는 것이 바람직하다. - AS_PATH 첫 ASN이 실제 고객 또는 피어 ASN과 일치하는지 - 고객이 광고할 수 있는 prefix인지 - RPKI-ROV 상태가 유효한지 - ASPA상 프로바이더 관계가 허용되는지 - RPKI-ROV와 ASPA는 origin 및 경로 관계 검증에 사용하고, First AS 검사는 자신의 ASN을 숨긴 경로 위조를 차단하는 방어선으로 함께 운용해야 한다.

원문 읽기(새 탭에서 열림)
netflix4분 읽기큐레이션 요약

시계열 워크로드를 위한 동적 재파티셔닝

Netflix의 TimeSeries Abstraction은 Cassandra를 이용해 페타바이트 규모의 시계열 데이터를 밀리초 단위로 처리하지만, 시간이 지날수록 커지는 광범위한 파티션이 지연시간과 타임아웃을 유발했다. 기존의 테이블 단위 재파티셔닝은 전체 데이터가 비슷한 문제를 보일 때는 효과적이지만, 일부 ID만 비정상적으로 커지는 경우에는 적합하지 않았다. 이를 해결하기 위해 Netflix는 읽기 경로에서 넓은 파티션을 감지하고, 해당 TimeSeries ID 단위로 비동기 분할한 뒤 읽기 요청을 자동으로 재라우팅하는 동적 파티셔닝 시스템을 구축했다. ## Cassandra와 넓은 파티션의 문제 - Cassandra는 높은 처리량, 낮은 지연시간, 비용 효율성, 운영 성숙도를 이유로 Netflix의 시계열 저장소로 사용된다. - 그러나 이벤트가 시간에 따라 누적되면 하나의 파티션이 지나치게 커질 수 있다. - 일반적인 읽기 지연은 수 밀리초 수준이지만, 넓은 파티션에서는 특히 데이터 끝부분에서 지연시간이 수 초까지 증가한다. - 이로 인해 요청 타임아웃, 높은 CPU 사용률, 가비지 컬렉션 일시정지, 스레드 큐 대기 등이 발생할 수 있다. - 단순히 Cassandra 클러스터를 확장하는 방식은 비용 문제를 해결하지 못하므로 데이터 배치 자체를 개선해야 한다. ## 기존 TimeSeries 파티셔닝 전략 - 데이터를 일정한 시간 단위의 개별 Time Slice로 나누어 파티션 크기를 제한한다. - 시간 기준으로 데이터를 효율적으로 조회하거나 삭제할 수 있으며, 대량의 tombstone을 처리해야 하는 부담도 줄어든다. - 데이터셋 생성 시 사용자가 예상 트래픽과 이벤트 특성을 입력한다. - 프로비저닝 파이프라인은 해당 입력을 바탕으로 Monte Carlo 시뮬레이션을 수행해 인프라와 파티션 설정을 결정한다. ## 사전 설정 방식의 한계 - 초기 단계에서는 실제 운영 트래픽을 정확히 예측하기 어렵다. - 시간이 지나면서 트래픽 패턴, 클라이언트 동작, 제품 요구사항이 변할 수 있다. - 일부 TimeSeries ID만 다른 ID보다 훨씬 많은 이벤트를 받는 데이터 이상치가 존재할 수 있다. - Time Slice마다 다른 파티션 전략을 적용할 수 있지만, 수천 개 데이터셋의 설정을 사람이 직접 조정하는 것은 지속 가능하지 않다. - 따라서 파티션 상태를 관찰하고 자동으로 조정하는 시스템이 필요하다. ## Time Slice 단위 재파티셔닝 - Cassandra의 `nodetool tablehistograms` 등 introspection API를 활용해 파티션 크기 분포를 관찰한다. - 너무 작은 파티션이 많은 과도한 분할(over-partitioning)과 지나치게 큰 파티션을 모두 탐지할 수 있다. - 예를 들어 파티션 크기가 10KB보다 작으면 읽기 증폭과 스레드 큐잉이 커질 수 있다. - 백그라운드 워커가 애플리케이션에 연결된 Time Slice의 파티션 히스토그램을 감시한다. - 파티션 크기가 설정된 목표 밀도에 미달하면 조정 계수를 계산하고, 이후 생성될 Time Slice의 `time_bucket` 간격을 변경한다. - 목표 파티션 크기는 워크로드에 따라 보통 2MiB~10MiB로 설정된다. - 이 방식은 읽기 지연시간과 타임아웃을 줄이는 데 효과가 있었지만, 테이블 전체가 비슷한 문제를 보일 때만 적합하다. - 특정 ID 몇 개만 넓은 경우에는 전체 테이블의 파티션 전략을 바꾸는 것이 불필요하거나 효과적이지 않다. ## 일부 ID만 문제가 될 때의 대응 - **아무것도 하지 않기** - 애플리케이션의 전체 지표에 영향이 없다면 문제를 감수하는 것이 합리적일 수 있다. - **부분 결과 반환** - 요청이 설정된 지연시간 SLO를 넘으면 진행 중인 요청을 중단한다. - 그때까지 수집한 데이터만 반환해, 전체 결과보다 빠른 응답을 우선하는 클라이언트에 적합하다. - **문제 ID 차단** - 테스트나 스팸 데이터처럼 시스템을 불안정하게 만드는 ID를 차단한다. - 다만 정상적이고 중요한 ID가 큰 경우에는 데이터 전체를 처리해야 하므로 이 방법을 사용할 수 없다. ## ID별 동적 파티셔닝 - 동적 파티셔닝은 테이블 전체가 아니라 특정 TimeSeries ID의 넓은 파티션만 자동으로 분할한다. - 비동기 파이프라인은 다음 세 단계로 구성된다. - **감지:** 읽기 경로에서 특정 파티션의 읽기 바이트 수를 추적하고, 임계치를 넘으면 넓은 파티션으로 판단한다. - **계획 및 분할:** 적절한 크기가 되도록 파티션 분할 작업을 계획하고 비동기적으로 실행한다. - **읽기 제공:** 분할이 완료되면 기존 요청 경로를 투명하게 새 파티션으로 재라우팅한다. - 읽기 작업 중 파티션에서 읽은 바이트가 설정된 한도를 초과하면 Kafka로 감지 이벤트를 발행한다. - 이벤트에는 데이터가 속한 Time Slice 테이블, 문제가 된 `time_series_id`, 기존 `time_bucket`, `event_bucket`, 해당 파티션의 쓰기 종료 여부(`immutable`), 버전 등의 정보가 포함된다. - 이 구조를 통해 정상적인 ID에는 영향을 주지 않으면서, 데이터량이 큰 특정 ID만 선택적으로 재구성할 수 있다. ## 실용적인 결론 - 데이터 전체의 분포가 바뀌었다면 Time Slice 단위 자동 재파티셔닝을 적용하는 것이 효율적이다. - 일부 ID만 비대해지는 경우에는 ID별 동적 파티셔닝이 더 적합하다. - 읽기량, 파티션 크기, 지연시간 SLO를 지속적으로 관찰하고 자동화된 감지·분할·재라우팅 체계를 마련하는 것이 핵심이다.

원문 읽기(새 탭에서 열림)