
💡 1분 핵심 요약 (TL;DR)
- ✅ <input> 속성 — autofocus(커서 표시), placeholder(힌트), readonly(읽기 전용), required(필수 입력)
- ✅ 숫자·길이 제한 — min·max·step(숫자 범위와 간격), size·minlength·maxlength(글자 수)
- ✅ 드롭다운 목록 — <select> 안에 <option>, 그룹은 <optgroup label>
- ✅ <textarea> — 여러 줄 입력 영역, cols(너비)·rows(줄 수)
- ✅ <button> — type은 submit(기본값)·reset·button
- ✅ <output> · <progress> · <meter> — 계산 결과 / 진행 상태 / 전체 중 차지하는 크기
📚 부산디지털대학교 '웹프로그래밍' 7주차 강의노트를 바탕으로 정리한 학습 노트입니다. (출처는 글 하단 참고)
01 <input>의 입력 도우미 속성 4가지
autofocus · placeholder · readonly · required
<input> 태그에 속성 몇 개만 더하면 커서 위치, 힌트, 읽기 전용, 필수 입력까지 폼을 세밀하게 조정할 수 있습니다.
| 속성 | 하는 일 | 쓰는 법 |
| autofocus | 페이지를 불러오자마자 원하는 폼 요소에 입력 커서를 표시 | <input autofocus> |
| placeholder | 입력란에 힌트를 흐리게 표시했다가, 입력을 시작하면 사라지게 함 | placeholder="힌트" |
| readonly | 내용을 보여 주기만 하고 입력은 못 하게 하는 읽기 전용 필드. 속성 값 없이 readonly만 씀 | <input readonly> |
| required | 반드시 입력해야 하는 필수 필드로 지정해 내용이 채워졌는지 검사 | required 또는 required="required" |
강의노트는 placeholder를 "텍스트 필드 앞에 제목을 사용하지 않고도 사용자에게 어떤 내용을 입력해야 할지 알려 줄 수 있어 편리한 기능"으로 설명합니다.
📖 보충 — placeholder가 label을 대신할 수는 없다
placeholder는 입력을 시작하면 사라지고, 화면 낭독기도 기본적으로 placeholder를 읽어 주지 않습니다. 그래서 MDN은 "placeholder를 <label> 대신 쓰면 사용성과 접근성을 해친다"고 안내합니다. 칸의 이름은 <label>로 붙이고, placeholder에는 입력 예시(예: 010-1234-5678)만 넣는 것이 권장 방식입니다.
(근거: MDN Web Docs, placeholder 속성 문서)
required는 불린 값(boolean value) 속성이라 이름만 적으면 켜집니다. 필수 필드는 브라우저가 직접 검사하므로 오류 메시지 문구는 브라우저마다 다릅니다.
입력 도우미 속성 4가지
<form>
<label for="uid">아이디</label>
<input type="text" id="uid" autofocus required placeholder="영문 4~12자"><br>
<label for="mail">이메일</label>
<input type="email" id="mail" required placeholder="name@example.com"><br>
<label for="code">가입 코드</label>
<input type="text" id="code" value="BDU-2026" readonly><br>
<input type="submit" value="가입하기">
</form>
🌐 브라우저 화면 | 아이디를 비운 채 [가입하기]를 누른 경우
아이디 영문 4~12자⚠️ 이 입력란을 작성하세요.
이메일 name@example.com
가입 코드 BDU-2026
가입하기
※ 페이지가 열리면 아이디 칸에 바로 커서가 있음(autofocus). 비어 있는 required 칸은 전송되지 않고 말풍선 경고가 뜸(문구는 크롬 기준). 가입 코드는 선택은 되지만 고칠 수 없음

