input 태그
✒️ 2025-05-16 11:14 내용 수정
참고 자료 : mdn web docs input attributes
- input태그는 JavaScript와 밀접한 관련이 있으며, 사용자가 데이터를 입력할 수 있는 입력 필드를 정의할 때 사용한다.
- 기본 타입은
text이며,type에 여러 속성을 지정하여 다양한 기능을 부여할 수 있다. - type 중 submit은 입력된 값에 대한 체크를 하지 않고 바로 데이터를 전송하기 때문에(유효성 검사 x) 검사를 해야 하는 경우엔 type을 button으로 생성하고 이벤트 처리 함수에서 유효성 검사를 넣어 주는 것이 좋다.
<!-- 기본 -->
<input type="text">
<!-- 비밀번호 -->
<input type="password" id="password" required>
<!-- 이메일 -->
<input type="email" id="email" name="email" required>
<!-- 라디오버튼 -->
<input type="radio" id="male" name="gender" value="male" required>
<input type="radio" id="female" name="gender" value="female" required>
<!-- 체크박스 -->
<input type="checkbox" id="subscribe" name="subscribe">
<!-- submit 제출 동작 -->
<input type="submit" value="제출">
<input>에는 다양한 타입이 있어 사용자로부터 다양한 값을 입력 받을 수 있다.- 각 타입별로 사용 가능한 속성도 달라 참고 자료를 보고 필요한 속성을 찾아 사용하는 것이 좋다.
| 속성 | 속성값 | 설명 |
|---|---|---|
type |
input 태그의 종류를 지정 | |
text |
텍스트를 입력할 수 있는 공간 | |
password |
비밀번호 입력 필드 | |
button |
버튼 | |
checkbox |
체크 박스 | |
radio |
라디오 버튼 | |
file |
파일을 업로드할 수 있음 | |
image |
이미지를 입력 받는 필드 | |
time |
시간을 입력 받는 필드 | |
date |
날짜를 입력 받는 필드 | |
datetime-local |
날짜와 시간을 입력 받는 필드 | |
week |
주를 입력 받는 필드 | |
month |
월을 입력받는 필드 | |
email |
이메일 | |
number |
숫자 입력을 받는 필드 | |
hidden |
숨김 | |
color |
색 | |
range |
일정 범위 내 숫자 값을 선택할 수 있는 슬라이더 | |
search |
검색어를 입력 받는 필드 | |
submit |
폼을 제출하는 버튼 | |
reset |
폼 내용을 초기화하는 버튼 | |
tel |
전화번호를 입력 받는 필드 | |
url |
웹 주소를 입력 받는 필드 |
<input>의 다양한 속성들
| 속성 | 타입 | 설명 |
|---|---|---|
type |
전체 | 입력 필드 유형 지정 |
name |
전체 | 전송 시 데이터 이름 지정 |
value |
image를 제외한 전체 |
입력 필드 초기값 설정 |
placeholder |
text, password, email 등 |
힌트 텍스트 표시 |
required |
hidden, range, color, 버튼 제외 전체 |
필수 입력 지정 |
readonly |
hidden, range, color,checkbox, radio, 버튼 제외 전체 |
읽기 전용 필드 설정 |
disabled |
전체 | 입력 비활성화 처리 |
checked |
checkbox, radio |
체크박스와 라디오 버튼 체크 여부 |
maxlength |
text, password, email 등 |
최대 입력 문자 수 제한 |
minlength |
text, password, email 등 |
최소 입력 문자 수 지정 |
min |
date, month, time, range 등 |
입력 허용 최소값 설정 |
max |
date, month, time, range 등 |
입력 허용 최대값 설정 |
step |
date, month, time, range 등 |
숫자 증가/감소 단위 지정 |
pattern |
text, password, email 등 |
정규식 기반 입력 값 검증 |
autocomplete |
checkbox, radio, 버튼 제외 전체 |
자동 완성 기능 설정on과 off값으로 설정 |
autofocus |
페이지 로드시 자동 포커스 설정 | |
multiple |
email, file |
복수 항목 입력 허용 |
size |
text, password, email 등 |
입력 필드 표시 너비 지정 |
src |
image |
이미지의 주소<img>의 src 속성과 동일 |
width |
image |
이미지의 너비 |
height |
image |
이미지의 높이 |
list |
hidden, password, checkbox, radio, 버튼 제외 전체 |
자동 완성 옵션 연결 |
form |
전체 | 특정 폼 요소와의 연결 설정 |
accept |
file |
허용 파일 형식 지정 (파일 업로드 시) |
<body>
<ol>
<li>text 형식
<ul>
<li><input value="text를 입력하는 공간"></li>
<li><input type="password"></li>
<li><input type="search" placeholder="검색어를 입력해주세요"></li>
<li><input type="tel" placeholder="전화번호를 입력해주세요"></li>
<li><input type="url" placeholder="url을 입력해주세요"></li>
<li><input type="email" placeholder="이메일을 입력해주세요"></li>
</ul>
</li>
<hr>
<li>button 형식
<ul>
<li><input type="button" value="버튼"></li>
<li><input type="checkbox" value="체크박스"></li>
<li><input type="radio" value="라디오버튼"></li>
<li><input type="submit" placeholder="제출"></li>
<li><input type="reset" value="형식 초기화"></li>
</ul>
</li>
<hr>
<li>파일 첨부 형식
<ul>
<li><input type="file" placeholder="파일을 드래그해서 첨부"></li>
<li><input type="image" placeholder="이미지를 드래그해서 첨부"></li>
</ul>
</li>
<hr>
<li>메뉴바 형식
<ul>
<li><input type="time"></li>
<li><input type="date"></li>
<li><input type="datetime-local"></li>
<li><input type="week"></li>
<li><input type="month"></li>
<li><input type="color" value="red"></li>
<li><input type="range" value="3"></li>
</ul>
</li>
</ol>
<input type="hidden" value="숨김">
</body>
input file
- 파일을 한개 혹은 여러 개를 선택해서 받을 수 있다.
- 참고 자료 : mdn web docs input file
change와input이벤트를 지원한다.- 파일의 MIME 타입은 mdn web docs basics of http MIME types 참고.
| 특성 | 설명 |
|---|---|
accept |
허용할 파일 유형을 지정 |
capture |
이미지 또는 비디오 데이터를 캡처할 때 사용할 방법 지정 |
files |
선택한 파일을 나열 |
multiple |
여러 개의 파일을 선택할 수 있음 |
<input type="file" multiple accept="image/*"/>
- input으로 받은 파일은
event.target.files를 통해 확인할 수도 있다.- 단일 파일을 업로드하더라도
event.target.files에는 배열로 저장되기 때문에 주의해야 한다. - 해당 부분을 처리하지 않으면
Failed to execute 'createObjectURL' on 'URL': Overload res에러가 발생한다.
- 단일 파일을 업로드하더라도
function handleUpload(event) {
const newImage = event.target.files[0];
const fileType = event.target.files[0]?.type;
console.log(event.target); // 이벤트 대상을 반환한다.
console.log(event.target.files); // FileList를 반환한다.
console.log(event.target.files[0]); // FileList의 0번째 요소에 대한 정보가 반환된다.
if (fileType.includes('image')) {
alert("이미지 업로드 성공!");
} else {
alert("이미지 파일만 업로드할 수 있습니다!");
return;
}
}
<input type="file" accept="image/*" onChange={handleUpload}/>
유효성 검사
<input>태그에는patternattribute이 있으며,text,search,url,tel,email,password타입에 적용할 수 있다.- 이는
<input>에 값이 들어오면 정규 표현식을 사용하여value가 이를 만족하는지 확인하여 유효한지 확인한다.- 정규 표현식 참고.
<input type="text" pattern="[a-zA-Z]"/>
type="email"은 기본 정규 표현식을 사용하고 있어 따로 지정하지 않아도 아래 표현식을 사용하여 유효성 검사를 진행한다.- email validation 참고.
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
pattern에는 String만 전달할 수 있어 Javascript의RegExp와 같은 객체를 사용하려면 String으로 표현을 변경해야 한다.- 이 때 이스케이프
\처리를 제대로 하지 않으면Invalid regular expression에러가 발생하여 정규 표현식이 작동하지 않는다.- React 프로젝트에서 진행했을 때 Chrome은
/v플래그를 사용하여 엄격한 표현식 검사를 진행했다. - 참고 자료 : RegExp u flag and v flag validity
- React 프로젝트에서 진행했을 때 Chrome은
- 표현식을
/exp/와 같이 만들었을 때pattern에서 사용할 String 형태는/을 제거한다.
// javascript
// 한글과 밑줄 문자를 포함한 영문과 숫자로 구성된 2~13글자
const reg = /^[가-힣\w]{2,13}$/;
// pattern에 적용할 String
const str_reg = "^[가-힣\\w]{2,13}$";
<!-- string regex로 적용 -->
<input type="text" pattern={str_reg}/>
주의사항
- email validation 에서 HTML form validation은 전체 데이터가 적절한 형식을 갖췄는지 확인하는 스크립트를 대체할 수 없다고 경고하고 있다.
- 사용자가 HTML을 수정하여 유효성 검사를 우회하도록 만들 수 있고, 아예 삭제할 수 있다.
- 또는 아예 HTML 자체를 우회해서 서버에 데이터를 직접 보낼 수 있어 서버측 코드에서 데이터에 대한 유효성 검사가 없다면 DB에 큰 문제가 생길 수 있다.
- 따라서 클라이언트 뿐 아니라 서버에서도 데이터를 받을 때 유효성 검사를 진행하는 코드가 필요하다.
Boostrap의 form validation에 적용하기
-
Bootstrap의 validation form을 사용하는 경우
<input>이 비어 있는 것을 확인하고, 유효성 검사까지 진행한 뒤에<Form.Control.Feedback>이 뜨도록 하려면<input pattern="">을 설정해야 적용되었다.- 아래 예시는 React-Bootstrap의 Form validation이다.
- Bootstrap, React, Hook과 State 참고.
-
Bootstrap의 form validation은
class="was-validated"와class="needs-validation"을 사용하며, 각각 클라이언트가 submit 하기 전/후input작성 여부를 체크한다.- 참고 자료 : 부트스트랩 Form Validation 사용하기
-
React-boostrap에선
validated에 검사 진행 여부 state를 사용하여 변경하고, 제출 동작 시form.checkValidity()를 사용하여 form에서<input>의 유효성 검사를 진행한다.requiredattribute를 추가하면 해당<input>의 값이 비어있을 때invalid로 처리한다.patternattribute를 추가하면 해당<input>의 값이pattern의 정규 표현식을 만족하는지 검사한다.
-
위 과정을 거쳐
<input>에 대한 검사가 끝나면form.checkValidity()가true일 때 초록색으로 바뀌며<Form.Control.Feedback type="valid">요소가 표시되고,false라면 빨간색으로 표시됨과 함께<Form.Control.Feedback type="invalid">요소가 표시된다.
import { Form, FloatingLabel, InputGroup } from "react-bootstrap";
import { useState } from 'react';
function Login() {
const [validated, setValidated] = useState(false); // 검사 진행 여부
// 제출 동작
const handleSubmit = (event) => {
const form = event.currentTarget;
if (form.checkValidity() === false) {
event.preventDefault(); // 새로고침 방지
event.stopPropagation(); // 진행 차단
}
// 검사 했음을 true로 변경
setValidated(true);
};
return (
<Form noValidate validated={validated}>
<Form.Group md="4" controlId="email">
<InputGroup hasvalidation>
<FloatingLabel
controlId="floatingInput"
label="이메일(email)"
className="mb-3"
>
<Form.Control
required
type="email"
name="email"
onChange={handleChange}
/>
<Form.Control.Feedback type="invalid">
이메일을 입력해주세요
</Form.Control.Feedback>
</FloatingLabel>
</InputGroup>
</Form.Group>
</Form.Group>
)
}
- 메시지는 다른 파일에서 배열로 지정해서 가져왔기에 예시 코드 상에는 빈 값 처리 문구만 넣어뒀다.