모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-02 에 새 판으로 개정됐습니다. 산출물을 진단 콘솔에서 고객사 페이지 인벤토리에 한국어로 묻는 CLI 질의 도구로 바꾸고 화면과 배포를 걷어냈습니다.최신 판 보기 →
인턴·신입서치오에스에이아이 · [Search OS] FDE(Forward Deployed Engineer) 신입 채용

고객사 페이지를 받아 검색·AI 인용에 필요한 항목(제목·메타·구조화 데이터·정규 주소)을 규칙으로 점검하고 누락분을 채운 개선안을 원안과 나란히 보여주는 진단 콘솔

서치오에스에이아이 공고에서 뽑은 세 가지 시그널.

'인프라 변경 없이도 SEO·AI 검색 대응을 자동화할 수 있게 한다' 는 공고 문장이 이 콘솔의 방식(페이지를 받아 점검·개선안만 내는 것)을 그대로 정의합니다. Search OS 가 CSR·SSR·SPA·레거시를 모두 지원한다고 밝힌 만큼, 렌더 방식별 점검을 규칙으로 다룬 이 도구가 그 제품 방향의 진단 축과 붙습니다. 이 포트폴리오가 입증하는 것은 렌더·검색 항목을 규칙으로 점검하고 개선안 생성을 분리하는 구현이며, 검색 순위 알고리즘이나 GEO 전문성은 주장하지 않습니다. 실제 인용 성과의 인과는 면접에서 모른다고 말하는 편이 낫습니다.

01

인프라 변경 없이 검색·AI 대응 자동화

공고가 대규모 플랫폼이 인프라 변경 없이 SEO·AI 검색 대응을 자동화하게 한다고 밝힙니다. 페이지를 규칙으로 점검하고 개선안을 생성하는 이 콘솔이 그 자동화의 진단 축입니다.

인프라 변경 없이도 SEO·AI 검색 대응을 자동화자동으로 변경/최적화구매전환율
02

렌더링 구조 이해가 핵심 기술 요건

SSR/CSR/Edge Rendering 구조 이해와 Next.js 경험, SEO/GEO 개념 이해를 요구합니다. 페이지의 렌더 방식별 점검이 그 기술 이해를 그대로 씁니다.

SSR/CSR/Edge RenderingNext.jsSEO/GEO
03

분석에서 멈추지 않고 실행까지 자동화

분석에서 멈추지 않고 실행까지 자동화하는 데 집착하는 사람을 찾습니다. 점검에 그치지 않고 개선안 생성까지 잇는 이 콘솔이 그 태도와 맞습니다.

분석에서 멈추지 않고 실행까지 자동화빠르게 만들고결과로 검증

포트폴리오 요약

고객사 페이지(URL·렌더 방식·제목·메타·구조화 데이터)를 받아, 검색 엔진과 AI 검색이 인용하기 좋은 항목을 규칙으로 점검하고(제목 길이·메타 존재·구조화 데이터 유효성·정규 주소·렌더 방식), 실패 항목은 LLM 이 채운 개선안을 원안과 나란히 보여주는 진단 콘솔입니다. 각 판정은 어느 항목을 왜 통과·실패했는지 원문 근거와 함께 추적됩니다.

고객 정의

여러 고객사 페이지가 검색과 AI 답변에 왜 덜 노출되는지 페이지마다 소스를 열어 손으로 확인하던 담당자입니다. 점검은 콘솔이 먼저 해두고, 실패 항목의 개선안을 원안과 비교해 바로 적용 판단하고 싶은 사람입니다.

고민 지점

검색·AI 인용에 필요한 항목을 규칙으로 점검하고 실패분만 LLM 개선안으로 채우면, 페이지 대응을 자동 진단하면서도 통과·실패 근거가 항목과 원문에 걸려 담당자가 개선안만 검토하면 됩니다.

주차별 일정

1주차여기까지로 완성

페이지를 넣으면 점검 결과와 개선안이 원안과 나란히 나온다

검색·AI 인용 항목 점검 규칙 엔진(제목·메타·구조화 데이터·정규 주소, 단위 테스트 포함)과 개선안 생성, 진단 콘솔까지 Next.js 로 묶어 Vercel 에 배포한 완결품입니다. 실크롤링 대신 페이지 스냅샷 더미를 입력으로 시작합니다(실크롤·자동 적용은 2·3주차).

  1. 1일 · 페이지 스냅샷 더미(렌더별·결측·구조화 데이터 깨짐 혼입)와 점검 규칙표를 만듭니다
  2. 2-3일 · 제목·메타·구조화 데이터·정규 주소 점검 규칙 엔진을 단위 테스트와 함께 만듭니다
  3. 4-5일 · 실패 항목 개선안 생성에 원문 근거 강제와 주제 이탈 방지 검증을 연결합니다
  4. 6-7일 · Next.js 진단 콘솔(원안·개선안 나란히 보기)을 붙여 Vercel 로 배포합니다