❌ 시험 함정
"페이지를 불러오자마자 원하는 요소에 마우스 커서를 표시하는 속성은?" → autofocus. placeholder(힌트), readonly(읽기 전용), required(필수)와 구별하세요.
📖 심화 — readonly와 disabled의 차이
둘 다 사용자가 값을 고칠 수 없지만 결정적인 차이가 있습니다.
· readonly : 포커스를 받을 수 있고 컨트롤로 정상 동작합니다. 폼을 전송하면 들어 있던 값도 함께 서버로 전송됩니다. (예: 가입 코드, 학기 정보)
· disabled : 포커스를 받을 수 없고, 폼을 전송해도 그 값은 서버로 전송되지 않습니다. 화면에서도 흐리게 비활성 상태로 보입니다.
서버에 꼭 보내야 하는 고정값이라면 disabled가 아니라 readonly를 써야 합니다.
(근거: MDN Web Docs, readonly 속성 문서 — Attribute interactions)
02 min · max · step 속성
숫자의 범위와 간격 정하기
| 속성 | 설명 |
| min | 입력할 수 있는 최솟값 |
| max | 입력할 수 있는 최댓값 |
| step | 허용 범위 안에서 숫자가 움직이는 일정한 간격 |
한 가지만 써도 되고, min과 max를 함께 써서 입력 범위를 제한할 수도 있습니다. 강의노트에 따르면 세 속성은 <input>의 type이 date, datetime, datetime-local, month, week, time, range, number일 때만 사용합니다.
📖 보충 — datetime은 폐지된 type
위 목록의 datetime은 HTML 표준에서 폐지된(Obsolete) 값이라 브라우저가 지원하지 않고 일반 텍스트 칸으로 보여 줍니다. 날짜와 시간을 함께 받을 때는 datetime-local을 쓰세요. 시험은 강의노트 목록 그대로 답하면 됩니다.
(근거: MDN Web Docs, <input> 요소 — Obsolete values)
min, max, step 사용하기
<label for="qty">수량</label>
<input type="number" id="qty" min="1" max="10" step="1" value="1"><br>
<label for="score">점수</label>
<input type="number" id="score" min="0" max="100" step="10" value="50"><br>
<label for="day">예약일</label>
<input type="date" id="day" min="2026-11-01" max="2026-11-30">
🌐 브라우저 화면
수량 1 ▲▼
점수 50 ▲▼
예약일 연도-월-일 📅
※ 점수 칸에서 ▲를 누르면 50 → 60 → 70처럼 10씩 바뀌고 100에서 멈춤. 예약일 달력에서는 11월 1일~30일만 고를 수 있음

✓ step 계산 요령
step은 min(없으면 0)을 기준으로 간격을 셉니다. min="0" step="10"이면 0, 10, 20 …만 올바른 값이고, 키보드로 55를 입력하고 전송하면 "가장 가까운 유효한 값은 50과 60입니다" 같은 경고가 뜹니다.
03 size · minlength · maxlength 속성
글자 수 다루기
min·max·step이 숫자의 조건이라면, size·minlength·maxlength는 텍스트 길이의 조건입니다.
| 속성 | 설명 |
| size | 텍스트·비밀번호·검색 필드처럼 한 줄 입력 칸이 화면에 몇 글자 너비로 보일지 지정 (입력 제한 아님) |
| minlength | 최소 몇 글자 이상 입력해야 하는지 |
| maxlength | 최대 몇 글자까지 입력할 수 있는지 — 넘는 글자는 아예 입력되지 않음 |
강의노트에는 "minlength 속성은 크롬 브라우저와 안드로이드 브라우저에서만 지원"이라고 적혀 있습니다.
📖 보충 — 지금은 주요 브라우저가 모두 지원
이 설명은 예전 기준입니다. 현재 minlength는 크롬 40, 엣지 17, 파이어폭스 51, 사파리 10.1 이후 버전에서 모두 지원되며, 전 세계 사용 브라우저의 약 97%가 지원합니다. 다만 minlength는 값을 입력했을 때만 검사하므로, 빈칸을 막으려면 required를 함께 써야 합니다.
(근거: Can I use, minlength attribute for input fields / MDN Web Docs, minlength 속성 문서)
size, minlength, maxlength
<label for="pw">비밀번호</label>
<input type="password" id="pw" size="10" minlength="8" maxlength="16" required><br>
<label for="nick">닉네임</label>
<input type="text" id="nick" size="30" maxlength="10">
🌐 브라우저 화면 | 비밀번호에 5글자만 넣고 전송한 경우
비밀번호 ●●●●●⚠️ 8자 이상으로 입력하세요(현재 5자).
닉네임
※ size가 클수록 칸이 넓게 보임(10 vs 30). 닉네임은 11번째 글자부터 입력되지 않음. 경고 문구는 브라우저마다 다름

