본문 바로가기
프로그래밍/Javascript

[Javascript] 실전 프로젝트 : 작지만 탄탄한 예제로 자바스크립트 역량 강화하기

by iwbap 2024. 12. 8.
728x90
반응형

들어가며

프로그래밍 언어를 배울 때 이론과 문법을 익히는 것만으로는 부족합니다. 실제로 무언가를 만들어보면서 문제를 해결하고, 아이디어를 구현할 때 배우는 것이 훨씬 많습니다. 지금까지 우리는 자바스크립트 기초, 핵심 문법 심화, 브라우저 환경 이해, 디버깅과 테스트에 이르기까지 탄탄한 기반을 쌓았습니다.

이번 글에서는 그동안 습득한 개념을 작은 프로젝트에 적용해보면서 경험을 쌓는 데 초점을 맞춥니다. Todo List 앱, 날씨 API 대시보드, 메모 앱, 타이머 & 스톱워치 같은 간단하지만 의미 있는 예제를 단계별로 구현하고 확장하는 과정을 통해 실무에 한 발 더 가까워질 수 있습니다. 이 프로젝트들을 거치며 DOM 조작, 이벤트 처리, Fetch API 활용, 로컬 스토리지 저장, 상태 관리, 디버깅, 테스트 등을 실전에 적용하는 경험을 해보세요.

1. Todo List 앱 구현 : DOM 조작과 이벤트 처리의 종합 연습

1-1. 요구사항 정리

  • 사용자는 입력 필드에 할 일을 입력한 뒤 “추가” 버튼을 눌러 새로운 할 일을 목록에 추가할 수 있습니다.
  • 각 할 일 옆에 완료 체크박스가 있으며, 체크 시 완료 상태로 표시됩니다.
  • 삭제 버튼을 눌러 해당 할 일을 목록에서 제거할 수 있습니다.
  • 페이지를 새로고침해도 데이터가 유지되도록 로컬 스토리지를 사용합니다.

1-2. 구현 포인트

  • DOM 조작 : createElement, appendChild 등을 사용해 할 일 목록을 동적으로 추가
  • 이벤트 처리 : 제출 버튼 클릭, 체크박스 상태 변경, 삭제 버튼 클릭 시 핸들러 등록
  • 로컬 스토리지 : 할 일 목록을 배열 형태로 관리하고, 변경 시 마다 JSON으로 직렬화하여 localStorage.setItem()에 저장. 초기 로드시 localStorage.getItem()으로 복원

1-3. 예제 코드 스니펫

[html]

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8"/>
  <title>Todo List</title>
  <style>
    .done { text-decoration: line-through; color: gray; }
  </style>
</head>
<body>
  <h1>할 일 목록</h1>
  <form id="todo-form">
    <input type="text" id="todo-input" placeholder="할 일을 입력하세요" />
    <button type="submit">추가</button>
  </form>
  <ul id="todo-list"></ul>

  <script>
    const form = document.getElementById('todo-form');
    const input = document.getElementById('todo-input');
    const list = document.getElementById('todo-list');

    let todos = JSON.parse(localStorage.getItem('todos')) || [];

    function saveTodos() {
      localStorage.setItem('todos', JSON.stringify(todos));
    }

    function render() {
      list.innerHTML = '';
      todos.forEach((todo, index) => {
        const li = document.createElement('li');
        const checkbox = document.createElement('input');
        checkbox.type = 'checkbox';
        checkbox.checked = todo.done;
        checkbox.addEventListener('change', () => {
          todo.done = checkbox.checked;
          saveTodos();
          render();
        });

        const span = document.createElement('span');
        span.textContent = todo.text;
        if (todo.done) {
          span.classList.add('done');
        }

        const btn = document.createElement('button');
        btn.textContent = '삭제';
        btn.addEventListener('click', () => {
          todos.splice(index, 1);
          saveTodos();
          render();
        });

        li.appendChild(checkbox);
        li.appendChild(span);
        li.appendChild(btn);
        list.appendChild(li);
      });
    }

    form.addEventListener('submit', (e) => {
      e.preventDefault();
      const text = input.value.trim();
      if (text !== '') {
        todos.push({ text, done: false });
        saveTodos();
        render();
        input.value = '';
      }
    });

    render();
  </script>
</body>
</html>

 

이 Todo List 앱을 통해 DOM 조작, 이벤트, 로컬 스토리지 활용 능력을 종합적으로 단련할 수 있습니다.

 

 

2. 날씨 API 대시보드 : 비동기 프로그래밍과 Fetch API 활용

2-1. 요구사항 정리

  • 사용자는 도시 이름을 입력하고 “조회” 버튼을 누르면 해당 도시의 현재 날씨 정보(온도, 날씨 아이콘, 상태 메시지)를 화면에 표시합니다.
  • OpenWeatherMap 같은 공용 API를 사용해 실시간 데이터를 받아옵니다.
  • 비동기 요청 처리, 에러 상황(잘못된 도시명) 대처를 연습합니다.

