React와 같은 새로운 기술 프레임워크에 능숙해지는 것은 실제적인 노출 없이는 당황스러울 수 있습니다. 실제 애플리케이션을 구축하는 행위는 개발자가 시스템의 원리와 기능을 파악할 수 있는 탁월한 수단으로 작용합니다.

React를 사용하여 간단한 할 일 목록을 작성함으로써 이 자바스크립트 라이브러리의 기본 원리에 대한 이해도를 높입니다.

할 일 목록 작성을 위한 전제 조건

HTML, CSS, JavaScript, ES6, React는 물론 Node.js와 JavaScript 패키지 관리자인 npm을 알아야 합니다. 또한 Visual Studio Code와 같은 코드 편집기를 사용해야 합니다.

본 프로젝트는 다양한 구성 요소와 기능의 시각적 모양에 대한 기본 원칙으로 사용되는 특정 CSS(Cascading Style Sheet) 프레임워크를 사용합니다.

 /* styles.css */
.App {
  font-family: sans-serif;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

.Todo {
  background-color: wheat;
  text-align: center;
  width: 50%;
  padding: 20px;
  box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
  margin: auto;
}

ul {
  list-style-type: none;
  padding: 10px;
  margin: 0;
}

button {
  width: 70px;
  height: 35px;
  background-color: sandybrown;
  border: none;
  font-size: 15px;
  font-weight: 800;
  border-radius: 4px;
  box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
}

.input {
  border: none;
  width: 340px;
  height: 35px;
  border-radius: 9px;
  text-align: center;
  box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
}

.Top {
  display: flex;
  justify-content: center;
  gap: 12px;
}

li {
  display: flex;
  justify-content: space-evenly;
  align-items: center;
  padding: 10px;
}

li:before {
  content: "*";
  margin-right: 5px;
}

프로젝트 환경 설정

개발 프로세스의 초기 단계에는 프로젝트 설정에 필요한 적절한 명령과 파일 활용이 포함됩니다. 시작하려면 터미널을 열고 다음 명령을 실행하여 새 React 프로젝트를 설정합니다:

 npx create-react-app todo-list 

필요한 파일과 패키지를 설치한 후 “할 일 목록”으로 지정된 새 React 애플리케이션에 필요한 구성 요소를 설정하는 데 몇 분 정도 걸릴 수 있습니다. 프로세스가 만족스럽게 진행되고 있음을 확인하면 올바른 경로를 시작했음을 확신할 수 있습니다.

관련 파일 시스템을 참조하고 지정된 지시어를 사용하여 앞서 언급한 디렉토리를 탐색하면 최근에 설립된 벤처의 위치로 이동할 수 있을 것입니다.

 cd todo-list 

다음 명령을 실행하여 로컬 컴퓨터에서 프로젝트를 실행하세요:

 npm start 

선호하는 인터넷 브라우저에서 에 접속하여 웹 브라우저를 통해 프로젝트를 관찰하세요.

이 글도 확인해 보세요:  JavaScript를 사용하여 이미지에 X 및 Y 좌표를 오버레이하는 방법

요구 사항에 불필요한 것으로 간주되는 “src” 폴더의 모든 파일을 삭제합니다. 특히 App.css, App.test.js, logo.svg, reportWebVitals.js 및 setupTests.js를 삭제합니다.

사용 가능한 파일에서 가져오기 문을 검사하고 제거된 콘텐츠에 대한 참조를 모두 제거하세요.

할 일 목록 컴포넌트 생성

할 일 목록에 필요한 코드 구현은 소스 폴더 내에 있는 TodoList.js 파일 내에서 수행됩니다. 제대로 작동하는지 확인하려면 테스트 목적으로 다음 코드 조각을 포함하세요.

 import React from 'react';

const TodoList = () => {
    return (
        <div>
            <h2>Hello World </h2>
        </div>
    );
};

export default TodoList;
 

App.js 파일을 열고 TodoList 컴포넌트를 가져왔는지 확인하세요.그런 다음 앱 컴포넌트 본문 내에서 JSX 구문을 사용하여 TodoList 컴포넌트를 렌더링합니다. 결과 코드는 다음 예시와 비슷해야 합니다.

 import React from 'react';
import './styles.css'
import TodoList from './TodoList';

const App = () => {
    return (
        <div>
            <TodoList />
        </div>
    );
};

export default App;

localhost:3000을 통해 액세스할 수 있는 로컬 브라우저에 표시되는 웹 페이지를 확인하여 “Hello World”가 굵은 글꼴로 눈에 잘 띄게 표시되는지 확인합니다. 모든 것이 올바르게 작동하면 다음 단계로 진행하세요.

입력 및 입력 변경 처리

이 단계를 구현하면 React 패키지에서 사용 상태 훅을 가져와서 텍스트 입력 필드에 작업을 입력할 때 이벤트를 활성화할 수 있습니다. useState 훅은 상태를 효율적으로 관리할 수 있는 React에서 제공하는 편리한 도구입니다.

 import React, { useState } from 'react'; 

useState 훅을 사용하여 초기값이 빈 문자열인 “inputTask”로 지정된 상태 변수를 생성합니다. 또한, 사용자 입력에 따라 “inputTask”의 값을 업데이트하는 “setInputTask” 함수를 부여합니다.

 const [inputTask, setInputTask] = useState(""); 

“handleInputChange” 함수는 새 작업 값에 대한 인수를 받는 “setInputTask” 함수를 활용하여 “inputTask” 상태를 업데이트하도록 설계되었습니다. 이벤트의 대상 값은 event.target.value를 통해 추출할 수 있으며, 이 함수는 입력 필드의 값이 수정될 때마다 실행됩니다.

 const handleInputChange = (event) => {
    setInputTask(event.target.value);
};

다음 코드 스니펫은 두 개의 JSX 요소를 반환합니다. 첫 번째 요소는 “내 할 일 목록”을 표시하는 제목이고, 두 번째 요소는 다양한 속성을 가진 입력 필드입니다. 구체적으로 “type” 속성은 “text”로 설정되어 있고, “value”는 중괄호를 사용하여 상태 변수 “inputTask”에 바인딩되어 있으며, “onChange”는 입력 필드의 값이 변경될 때 “handleInputChange” 함수를 트리거하여 “inputTask” 상태 변수의 값을 업데이트합니다.

 <div className="Todo">
    <h1>My To-Do List</h1>
    <div className="Top">
        <input className="input" type="text" value={inputTask}
           onChange={handleInputChange} placeholder="Enter a task" />

버튼을 클릭하면 사용자가 입력한 작업을 기존 작업 목록에 추가하는 버튼을 인터페이스에 추가하세요.

         <button className="btn">ADD</button>
   </div>
</div>

이 시점에서 브라우저 출력의 모양은 다음과 같습니다:

이 글도 확인해 보세요:  자바스크립트에서 Intl API를 사용하는 방법

‘ADD’ 버튼에 기능 추가

useState 훅을 활용하여 처음에는 빈 배열을 보유하는 ‘list’라는 상태 변수를 만듭니다. ‘setList’ 함수는 사용자 입력에 따라 결정된 작업 목록을 저장하는 역할을 담당합니다.

 const [list, setList] = useState([]); 

‘ADD’ 버튼을 클릭하면 핸들AddTodo 함수가 실행되어 Todo 항목을 인수로 받습니다. 이 함수는 새로운 작업 인스턴스를 생성하여 Math.random() 메서드를 사용하여 생성된 임의의 식별자를 할당하고 제공된 입력과 일치하도록 제목을 설정합니다.

목록 상태를 업데이트하려면 스프레드 연산자 […list]를 사용하여 현재 작업 목록을 포함하는 새 배열을 구성해야 합니다. 새로 추가된 작업을 배열의 끝에 추가함으로써 원래 상태 배열이 변경되지 않도록 합니다. 그 후 입력 태스크 상태를 빈 문자열로 재설정하면 버튼을 클릭할 때 사용자의 편의를 위해 입력 필드가 지워집니다.

 const handleAddTodo = (todo) => {
    const newTask = {
        id: Math.random(),
        todo: todo
   };

   setList([...list, newTask]);
    setInputTask('');
};

onClick 속성을 “ADD” 텍스트가 있는 버튼 요소에 포함시킵니다. 클릭하면 handleAddTodo 함수가 트리거되어 목록 상태에 새 작업을 추가합니다.

 <button onClick={() => handleAddTodo(inputTask)}>ADD</button>  

애플리케이션의 기능은 사용자가 작업을 입력한 후 “추가” 버튼을 클릭하면 입력 필드에 내용이 없어지도록 하는 것입니다. 이 작업이 문제없이 수행되는 경우 시스템은 다음 단계로 진행됩니다.

삭제 버튼 추가

궁극적인 목표는 오류 발생 시 또는 완료 시 사용자가 작업을 삭제할 수 있는 기능을 제공하는 것입니다. 이를 위해 사용자가 특정 작업의 ‘삭제’ 버튼을 클릭할 때 이벤트 리스너 역할을 하는 `handleDeleteTodo`라는 함수를 구현합니다. 이 함수는 작업의 고유 식별자를 매개변수로 받아야 합니다.

함수 컴포넌트 내에서 “list” 배열에 “filter” 메서드를 사용하여 해당 식별자를 가진 작업을 생략하는 새 컬렉션 “newList”를 생성합니다. “filter” 메서드는 “list” 배열 내의 모든 요소를 순회하여 지정된 전제 조건을 충족하는 컴포넌트로만 구성된 컬렉션을 반환합니다. 이 경우 각 할당의 ID가 인수로 제공된 ID와 동일한지 확인합니다. “setList(newList)”를 호출하여 “list” 상태를 수정하면 상태가 정제된 컬렉션으로 설정되어 목록에서 일치하는 식별자를 가진 작업이 제거됩니다.

 const handleDeleteTodo = (id) => {
    const newList = list.filter((todo) =>
        todo.id !== id
   );

    setList(newList);
};

`map()` 메서드를 사용하여 `list` 배열의 항목을 반복하여 해당 `todo` 객체에서 각 작업을 나타내는 `

이 글도 확인해 보세요:  HTTP와 HTTPS: 차이점은 무엇인가요?
  • ` 요소의 새 배열을 만듭니다. 각 목록 항목이 React에 의해 고유하게 식별되도록 하려면, `key` 속성을 각 `todo` 객체의 `id` 속성으로 설정합니다. 이렇게 하면 목록의 내용이 변경될 때 React가 DOM을 효율적으로 업데이트할 수 있습니다.

    목록에 있는 각 작업의 ‘todo’ 속성에 액세스하여 상태를 검색한 다음, 작업의 고유 식별자를 인수로 전달하면서 “handleDeleteTodo” 함수를 호출하기 위해 누를 수 있는 버튼을 생성하여 목록에서 항목을 제거할 수 있도록 합니다.

     <ul>
    { list.map((todo) => (
       <li className="task" key={todo.id}>
            {todo.todo}
            <button onClick={() => handleDeleteTodo(todo.id)}>Delete</button>
        </li>
    ))}
    </ul>

    최종 코드는 이 형식과 비슷해야 합니다:

     import React, { useState } from 'react';

    const TodoList = () => {
        const [inputTask, setInputTask] = useState('');
        const [list, setList] = useState([]);

        const handleAddTodo = () => {
            const newTask = {
                id: Math.random(),
                todo: inputTask
            };

           setList([...list, newTask]);
            setInputTask('');
        };

       const handleDeleteTodo = (id) => {
            const newList = list.filter((todo) => todo.id !== id);
            setList(newList);
        };

       const handleInputChange = (event) => {
            setInputTask(event.target.value);
        };

       return (
            <div className="Todo">
                <h1>My To-Do List</h1>

                <div className="Top">
                    <input className="input" type="text" value={inputTask}
                       onChange={handleInputChange} placeholder="Enter a task" />

                    <button className="btn" onClick={handleAddTodo}>ADD</button>
                </div>

               <ul>
                    { list.map((todo) => (
                        <li className="task" key={todo.id}>
                            {todo.todo}
                            <button onClick={() => handleDeleteTodo(todo.id)}>
                               Delete
                           </button>
                        </li>
                    ))}
                </ul>
            </div>
        );
    };

    export default TodoList;

    작업의 최종 결과물에는 추가 및 삭제 버튼이 모두 지정된 방식으로 작동합니다.

    작업의 추가와 삭제가 모두 가능한 작업 목록을 만든 성과는 주목할 만합니다. 더 큰 성공을 거두기 위해 외관과 기능을 개선하는 것을 고려해보세요.

    실제 프로젝트를 사용하여 React 학습하기

    실습은 효과적인 학습 방법이 될 수 있습니다. 실습을 통해 React 개념과 모범 사례를 실무에 적용하여 프레임워크에 대한 이해를 강화할 수 있습니다. 수많은 프로젝트가 있으므로 자신에게 맞는 프로젝트를 찾아야 합니다.

  • By 김민수

    안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.