๐Ÿงพ form

๊น€์ฒ ์ค€ยท2022๋…„ 3์›” 23์ผ
0

HTML

๋ชฉ๋ก ๋ณด๊ธฐ
1/4

๋ฆฌ์•กํŠธ๋กœ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… Project๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค ๋ฌธ๋“ form ํƒœ๊ทธ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์ž˜ ๋ชจ๋ฅด๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ์กฐ๊ธˆ ๋” ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹จ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

form ํƒœ๊ทธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

form ํƒœ๊ทธ๋ž€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ •๋ณด๋“ค์„ ๋ณด๋‚ด๋Š” ์–‘์‹์ด๋‹ค.
์—ฌ๋Ÿฌ input tag ๋ฐ button๊ณผ ํ•จ๊ป˜ ํ•ด๋‹น ํƒœ๊ทธ์˜ ์ •๋ณด๋“ค์„ ์ง€์ •ํ•œ ์„œ๋ฒ„์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํƒœ๊ทธ์ด๋‹ค.

<form>
  <input/>
  <button>์ œ์ถœ</button>
</form>

๊ทธ๋ ‡๋‹ค๋ฉด form tag์˜ attributes๋“ค์„ ์‚ดํŽด๋ณด์ž.

action

action attribute๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ์–ด๋””๋กœ ๋ณด๋‚ด์งˆ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค.
๊ฐ’์œผ๋กœ ์ ˆ๋Œ€์ ์ธ ๊ฒฝ๋กœ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์ƒ๋Œ€์ ์ธ ๊ฒฝ๋กœ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ˆ๋Œ€์ ์ธ ๊ฒฝ๋กœ๋Š” ๊ฐ’์œผ๋กœ ์ž…๋ ฅํ•œ ๊ฒฝ๋กœ๋กœ ๋ฐ์ดํ„ฐ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ 
์ƒ๋Œ€์ ์ธ ๊ฒฝ๋กœ๋Š” ํ˜„์žฌ ๋‚ด ์„œ๋ฒ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜์—ฌ ์ƒ๋Œ€์ ์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

absolute URL

<!--๋ฐ์ดํ„ฐ๊ฐ€ https://example.com๋กœ ๋ณด๋‚ด์ง„๋‹ค. -->
<form action="https://example.com">

relative URL

<!--๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜์˜ ์„œ๋ฒ„ ์ค‘ /somewhere_else๋กœ ๋ณด๋‚ด์ง„๋‹ค. -->
<form action="/somewhere_else">

๋งŒ์•ฝ action attribute๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด form tag๊ฐ€ ์กด์žฌํ•˜๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€๋กœ ๋ณด๋‚ด์ง€๊ฒŒ ๋œ๋‹ค.

๋งŒ์•ฝ localhost:3000์ธ ๋กœ์ปฌ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋˜์žˆ๋‹ค๋ฉด ๋กœ์ปฌ ์„œ๋ฒ„๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด๋‚ด์ง€๊ฒŒ ๋œ๋‹ค.

์œ„ ์˜ˆ์ œ์—์„œ ๋ณด๋“ฏ์ด http๋ฟ๋งŒ ์•„๋‹ˆ๋ผ https๋กœ๋„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
https๋กœ ๋ณด๋‚ธ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋“ค์ด ์•”ํ˜ธํ™”๋˜์–ด ๋ณด๋‚ด์ง„๋‹ค.
์ด ๋•Œ ํผ ํƒœ๊ทธ๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŽ˜์ด์ง€์— ์žˆ๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋“ค์ด ์•”ํ˜ธํ™”๋˜์–ด ๋ณด๋‚ด์ง„๋‹ค.

ํ•œํŽธ formํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์•ˆ์ „ํ•˜๋”๋ผ๋„ protocol์ด http์ธ url๋กœ ๋ณด๋‚ธ๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ๋•Œ๋งˆ๋‹ค ๋ณด์•ˆ ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•  ๊ฒƒ์ด๋‹ค.

method

<form action ="https://example.com" method="get">
</form>

