# AIROUM 프로젝트 기술 청사진 (Technical Blueprint) v1.0 ## 1. 프로젝트 개요 (Project Overview) AIROUM 프로젝트의 핵심 목표는 'AI와 새로움'의 가치를 효과적으로 전달하고, 잠재 고객이 AI 교육 프로그램을 쉽게 이해하여 문의 및 신청으로 이어지게 하는 공식 랜딩 페이지를 제작하는 것입니다. 최종 결과물은 빠른 로딩 속도와 명확한 사용자 경험을 제공하며, '문의하기'라는 핵심 기능에 집중한 경량의 웹 애플리케이션입니다. 주요 기술 스택은 **프론트엔드에 순수 HTML, CSS, 최소한의 Vanilla JavaScript**를, **백엔드에는 Python 기반의 Flask 마이크로 프레임워크**를, **데이터베이스는 SQLite**를 사용합니다. 이 스택은 빠른 개발 속도, 쉬운 유지보수, 낮은 서버 복잡성을 목표로 선정되었으며, 특히 '문의하기'라는 단일 동적 기능을 안정적으로 처리하는 데 최적화되어 있습니다. ## 2. 상세 프로젝트 구조 (Detailed Project Structure) ### **프론트엔드 디렉토리 구조** React나 Vue 같은 프레임워크를 사용하지 않으므로, `static` 폴더를 중심으로 단순하고 직관적인 구조를 유지합니다. ``` /airoum-landing ├── app.py # Flask 애플리케이션 ├── requirements.txt # Python 의존성 ├── templates/ │ └── index.html # 메인 랜딩 페이지 HTML └── static/ ├── css/ │ └── style.css # 메인 스타일시트 ├── js/ │ ├── main.js # 공통 스크립트 (e.g., 네비게이션) │ └── form.js # 문의하기 폼 전용 스크립트 └── images/ ├── logo.svg └── hero-background.mp4 ``` * `static/css/style.css`: 모든 페이지의 스타일을 정의합니다. BEM(Block, Element, Modifier) 방법론을 적용하여 클래스명을 구조화합니다. ```css /* 예시: BEM 적용 */ .btn { /* ... */ } .btn--primary { /* ... */ } .form__input { /* ... */ } .form__input--error { /* ... */ } ``` * `static/js/form.js`: '문의 및 신청' 폼의 유효성 검사 및 AJAX를 통한 API 서버 통신을 담당합니다. ```javascript // 예시: 문의 폼 제출 로직 document.getElementById('inquiry-form').addEventListener('submit', async (e) => { e.preventDefault(); const formData = new FormData(e.target); const data = Object.fromEntries(formData.entries()); try { const response = await fetch('/api/inquiry', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); // ... 성공/실패 처리 } catch (error) { // ... 네트워크 에러 처리 } }); ``` ### **백엔드 아키텍처** 기술 설계서에 명시된 대로, 단일 책임을 갖는 최소주의 아키텍처를 따릅니다. 복잡한 서비스 레이어 없이, `app.py` 내에서 라우트 핸들러가 직접 요청을 처리하고 데이터베이스와 상호작용하는 단순한 구조를 채택합니다. * **API 라우팅**: `app.py` 파일에 모든 라우트를 정의합니다. * `@app.route('/')`: 메인 랜딩 페이지(`index.html`)를 렌더링합니다. * `@app.route('/api/inquiry', methods=['POST'])`: 문의 데이터를 받아 처리하는 유일한 API 엔드포인트입니다. * **데이터베이스 상호작용**: Flask 라우트 핸들러 내에서 직접 SQLite 데이터베이스 커넥션을 열고, `INSERT` 쿼리를 실행하여 문의 내용을 저장합니다. ### **데이터베이스 스키마** 시스템의 유일한 테이블인 `INQUIRIES`만 존재합니다. | 컬럼명 | 데이터 타입 | 제약 조건 | 설명 | | :--- | :--- | :--- | :--- | | `id` | `INTEGER` | `PRIMARY KEY AUTOINCREMENT` | 고유 식별자 | | `name` | `VARCHAR(50)` | `NOT NULL` | 문의자 이름 | | `email` | `VARCHAR(100)` | `NOT NULL` | 문의자 이메일 | | `phone` | `VARCHAR(20)` | `NULL` | 문의자 연락처 (선택) | | `message` | `TEXT` | `NOT NULL` | 문의 내용 | | `created_at` | `DATETIME` | `NOT NULL, DEFAULT CURRENT_TIMESTAMP` | 문의 접수 일시 | ## 3. 핵심 개발 방향 및 로드맵 (Core Development Direction & Roadmap) ### **개발 1단계 (Phase 1 - MVP)** 가장 먼저 구현해야 할 핵심 기능은 다음과 같습니다. 1. **[P1] 회사 및 교육 프로그램 소개 페이지 구현**: `aroum_landing_page_plan.md`에 기획된 Hero, About, Core Programs 섹션을 포함한 정적 페이지를 HTML/CSS로 완성합니다. 2. **[P2] 문의하기 기능 구현 (End-to-End)**: 프론트엔드의 '문의 및 신청' 폼 UI를 만들고, 백엔드의 `POST /api/inquiry` 엔드포인트와 연동하여 실제 데이터가 SQLite DB에 저장되는 흐름을 완성합니다. 3. **[P3] 반응형 디자인 적용**: 모바일, 태블릿, 데스크탑 환경에서 깨짐 없이 콘텐츠가 표시되도록 CSS 미디어 쿼리를 적용합니다. ### **기술적 원칙 (Technical Principles)** * **코딩 컨벤션**: * Python: [PEP 8](https://www.python.org/dev/peps/pep-0008/) 스타일 가이드를 준수합니다. * CSS: BEM 방법론을 사용하여 클래스명을 작성하고, `prettier`를 통해 코드 스타일을 통일합니다. * JavaScript: `ESLint`와 `prettier`를 사용하여 코드 품질과 일관성을 유지합니다. * **상태 관리**: 클라이언트 측 상태 관리는 최소화합니다. 모든 상태는 서버로부터 받거나, 폼 입력과 같이 일시적인 UI 상태만 Vanilla JS로 관리합니다. * **테스트 정책**: MVP 단계에서는 단위 테스트보다 핵심 기능(문의 제출)에 대한 수동 E2E(End-to-End) 테스트에 집중합니다. * **API 설계 원칙**: `technical-design-document.md`에 정의된 단일 엔드포인트 명세를 엄격히 따릅니다. 요청/응답 형식은 JSON으로 통일하고, 성공/실패 상태를 명확히 반환합니다. ### **주요 컴포넌트 설계** 향후 TypeScript 기반 프레임워크로의 확장을 고려하여 주요 컴포넌트의 인터페이스를 정의합니다. 실제 구현은 CSS 클래스와 HTML 구조로 진행합니다. * **Button (`.btn`)** ```typescript interface ButtonProps { label: string; variant?: 'primary' | 'secondary'; onClick: () => void; disabled?: boolean; } ``` * **Modal (`.modal`)** ```typescript interface ModalProps { isOpen: boolean; onClose: () => void; title: string; children: React.ReactNode; // 실제로는 HTML 콘텐츠가 들어감 } ``` * **Input (`.form__input`)** ```typescript interface InputProps { id: string; label: string; value: string; onChange: (e: React.ChangeEvent) => void; placeholder?: string; error?: string; } ``` ## 4. 즉시 실행할 액션 아이템 (Immediate Action Items) 개발팀은 다음 주까지 아래 작업을 완료해야 합니다. 1. **GitHub 레포지토리 생성 및 초기 설정**: `airoum-landing` 레포지토리를 생성하고, `main` 브랜치 보호 규칙을 설정합니다. 위에서 정의한 디렉토리 구조와 `requirements.txt`, `.gitignore` 파일을 포함한 초기 커밋을 완료합니다. 2. **Flask 기본 환경 설정 및 'Hello World' 배포**: `app.py`에 기본 Flask 앱을 설정하고, `/` 경로에서 `index.html`을 렌더링하는 기능을 구현합니다. 이를 Gunicorn을 통해 로컬 환경에서 실행하는 것을 확인합니다. 3. **랜딩 페이지 Hero 섹션 마크업 및 스타일링 착수**: `aroum_landing_page_plan.md` 기획안에 따라, 동영상 배경을 포함한 Hero 섹션의 HTML 구조와 기본 CSS 스타일링 작업을 시작합니다.