# 은행 앱 만들기 2부: 로그인 및 등록 양식 만들기
```mermaid
journey
title 당신의 폼 개발 여정
section HTML 기초
폼 요소 이해하기: 3: Student
입력 타입 배우기: 4: Student
접근성 마스터하기: 4: Student
section JavaScript 통합
폼 제출 처리하기: 4: Student
AJAX 통신 구현하기: 5: Student
서버 응답 처리하기: 5: Student
section 검증 시스템
다중 검증 단계 만들기: 5: Student
사용자 경험 향상하기: 5: Student
데이터 무결성 보장하기: 5: Student
```
## 강의 전 퀴즈
[강의 전 퀴즈](https://ff-quizzes.netlify.app/web/quiz/43)
온라인에서 양식을 작성하다가 이메일 형식이 거부된 적이 있나요? 아니면 제출 버튼을 눌렀는데 모든 정보가 사라졌나요? 우리 모두 이런 좌절스러운 경험을 해봤을 겁니다.
양식은 사용자와 애플리케이션 기능 간의 다리입니다. 항공 교통 관제사가 비행기를 목적지까지 안전하게 안내하는 까다로운 절차처럼, 잘 설계된 양식은 명확한 피드백을 제공하고 비용이 많이 드는 오류를 방지합니다. 반면에 잘못된 양식은 복잡한 공항의 소통 오류보다도 빠르게 사용자를 떠나게 할 수 있습니다.
이번 수업에서는 정적인 은행 앱을 인터랙티브한 애플리케이션으로 바꿉니다. 사용자 입력을 검증하고, 서버와 통신하며, 유용한 피드백을 제공하는 양식을 만드는 법을 배웁니다. 이를 통해 사용자가 앱 기능을 탐색할 수 있는 제어 인터페이스를 구축하는 셈입니다.
최종적으로는 사용자가 좌절하지 않고 성공으로 안내하는 검증 기능이 포함된 완전한 로그인 및 회원가입 시스템을 갖추게 될 것입니다.
```mermaid
mindmap
root((폼 개발))
HTML Foundation
의미론적 요소
입력 유형
접근성
라벨 연결
User Experience
검증 피드백
오류 방지
로딩 상태
성공 메시지
JavaScript Integration
이벤트 처리
AJAX 통신
데이터 처리
오류 관리
Validation Layers
HTML5 검증
클라이언트 측 로직
서버 측 보안
점진적 향상
Modern Patterns
Fetch API
Async/Await
Form Data API
약속 처리
```
## 사전 준비 사항
양식을 만들기 전에 모든 설정이 올바른지 확인해 보겠습니다. 이 수업은 이전 수업에서 다룬 내용을 그대로 이어가므로, 건너뛰었다면 기본 설정부터 완성하는 것을 권장합니다.
### 필수 설정
| 구성 요소 | 상태 | 설명 |
|-----------|--------|-------------|
| [HTML 템플릿](../1-template-route/README.md) | ✅ 필수 | 기본 은행 앱 구조 |
| [Node.js](https://nodejs.org) | ✅ 필수 | 서버용 자바스크립트 런타임 |
| [은행 API 서버](../api/README.md) | ✅ 필수 | 데이터 저장용 백엔드 서비스 |
> 💡 **개발 팁**: 프론트엔드 은행 앱과 백엔드 API, 두 개의 별도 서버를 동시에 실행할 것입니다. 이는 프론트엔드와 백엔드 서비스가 독립적으로 운영되는 실제 개발 환경과 유사합니다.
### 서버 구성
**개발 환경은 다음으로 구성됩니다:**
- **프론트엔드 서버**: 은행 앱을 제공 (보통 포트 `3000`)
- **백엔드 API 서버**: 데이터 저장 및 조회 처리 (포트 `5000`)
- **두 서버**는 충돌 없이 동시에 실행 가능
**API 연결 테스트:**
```bash
curl http://localhost:5000/api
# 예상 응답: "Bank API v1.0.0"
```
**API 버전 응답이 보이면 준비 완료입니다!**
---
## HTML 양식과 컨트롤 이해하기
HTML 양식은 사용자가 웹 애플리케이션과 소통하는 방식입니다. 19세기 먼 곳을 연결했던 전신 시스템처럼 사용자 의도와 애플리케이션 응답 간 통신 프로토콜 역할을 합니다. 잘 설계되면 오류를 잡아내고 입력 형식을 안내하며 유용한 제안을 제공합니다.
현대 양식은 기본 텍스트 입력보다 훨씬 정교합니다. HTML5는 이메일 검증, 숫자 포맷, 날짜 선택 등을 자동으로 처리하는 전문화된 입력 유형을 도입했습니다. 이러한 개선은 접근성과 모바일 사용자 경험에 모두 이점을 줍니다.
### 필수 양식 요소
**양식에 꼭 필요한 기본 요소:**
```html
```
**이 코드는 다음을 수행합니다:**
- **폼 컨테이너**를 고유 식별자와 함께 생성
- **데이터 제출 HTTP 메서드** 지정
- **접근성 위해 라벨과 입력 연결**
- **폼 처리용 제출 버튼 정의**
### 최신 입력 유형과 속성
| 입력 유형 | 용도 | 사용 예시 |
|------------|---------|---------------|
| `text` | 일반 텍스트 입력 | `` |
| `email` | 이메일 검증 | `` |
| `password` | 비밀 텍스트 입력 | `` |
| `number` | 숫자 입력 | `` |
| `tel` | 전화번호 입력 | `` |
> 💡 **최신 HTML5 장점**: 특정 입력 유형을 사용하면 추가 자바스크립트 없이 자동 검증, 적합한 모바일 키보드, 더 나은 접근성 지원이 가능합니다!
### 버튼 유형과 동작
```html
```
**각 버튼 유형의 기능:**
- **제출 버튼**: 폼 제출을 트리거하고 지정된 엔드포인트에 데이터 전송
- **초기화 버튼**: 모든 폼 필드를 초기 상태로 복원
- **일반 버튼**: 기본 동작 없음, 기능 구현 위해 커스텀 자바스크립트 필요
> ⚠️ **중요 참고**: `` 요소는 self-closing으로 닫는 태그가 필요 없습니다. 최신 권장 사항은 ``을 슬래시 없이 작성하는 것입니다.
### 로그인 폼 만들기
이제 실용적인 로그인 폼을 만들어 현대 HTML 양식 관행을 보여 드리겠습니다. 기본 구조부터 시작해 접근성 기능과 검증으로 점진적으로 강화할 것입니다.
```html
Bank App
Login
```
**여기서 일어나는 일:**
- **의미론적 HTML5 요소**로 폼 구조화
- **관련 요소 그룹화**를 위해 의미 있는 클래스가 포함된 `div` 컨테이너 사용
- **`for`와 `id` 속성으로 라벨과 입력 연결**
- **더 나은 UX를 위해 `autocomplete`과 `placeholder` 같은 최신 속성 포함**
- **브라우저 기본 검증 대신 JavaScript 검증을 위해 `novalidate` 추가**
### 적절한 라벨의 힘
**왜 라벨이 현대 웹 개발에서 중요한가:**
```mermaid
graph TD
A[라벨 요소] --> B[스크린 리더 지원]
A --> C[클릭 대상 확대]
A --> D[폼 검증]
A --> E[SEO 이점]
B --> F[모든 사용자에게 접근 가능]
C --> G[더 나은 모바일 경험]
D --> H[명확한 오류 메시지]
E --> I[더 나은 검색 순위]
```
**적절한 라벨이 제공하는 효과:**
- **화면 읽기 도구가 폼 필드를 명확히 읽도록 지원**
- **클릭 영역 확대(라벨 클릭 시 입력에 포커스 이동)**
- **모바일에서 더 큰 터치 영역 제공으로 사용성 향상**
- **폼 검증 시 의미 있는 오류 메시지 지원**
- **폼 요소에 의미론적 의미 부여로 SEO 향상**
> 🎯 **접근성 목표**: 모든 폼 입력에는 연결된 라벨이 있어야 합니다. 이 간단한 습관은 장애가 있는 사용자를 포함해 모든 사용자가 양식을 원활히 사용할 수 있도록 하고 전반적인 사용자 경험을 개선합니다.
### 회원가입 폼 만들기
회원가입 폼은 완전한 사용자 계정 생성을 위해 더 상세한 정보가 필요합니다. 최신 HTML5 기능과 향상된 접근성을 적용해 만들어 봅시다.
```html
Register
```
**위 코드에서:**
- **각 필드를 컨테이너 `div`로 조직화해 스타일과 레이아웃 개선**
- **브라우저 자동 완성 지원을 위한 적절한 `autocomplete` 속성 추가**
- **사용자 입력 안내를 위한 도움말용 플레이스홀더 텍스트 포함**
- **기본값 설정을 위한 `value` 속성 사용**
- **`required`, `maxlength`, `min` 같은 검증 속성 적용**
- **잔액 필드에 소수점 지원을 위한 `type="number"` 사용**
### 입력 유형 및 동작 탐색
**현대 입력 유형의 향상된 기능:**
| 특징 | 이점 | 예시 |
|---------|---------|----------|
| `type="number"` | 모바일에서 숫자 키패드 제공 | 잔액 입력 용이 |
| `step="0.01"` | 소수점 단위 조절 | 화폐 단위(센트) 입력 가능 |
| `autocomplete` | 브라우저 자동 완성 | 빠른 양식 작성 |
| `placeholder` | 맥락적 힌트 제공 | 사용자 기대 안내 |
> 🎯 **접근성 도전 과제**: 키보드만으로 양식을 탐색해 보세요! `Tab`으로 필드 간 이동, `Space`로 체크박스 선택, `Enter`로 제출하기를 시도해 보세요. 이 경험은 화면 읽기 도구 사용자가 양식을 다루는 방식을 이해하는 데 도움이 됩니다.
### 🔄 **학습 상태 점검**
**양식 기초 이해**: 자바스크립트 구현 전에 이해해야 할 사항:
- ✅ 의미론적 HTML이 접근 가능한 폼 구조를 만드는 방법
- ✅ 입력 유형이 모바일 키보드 및 검증에 중요한 이유
- ✅ 라벨과 폼 컨트롤의 관계
- ✅ 폼 속성이 브라우저 기본 동작에 미치는 영향
**빠른 자가 테스트**: 자바스크립트가 없는 상태로 양식을 제출하면 어떻게 되나요?
*답변: 브라우저가 기본 제출을 수행하여 보통 액션 URL로 리다이렉션합니다.*
**HTML5 폼의 장점**:
- **내장 검증**: 이메일, 숫자 형식 자동 확인
- **모바일 최적화**: 적절한 입력용 키보드 표시
- **접근성 지원**: 화면 읽기 도구 및 키보드 내비게이션 지원
- **점진적 향상**: 자바스크립트가 꺼져 있어도 작동
## 폼 제출 방식 이해하기
누군가 양식을 작성한 뒤 제출 버튼을 누르면 데이터는 보통 저장할 서버로 전송돼야 합니다. 이를 처리하는 몇 가지 방법이 있고 어떤 것을 선택하느냐에 따라 후속 작업이 달라집니다.
버튼을 누를 때 실제로 어떤 일이 일어나는지 살펴보겠습니다.
### 기본 폼 동작
먼저 기본 폼 제출 동작을 관찰해 봅시다:
**현재 양식 테스트:**
1. 양식에서 *가입하기* 버튼 클릭
2. 브라우저 주소창 변화 관찰
3. 페이지가 새로고침 되고 URL에 데이터가 표시됨을 확인

### HTTP 메서드 비교
```mermaid
graph TD
A[양식 제출] --> B{HTTP 메서드}
B -->|GET| C[URL의 데이터]
B -->|POST| D[요청 본문의 데이터]
C --> E[주소 표시줄에 표시됨]
C --> F[데이터 크기 제한]
C --> G[북마크 가능]
D --> H[URL에서 숨김]
D --> I[대용량 데이터 가능]
D --> J[더 안전함]
```
**차이점 이해하기:**
| 메서드 | 사용 사례 | 데이터 위치 | 보안 수준 | 크기 제한 |
|--------|----------|---------------|----------------|-------------|
| `GET` | 검색 쿼리, 필터링 | URL 파라미터 | 낮음 (노출됨) | 약 2000자 |
| `POST` | 사용자 계정, 민감 데이터 | 요청 본문 | 높음 (숨김) | 사실상 무제한 |
**기본 차이점 요약:**
- **GET**: 폼 데이터를 쿼리 파라미터로 URL에 추가 (검색용 적합)
- **POST**: 데이터를 요청 본문에 포함 (민감 정보에 필수)
- **GET 제한**: 크기 제한, 데이터 노출, 브라우저 기록에 남음
- **POST 장점**: 대용량 처리 가능, 개인정보 보호, 파일 업로드 지원
> 💡 **최선의 방법**: 검색 및 필터는 `GET`, 회원가입, 로그인, 데이터 생성에는 `POST` 사용 권장
### 폼 제출 구성
등록 폼이 백엔드 API와 `POST` 방식으로 안전하게 통신하도록 설정합시다:
```html
```
**향상된 유효성 검사 이해하기:**
- **필수 필드 표시와 유용한 설명 결합**
- **형식 검사용 `pattern` 속성 포함**
- **접근성과 툴팁용 `title` 속성 제공**
- **사용자 입력 안내용 보조 텍스트 추가**
- **접근성 향상을 위한 의미론적 HTML 구조 사용**
### 고급 유효성 검사 규칙
**각 유효성 검사 규칙의 역할:**
| 필드 | 유효성 검사 규칙 | 사용자 이점 |
|-------|------------------|--------------|
| 사용자명 | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | 유효하고 고유한 식별자 보장 |
| 통화 | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | 일반 통화 기호 허용 |
| 잔액 | `min="0"`, `step="0.01"`, `type="number"` | 음수 잔액 방지 |
| 설명 | `maxlength="100"` | 적절한 길이 제한 |
### 유효성 검사 동작 테스트
**다음 유효성 검사 시나리오를 시도해 보세요:**
1. **빈 필수 필드로 폼 제출 시도**
2. **3자 미만의 사용자명 입력**
3. **사용자명에 특수 문자 입력 시도**
4. **음수 잔액 입력**

**관찰할 점:**
- **브라우저 기본 유효성 검사 메시지 표시**
- **`:valid` 및 `:invalid` 상태에 따른 스타일 변화**
- **모든 유효성 검사가 통과할 때까지 폼 제출 막힘**
- **최초 오류 필드로 자동 포커스 이동**
### 클라이언트-사이드 vs 서버-사이드 유효성 검사
```mermaid
graph LR
A[클라이언트 측 검증] --> B[즉각적인 피드백]
A --> C[더 나은 사용자 경험]
A --> D[서버 부하 감소]
E[서버 측 검증] --> F[보안]
E --> G[데이터 무결성]
E --> H[비즈니스 규칙]
A -.-> I[둘 다 필요]
E -.-> I
```
**양쪽이 모두 필요한 이유:**
- **클라이언트-사이드 검사**: 즉각 피드백 및 사용자 경험 향상
- **서버-사이드 검사**: 보안 보장 및 복잡한 비즈니스 규칙 처리
- **결합 접근법**: 견고하고 사용자 친화적이며 안전한 앱 구현
- **점진적 향상**: 자바스크립트 비활성화 시에도 작동
> 🛡️ **보안 알림**: 클라이언트 측 검증만 믿지 마세요! 악의적 사용자는 클라이언트 검증을 우회할 수 있으므로 보안과 데이터 무결성을 위해 서버 측 유효성 검증은 필수입니다.
### ⚡ **다음 5분 동안 해볼 일**
- [ ] 잘못된 데이터로 폼을 테스트하며 유효성 메시지 확인
- [ ] 자바스크립트 비활성화 후 HTML5 유효성 검사 시도
- [ ] 브라우저 개발자 도구 열고 서버에 전송되는 폼 데이터 검사
- [ ] 다양한 입력 타입 테스트하여 모바일 키보드 변화 확인
### 🎯 **이번 시간에 달성할 목표**
- [ ] 강의 후 퀴즈 완료 및 폼 처리 개념 이해
- [ ] 실시간 피드백 포함 포괄적 유효성 검사 구현 도전
- [ ] 전문적인 폼용 CSS 스타일링 추가
- [ ] 중복 사용자명 및 서버 오류에 대한 오류 처리 구현
- [ ] 비밀번호 확인 필드 및 일치 검사 추가
### 📅 **주간 폼 마스터리 여정**
- [ ] 고급 기능 포함 완전한 뱅킹 앱 구현
- [ ] 프로필 사진 또는 문서 업로드 기능 추가
- [ ] 진행 표시기 및 상태 관리 포함 다중 단계 폼 구현
- [ ] 사용자 선택에 따라 적응하는 동적 폼 생성
- [ ] 더 나은 사용자 경험을 위한 자동 저장 및 복구 기능 구현
- [ ] 이메일 인증 및 전화번호 형식 지정 같은 고급 유효성 검사 추가
### 🌟 **월간 프런트엔드 개발 마스터리**
- [ ] 조건부 로직과 워크플로우가 포함된 복잡한 폼 애플리케이션 제작
- [ ] 신속한 개발을 위한 폼 라이브러리 및 프레임워크 학습
- [ ] 접근성 지침과 포괄적 디자인 원칙 마스터
- [ ] 전 세계 양식 지원을 위한 국제화 및 현지화 구현
- [ ] 재사용 가능한 폼 컴포넌트 라이브러리 및 디자인 시스템 구축
- [ ] 오픈 소스 폼 프로젝트에 기여하고 베스트 프랙티스 공유
## 🎯 당신의 폼 개발 마스터리 타임라인
```mermaid
timeline
title 폼 개발 및 사용자 경험 학습 진행
section HTML 기초 (15분)
시맨틱 폼: 폼 요소
: 입력 유형
: 레이블 및 접근성
: 점진적 향상
section 자바스크립트 통합 (25분)
이벤트 처리: 폼 제출
: 데이터 수집
: AJAX 통신
: Async/await 패턴
section 검증 시스템 (35분)
다중 보안 계층: HTML5 검증
: 클라이언트 측 로직
: 서버 측 검증
: 오류 처리
section 사용자 경험 (45분)
인터페이스 다듬기: 로딩 상태
: 성공 메시지
: 오류 복구
: 접근성 기능
section 고급 패턴 (1주)
전문 폼: 동적 검증
: 다단계 워크플로우
: 파일 업로드
: 실시간 피드백
section 엔터프라이즈 스킬 (1개월)
프로덕션 애플리케이션: 폼 라이브러리
: 테스트 전략
: 성능 최적화
: 보안 모범 사례
```
### 🛠️ 당신의 폼 개발 도구 모음 요약
이번 강의를 완료한 후, 이제 다음을 마스터했습니다:
- **HTML5 폼**: 의미론적 구조, 입력 타입, 접근성 기능
- **자바스크립트 폼 처리**: 이벤트 관리, 데이터 수집, AJAX 통신
- **유효성 검사 아키텍처**: 보안 및 사용자 경험을 위한 다중 레이어 검사
- **비동기 프로그래밍**: 최신 fetch API와 async/await 패턴
- **오류 관리**: 포괄적 오류 처리와 사용자 피드백 체계
- **사용자 경험 디자인**: 로딩 상태, 성공 메시지, 오류 복구
- **점진적 향상**: 모든 브라우저와 기능에서 동작하는 폼
**실제 적용 사례**: 당신의 폼 개발 기술은 다음에 직접 적용됩니다:
- **전자상거래 애플리케이션**: 결제 과정, 계정 등록, 결제 폼
- **기업용 소프트웨어**: 데이터 입력 시스템, 보고 인터페이스, 워크플로우 앱
- **콘텐츠 관리**: 게시 플랫폼, 사용자 생성 콘텐츠, 관리 인터페이스
- **금융 애플리케이션**: 뱅킹 인터페이스, 투자 플랫폼, 거래 시스템
- **의료 시스템**: 환자 포털, 예약 일정, 의료 기록 폼
- **교육 플랫폼**: 강좌 등록, 평가 도구, 학습 관리
**전문 기술 향상**: 이제 다음이 가능합니다:
- **모든 사용자, 장애인 포함, 접근 가능한 폼 설계**
- **데이터 훼손 및 보안 취약점을 막는 안전한 폼 유효성 검사 구현**
- **명확한 피드백과 안내를 제공하는 반응형 사용자 인터페이스 제작**
- **브라우저 개발자 도구 및 네트워크 분석을 사용해 복잡한 폼 상호작용 디버그**
- **효율적인 데이터 처리 및 유효성 검사 전략을 통해 폼 성능 최적화**
**프론트엔드 개발 개념 숙달**:
- **이벤트 기반 아키텍처**: 사용자 상호작용 처리 및 응답 시스템
- **비동기 프로그래밍**: 논블로킹 서버 통신 및 오류 처리
- **데이터 유효성 검사**: 클라이언트 및 서버 측 보안 및 무결성 검사
- **사용자 경험 디자인**: 사용자가 성공으로 이끄는 직관적 인터페이스
- **접근성 공학**: 다양한 사용자 필요에 맞는 포괄적 설계
**다음 단계**: 고급 폼 라이브러리를 탐색하거나, 복잡한 유효성 검사 규칙을 구현하거나, 기업용 데이터 수집 시스템 구축에 도전하세요!
🌟 **획득한 성과**: 전문가 수준 유효성 검사, 오류 처리, 사용자 경험 패턴이 포함된 완전한 폼 처리 시스템을 구축했습니다!
---
---
## GitHub Copilot Agent Challenge 🚀
에이전트 모드를 사용하여 다음 도전을 완료하세요:
**설명:** 등록 폼을 포괄적인 클라이언트 측 유효성 검사와 사용자 피드백으로 향상하세요. 이번 도전은 폼 유효성 검사, 오류 처리, 상호작용 피드백으로 사용자 경험 개선을 실습할 기회를 제공합니다.
**프롬프트:** 등록 양식을 위한 완전한 폼 유효성 검사 시스템을 만드세요. 다음을 포함합니다: 1) 사용자가 입력할 때 각 필드에 대한 실시간 유효성 검사 피드백, 2) 각 입력 필드 아래에 표시되는 사용자 정의 유효성 검사 메시지, 3) 비밀번호 확인 필드 및 일치 유효성 검사, 4) 시각적 표시기(유효한 필드에는 초록색 체크 표시, 유효하지 않은 필드에는 빨간 경고 표시 등), 5) 모든 유효성 검사가 통과되었을 때만 활성화되는 제출 버튼. HTML5 유효성 검사 속성, 유효성 검사 상태 스타일링을 위한 CSS, 상호 작용 동작을 위한 JavaScript를 사용하세요.
[agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode)에 대해 자세히 알아보세요.
## 🚀 챌린지
사용자가 이미 존재하는 경우 HTML에 오류 메시지를 표시하세요.
약간의 스타일링 후 최종 로그인 페이지가 어떻게 보일 수 있는지에 대한 예시는 다음과 같습니다:

## 강의 후 퀴즈
[강의 후 퀴즈](https://ff-quizzes.netlify.app/web/quiz/44)
## 리뷰 및 자기 주도 학습
개발자들은 특히 유효성 검사 전략과 관련하여 폼 제작에 매우 창의적이 되었습니다. [CodePen](https://codepen.com)을 살펴보며 다양한 폼 흐름을 배워보세요; 흥미롭고 영감을 주는 폼을 찾을 수 있나요?
## 과제
[당신의 은행 앱 스타일링하기](assignment.md)
---
**면책 조항**:
이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 저희는 정확성을 위해 최선을 다하고 있으나, 자동 번역에는 오류나 부정확성이 있을 수 있음을 양지해 주시기 바랍니다. 원문은 해당 문서가 작성된 원어가 권위 있는 출처로 간주되어야 합니다. 중요한 정보의 경우 전문적인 인간 번역을 권장합니다. 본 번역 사용으로 인한 오해나 잘못된 해석에 대해 당사는 책임지지 않습니다.