method attribute๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด๋‚ผ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค.
์ฃผ์š” ๋ฉ”์„œ๋“œ๋Š” get,post์ด๋‹ค.

GET

get ๋ฉ”์„œ๋“œ๋Š” ์ฃผ๋กœ ์„œ๋ฒ„์—๊ฒŒ ์–ด๋– ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์–ป์–ด์˜ค๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
๋ธŒ๋ผ์šฐ์ €๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ body๋ถ€๋ถ„์ด ๋น„์–ด์žˆ๋Š” ์ƒํƒœ๋กœ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.

์ด ๋•Œ body๋ถ€๋ถ„์ด ๋น„์–ด์žˆ๋Š” ์ƒํƒœ๋กœ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด url์— ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.
(body๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•  ๋•Œ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ•˜๋Š” ๋ถ€๋ถ„์„ ์–ด๋– ํ•œ ์‹์œผ๋กœ ๊ฐ€๊ณตํ•ด๋‹ฌ๋ผ๋ผ๋Š” ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค.)

๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

<form action="http://www.foo.com" method="GET">
  <div>
    <label for="say">What greeting do you want to say?</label>
    <input name="say" id="say" value="Hi">
  </div>
  <div>
    <label for="to">Who do you want to say it to?</label>
    <input name="to" id="to" value="Mom">
  </div>
  <div>
    <button>Send my greetings</button>
  </div>
</form>

GET ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ๋ณด๋‚ธ๋‹ค๋ฉด URL์— ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ์˜ ์ •๋ณด๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.
๋ฐ์ดํ„ฐ๋Š” key์™€ value์˜ ์Œ์œผ๋กœ ๋ณด๋‚ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ key=value์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰, ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ํ•ด์ค„ ๋•Œ์— ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ URL์— ํฌํ•จํ•˜์—ฌ ๋ณด๋‚ด์ค€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

POST

POST๋Š” GET๊ณผ ๋‹ฌ๋ฆฌ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ํ•  ๋•Œ body๋ถ€๋ถ„์„ ๊ณ ๋ คํ•˜์—ฌ ์š”์ฒญํ•˜๊ฒŒ ๋œ๋‹ค.

body๋ถ€๋ถ„๊ณผ ํ•จ๊ป˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์–ด server์— body์—์„œ ์š”์ฒญํ•œ ์ฃผ๋ฌธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ์ด์— ๋”ฐ๋ผ server ์š”์ฒญํ•œ๋Œ€๋กœ ์‘๋‹ต์„ ํ•ด์ค€๋‹ค.(์š”์ฒญํ•  ๋•Œ์— request.body์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด์•„ ๋ณด๋‚ด์ง€๊ฒŒ ๋œ๋‹ค.)

์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

<form action="http://www.foo.com" method="POST">
  <div>
    <label for="say">What greeting do you want to say?</label>
    <input name="say" id="say" value="Hi">
  </div>
  <div>
    <label for="to">Who do you want to say it to?</label>
    <input name="to" id="to" value="Mom">
  </div>
  <div>
    <button>Send my greetings</button>
  </div>
</form>

GET๊ณผ ๋‹ฌ๋ฆฌ URL์— ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.
๋˜ํ•œ request body์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์ง„๋‹ค.

POST / HTTP/2.0
Host: foo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

say=Hi&to=Mom

Content-Length๋Š” body์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  Content-type์€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์ง„ ๋ฆฌ์†Œ์Šค ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์œ„์˜ ์ •๋ณด๋“ค์„ ๋ณด์•˜์„ ๋•Œ GET/METHOD์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
1. ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ณด์•ˆ์ด ์œ ์ง€๋˜์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ์—๋Š” GET๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.(๋ฐ์ดํ„ฐ๊ฐ€ URL์— ๋‚˜ํƒ€๋‚˜๊ธฐ ๋•Œ๋ฌธ์—)

  1. ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ์–‘์ด ํฌ๋‹ค๋ฉด POST ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    ๋ช‡๋ช‡ ๋ธŒ๋ผ์šฐ์ €๋Š” URL ์‚ฌ์ด์ฆˆ๋ฅผ ์ œํ•œํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    ๋˜ํ•œ ๋งŽ์€ ์„œ๋ฒ„๋“ค์ด ๋ฐ›์•„๋“ค์ด๋Š” URL ์‚ฌ์ด์ฆˆ๋ฅผ ์ œํ•œํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

