API Doc 포트폴리오
Source: Dev.to
번역을 진행하려면 번역이 필요한 전체 텍스트를 제공해 주시겠어요? 현재는 소스 링크만 포함되어 있어 번역할 내용이 없습니다. 텍스트를 알려주시면 바로 한국어로 번역해 드리겠습니다.
Overview
My hack‑athon goal was to craft a portfolio that stands out while remaining approachable.
I chose an API‑documentation aesthetic (think Swagger / Postman) to reflect my developer identity, yet I kept the experience friendly for non‑technical visitors.
- Single‑source data: All personal information lives in one
data.jsonfile, making updates painless. - Tech stack: React + TypeScript for scalability & type safety, Tailwind CSS for rapid, consistent UI design.
- Tools used:
- Gemini – creative prompt‑engineering assistant.
- Antigravity IDE (Gemini 3 Pro) – senior‑frontend reviewer, refactoring, bug‑fixing, UI/UX feedback.
- Google Cloud Run – deployment platform.
I followed Google scientists’ prompt‑engineering guide, applying one‑shot, step‑back, and tree‑of‑thought techniques. Selected prompts are included below.
Source: …
Prompt 1 – 이력서 페이지를 JSON에서 데이터 가져오도록 리팩터링
컨텍스트:
우리는 데이터‑드리븐 아키텍처로 전환하고 있습니다. 모든 콘텐츠는 이제 data.json에 저장됩니다.
작업:
“Resume/IDE Viewer” 페이지(HTML/JS)를 리팩터링하여 data.json에서 동적으로 내용을 로드하도록 합니다.
요구 사항
-
JSON 구조 (정확한 형태)
{ "resume": { "pdf_path": "/assets/cv.pdf", "filename": "cv_xxx_backend.pdf", "last_updated": "2026-01-12", "raw_data": { "name": "XXX", "role": "Junior Backend Developer", "stack": ["Python", "Django", "Docker"] } } } -
TypeScript 로직 (Fetch & DOM 조작)
- 페이지 로드 시:
fetch('./data.json'). - PDF 업데이트:
<iframe>(또는 유사 요소)를 찾아src를resume.pdf_path로 설정. - “Raw” 뷰 업데이트: “Raw (JSON)” 탭의 코드 블록에
resume.raw_data를 보기 좋게 포맷해서 채움. - UI 라벨 업데이트: breadcrumb/파일‑경로 라벨을
resume.filename으로 변경.
- 페이지 로드 시:
-
HTML 변경
- PDF 컨테이너에 하드코딩된
src를 제거하고(빈 상태 또는 로딩 스피너 표시). - JS 타깃팅을 위한 고유 ID 추가, 예:
id="pdf-viewer"id="json-code-block"id="file-name-label"
- PDF 컨테이너에 하드코딩된
전달물
아래는 최소 HTML 스니펫과 업데이트된 JavaScript(TypeScript 호환)이며, 위 요구 사항을 만족합니다.
HTML (발췌)
<!-- PDF viewer -->
<iframe id="pdf-viewer" src=""></iframe>
<!-- Tabs -->
<button id="preview-tab">Preview</button>
<button id="raw-tab">Raw (JSON)</button>
<!-- JSON code block -->
<pre id="json-code-block"></pre>
<!-- Breadcrumb / filename label -->
<span id="file-name-label"></span>
JavaScript / TypeScript (ES6)
// src/utils/loadResume.ts
interface ResumeRaw {
name: string;
role: string;
stack: string[];
}
interface ResumeData {
pdf_path: string;
filename: string;
last_updated: string;
raw_data: ResumeRaw;
}
interface PortfolioJSON {
resume: ResumeData;
}
/**
* Fetches `data.json`, updates the DOM, and handles errors.
*/
async function initResumeViewer(): Promise<void> {
try {
const response = await fetch('./data.json');
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data: PortfolioJSON = await response.json();
const { pdf_path, filename, raw_data } = data.resume;
// ---- Update PDF viewer ----
const pdfViewer = document.getElementById('pdf-viewer') as HTMLIFrameElement;
if (pdfViewer) pdfViewer.src = pdf_path;
// ---- Update filename breadcrumb ----
const fileLabel = document.getElementById('file-name-label');
if (fileLabel) fileLabel.textContent = filename;
// ---- Populate Raw JSON view ----
const jsonBlock = document.getElementById('json-code-block');
if (jsonBlock) {
const pretty = JSON.stringify(raw_data, null, 2);
jsonBlock.textContent = pretty;
}
} catch (err) {
console.error('Failed to load resume data:', err);
// Optional: display a user‑friendly fallback UI
}
}
// Run on DOM ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initResumeViewer);
} else {
initResumeViewer();
}
Prompt 2 – UX Audit for Non‑Technical Users (Recruiter Persona)
Role: Senior UX Researcher paired with a Non‑Technical Tech Recruiter (HR Manager).
Context:
The portfolio uses a heavy API‑Documentation / CLI theme: dark mode, monospaced fonts, terminal‑style inputs, JSON code blocks, sidebar navigation (Stripe‑Docs style), and a command palette.
Problem:
The design may be over‑engineered, potentially confusing recruiters who lack coding experience, increasing cognitive load and navigation friction.
Heuristic Evaluation
| Friction Point | Why it fails HR | Thematic Solution |
|---|---|---|
| Bio text inside a JSON string | 빠르게 읽기 어려움; 괄호/따옴표 때문에 시각적 잡음; 채용 담당자는 일반 텍스트를 스캔함. | 왼쪽에 미묘한 라인‑넘버 거터(IDE와 유사)를 유지하면서 본문을 일반 문단 텍스트로 렌더링해 “코드” 느낌을 보존. |
| Navigation via a terminal‑style command palette | 명령을 입력하거나 기억해야 함; 간단한 조회에 불필요한 상호작용 단계 추가. | 명령 팔레트를 선택적 단축키로 유지하되, 명확히 라벨링된 탭(About, Projects, Resume)이 있는 눈에 띄는 최상위 네비게이션 바 제공. |
| Work Experience displayed as raw JSON objects | 채용 담당자는 불릿 포인트나 카드 형태를 기대함; JSON 형식은 연대기와 성과를 가리게 함. | 날짜, 직함, 책임을 일반 언어로 표시하면서 코드 블록(테두리, 모노스페이스 폰트) 느낌을 모방한 카드로 각 역할을 보여줌. |
| Sidebar mimicking API docs with collapsible sections | 중첩 레이어가 너무 많아 “Resume” 링크를 놓칠 수 있음. | 사이드바를 최소한의 최상위 항목으로 축소하고 헤더에 고정된 “Download Resume” 버튼 추가. |
| Heavy use of dark background with low‑contrast text | 다크‑모드 코딩 환경에 익숙하지 않은 사용자에게 가독성 저하. | 대비 비율을 높임(예: 다크‑그레이 배경에 라이트‑그레이 텍스트) 및 접근성을 위한 “light mode” 토글 제공. |
| “Raw JSON” view of the resume | 채용 담당자에게 가치가 없으며 기술적이고 위압적으로 보임. | “Advanced” 토글 뒤에 원시 뷰를 숨기고, 기본 이력서 접근점으로 깔끔한 인쇄용 PDF 미리보기를 제공. |
| Terminal‑style input prompts for project demos | 데모를 보기 위해 명령을 입력해야 함; 클릭만으로 가능한 간단한 흐름에 마찰 추가. | 터미널 스타일 테두리와 커서 애니메이션을 유지하면서도 클릭 가능한 “Run Demo” 버튼으로 교체, 타이핑 없이 명령줄 느낌 제공. |
Breadcrumbs showing file paths (e.g., /cv_xxx_backend.pdf) | 혼란을 줄 수 있음; 채용 담당자는 “Resume” 같은 명확한 라벨을 원함. | 친절한 라벨(“Resume”)과 기술적 브레드크럼을 작은 보조 폰트로 동시에 표시. |
Specific Questions Answered
| Question | Recommendation |
|---|---|
| Should I keep the “Terminal Input” as the primary navigation? | No. 파워 유저를 위한 선택적 단축키로 유지하고, 채용 담당자를 위한 명확히 라벨링된 전통적인 네비게이션 바 제공. |
| How can I display “Work Experience” so it looks like code but reads like a story? | 코드‑블록 테두리와 모노스페이스 폰트를 적용한 카드 컴포넌트 사용, 내용은 자연어 문장으로 작성. 왼쪽에 미세한 라인 번호를 추가해 개발자 분위기 유지. |
| Is the “Raw JSON” view of my resume necessary? | Only as an advanced option. “Advanced / Raw Data” 토글 뒤에 배치. 기본 뷰는 깔끔한 인쇄용 PDF 미리보기와 눈에 띄는 “Download” 버튼이어야 함. |
Summary
- Maintain the technical aesthetic (dark theme, code‑like borders, line numbers) while simplifying interactions for non‑technical users.
- Prioritize readability: plain text for bios, bullet points for experience, high‑contrast colors.
- Offer progressive disclosure: advanced JSON or terminal features are hidden behind optional toggles, keeping the primary experience clean and approachable.
es는 선택적 토글 뒤에 숨겨져 있어 기본 흐름을 간단하게 유지합니다.
Implementing these bridges will let recruiters find the essential information (Name, Role, Tech Stack, Resume) within the 6‑second scan window while preserving the unique API‑documentation personality of the portfolio.
I’m proud of how this project turned the portfolio itself into an experiment. Instead of focusing only on visuals, I treated it as a system: maintainable, extensible, and driven by data. Designing the entire site around a single JSON source allowed me to iterate quickly and keep the structure clean throughout the hackathon.
I’m also especially proud of how I used AI as a collaborator rather than just a code generator. By refining prompts and applying techniques, I was able to use Gemini and Antigravity Agents as creative and technical reviewers, helping me improve architecture decisions, UI/UX, and overall clarity.