HTML5의 사용자와 상호작용하기 위한 - Forms 요소

박영광·2024년 6월 4일

HTML/CSS/JS/SASS

목록 보기
9/10

웹 페이지에서 사용자로부터 입력을 받고 서버에 데이터를 전송하는 것은 매우 중요한 기능입니다. HTML5에서는 이를 위해 다양한 폼 요소를 제공하고 있습니다. 이번 포스팅에서는 <form>, <input>, <select>, <textarea>, <button> 등의 태그를 중심으로 폼 요소의 사용 방법에 대해 자세히 알아보겠습니다.

1. 폼 태그: <form>

<form> 태그는 사용자가 입력한 데이터를 수집하기 위한 컨테이너 역할을 합니다. <form> 내부에는 다양한 입력 양식 태그들이 포함될 수 있습니다.

<form action="/submit" method="post">
  <!-- 다양한 입력 양식 태그들 -->
</form>
  • action 속성: 폼 데이터를 전송할 서버 측 URL을 지정합니다.

  • method 속성: 폼 데이터의 전달 방식을 지정합니다. get(기본값)과 post 중 선택할 수 있습니다.

1.1 GET 방식과 POST 방식

폼 데이터를 서버에 전달하는 방식에는 GET 방식과 POST 방식이 있습니다.

GET 방식

폼 데이터를 URL의 쿼리 문자열로 전달합니다. 데이터가 URL에 노출되므로 보안에 취약하고, 전송할 수 있는 데이터의 길이에 제한이 있습니다.

  • GET 방식은 요청 URL에 쿼리 문자열(query string) 형태로 데이터를 전달하는 방식입니다.

  • 전송 URL 뒤에 '?'를 붙이고, 'key=value' 형식으로 데이터를 추가합니다. 여러 개의 데이터는 '&'로 구분합니다.

http://example.com/api/users?id=1&name=John
  • URL에 데이터가 노출되므로 보안에 취약하며, 전송할 수 있는 데이터의 길이에 제한(최대 255자)이 있습니다.

  • 브라우저 캐싱이 가능하므로, GET 요청은 브라우저에 의해 캐싱될 수 있습니다.

  • REST API에서 GET 메서드는 리소스 조회에 사용됩니다.

POST 방식

폼 데이터를 HTTP 요청의 본문에 포함하여 전달합니다. 데이터가 URL에 노출되지 않아 GET에 비해 보안성이 높지만, 속도는 느립니다.

  • POST 방식은 HTTP 요청의 본문(body)에 데이터를 담아 전송하는 방식입니다.

  • URL에 데이터가 노출되지 않아 GET에 비해 보안성이 높습니다.

  • 데이터 길이에 제한이 없으며, 대용량 데이터를 전송할 수 있습니다.

  • GET과 달리 브라우저 캐싱이 되지 않습니다.

  • REST API에서 POST 메서드는 새로운 리소스 생성에 사용됩니다.


일반적으로 GET은 데이터 조회, POST는 데이터 생성이나 수정에 사용되지만, 보안이 중요한 데이터는 POST로 전송하는 것이 좋습니다. 또한 대용량 데이터는 POST로 전송해야 합니다.

추가 개념 - HTTP 프로토콜

HTTP(HyperText Transfer Protocol)는 웹에서 데이터를 교환하기 위한 주요 프로토콜입니다.
HTTP는 클라이언트-서버 모델을 기반으로 하며, 무상태(stateless) 프로토콜입니다.

  • HTTP 메시지는 헤더(header)와 본문(body)으로 구성됩니다.

  • HTTP 메서드(GET, POST, PUT, DELETE 등)는 서버에 대한 작업을 나타냅니다.

  • HTTP 상태 코드(status code)는 요청에 대한 서버의 응답 결과를 나타냅니다. (예: 200 OK, 404 Not Found)

  • HTTP/1.1에서는 지속 연결(persistent connection)과 가상 호스팅(virtual hosting)을 지원합니다.

  • HTTP는 캐싱과 프록시 서버를 통해 성능 향상과 대역폭 절약을 실현합니다.

2. 입력 태그: <input>

<input> 태그는 사용자로부터 데이터를 입력받기 위한 가장 기본적인 태그입니다. type 속성을 통해 다양한 종류의 입력 양식을 만들 수 있습니다.

<input type="text" name="username" placeholder="사용자명을 입력하세요">
  • type 속성: 입력 양식의 종류를 지정합니다. 텍스트, 비밀번호, 체크박스, 라디오 버튼, 파일 선택 등 다양한 값을 사용할 수 있습니다.

  • name 속성: 서버에 전송될 데이터의 키(key)를 지정합니다.

  • value 속성: 입력 양식의 초기값을 지정합니다.