⚠️ size와 maxlength를 헷갈리지 말 것
size는 칸의 보이는 너비일 뿐, 그보다 긴 글자도 입력됩니다. 입력 글자 수를 막는 것은 maxlength입니다. 요즘은 칸 너비를 CSS(width)로 정하는 경우가 많습니다.
04 <select> · <option> · <optgroup> — 드롭다운 목록
공간은 적게, 선택지는 많이
드롭다운 목록은 <select>로 시작과 끝을 표시하고, 그 안에 <option>으로 항목을 넣어 만듭니다. 기본적으로 한 가지 옵션만 보이고, 화살표를 눌러 나머지를 살펴본 뒤 하나를 고릅니다.
| 태그·속성 | 역할 |
| <select> | 드롭다운 목록의 시작과 끝 |
| <option> | 목록 안의 각 항목 (value 속성 = 서버로 보낼 값) |
| <optgroup label> | 항목들을 몇 개의 그룹으로 묶고, label 속성으로 그룹 제목을 붙임 |
| size (select 속성) | 한 번에 보이는 항목 수 — 2 이상이면 펼쳐진 목록 상자로 보임 |
| multiple (select 속성) | 여러 항목을 동시에 선택 가능 (Ctrl·Shift + 클릭) |
| selected (option 속성) | 처음부터 선택되어 있는 항목 |
드롭다운 목록과 optgroup
<label for="major">관심 분야</label>
<select id="major" name="major">
<optgroup label="프로그래밍">
<option value="web" selected>웹프로그래밍</option>
<option value="python">파이썬</option>
</optgroup>
<optgroup label="디자인">
<option value="ui">UI 디자인</option>
<option value="photo">사진 편집</option>
</optgroup>
</select>
🌐 브라우저 화면 | 목록을 펼친 모습
관심 분야 웹프로그래밍▾
프로그래밍
웹프로그래밍
파이썬
디자인
UI 디자인
사진 편집
※ optgroup 제목(프로그래밍, 디자인)은 굵게 보이고 선택할 수 없음. selected를 준 웹프로그래밍이 처음 선택값

size와 multiple
<select name="days" size="4" multiple>
<option>월요일</option>
<option>화요일</option>
<option>수요일</option>
<option>목요일</option>
<option>금요일</option>
</select>
🌐 브라우저 화면 | 화·목요일을 Ctrl+클릭으로 고른 경우
월요일
화요일
수요일
목요일
※ size="4"라 4줄짜리 목록 상자로 펼쳐져 보이고(금요일은 스크롤), multiple이라 여러 개 선택 가능
❌ 시험 함정
"클릭했을 때 옵션들이 요소 아래쪽으로 펼쳐지는 것은?" → 드롭다운 목록. 공간을 최소한으로 쓰면서 여러 옵션을 보여 줄 때 가장 알맞습니다.
05 <textarea> — 여러 줄 입력 영역
고르는 대신 길게 쓰는 칸
항목을 고르는 것이 아니라 여러 줄의 문장을 직접 입력받을 때는 <textarea>를 씁니다. 이 영역을 텍스트 영역(textarea)이라고 하며, 회원 가입 양식의 이용 약관이나 문의 내용 칸에 주로 쓰입니다.
| 속성 | 설명 |
| cols | 너비 — 한 줄에 몇 글자 정도 보일지 |
| rows | 높이 — 화면에 몇 줄을 보일지 |
textarea로 약관과 문의 칸 만들기
<label for="terms">이용 약관</label><br>
<textarea id="terms" cols="40" rows="3" readonly>
제1조 이 약관은 웹프로그래밍 실습 사이트 이용에 관한 사항을 정합니다.
</textarea><br>
<label for="memo">문의 내용</label><br>
<textarea id="memo" cols="40" rows="4" placeholder="궁금한 점을 적어 주세요"></textarea>
🌐 브라우저 화면
이용 약관
제1조 이 약관은 웹프로그래밍 실습 사이트 이용에 관한 사항을 정합니다.
문의 내용
궁금한 점을 적어 주세요
※ 오른쪽 아래 모서리를 끌면 크기를 바꿀 수 있음. 약관은 readonly라 읽기만 가능