2주차선택 성장

점검이 맞는지 라벨 정답과 대조한다

사람이 라벨링한 페이지 점검 정답표 대비 항목 판정 일치율 리포트와, 구조화 데이터 깨짐·렌더별 제목 결측 경계 케이스 회귀 테스트가 남은 상태입니다.

  1. 8-9일 · 점검 정답표 대비 항목 판정 전수 채점을 굳힙니다
  2. 10-12일 · 구조화 데이터 깨짐·렌더별 결측 경계 회귀 테스트를 굳힙니다
3주차선택 성장

실제 페이지 크롤과 키워드 대응을 붙인다

고객사 URL 을 실제 크롤해 점검하고, target_keyword 대비 제목·본문 대응을 진단해 우선순위 리포트로 정렬하는 흐름이 붙은 상태입니다.

  1. 15-18일 · 실제 URL 크롤과 target_keyword 대응 진단·우선순위 리포트를 붙입니다

데모 · 측정 지표

01

페이지를 넣으면 항목별 점검 결과와 실패분 개선안이 원안과 나란히 나오는 흐름을 시연합니다(구조화 데이터 깨짐·제목 결측 포함).

02

항목 점검 판정을 사람 라벨 정답표와 대조한 일치율을 보여줍니다(표본: 페이지 60건, 자가 라벨, 항목별 통과·실패 판정 기준).

03

일부러 만든 구조화 데이터 깨짐·제목 결측·CSR 미렌더·정규 주소 충돌 30종을 넣어도 점검 형식이 깨지지 않고 정확히 실패로 잡힘을 보여줍니다.

정직 경계선

진짜 성능 검증은 여기서 멈춥니다

위 수치는 작성자가 만든 더미 페이지와 자가 라벨 기준이라 성능 증명이 아니라 데모 조건 동작이며, 개선안이 실제 검색·AI 인용을 높이는지는 서치오에스에이아이의 고객사 데이터와 실측 지표가 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.

미리 알아둬야 할 것들

점검 일치율은 작성자가 만든 더미 페이지와 자가 라벨 기준의 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 검증 구조로 솔직하게 설명합니다.

정답을 내가 만들었으니 잘 맞는 게 당연해지는 함정이 있어, 구조화 데이터 깨짐·제목 결측·CSR 미렌더·정규 주소 충돌을 페이지 더미에 일부러 섞습니다.

점검 항목 통과가 실제 검색·AI 인용 상승을 보장하지 않으므로(상관≠인과), 이 도구는 점검·개선안 생성까지만 입증하고 성과 인과는 검증 대상에서 뺍니다.

실서비스 전환 시 실제 렌더링 후 DOM 크롤과 사이트별 예외 처리가 필요하며, 이는 스냅샷 더미와 달라지는 부분으로 분리해 둡니다.

더미 데이터

① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.

page_snapshotsTABLE· 10 rows

점검 엔진의 입력이 되는 고객사 페이지 스냅샷입니다. 결측·구조화 데이터 깨짐·렌더 방식 차이를 일부러 담아 점검 분기를 시험합니다.

