form

μš°λ¦¬κ°€ λΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ κ°€μž₯ 많이 μ ‘ν•˜κ²Œ λ˜λŠ” ν™”λ©΄ 쀑 ν•˜λ‚˜κ°€ λ°”λ‘œ μž…λ ₯창이닀. 검색어, 아이디, λΉ„λ°€λ²ˆν˜Έ λ“± μ‚¬μš©μžμ˜ μž…λ ₯을 λ°›μ•„ μ„œλ²„λ‘œ μ „μ†‘ν•˜λŠ” 역할을 ν•˜λŠ”κ²ƒμ΄ λ°”λ‘œ form 양식이닀.

HTMLμ—μ„œ form 양식을 μœ„ν•΄ μ‚¬μš©λ˜λŠ” νƒœκ·ΈλŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆλ‹€.

  • form

  • input, textarea

  • label...etc

μœ„μ— λ‚˜μ—΄ν•œ νƒœκ·Έλ“€μ΄ μ•„λ§ˆ κ°€μž₯ μ΅μˆ™ν•œ νƒœκ·ΈμΌ 것이닀. 이 쀑, 자주 μ‚¬μš©λ˜λŠ” form, input νƒœκ·Έμ— λŒ€ν•΄ 쑰금 더 μ‚΄νŽ΄λ³΄μž.

form tag

form νƒœκ·ΈλŠ” article, main, header 와 μœ μ‚¬ν•˜κ²Œ μ»΄ν¬λ„ŒνŠΈλ‚΄ μž…λ ₯ 양식 전체λ₯Ό κ°μŒ€λ•Œ μ‚¬μš©λ˜λŠ” νƒœκ·Έμ΄λ‹€. ν•œλ²ˆ 속성듀을 μ•Œμ•„λ³΄μž.

  • method : 전솑 방식을 μ„ νƒν•œλ‹€. (get, post)

  • name : form의 이름을 μ„€μ •ν•œλ‹€. μ„œλ²„λ‘œ μ „μ†‘λœ 데이터λ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•΄μ„œ μ„€μ •ν•œλ‹€.

  • action : form을 전솑할 μ„œλ²„μͺ½μ˜ script νŒŒμΌμ„ μ§€μ •ν•œλ‹€.

  • autocomplete : 단어 κ·ΈλŒ€λ‘œ μžλ™μ™„μ„±μ΄λ‹€. on으둜 μ„€μ •μ‹œ, κ³Όκ±° μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 값을 베이슀둜 μ—¬λŸ¬ 값을 보여쀀닀.

  • enctype : 데이터가 μ„œλ²„λ‘œ μ „μ†‘λ λ•Œ 인코딩 λ˜λŠ” 방식을 λͺ…μ‹œν•œλ‹€.

1. application/x-www-form-urlencoded : default value. λͺ¨λ“  λ¬Έμžμ—΄μ„ μ„œλ²„λ‘œ 전솑전에 인코딩 됨
2. multipart/form-data : λͺ¨λ“  λ¬Έμžμ—΄μ„ μΈμ½”λ”©ν•˜μ§€ μ•ŠλŠ”λ‹€. 주둜 파일/이미지λ₯Ό μ „μ†‘ν• λ•Œ μ‚¬μš©λœλ‹€.
3. text/plain : 곡백은 "+" 둜 μΉ˜ν™˜λ˜μ§€λ§Œ, λ‚˜λ¨Έμ§€ λ¬ΈμžλŠ” 인코딩 λ˜μ§€ μ•ŠλŠ”λ‹€.
  • novalidate : 데이터λ₯Ό μ„œλ²„λ‘œ μ „μ†‘μ‹œ, μœ νš¨μ„± 검사λ₯Ό μ‹€μ‹œν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 λͺ…μ‹œν•œλ‹€.

이처럼, form νƒœκ·ΈλŠ” μƒν˜Έμž‘μš©ν•  μž…λ ₯μ°½, λ²„νŠΌ, νƒœκ·Έλ“±μ„ μ •μ˜ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.

input tag