⚠️ textarea는 닫는 태그가 있다
<input>과 달리 <textarea>는 </textarea>로 닫아야 하고, 처음 들어갈 내용은 value 속성이 아니라 두 태그 사이에 적습니다. 태그 사이의 공백과 줄바꿈도 그대로 표시되니 주의하세요.
❌ 시험 함정
"선택이 아니라 직접 여러 줄의 텍스트를 입력하는 영역을 만드는 태그는?" → <textarea>. <option>, <select>, <datalist>는 고르는 목록용입니다.
06 <button> 태그 — 버튼 넣기
input 버튼과 비슷하지만 더 자유롭게
강의노트의 소제목 "<bouuon>(→ <button>) 태그 – 버튼 넣기"처럼, <button>은 <input>의 버튼과 비슷하게 폼을 전송하거나 리셋하는 버튼을 넣습니다.
| type 값 | 동작 |
| submit | 폼을 서버로 전송 — type을 지정하지 않으면 기본값 |
| reset | 폼에 입력한 모든 내용을 초기화 |
| button | 버튼 모양만 만들고 자체 기능은 없음 (자바스크립트와 함께 사용) |
button 태그 세 가지
<form>
<label for="q">검색어</label> <input type="text" id="q">
<button type="submit">검색</button>
<button type="reset">지우기</button>
<button type="button">도움말</button>
</form>
🌐 브라우저 화면
검색어 검색 지우기 도움말
※ 검색은 폼 전송, 지우기는 입력값 초기화, 도움말은 눌러도 아무 일도 일어나지 않음
| <input type="submit"> · 닫는 태그 없음 · 버튼 글자는 value 속성 · 글자만 넣을 수 있음 |
<button> · </button>으로 닫음 · 버튼 글자는 두 태그 사이 · 사이에 <img>·<b> 등을 넣어 꾸밀 수 있음 |