② page_snapshots.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 10)
urlrendertitlemeta_descriptionh1structured_datacanonicaltarget_keyword
https://shop.example.com/p/1SSR겨울 패딩 베스트 10 | Example따뜻한 겨울 패딩 추천겨울 패딩 추천{"@type":"Product"}https://shop.example.com/p/1겨울 패딩
https://shop.example.com/p/2CSR—————러닝화
https://shop.example.com/p/3SSR이 페이지는 정말 길고 검색 결과에서 잘려서 사용자에게 제대로 노출되…설명제품{invalid jsonhttps://shop.example.com/p/3가방
https://shop.example.com/p/4SPA제품 상세제품 상세—https://shop.example.com/p/9지갑
https://blog.example.com/a/1SSRAI 검색 최적화 가이드AI 검색에 잘 노출되는 법AI 검색 최적화{"@type":"Article"}https://blog.example.com/a/1AI 검색
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
다음 JSON Schema 를 그대로 만족하는 페이지 스냅샷 행을 40개 더 만들어 주세요: {"type":"object","properties":{"url":{"type":"string"},"render":{"type":"string","enum":["CSR","SSR","SPA","legacy"]},"title":{"type":["string","null"]},"meta_description":{"type":["string","null"]},"h1":{"type":["string","null"]},"structured_data":{"type":["string","null"]},"canonical":{"type":["string","null"]},"target_keyword":{"type":["string","null"]}},"required":["url","render"]} url·title·meta 는 실제 상거래·블로그 페이지처럼 현실적이어야 합니다. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) title·meta_description·h1 중 하나 이상이 null(결측) 6건, (2) structured_data 가 깨진 JSON 또는 빈 name 5건, (3) CSR·SPA 라 서버 응답에 제목이 비는 렌더 결측 5건, (4) canonical 이 다른 URL 을 가리키는 정규 주소 충돌 3건, (5) title 이 과도하게 길어 검색 결과에서 잘리는 경계 3건.
schema (3 층의 단일 출처)
{"type":"object","properties":{"url":{"type":"string"},"render":{"type":"string","enum":["CSR","SSR","SPA","legacy"]},"title":{"type":["string","null"]},"meta_description":{"type":["string","null"]},"h1":{"type":["string","null"]},"structured_data":{"type":["string","null"]},"canonical":{"type":["string","null"]},"target_keyword":{"type":["string","null"]}},"required":["url","render"]}
seo_rulesTABLE· 10 rows

점검 통과·실패를 결정하는 규칙입니다. 어느 항목을 어떤 기준으로 보고 실패·경고인지 담아 정답을 규칙으로 결정합니다.

② seo_rules.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 10)
rule_idfieldcheckseverity
S-001title존재하고 15~60자 사이여야 함fail
S-002meta_description존재하고 50~160자 사이여야 함warn
S-003h1페이지에 정확히 하나 존재해야 함warn
S-004structured_data유효한 JSON 이고 @type 이 있어야 함fail
S-005canonical자기 URL 을 가리켜야 함(다른 URL 이면 충돌)fail
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
다음 JSON Schema 를 그대로 만족하는 점검 규칙 행을 15개 더 만들어 주세요: {"type":"object","properties":{"rule_id":{"type":"string"},"field":{"type":"string"},"check":{"type":"string"},"severity":{"type":"string","enum":["fail","warn"]}},"required":["rule_id","field","check","severity"]} field 는 page_snapshots 의 필드여야 하고 check 는 결정론으로 판정 가능한 기준이어야 합니다. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) severity 가 warn 이라 실패가 아니라 경고인 규칙 5건, (2) 같은 field 에 대해 결측·형식·중복을 각각 보는 규칙 3건.
schema (3 층의 단일 출처)
{"type":"object","properties":{"rule_id":{"type":"string"},"field":{"type":"string"},"check":{"type":"string"},"severity":{"type":"string","enum":["fail","warn"]}},"required":["rule_id","field","check","severity"]}

기술 상세 · 아키텍처·운영·출력 스키마

기술 스택 매핑
Next.js진단 콘솔 앱 프레임워크이며 SSR/CSR 렌더 방식별 점검 로직과 함께 1주차 완성품을 Vercel 로 배포합니다
TypeScript페이지 점검 규칙 엔진과 콘솔의 구현 언어입니다. 점검 로직의 단위 테스트를 여기서 돌립니다
LLM실패한 항목(제목·메타·구조화 데이터)의 개선안 문구를 원안 근거에 맞춰 생성합니다
LLM 선택
model
Claude Sonnet (실패 항목 개선안 생성) + 규칙 엔진 (점검 통과·실패 판정)
prompt
입력을 규칙 엔진이 낸 항목별 점검 결과 JSON 으로 한정하고, 개선안 JSON Schema 를 강제합니다. 개선안은 실패 항목에만 생성하게 하고 원문 키워드·주제를 벗어나면 재생성합니다.
rationale
통과·실패의 정답은 항목 존재·길이·구조화 데이터 유효성이라는 규칙으로 결정되므로 RAG 가 필요 없습니다. LLM 은 실패분의 개선 문구를 채우는 생성기라, 스키마 강제와 원문 근거로 개선안이 원 주제를 벗어나지 못하게 묶는 구성이 맞습니다.
결정 게이트
1주차 끝페이지 스냅샷 5종(구조화 데이터 깨짐·제목 결측·CSR 미렌더 포함)을 넣어 점검 결과와 개선안이 원안과 나란히 화면까지 나오는지 확인합니다.

✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 라벨 정답 대조와 실크롤·키워드 대응으로 넘어갑니다.

