Skip to main content

Command Palette

Search for a command to run...

체크박스 인풋 태그 활용 주의 사항 정리

체크박스 인풋을 다룰 때 주의할만한 점을 정리해봤습니다.

Updated
3 min readView as Markdown
체크박스 인풋 태그 활용 주의 사항 정리
T

Software engineer for web tech. Interested in sustainable growth as software engineer.

체크박스 인풋 다룰 때 주의 사항 5가지

  1. 이벤트 핸들링: changeclick 이벤트를 적절히 사용하여 체크박스의 상태 변경을 감지하고, 상태를 업데이트해야 합니다. 일반적으로 change 이벤트가 체크박스 상태 관리에 더 적합합니다.

  2. 접근성(Accessibility): 모든 사용자가 체크박스를 쉽게 사용할 수 있도록, 키보드 및 스크린 리더 접근성을 고려해야 합니다. 예를 들어, label을 사용하여 체크박스와 연관된 텍스트를 명확히 해야 합니다.

  3. 폼 제출 동작: 폼(form 태그) 내에서 체크박스를 사용할 경우, 체크박스가 체크되었을 때와 체크되지 않았을 때의 폼 제출 값(value)을 처리해야 합니다. 체크박스의 value 속성과 폼 제출 시 서버로 전송되는 데이터를 관리해야 합니다.

  4. 초기 상태 관리: SPA일 경우 체크박스의 초기 체크 상태를 관리하기 위해 상태나 props를 사용해야 합니다. 컴포넌트가 마운트될 때 체크박스의 초기 상태를 설정하고, 필요에 따라 상태를 업데이트해야 합니다.

  5. 다중 체크박스 관리: 다중 체크박스를 사용하는 경우, 각 체크박스의 선택 여부를 배열이나 객체 등의 구조로 관리해야 합니다. 이를 통해 복잡한 폼에서도 체크박스 그룹의 상태를 효율적으로 관리할 수 있습니다.

크게 다섯 가지 주의 사항이 있었는데요, 그 중 첫 번째인 이벤트 핸들링에 초점을 맞춰 이야기 해 보겠습니다.

이벤트 핸들링에 왜 주의해야 할까?

change 이벤트와 click 이벤트의 차이

  • change 이벤트: 체크박스의 상태가 변경될 때마다 발생합니다. 이는 체크박스의 체크 상태(체크됨/해제됨)가 변경될 때 이벤트가 발생하며, 폼 요소의 상태 관리에 가장 적합한 이벤트입니다.

  • click 이벤트: 체크박스를 클릭할 때 발생합니다. 사용자가 체크박스를 클릭하는 모든 경우에 이벤트가 발생하며, 클릭 자체에 반응하는 UI 동작 구현에 유용합니다.

리액트에서 사용할 때 주의할 점

리액트는 선언적 UI 패러다임을 활용하는 것이 권장되고, 사용자 입력에 따른 상태를 JS단에서 관리하게 되는 경우가 많습니다. 이런 환경에서 체크박스와 같은 폼 요소를 다룰 때 onClick 이벤트를 사용하는 것은 의도하지 않은 문제를 일으킬 수 있습니다. 대신 onChange 이벤트를 사용하여 컴포넌트의 상태를 업데이트하는 것이 권장됩니다.

예시 코드 -onClick

import React, { useState } from 'react';

function CheckboxWithOnClick() {
  const [isChecked, setIsChecked] = useState(false);

  const handleClick = (event: React.MouseEvent<HTMLInputElement>) => {
    // 사용자가 체크박스를 클릭했을 때의 조건을 검사하지만,
    // 조건에 따라 이벤트를 취소하려고 해도, 이미 클릭은 발생했기 때문에
    // UI와 실제 상태 사이에 불일치가 발생할 수 있음.
    if (someCondition) { // ⚠ someCondition은 sudo 코드
      event.preventDefault(); // 이 코드는 체크박스 상태 변경을 막지 못함.
      // 추가 로직...
    }
    setIsChecked(!isChecked); // 이 로직은 조건과 상관없이 실행됨.
  };

  return (
    <div>
      <input
        type="checkbox"
        checked={isChecked}
        onClick={handleClick}
      />
      <label>{isChecked ? 'Checked' : 'Not checked'}</label>
    </div>
  );
}

이 예시에서, 만약 someConditiontrue일 때 체크박스의 상태 변경을 막으려고 한다면, onClick 이벤트 핸들러에서 event.preventDefault()를 호출해도 체크박스의 상태는 이미 변경된 후입니다. 이는 onClick이 DOM 요소에서 발생하는 실제 클릭 이벤트에 반응하기 때문에 생기는 문제로, preventDefault는 폼 제출 같은 기본 동작을 막는 데는 효과적이지만, 체크박스의 체크 상태 같은 것을 제어하는 데는 적합하지 않습니다.

그리고 만약 키보드를 통해서 입력이 됐을 때도 감지하지 못해 상태가 적절히 변경되지 않을 가능성도 있습니다.

예시 코드 - onChange

import React, { useState } from 'react';

function CheckboxComponent() {
    const [isChecked, setIsChecked] = useState(false);

    const handleChange = (event) => {
        setIsChecked(event.target.checked);
    };

    return (
        <div>
            <input
                type="checkbox"
                checked={isChecked}
                onChange={handleChange}
            />
            <label>{isChecked ? 'Checked' : 'Not checked'}</label>
        </div>
    );
}

이 예시에서는 onChange 이벤트를 사용하여 체크박스의 상태를 관리하고 있습니다. 사용자가 체크박스를 클릭하여 상태를 변경할 때마다, handleChange 함수가 호출되어 isChecked 상태가 업데이트됩니다. 만약 키보드나 다른 수단으로 값이 업데이트 되더라도 change이벤트는 호출되므로 상태변화에 따른 값의 변화도 보장이 됩니다.

More from this blog

프론트엔드는 경계를 다루는 직무가 되어간다

프론트엔드는 원래도 복잡했습니다. 브라우저마다 다른 렌더링, 상태 동기화, 성능, 접근성 — 화면 하나 제대로 만드는 데 신경 쓸 게 늘 많았습니다. 다만 그 복잡함은 대체로 한 방향을 향했습니다. 이 UI를 어떻게 만들까, 상태를 어떻게 관리할까, 클릭하면 무엇이 바뀌어야 할까. 그런데 요즘 질문의 축이 하나 더 늘고 있습니다. 이 UI는 서버에서 먼저

Jul 20, 20266 min read

AI가 코드를 짜는 시대, 나는 리뷰를 못 따라가고 있었다

솔직히 말하면, 요즘 PR을 제때 리뷰하지 못하고 있습니다. 개발 속도는 빨라졌는데 리뷰 속도는 그대로입니다. 예전엔 하루 이틀이면 처리하던 게 이제는 며칠씩 밀립니다. 처음엔 제가 게을러진 탓인가 싶었습니다. 돌아보니 그게 아니었습니다. AI 도구를 쓰면서 코드가 쏟아지는 속도가 달라졌습니다. 한 사람이 만들어내는 코드 양이 예전과 비교가 안 됩니다. P

Mar 18, 20263 min read
AI가 코드를 짜는 시대, 나는 리뷰를 못 따라가고 있었다

테드풀의 한 입 지식

78 posts

가볍게 정리하는 기록들입니다.