Addtional Learning

form ํƒœ๊ทธ ์—†์ด input๊ณผ button์„ ๊ตฌ์„ฑํ•ด๋„ ์ œ์ถœ์ด ๋ ๊นŒ?
formํƒœ๊ทธ์—†์ด input๊ณผ button์„ ๊ตฌ์„ฑํ•˜๋ฉด submit์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

form tag ์ž์ฒด์— ์„œ๋ฒ„๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๋‚ด์žฌ๋˜์–ด ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด form ํƒœ๊ทธ๋‚ด์—์„œ input,button ๋“ฑ์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

๋˜ํ•œ ๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ js๋กœ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๊ฐ’์„ ๊ฐ€๊ณตํ•˜์—ฌ ๋ณด๋‚ธ๋‹ค๊ฑฐ๋‚˜ ์ค‘๊ฐ„์—์„œ ์–ด๋– ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€,์ œ๊ฑฐ,์ˆ˜์ •์„ ํ•˜์—ฌ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด formํƒœ๊ทธ๋ฅผ selectํ•˜์—ฌ onsubmit์ด๋ฒคํŠธ๋ฅผ listenํ•˜์—ฌ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

const form = document.querySelector("form")
form.addEventListener("submit",(e)=> {~~~})

input์— label๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ด๊ณ  name attribute๋Š” ์™œ ๋‹ฌ๊นŒ?

์šฐ์„  input์˜ name attribute๋Š” ์„œ๋ฒ„์—์„œ input์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  js์—์„œ input์˜ name์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๋งŒ์•ฝ input์˜ name์ด ์—†๋Š” ์ƒํƒœ๋กœ ์ œ์ถœ์ด ๋œ๋‹ค๋ฉด input์˜ value๊ฐ’์€ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š๋Š”๋‹ค.

<label for="peas">Do you like peas?</label>
<input type="checkbox" name="peas" id="peas">

input์„ label๊ณผ ๊ฐ™์ด ์“ฐ๋Š” ์ด์œ ๋Š” ์›น ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด์„œ์ด๋‹ค.
๊ธฐ์ˆ ์  ๋„์›€์ด ํ•„์š”ํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๋ฉฐ ๋˜ํ•œ label๋ˆ„๋ฅผ ๋•Œ์— input์— focus,check ๋“ฑ์˜ ์ด๋ฒคํŠธ์˜ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด element์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ๋„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌ

form ํƒœ๊ทธ๋Š” ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ element์ด๋ฉฐ ์ž์ฒด์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋˜ํ•œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด ํ•ด๋‹น form์„ ์„ ํƒํ•˜์—ฌ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

method atrribute๋ฅผ ์ง€์ •ํ•˜๋Š”๋ฐ์— ์žˆ์–ด ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ์™€ ๋ณด์•ˆ์ƒ ์œ ์ง€๋˜์–ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ๋‹ค๋ฉด POST๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ ๊ฑฐ๋‚˜ ๋ณด์•ˆ์ƒ ๋…ธ์ถœ๋˜๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ๋ผ๋ฉด GET๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ input๋ฉ”์„œ๋“œ์—๋Š” label ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ™์ด๋Š” ์Šต๊ด€๋„ ์ค‘์š”ํ•˜๋‹ค.

formํƒœ๊ทธ๋ฅผ ์• ๋งคํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์ •ํ™•ํ•˜๊ฒŒ ๊ณต๋ถ€ํ•˜์—ฌ ์•Œ๊ฒŒ ๋˜๋‹ˆ ์•ž์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

Refrence

https://developer.mozilla.org/en-US/docs/Learn/Forms/Sending_and_retrieving_form_data#clientserver_architecture

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label#accessibility_concerns

0๊ฐœ์˜ ๋Œ“๊ธ€