type 어트리뷰트값 Description HTML5 호환 IE FF CR SF OP
button 버튼 생성 ◯ ◯ ◯ ◯ ◯
checkbox checkbox 생성 ◯ ◯ ◯ ◯ ◯
color 컬러 선택 생성 ◯ ❌ ◯ ◯ ❌ ◯
date date control (년월일) 생성 ◯ ❌ ❌ ◯ ◯ ◯
datetime date & time control (년월일시분초) 생성 HTML spec에서 drop되었다. ◯ ❌ ❌ ❌ ❌ ❌
datetime-local 지역 date & time control (년월일시분초) 생성 ◯ ❌ ❌ ◯ ◯ ◯
email 이메일 입력 form 생성 subumit 시 자동 검증된다. ◯ ◯(10+) ◯ ◯ ❌ ◯
file 파일 선택 form 생성 ◯ ◯ ◯ ◯ ◯ ◯
hidden 감춰진 입력 form 생성 ◯ ◯ ◯ ◯ ◯ ◯
image 이미지 틀 submit button 생성 ◯ ◯ ◯ ◯ ◯ ◯
month 월 선택 form 생성 ◯ ❌ ❌ ◯ ◯ ◯
number 숫자 입력 form 생성 ◯ ◯(10+) ◯ ◯ ◯ ◯
password password 입력 form 생성 ◯ ◯ ◯ ◯ ◯ ◯
radio radio button 생성 ◯ ◯ ◯ ◯ ◯ ◯
range 범위 선택 form 생성 ◯ ◯(10+) ◯ ◯ ◯ ◯
reset 초기화 button 생성 ◯ ◯ ◯ ◯ ◯ ◯
search 검색어 입력 form 생성 ◯ ❌ ❌ ◯ ◯ ❌
submit 제출 button 생성 ◯ ◯ ◯ ◯ ◯ ◯
tel 전화번호 입력 form 생성 ◯ ❌ ❌ ❌ ❌ ❌
text 텍스트 입력 form 생성 ◯ ◯ ◯ ◯ ◯ ◯
time 시간 선택 form 생성 ◯ ❌ ❌ ◯ ◯ ◯
url url 입력 form 생성 ◯ ◯(10+) ◯ ◯ ❌ ◯
week 주 선택 입력 form 생성 ◯ ❌ ❌ ◯ ◯ ◯

2.1 HTML5에서 추가된 입력 타입

HTML5에서는 기존 입력 타입 외에도 다양한 새로운 타입들이 추가되었습니다. 이를 통해 좀 더 세밀한 입력값 검증과 사용자 경험 향상이 가능해졌습니다.

  • color: 색상 선택기
  • date, month, week, time: 날짜/시간 선택기
  • number, range: 숫자 입력 및 범위 선택
  • email, tel, url: 이메일, 전화번호, URL 입력 (제출 시 자동 검증)
<input type="color" name="theme">
<input type="date" name="birthday">
<input type="number" name="quantity" min="1" max="10" step="1">

다만, 일부 오래된 브라우저에서는 이러한 새로운 타입들을 지원하지 않을 수 있습니다. 이럴 경우 자바스크립트를 사용하여 폴리필(polyfill)을 구현하거나, 다른 방식으로 대체해야 합니다.

2.2 입력 요소의 유효성 검사

HTML5에서는 입력 요소의 유효성을 검사하기 위한 다양한 속성들도 추가되었습니다. 이를 통해 클라이언트 측에서 기본적인 유효성 검사를 수행할 수 있습니다.

  • required: 필수 입력 필드를 지정합니다.
  • pattern: 입력값이 일치해야 하는 정규식 패턴을 지정합니다.
  • min, max: 숫자나 날짜 입력의 최소값과 최대값을 지정합니다.
  • step: 숫자 입력의 단계 크기를 지정합니다.
  • maxlength: 입력 가능한 최대 문자 수를 지정합니다.
<input type="text" name="username" required>
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">
<input type="number" name="age" min="18" max="120">

이러한 속성들을 사용하면 사용자가 유효하지 않은 데이터를 제출하는 것을 방지할 수 있습니다. 하지만 서버 측에서의 유효성 검사도 함께 수행하는 것이 안전합니다.

2.3 입력 요소의 자동완성 기능

HTML5의 autocomplete 속성을 사용하면 브라우저의 자동완성 기능을 제어할 수 있습니다.

<input type="text" name="username" autocomplete="off">
  • on: 자동완성 기능을 사용합니다. (기본값)
  • off: 자동완성 기능을 사용하지 않습니다.