input νƒœκ·ΈλŠ” μ‚¬μš©μžκ°€ 데이터λ₯Ό 직접 μž…λ ₯ν• μˆ˜ μžˆλ„λ‘ ν•˜λŠ” νƒœκ·Έλ‹€.

  • readonly : μ½κΈ°μ „μš© ν•„λ“œ μ—¬λΆ€

  • placeholder : μž…λ ₯창에 μ˜ˆμ‹œλ“±μ„ ν‘œμ‹œν• λ•Œ μ‚¬μš©λœλ‹€. (ν΄λ¦­μ‹œ 사라짐)

  • autofocus : νŽ˜μ΄μ§€ λ Œλ”λ§μ‹œ, νŠΉμ • 뢀뢄에 μ»€μ„œκ°€ ν‘œμ‹œλ˜λ„λ‘ ν•œλ‹€.

  • autocomplete : μžλ™μ™„μ„±

  • max/min : input의 μ΅œλŒ€/μ΅œμ†Ÿκ°’ μ„€μ •

  • maxlength : input에 μ΅œλŒ€λ‘œ μž…λ ₯이 κ°€λŠ₯ν•œ λ¬Έμžμ—΄ 갯수λ₯Ό μ§€μ •ν•œλ‹€.

  • required : ν•„μˆ˜ μž…λ ₯ ν•„λ“œλ₯Ό μ§€μ •ν•œλ‹€.

  • type : input에 μž…λ ₯λ˜λŠ” λ°μ΄ν„°μ˜ νƒ€μž…μ„ μ •μ˜ν•œλ‹€.

μœ„μ— μ—΄κ±°ν•œ 속성듀 쀑, type μ†μ„±μ˜ 섀정값에 따라 input이 λ²„νŠΌ, ν…μŠ€νŠΈ λž€μ΄ λ μˆ˜λ„ μžˆλ‹€. typeμ—μ„œ μ„€μ •ν• μˆ˜ μžˆλŠ” 값듀을 μ‚΄νŽ΄λ³΄μž.

  • hidden: μ‚¬μš©μžμ—κ²Œ 보이지 μ•Šκ²Œ ν•œλ‹€.

  • text : κ°€μž₯ 자주 μ‚¬μš©λ˜λŠ” ν•œμ€„ λ¬Έμžμ—΄μ„ μž…λ ₯ν•˜λŠ” ν…μŠ€νŠΈ μƒμž.

  • search : 검색 μƒμž(크둬/μ‚¬νŒŒλ¦¬μ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€).

  • tel : μ „ν™”λ²ˆν˜Έ μž…λ ₯ ν•„λ“œ.

  • url : url μ£Όμ†Œ μž…λ ₯ ν•„λ“œ.

  • email : email μ£Όμ†Œ μž…λ ₯ ν•„λ“œ.

  • password : λΉ„λ°€λ²ˆν˜Έ μž…λ ₯ ν•„λ“œ.

  • number : 숫자 쑰절이 κ°€λŠ₯ν•œ ν•„λ“œ.

  • range : 숫자 λ²”μœ„ 쑰절이 κ°€λŠ₯ν•œ ν•„λ“œ. (min, max둜 λ²”μœ„λ₯Ό μ‘°μ ˆν•œλ‹€.)

  • checkbox : 2κ°œμ΄μƒ 선택이 κ°€λŠ₯ν•œ μ²΄ν¬λ°•μŠ€.

  • radio : 1개만 선택 κ°€λŠ₯ν•œ λΌλ””μ˜€ λ²„νŠΌ.

  • datetime : UTCλ₯Ό κΈ°μ€€μœΌλ‘œ μ„€μ •λœ λ‚ μ§œ, μ‹œκ°„ (μ—°,μ›”,일,μ‹œ,λΆ„,초) ν‘œμ‹œ

  • date, month, week, time : μ‚¬μš©μž 지역을 κΈ°μ€€μœΌλ‘œ λ‚ μ§œ,μ›”,μ£Ό,μ‹œκ°„ ν‘œμ‹œ

  • button : λ²„νŠΌμ„ λ§Œλ“€μ–΄ 클릭이벀트λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

  • file: 파일 첨뢀 λ²„νŠΌ 생성.

  • submit : μ„œλ²„ 전솑 λ²„νŠΌ 생성.

  • reset : μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 정보 μ‚­μ œ.

