--- status: stable page_id: A07_Register related_pages: ["[[A07_Register/A07_backend]]", "[[A06_Login/A06_frontend]]", "[[auth_rbac]]"] last_updated: 2026-07-12 --- # A07_Register — Frontend 회원가입 화면. 정보 입력 + 약관 아코디언 동의 → OTP 입력으로 전환하는 2단계 폼. ## 파일 구조 | 파일 | 위치 | 역할 | |---|---|---| | `A07_Register_UI_Auth_Page.ts` | `A07_Register/A07_Register_UI_Auth_Page.ts:1-208` | **실사용** 회원가입 UI (약관·OTP·실 API) | | `A07_Register_UI_Page.ts` | `A07_Register/A07_Register_UI_Page.ts:1-142` | ⚠️ 구버전 잔재 (미사용, 아래 참고) | | `A07_Register_UI_Style.css` | `A07_Register/A07_Register_UI_Style.css:1-103` | 스타일 (theme.css 변수만 사용) | | `A07_Register_Api_Fetch.ts` | `A07_Register/A07_Register_Api_Fetch.ts:1-47` | 회원가입/회사검색 API 클라이언트 | > ⚠️ **라우터는 `A07_Register_UI_Auth_Page`만 사용** (router.ts:30 확인). `A07_Register_UI_Page.ts`는 > 회사명+이름+이메일+비번만 받는 단순 폼이며 백엔드 미연동(TODO 주석, `navigateTo`만) — 구버전 잔재로 판단. 정리 권장. ## 컴포넌트 / 함수 (UI_Auth_Page — 실사용) | 함수 | 위치 | 역할 | |---|---|---| | `renderA07Register(root)` | `A07_Register/A07_Register_UI_Auth_Page.ts:68` | 카드+폼 조립, 약관 텍스트 비동기 로드 후 렌더 | | `onA07_Register_Submit_Click(event)` | `A07_Register/A07_Register_UI_Auth_Page.ts:146` | 제출 핸들러(검증→가입요청→OTP 전환→검증) | | `checkboxWithAccordion(label, text)` | `A07_Register/A07_Register_UI_Auth_Page.ts:22` | 체크박스+펼침 상세(약관 본문) 컴포넌트 | | `loadAgreementText(filename)` | `A07_Register/A07_Register_UI_Auth_Page.ts:58` | `resources/legal/*.txt` 약관 파일 fetch | ## API 클라이언트 함수 | 함수 | 위치 | 역할 | |---|---|---| | `requestRegistration(payload)` | `A07_Register/A07_Register_Api_Fetch.ts:28` | `POST /auth/register/request` | | `verifyRegistration(email, otpCode)` | `A07_Register/A07_Register_Api_Fetch.ts:32` | `POST /auth/register/verify` | | `searchCompanies(query)` | `A07_Register/A07_Register_Api_Fetch.ts:39` | `GET /auth/companies?q=` → id/name 목록 | - `RegisterPayload` 타입: email, password, password_confirm, name, position, phone, terms_version, terms_agreed, privacy_agreed, marketing_agreed ## 제출 로직 (2단계 폼 전환) 1. **입력 검증**: 이름/이메일/비번/비번확인 필수, 이메일 형식, 비번 8자 이상, 비번 일치, 필수 약관(terms/privacy) 체크 2. `requestRegistration()` 호출 (`terms_version: "1.0"` 고정, terms_agreed/privacy_agreed true) 3. 성공 시 `verifyStep = true`: 입력 필드 숨기고 OTP 필드 노출, 버튼 라벨 → `A07_Register_Verify` 4. OTP 제출 → `verifyRegistration()` → 성공 토스트 → `navigateTo(ROUTES.A06_LOGIN)` ## 약관 동의 (아코디언) - `checkboxWithAccordion`으로 이용약관/개인정보/마케팅 3종 생성 - 약관 본문은 `resources/legal/{terms_of_service,privacy_policy,marketing_consent}.txt`에서 fetch - 마케팅은 선택(marketing_agreed), 이용약관·개인정보는 필수 ## 로컬라이제이션 모든 텍스트는 [[ui_templates]]에서 로드. 하드코딩 금지. | UI 요소 | 로케일 키 | |---|---| | 제목 | `A07_Register_Title` | | 필드 | `A07_Register_Field_Name`, `_Position`, `_Email`, `_Phone`, `_Password`, `_PasswordConfirm`, `_Otp` | | 약관 | `A07_Register_Terms`, `_Privacy`, `_Marketing` | | 제출/인증 | `A07_Register_Submit`, `A07_Register_Verify` | | 안내/성공 | `A07_Register_OtpSent`, `A07_Register_Success` | | 오류 | `A07_Register_Error_Required`, `_Email`, `_Password`, `_PasswordMismatch`, `_Terms`, `_Request` | | 로그인 이동 | `A07_Register_ToLogin` | ## 스타일 (CSS) - `.a07-register__card` — 카드 (max-width: 420px) - `.a07-register__agreement` — 약관 컨테이너(border, overflow hidden) - `.a07-register__agreement-summary` — 체크박스+라벨 헤더(클릭 시 상세 토글) - `.a07-register__agreement-details` / `-content` — 펼침 약관 본문(max-height 200px, pre-wrap) ## 이벤트 핸들러 | 함수 | 위치 | 동작 | |---|---|---| | `onA07_Register_Submit_Click()` | `A07_Register/A07_Register_UI_Auth_Page.ts:146` | 가입/OTP 제출 | | (인라인) 로그인 버튼 | `A07_Register/A07_Register_UI_Auth_Page.ts:201` | A06_LOGIN으로 이동 | | (인라인) 약관 요약 클릭 | `A07_Register/A07_Register_UI_Auth_Page.ts:47` | 상세 아코디언 토글 | ## 의존성 - [[a00_app_shell_framework]] — `navigateTo()` 라우팅 - `config_frontend.ts` — `ROUTES`, `API_BASE_URL` - `common_util_validate` — `isBlank`, `isValidEmail`, `hasMinLength` - [[ui_templates]] — `createButton`, `createInputField`, `showLoadingOverlay`/`hideLoadingOverlay`, `showToast` - 백엔드 API → [[A07_Register/A07_backend]]