2-2. 구현 포인트

  • Fetch API : fetch()로 외부 API 호출
  • async / await : 비동기 코드를 동기식으로 명확히 표현
  • 에러 처리 : 도시명이 잘못되었을 경우 예외 처리 및 사용자에게 안내 메시지 표시

2-3. 주요 코드 아이디어

[js]

async function getWeather(city) {
  const apiKey = 'YOUR_API_KEY'; 
  const url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`;
  const response = await fetch(url);
  if(!response.ok) {
    throw new Error('도시 정보를 가져올 수 없습니다.');
  }
  return await response.json();
}

 

이후 DOM에 데이터를 반영하고 에러 발생 시 경고 메시지를 띄워보세요. 이 과정을 통해 비동기 처리, API 연동, 예외 처리에 능숙해질 수 있습니다.

 

 

3. 메모 앱 : 데이터 지속성과 UX 개선

3-1. 요구사항 정리

  • 사용자는 제목과 내용 필드를 입력하고 “저장” 버튼을 누르면 메모를 생성할 수 있습니다.
  • 생성된 메모는 목록 형태로 표시되며, 클릭 시 내용 조회 가능
  • 메모는 로컬 스토리지에 저장되어 페이지 새로고침 후에도 유지
  • 메모 수정 및 삭제 기능 추가로 확장 가능

3-2. 구현 포인트

  • CRUD 작업 연습 : Create(추가), Read(조회), Update(수정), Delete(삭제) 기능을 모두 경험
  • 상태 관리 : 메모 목록을 배열로 관리하고, 변경 시 마다 로컬 스토리지에 반영
  • UX 개선 : 검색 기능을 추가하거나 최근 메모를 맨 위에 표시하는 등 확장성을 고려

이 앱을 통해 데이터 유지와 상태 관리를 한 단계 더 발전시키며, 배열과 객체 조작 능력을 한층 향상시킬 수 있습니다.

4. 타이머 & 스톱워치 : 시간 기반 로직 처리 연습

4-1. 요구사항 정리

  • 타이머 : 사용자가 특정 시간을 입력하면, 1초씩 줄어드는 카운트다운 표시
  • 시간 종료 시 알림 표시
  • 스톱워치 : 시작, 일시정지, 초기화 버튼 구현으로 증가하는 시간 표시
  • DOM 업데이트로 매초 화면에 현재 남은 시간 혹은 경과 시간을 반영

4-2. 구현 포인트

  • setInterval(), clearInterval() 사용 : 주기적인 이벤트 처리
  • 이벤트 핸들링 : 시작 / 정지 / 리셋 버튼 동작
  • 상태 변수 관리 : 현재 남은 시간, 현재 경과 시간 등을 변수로 관리

이 예제로 시간 기반 로직 구현 능력을 키우며, DOM과 이벤트를 실전적으로 연결하는 훈련을 할 수 있습니다.

 

 

마무리 : 실전 예제를 통해 개념에서 실무로

위의 실전 프로젝트들은 단순한 예제에 불과하지만, 각 프로젝트는 실제 서비스 개발에 필요한 핵심 기술들을 압축적으로 담고 있습니다.

  • Todo List 앱 : CRUD 로직, DOM 조작, 로컬 스토리지
  • 날씨 API 대시보드 : 비동기 프로그래밍, API 연동, 에러 처리
  • 메모 앱 : CRUD 확장, 상태 관리, 검색 기능 등 UX 개선
  • 타이머 & 스톱워치 : 시간 기반 로직, 이벤트 관리

이러한 프로젝트를 통해 개념을 손으로 직접 구현해봄으로써, 머릿속 지식이 실전 기술로 변환되는 경험을 하게 됩니다. 또한, 각 프로젝트에서 발생하는 소소한 에러나 로직 문제를 디버깅하며 문제 해결 능력을 더욱 강화할 수 있습니다.

추가적으로 다음과 같은 사항들을 고려해보세요.

  • 테스트 코드 작성 : 핵심 함수 로직에 대한 유닛 테스트를 작성해보며, 코드 품질 관리 능력 향상
  • 코드 구조화 : 프로젝트 규모가 커질 경우, 모듈 시스템과 폴더 구조 개선을 통해 유지보수성을 높일 수 있습니다.
  • 디자인 개선 : CSS나 UI 라이브러리와 결합하여 좀 더 세련된 사용자 인터페이스를 구현할 수 있습니다.

이제 실전 예제를 통해 자신감을 쌓았다면, 다음 단계에서 프레임워크 기초를 익히며 자바스크립트 개발자로서 성장하는 길을 탐색해보는 것은 어떨까요?

728x90
반응형