2주차 끝점검 정답표 대비 항목 판정 일치율과 경계 케이스 회귀 테스트 통과를 확인합니다.

✓ pass → 실제 URL 크롤과 키워드 대응 진단으로 넘어갑니다.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • 페이지 항목을 규칙으로 점검해 통과·실패를 판정하는 결정론 엔진
  • 실패 항목에만 개선안을 생성하되 원문 근거를 강제하는 LLM 파이프라인
  • 개선안이 원 주제를 벗어나는지 확인하는 검증기
  • 라벨 정답 대비 점검 전수 채점 스크립트
  • 원안·개선안을 나란히 보는 진단 콘솔 컴포넌트
domain (교체 대상)
  • 점검 규칙 세트(제목 길이·구조화 데이터 유형)는 검색·AI 대응 기준별로 갈아끼웁니다
  • render enum(CSR·SSR·SPA·legacy)과 field 목록은 대상 사이트 유형별로 교체합니다
  • 구조화 데이터 스키마(제품·기사·FAQ)는 고객 도메인에 맞게 바꿉니다
출력 스키마 · page_diagnosis

규칙 점검 결과와 실패 항목 개선안입니다. 항목마다 원문 근거를 달고 개선안은 실패분에만 채웁니다.

schema (JSON Schema)
{"type":"object","properties":{"url":{"type":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"status":{"type":"string","enum":["ok","fail","warn"]},"evidence":{"type":"string"}},"required":["field","status","evidence"]}},"proposed":{"type":"object","properties":{"title":{"type":["string","null"]},"meta_description":{"type":["string","null"]},"structured_data":{"type":["string","null"]}}},"hedge":{"type":"string"}},"required":["url","issues","proposed","hedge"]}
모범 출력 (3)
[
  {
    "url": "https://shop.example.com/p/2",
    "issues": [
      {
        "field": "title",
        "status": "fail",
        "evidence": "title=null"
      },
      {
        "field": "structured_data",
        "status": "fail",
        "evidence": "structured_data=null"
      },
      {
        "field": "render",
        "status": "warn",
        "evidence": "render=CSR 로 서버 응답에 제목이 비어 있음"
      }
    ],
    "proposed": {
      "title": "러닝화 추천 베스트 | Example",
      "meta_description": "가볍고 편한 러닝화를 한눈에 비교해 보세요.",
      "structured_data": "{\"@type\":\"Product\",\"name\":\"러닝화\"}"
    },
    "hedge": "개선안은 target_keyword 기반 제안이며 실제 검색 성과를 보장하지 않습니다. 합성 페이지 기준입니다."
  },
  {
    "url": "https://shop.example.com/p/3",
    "issues": [
      {
        "field": "title",
        "status": "fail",
        "evidence": "title 길이 60자 초과"
      },
      {
        "field": "structured_data",
        "status": "fail",
        "evidence": "structured_data 가 깨진 JSON"
      }
    ],
    "proposed": {
      "title": "가방 추천 | Example",
      "meta_description": null,
      "structured_data": "{\"@type\":\"Product\",\"name\":\"가방\"}"
    },
    "hedge": "긴 제목은 잘림 위험만 규칙으로 잡고 문구 품질은 사람 검토가 필요합니다."
  },
  {
    "url": "https://shop.example.com/p/6",
    "issues": [
      {
        "field": "title",
        "status": "ok",
        "evidence": "운동화 | Example (13자, 키워드 포함)"
      },
      {
        "field": "structured_data",
        "status": "ok",
        "evidence": "@type=Product 유효"
      }
    ],
    "proposed": {
      "title": null,
      "meta_description": null,
      "structured_data": null
    },
    "hedge": "통과 항목은 개선안을 생성하지 않았습니다. 합성 기준 점검입니다."
  }
]
검증 노트 (자동 vs 수동)

[자동 검증 · 스크립트가 전수 수행] 1. 출력이 JSON Schema 형식을 통과하는지 확인합니다(형식 깨진 진단이 콘솔에 나가는 것을 차단). 2. issues 의 status 가 규칙 엔진 재실행 결과와 100% 일치하는지 확인합니다(정답은 LLM 이 아니라 규칙이 결정). 3. proposed 개선안이 status=fail·warn 항목에만 채워졌는지, ok 항목엔 null 인지 확인합니다(불필요 생성 차단). [수동 검증 · 사람이 표본 확인] 1. 개선안이 원문 주제·키워드를 벗어나 과장하지 않는지 페이지 30건을 표본 검토합니다. 2. 통과 항목에 개선안이 생성되지 않았는지 확인합니다.