μ΄λ ‡κ²Œ μ‚¬μš©μžμ˜ μž…λ ₯값을 μ„œλ²„λ‘œ μ „μ†‘ν•˜λŠ”κ²ƒμ΄ form 양식 νƒœκ·Έλ“€μ˜ 역할이닀. νŽ˜μ΄μ§€ ν•˜λ‚˜μ— μ κ²ŒλŠ” 1개 λ§Žκ²ŒλŠ” μˆ˜μ‹­κ°œμ˜ μž…λ ₯ 폼이 λ“€μ–΄κ°ˆμˆ˜ μžˆκΈ°μ—, 각 μž…λ ₯ 폼의 데이터 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ”κ²ƒμ΄ μ€‘μš”ν•œ μš”μ†Œλ‘œ κΌ½νžˆκ³€ν•œλ‹€.

Reactμ—μ„œλŠ” 각 μž…λ ₯폼의 μƒνƒœλ₯Ό useState 둜 κ΄€λ¦¬ν•˜κ²Œ λœλ‹€. ν•˜μ§€λ§Œ μƒνƒœκ°’μ΄ λ§Žμ•„μ§ˆμˆ˜λ‘ 각 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜κΈ° νž˜λ“€μ–΄μ§€κ³ , 가독성 λ˜ν•œ 맀우 λ–¨μ–΄μ§„λ‹€. λ¬Όλ‘ , ν•œκ°œμ˜ useStateλ₯Ό μ•„λž˜μ™€ 같이 κ°μ²΄ν˜•μ‹μœΌλ‘œ λ§Œλ“€μ–΄ κ΄€λ¦¬ν•˜λŠ” 방법도 μžˆμ§€λ§Œ μƒνƒœκ°’, μƒνƒœ 처리 ν•¨μˆ˜, html λ Œλ”λ§ 뢀뢄에 μžˆμ–΄μ„œ 기본적인 보일러 ν”Œλ ˆμ΄νŠΈκ°€ 적지 μ•Šμ•„ κ΄€λ¦¬ν•˜κΈ° μ‰½μ§€λŠ” μ•Šλ‹€.

import React, { useState } from 'react';

const MultiInputForm = () => {
  const [formValues, setFormValues] = useState({
    name: '',
    email: '',
    phone: '',
    address: '',
    password: '',
    confirmPassword: '',
  });

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const { name, value } = e.target;
    setFormValues((prevValues) => ({
      ...prevValues,
      [name]: value,
    }));
  };

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    console.log('Form Submitted:', formValues);
  };

  return (
    <form onSubmit={handleSubmit} className="p-4 space-y-4 max-w-md mx-auto">
      <div>
        <label htmlFor="name" className="block mb-1 font-bold">Name:</label>
        <input
          type="text"
          id="name"
          name="name"
          value={formValues.name}
          onChange={handleChange}
          className="w-full p-2 border rounded"
        />
      </div>
      <div>
        <label htmlFor="email" className="block mb-1 font-bold">Email:</label>
        <input
          type="email"
          id="email"
          name="email"
          value={formValues.email}
          onChange={handleChange}
          className="w-full p-2 border rounded"
        />
      </div>
      <div>
        <label htmlFor="phone" className="block mb-1 font-bold">Phone:</label>
        <input
          type="text"
          id="phone"
          name="phone"
          value={formValues.phone}
          onChange={handleChange}
          className="w-full p-2 border rounded"
        />
      </div>
      <div>
        <label htmlFor="address" className="block mb-1 font-bold">Address:</label>
        <input
          type="text"
          id="address"
          name="address"
          value={formValues.address}
          onChange={handleChange}
          className="w-full p-2 border rounded"
        />
      </div>
      <div>
        <label htmlFor="password" className="block mb-1 font-bold">Password:</label>
        <input
          type="password"
          id="password"
          name="password"
          value={formValues.password}
          onChange={handleChange}
          className="w-full p-2 border rounded"
        />
      </div>
      <div>
        <label htmlFor="confirmPassword" className="block mb-1 font-bold">Confirm Password:</label>
        <input
          type="password"
          id="confirmPassword"
          name="confirmPassword"
          value={formValues.confirmPassword}
          onChange={handleChange}
          className="w-full p-2 border rounded"
        />
      </div>
      <button type="submit" className="px-4 py-2 bg-blue-500 text-white rounded">
        Submit
      </button>
    </form>
  );
};

export default MultiInputForm;

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λ°”λ‘œ react-hook-form이닀. ν•΄λ‹Ή λΌμ΄λΈŒλŸ¬λ¦¬μ— κ΄€ν•΄μ„œλŠ” λ‹€λ₯Έ κ²Œμ‹œκΈ€μ—μ„œ 닀뀄보렀고 ν•œλ‹€.

Last updated