HTML: 인풋, 사용자에게 입력을 받자
이 글에서는 HTML(HyperText Markup Language) 에서 사용자로부터 값을 어떻게 입력받을 수 있는 인풋(Input) 태그의 여러가지 속성, 타입에 대해 정리했습니다.
HTML: Input
input 태그는 사용자로부터 텍스트, 이메일, 숫자 등의 여러가지 타입의 값을 입력받을 때 사용하는 HTML 태그입니다.
Input: 여러가지 속성
-
type: ** 어떤 형태의 데이터를 입력받을지를 결정 **하는 속성.HTML <input type="email" /> <input type="number" /> -
name: 데이터의 고유 이름을 설정하는데 사용하는 속성.HTML <input type="text" name="username" /> <input type="password" name="password" /> -
value:input태그가 현재 가지고 있는 값을 나타내는 속성. 기본값을 설정할 때도 사용된다.HTML <input type="text" name="nickname" value="baklibra" /> -
placeholder: 예시/힌트 텍스트를 보여주는 속성. 실제 입력값은 아니며 값을 입력하면 사라진다.HTML <input type="text" name="username" placeholder="아이디를 입력하세요" /> -
disabled:input태그를 비활성화되어 클릭/입력이 불가능하며, 폼 전송 시 값이 전송되지 않는다.HTML <button type="submit" disabled>제출하기</button> -
required: 값 필수 여부를 나타내는 속성으로 값을 입력되지 않으면 브라우저가 기본으로 검증 메세지를 띄워준다.HTML <input type="password" name="password" required />
Input: 여러가지 타입
input의 type 값에 따라 텍스트, 비밀번호, 이메일 등 용도에 맞는 전용 입력 필드를 만들 수 있고, 브라우저가 각 타입에 맞는 UI와 기본 검증을 함께 제공해 줍니다.
Input: 텍스트 타입
text 는 한줄 텍스트를 입력받을 때 사용하는 타입 속성입니다.
text타입 예시HTML <input type="text" />
Input: 패스워드 타입
password 는 사용자 계정의 패스워드를 입력받을 때 사용하는 타입 속성으로, 입력 내용이 ●●● 으로 가려집니다.
password타입 예시HTML <input type="password" />
Input: 이메일 타입
email 은 이메일 정보를 입력받을 때 사용하는 타입 속성으로 이메일 형식 검증을 지원하고, 모바일에서 이메일 입력에 어울리는 키보드를 보여줍니다.
email타입 예시HTML <input type="email" />
Input: 넘버 타입
number 는 숫자 정보를 입력받을 때 사용하는 속성으로, 스핀 버튼이 표시되고 숫자가 아닌 값은 기본 검증에서 막히게됩니다.
number타입 예시HTML <input type="number" />
Input: 체크박스 타입
checkbox 는 여러 값을 ** 다중 선택 으로 받는 타입으로, 각 체크박스는 체크 여부만 true/false 로 표현됩니다.
같은 name 을 가진 checkbox 들 중 선택된 checkbox 의 value 가 서버로 ** 리스트처럼 묶여 전송되며,
폼이 application/x-www-form-urlencoded 로 전송될 때는 stack=frontend&stack=backend 같이 한 줄의 쿼리 스트링으로 인코딩됩니다.
-
checkbox예시HTML <input type="checkbox" name="stack" value="frontend" /> <input type="checkbox" name="stack" value="backend" /> <input type="checkbox" name="stack" value="devops" />
Input: 라디오 타입
radio 타입은 ** 여러 선택지 중에서 딱 하나만 고르게 할 때** 사용하는 타입으로,
같은 name을 가진 라디오 버튼들은 서로 연결되어 한 그룹이 되고, 그 그룹 안에서는 항상 하나 선택 또는 전부 해제 선택하도록 강제됩니다.
radio타입 기본 예시HTML male: <input type="radio" name="gender" value="male" /> female: <input type="radio" name="gender" value="female" /> other: <input type="radio" name="gender" value="other" />
동일한 name 값을 가지는 radio 타입의 input 은 ** 하나의 그룹 **이 되고 사용자는 해당 그룹의 항목 중 ** 오직 하나만 선택 **할 수 있습니다.
Input: 날짜/시간 타입
날짜·시간 관련 인풋 타입들은 브라우저가 ** 전용 피커 UI**를 띄워줍니다. 덕분에 사용자가 직접 형식을 맞춰 입력하지 않아도 되고, 기본적인 형식 검증도 함께 처리됩니다.
-
type="date": 날짜(년/월/일)를 선택하는 달력 UI.HTML <input type="date" name="birthday" /> <input type="time" name="meeting_time" /> <input type="datetime-local" name="event_at" /> -
type="time": 시/분(필요시 초)만 선택하는 시간 피커.HTML <input type="date" name="birthday" /> <input type="time" name="meeting_time" /> <input type="datetime-local" name="event_at" /> -
type="datetime-local": 날짜 + 시간까지 한 번에 선택하는 입력 필드.HTML <input type="date" name="birthday" /> <input type="time" name="meeting_time" /> <input type="datetime-local" name="event_at" />
Input: 파일 타입
file 는 이미지, 동영상과 같은 파일을 입력받을 때 사용하는 타입 속성입니다.
file타입 예시HTML <input type="file" />
Input: Label과 함께
input만 둔다면 사용자가 어떤 값을 써야 하는지 알기 어렵기 때문에, 설명 텍스트를 함께 두는 것이 좋습니다.
label은 ** 해당 인풋을 설명하는 텍스트 **로, "이 칸에 어떤 값을 입력해야 하는지"를 명확하게 알려 줍니다.
label사용 시 좋은 점label을 클릭해도input에 포커스가 가기 때문에 클릭 영역이 넓어져 사용성이 좋아진다.- 스크린 리더는
input에 포커스가 갈 때label의 텍스트를 함께 읽어 줘서 접근성이 올라간다.
Label: Input을 감싸자
<label>
사용자 이름
<input type="text" name="username" />
</label>
label 안에 input을 포함시키면 둘이 암묵적으로 연결되어, label 전체(텍스트 영역 포함)를 클릭해도 해당 input이 활성화됩니다.
Label: for/id 속성과 Input 을 함께
<label for="agree-terms">이용약관에 동의합니다</label>
<input id="agree-terms" type="checkbox" name="agree" />
for와 id 값을 맞추면, label과 input이 명시적으로 연결되며 label을 클릭해도 해당 input이 활성화됩니다.
Input: Best Practice
- 중요한 인풋에는 ** 가능하면 항상
label을 붙인다.** - 단순 스타일용
<span>대신, 의미를 살릴 수 있도록label로 필드 이름을 표시한다. - 체크박스·라디오는 ** 반드시 라벨과 함께 사용 **해 선택 영역과 접근성을 확보한다.
placeholder는 “설명”이 아니라 ** 예시 텍스트 **로만 쓰고, 필드 이름은label로 제공한다.for와id를 쓸 때는 페이지 내에서 ** 중복되지 않는 고유id** 를 사용한다.- 시멘틱 관점에서 “입력 필드”는
input, “필드의 이름/설명”은label로 역할을 분리하는 것이 좋다.
주의할 점
1. type을 생략하면 기본값 text가 적용된다
이메일 필드에 type="email"을 지정하지 않으면 모바일에서 이메일 키보드가 나오지 않고, 브라우저 기본 검증도 동작하지 않는다.
2. label과 input을 연결하지 않으면 접근성이 깨진다
<label for="id">와 <input id="id">를 매칭하지 않으면 스크린 리더가 필드의 용도를 알 수 없다.