❌ 시험 함정
"<button> 태그의 type 값이 아닌 것은?" → text. type은 submit·reset·button 세 가지이고, 지정하지 않으면 submit으로 간주됩니다. 폼 안의 <button>이 의도치 않게 폼을 전송한다면 type="button"을 빠뜨린 경우입니다.
07 <output> 태그 — 계산 결과
이 값은 계산 결과입니다
<output>은 그 안의 값이 일반 텍스트가 아니라 계산 결과라는 것을 브라우저에 알려 주는 태그입니다. 계산 자체는 보통 자바스크립트가 하고, <output>은 결과를 담는 자리 역할을 합니다.
두 수를 더해 output에 표시
<form oninput="result.value = Number(a.value) + Number(b.value)">
<input type="number" id="a" name="a" value="10"> +
<input type="number" id="b" name="b" value="20"> =
<output name="result" for="a b">30</output>
</form>
🌐 브라우저 화면 | 두 번째 칸을 25로 바꾼 경우
10 + 25 = 35
※ 숫자를 바꿀 때마다(oninput) 오른쪽 결과가 바로 다시 계산됨. for 속성은 어떤 입력값으로 계산했는지 id로 알려 주고, 스크립트의 a.value·b.value는 폼 안의 name으로 요소를 찾음
✓ 왜 그냥 <span>을 쓰지 않을까
<span>에 숫자를 넣어도 화면은 같지만, <output>을 쓰면 브라우저와 화면 낭독기가 "이 부분은 계산 결과"라고 이해합니다. 의미에 맞는 태그를 쓰는 것이 웹 표준의 기본입니다.
08 <progress> · <meter> — 막대로 보여 주기
진행 상황인가, 차지하는 비율인가
| <progress> — 진행 상태 · 작업이 얼마나 진행되었는지 · 시작 0 → 완료 max · 단위가 없고 표시하지도 않음 · 예: 파일 다운로드, 설치 진행률 |
<meter> — 차지하는 크기 · 전체 중 얼마나 차지하는지 · 진행의 의미가 없음 · 예: 하드 디스크 사용량, 투표율 · 범위에 따라 색이 바뀜 |
| 태그 | 속성 | 설명 |
| <progress> | value | 작업 진행 상태 (부동 소수점 숫자) |
| max | 완료까지 필요한 전체 작업량 | |
| <meter> | min, max | 범위의 최솟값, 최댓값 |
| value | 범위 안에서 차지하는 값 | |
| low, high | "이 정도면 낮다", "이 정도면 높다"의 기준값 | |
| optimum | "이 정도면 적당하다"고 할 값 |
progress와 meter 비교
다운로드 <progress value="70" max="100"></progress><br>
디스크 사용량 <meter min="0" max="100" value="45" low="60" high="85"></meter> 45%<br>
디스크 사용량 <meter min="0" max="100" value="92" low="60" high="85"></meter> 92%<br>
투표율 <meter value="0.63">63%</meter>
🌐 브라우저 화면
다운로드
디스크 사용량 45%
디스크 사용량 92%
투표율
※ progress는 진행 막대(파랑). meter는 optimum을 생략하면 가운데 값(50)이 '적당한 값'이 되어, 45처럼 low보다 낮으면 초록, 60~85 사이면 노랑, 92처럼 high를 넘으면 빨강으로 표시됨(크롬 기준). meter의 max를 생략하면 0~1 범위

❌ 시험 함정
"진행 상태를 보여 줄 때 쓰는 태그는?" → <progress>. 화면은 <meter>와 거의 같아 헷갈리기 쉽지만, meter는 진행이 아니라 전체 중 차지하는 크기(사용량·투표율)입니다.
09 종합 실습 — 수강 신청서
이번에 배운 속성과 태그를 한 번에
apply.html — 수강 신청서
<form action="apply.php" method="post">
<fieldset>
<legend>수강 신청</legend>
<label for="name">이름</label>
<input type="text" id="name" name="user_name" autofocus required maxlength="10"><br>
<label for="sid">학번</label>
<input type="text" id="sid" name="sid" required minlength="8" maxlength="8" placeholder="예: 20260001"><br>
<label for="term">학기</label>
<input type="text" id="term" name="term" value="2026-2학기" readonly><br>
<label for="course">과목</label>
<select id="course" name="course">
<optgroup label="전공">
<option value="web">웹프로그래밍</option>
<option value="db">데이터베이스</option>
</optgroup>
<optgroup label="교양">
<option value="writing">글쓰기</option>
</optgroup>
</select><br>
<label for="hours">주당 공부 시간</label>
<input type="number" id="hours" name="hours" min="1" max="20" step="1" value="5"><br>
<label for="why">신청 이유</label><br>
<textarea id="why" name="why" cols="40" rows="3"></textarea><br>
작성 진행률 <progress value="3" max="6"></progress>
</fieldset>
<button type="submit">신청</button>
<button type="reset">다시 쓰기</button>
</form>
🌐 브라우저 화면
수강 신청
이름
학번 예: 20260001
학기 2026-2학기
과목 웹프로그래밍▾
주당 공부 시간 5 ▲▼
신청 이유
작성 진행률
신청 다시 쓰기
※ 이름 칸에 커서가 있고, 이름·학번을 비우거나 학번이 8자가 아니면 전송되지 않음

