HTMLHTML 입문 · 9기초

HTML만으로 만드는 학급 설문 폼 실습

HTMLform실습유효성검사required

이번 편은 실습 위주입니다

6편에서 폼의 기초를 배웠습니다. 이번 편에서는 실제로 쓸 수 있는 수준의 설문 폼을 처음부터 끝까지 완성합니다. 그 과정에서 입력 유효성 검사 속성도 함께 익힙니다.


입력 유효성 검사 속성들

HTML5부터는 JavaScript 없이도 간단한 입력 검사를 할 수 있습니다.

required — 필수 입력

<input type="text" required />

비워두고 제출 버튼을 누르면 자동으로 "이 필드를 작성하세요" 메시지가 뜹니다.

minlength / maxlength — 글자 수 제한

<!-- 최소 2글자, 최대 20글자 -->
<input type="text" minlength="2" maxlength="20" />

min / max — 숫자 범위

<!-- 1~100 사이 숫자만 -->
<input type="number" min="1" max="100" />

pattern — 정규식 패턴

<!-- 숫자 4자리만 허용 (학번 등) -->
<input type="text" pattern="[0-9]{4}" title="4자리 숫자를 입력하세요" />

placeholder — 힌트 텍스트

<input type="text" placeholder="예) 홍길동" />

실습: 학급 설문 폼 완성하기

아래 완성본 코드를 천천히 읽고, 직접 타이핑해서 만들어 보세요. 복사·붙여넣기보다 직접 치는 게 훨씬 빨리 외워집니다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>학급 설문지</title>
</head>
<body>

  <header>
    <h1>📋 학급 설문지</h1>
    <p>2026학년도 1학기 학급 만족도 조사입니다. 솔직하게 답해 주세요!</p>
  </header>

  <main>
    <form>

      <!-- 1. 기본 정보 -->
      <section>
        <h2>기본 정보</h2>

        <div>
          <label for="name">이름 <span>*</span></label><br />
          <input
            type="text"
            id="name"
            name="name"
            placeholder="홍길동"
            required
            minlength="2"
            maxlength="10"
          />
        </div>

        <br />

        <div>
          <label for="grade">학년</label><br />
          <select id="grade" name="grade" required>
            <option value="">-- 선택하세요 --</option>
            <option value="1">1학년</option>
            <option value="2">2학년</option>
            <option value="3">3학년</option>
          </select>
        </div>

        <br />

        <div>
          <label for="class">반</label><br />
          <input
            type="number"
            id="class"
            name="class"
            min="1"
            max="12"
            placeholder="반 번호"
          />
        </div>
      </section>

      <hr />

      <!-- 2. 학교 생활 -->
      <section>
        <h2>학교 생활</h2>

        <div>
          <p>가장 좋아하는 과목을 모두 선택하세요:</p>
          <label>
            <input type="checkbox" name="subject" value="korean" /> 국어
          </label>
          <label>
            <input type="checkbox" name="subject" value="math" /> 수학
          </label>
          <label>
            <input type="checkbox" name="subject" value="english" /> 영어
          </label>
          <label>
            <input type="checkbox" name="subject" value="science" /> 과학
          </label>
          <label>
            <input type="checkbox" name="subject" value="pe" /> 체육
          </label>
          <label>
            <input type="checkbox" name="subject" value="art" /> 미술
          </label>
        </div>

        <br />

        <div>
          <p>학교 급식 만족도:</p>
          <label>
            <input type="radio" name="lunch" value="5" required /> 매우 만족
          </label>
          <label>
            <input type="radio" name="lunch" value="4" /> 만족
          </label>
          <label>
            <input type="radio" name="lunch" value="3" /> 보통
          </label>
          <label>
            <input type="radio" name="lunch" value="2" /> 불만족
          </label>
          <label>
            <input type="radio" name="lunch" value="1" /> 매우 불만족
          </label>
        </div>

        <br />

        <div>
          <label for="activity">가장 즐거운 학교 활동:</label><br />
          <select id="activity" name="activity">
            <option value="">-- 선택하세요 --</option>
            <option value="sports">체육 대회</option>
            <option value="festival">축제</option>
            <option value="field-trip">현장 학습</option>
            <option value="club">동아리 활동</option>
            <option value="other">기타</option>
          </select>
        </div>
      </section>

      <hr />

      <!-- 3. 의견 -->
      <section>
        <h2>의견</h2>

        <div>
          <label for="suggestion">학교에 바라는 점:</label><br />
          <textarea
            id="suggestion"
            name="suggestion"
            rows="5"
            cols="50"
            placeholder="자유롭게 적어 주세요. (선택 사항)"
            maxlength="500"
          ></textarea>
        </div>

        <br />

        <div>
          <label>
            <input type="checkbox" name="agree" required />
            이 설문은 학급 개선을 위해서만 사용됩니다. 동의합니다.
          </label>
        </div>
      </section>

      <hr />

      <!-- 제출 버튼 -->
      <div>
        <button type="submit">제출하기</button>
        <button type="reset">다시 작성</button>
      </div>

    </form>
  </main>

  <footer>
    <p>© 2026 1학년 1반 | 설문 관련 문의: 담임 선생님께 문의하세요.</p>
  </footer>

</body>
</html>

코드를 완성한 뒤 확인할 것들

  1. 이름 필드를 비우고 제출 → 오류 메시지가 뜨나요?
  2. 반 번호에 100을 입력 → 최대값 초과 경고가 뜨나요?
  3. 동의 체크박스를 체크하지 않고 제출 → 막히나요?
  4. 다시 작성 버튼 → 모든 입력이 초기화되나요?

개선 아이디어

이 폼을 더 좋게 만들려면 무엇이 필요할까요?

  • 지금은 디자인이 없어서 투박합니다. 다음 시리즈(CSS)를 배우면 예쁘게 꾸밀 수 있습니다.
  • 제출 버튼을 눌러도 실제로 데이터가 전송되지 않습니다. 서버 연결은 백엔드 영역으로, 나중에 배우게 됩니다.
  • 유효성 검사 메시지가 영어로 나옵니다. JavaScript를 배우면 한국어 메시지로 바꿀 수 있습니다.

직접 해보기 ✏️

위 설문지를 완성한 뒤, "우리 학교 급식 메뉴 투표" 폼을 새로 만들어 보세요.

포함할 내용:

  • 이름 (필수)
  • 가장 좋아하는 급식 메뉴 (라디오: 본인이 생각하는 메뉴 5개)
  • 가장 싫어하는 급식 메뉴 (라디오)
  • 추가됐으면 하는 메뉴 (텍스트 입력)
  • 제출 버튼

정리

이번 편에서 배운 유효성 검사 속성:

속성역할
required필수 입력
minlength / maxlength텍스트 글자 수 제한
min / max숫자 범위 제한
pattern정규식 패턴 검사

다음 편(마지막 HTML 편!)에서는 지금까지 배운 HTML을 모두 활용해 나만의 소개 웹페이지를 완성합니다.

궁금한 점이 있으신가요?

협업·의뢰는 아래로, 가벼운 소통은 인스타그램 @bluefox._.hi도 환영이에요.