자동완성 기능은 사용자의 편의를 위해 제공되지만, 보안이 중요한 입력 필드(예: 비밀번호)에는 autocomplete="off"를 지정하는 것이 좋습니다.

2.4 입력 요소의 placeholder

placeholder 속성을 사용하면 입력 필드에 사용자가 입력할 값의 힌트를 표시할 수 있습니다.

<input type="text" name="username" placeholder="사용자명을 입력하세요">

placeholder는 사용자가 입력을 시작하면 자동으로 사라집니다. 레이블을 대체하기 위한 용도로 사용해서는 안되며, 보조적인 역할로 사용되어야 합니다.

3. 선택 태그: <select>, <option>, <optgroup>

<select> 태그는 드롭다운 형태의 선택 메뉴를 제공합니다. 내부에는 <option> 태그를 사용하여 선택 가능한 옵션들을 정의합니다.

<select name="fruits">
  <option value="apple">사과</option>
  <option value="banana" selected>바나나</option>
  <option value="orange">오렌지</option>
</select>
  • <option> 태그의 selected 속성: 초기에 선택되어 있을 옵션을 지정합니다.
  • <optgroup> 태그: 옵션들을 그룹화하여 구조적으로 표현할 수 있습니다.

<select> 태그의 multiple 속성을 사용하면 다중 선택이 가능한 메뉴를 만들 수 있습니다.

4. 텍스트 영역 태그: <textarea>

<textarea> 태그는 여러 줄의 텍스트를 입력받을 수 있는 텍스트 영역을 제공합니다.

<textarea name="content" rows="5" cols="30" placeholder="내용을 입력하세요"></textarea>
  • rows 속성: 텍스트 영역의 초기 높이를 지정합니다.
  • cols 속성: 텍스트 영역의 초기 너비를 지정합니다.

텍스트 영역의 크기는 CSS를 사용하여 자유롭게 변경할 수 있습니다.

5. 버튼 태그: <button>

<button> 태그는 클릭 가능한 버튼을 생성합니다. <input type="button">과 유사하지만, 내부에 텍스트나 다른 HTML 요소를 포함할 수 있다는 점이 다릅니다.

<button type="submit">
  <img src="submit.png" alt="제출">
  폼 제출하기
</button>
  • type 속성: 버튼의 타입을 지정합니다. button, reset, submit 중 선택할 수 있습니다.

<button> 태그를 사용할 때는 오래된 IE 브라우저에서 value 속성값이 다르게 전송될 수 있다는 점에 주의해야 합니다.

6. 폼 요소 그룹화: <fieldset>, <legend>

<fieldset> 태그와 <legend> 태그를 사용하면 관련된 폼 요소들을 시각적으로 그룹화할 수 있습니다.

<fieldset>
  <legend>개인 정보</legend>
  <label>이름: <input type="text" name="name"></label><br>
  <label>나이: <input type="number" name="age" min="0"></label>
</fieldset>
  • <fieldset> 태그: 폼 요소들을 그룹화합니다. 브라우저에 따라 그룹 주변에 테두리가 표시될 수 있습니다.
  • <legend> 태그: 필드셋의 제목을 지정합니다.

7. 레이블 태그: <label>

<label> 태그는 폼 요소에 대한 설명을 제공합니다. for 속성을 사용하여 특정 폼 요소와 연결할 수 있습니다.

<label for="name">이름:</label>
<input type="text" id="name" name="name">
  • for 속성: 레이블과 연결할 폼 요소의 id 속성값을 지정합니다.

레이블을 클릭하면 연결된 폼 요소에 자동으로 포커스가 맞춰지므로, 사용자 경험 향상에 도움이 됩니다.

8. 마치며

이번 포스팅에서는 HTML5의 주요 폼 요소들에 대해 알아보았습니다. <form> 태그를 사용하여 입력 데이터를 그룹화하고, <input>, <select>, <textarea> 등의 태그를 사용하여 다양한 종류의 데이터를 입력받을 수 있습니다.

또한 <fieldset>과 <legend>를 사용하여 폼 요소들을 시각적으로 구조화하고, <label>을 사용하여 폼 요소에 대한 설명을 제공할 수 있습니다.

이러한 폼 요소들을 적절히 활용하면 사용자와 효과적으로 상호작용하는 웹 페이지를 만들 수 있습니다.

#HTML #HTML5 #폼 #입력양식 #사용자입력 #데이터전송 #GET방식 #POST방식 #input #select #textarea #button #fieldset #legend #label #입력요소 #input #유효성검사 #required #pattern #min #max #step #maxlength #자동완성 #autocomplete #placeholder

profile
매일 1mm씩 성장하겠습니다

0개의 댓글