| 사용한 기능 | 어디에 |
| autofocus · required · maxlength | 이름 |
| required · minlength · maxlength · placeholder | 학번 (정확히 8자리) |
| readonly | 학기 (고칠 수 없는 안내 값) |
| select · optgroup · option value | 과목 (value가 서버로 가는 값) |
| number + min · max · step | 주당 공부 시간 |
| textarea | 신청 이유 |
| progress | 작성 진행률 |
| button type="submit"·"reset" | 신청 · 다시 쓰기 |
| name | 모든 입력 요소 — 서버(apply.php)로 값을 보낼 때 붙는 이름표 |
⚠️ name이 없으면 값이 전송되지 않는다
6주차 글에서 정리했듯이 서버는 user_name=홍길동&sid=20260001처럼 name=값 쌍으로 데이터를 받습니다. id만 있고 name이 없는 입력 요소의 값은 폼을 전송해도 서버로 가지 않으므로, 실제로 보낼 요소에는 반드시 name을 붙입니다. id는 label의 for와 연결용, name은 서버 전송용입니다.
10 핵심 정리
시험 직전에 이것만은 꼭
📌 핵심 정리
· autofocus : 페이지를 열자마자 그 요소에 커서 표시
· placeholder : 입력란의 힌트, 입력하면 사라짐. label을 대신하지는 못함(입력 예시용)
· readonly : 읽기 전용, 값 없이 readonly만. 값은 서버로 전송됨(disabled는 전송 안 되고 포커스도 안 됨)
· required : 필수 필드, 불린 값이라 required 또는 required="required", 오류 문구는 브라우저마다 다름
· min · max · step : 최솟값·최댓값·간격. date·datetime-local·month·week·time·range·number에서 사용(datetime은 폐지)
· size 보이는 너비 / minlength 최소 글자 수 / maxlength 최대 글자 수. minlength는 현재 주요 브라우저 모두 지원
· <select> 드롭다운 목록 + <option value> 항목(value가 전송값, 생략하면 표시 글자가 전송됨) + <optgroup label> 그룹. select의 size·multiple로 크기·다중 선택
· <textarea> : 여러 줄 입력, cols(너비)·rows(줄 수), 닫는 태그 있음
· <button> : type = submit(기본값)·reset·button. text는 type 값이 아님
· <output> : 계산 결과임을 브라우저에 알림
· name : 서버로 값을 보내려면 모든 입력 요소에 필수(id는 label 연결용)
· <progress> 진행 상태(value·max) vs <meter> 전체 중 차지하는 크기(min·max·value·low·high·optimum)
태그 : input 태그 속성 정리placeholder required 속성readonly autofocus 속성min max step 속성minlength maxlength 차이select option optgroupHTML 드롭다운 목록 만들기textarea cols rowsbutton 태그 type 속성progress meter 차이
출처 : 이 글은 부산디지털대학교(BDU)의 '웹프로그래밍' 과목 2026년도 강의노트와 교재 『Do it! HTML+CSS 웹 표준의 정석』(고경희 저, 이지스퍼블리싱, 2025)과 아래 자료를 참고하여 학습용으로 작성한 글입니다.
보충 자료 (📖 보충 박스의 근거)
· placeholder와 label의 관계 : MDN Web Docs, HTML attribute: placeholder
· readonly와 disabled의 차이 : MDN Web Docs, HTML attribute: readonly
· datetime type 폐지 : MDN Web Docs, <input>: The HTML Input element
· minlength 브라우저 지원 : Can I use, minlength attribute for input fields
· minlength 동작 방식 : MDN Web Docs, HTML attribute: minlength
'학과 수업 노트 > 웹프로그래밍' 카테고리의 다른 글
| 6. 폼 관련 태그들 I - 폼 태그, 레이블 태그, 사용자 입력(input) 태그 (0) | 2026.10.07 |
|---|---|
| 5. 링크 만들기 - 링크 태그, 앵커 만들기, 이미지 맵 지정 (0) | 2026.09.30 |
| 4. 이미지 태그 - 웹 이미지 형식, 이미지 경로, 크기 조정 (0) | 2026.09.30 |
| 3. 테이블 태그 - 기본적인 표 만들기, 표 구조 정의 (0) | 2026.09.30 |
| 2. 텍스트 관련 태그들 - 텍스트 태그, 목록을 만드는 태그 (0) | 2026.09.30 |



