동적 카테고리 시스템 구현하기 2

1부에서 Jekyll과 Liquid로 카테고리 시스템의 HTML 구조를 만들었습니다. 이번에는 JavaScript를 사용해서 사용자가 실제로 클릭하고 상호작용할 수 있는 동적 기능을 구현해보겠습니다.

DOM과 이벤트 리스너 기초

먼저 DOM(Document Object Model)에 대해 간단히 알아보겠습니다. DOM은 웹페이지의 HTML 구조를 JavaScript에서 조작할 수 있게 해주는 인터페이스입니다.

DOM 선택자 활용하기

// HTML이 이렇게 있다면
// <div class="subcategory-card" data-subcategory="genai-llm">
//     <h3 class="subcat-title">GenAI&LLM</h3>
// </div>

// JavaScript에서 이렇게 접근할 수 있어요
const card = document.querySelector(".subcategory-card");
console.log(card.dataset.subcategory); // "genai-llm"
console.log(card.querySelector(".subcat-title").textContent); // "GenAI&LLM"

이벤트 리스너 등록하기

카테고리 시스템에 필요한 이벤트 리스너들을 등록해보겠습니다:

// categories.html 하단에 추가
<script>
document.addEventListener('DOMContentLoaded', function() {
    // 필요한 DOM 요소들 선택
    const categoryItems = document.querySelectorAll('.category-item');
    const postsContainers = document.querySelectorAll('.posts-container');
    const categoryContent = document.querySelector('.category-content');

    // 카테고리 클릭 이벤트 처리
    categoryItems.forEach(item => {
        item.addEventListener('click', function() {
            const category = this.dataset.category;

            // 모든 카테고리에서 active 클래스 제거
            categoryItems.forEach(cat => cat.classList.remove('active'));

            // 클릭된 카테고리에 active 클래스 추가
            this.classList.add('active');

            // 해당 카테고리의 컨텐츠 표시
            showCategoryContent(category);
        });
    });

    // 서브카테고리 클릭 이벤트 처리
    function setupSubcategoryEvents() {
        const subcategoryCards = document.querySelectorAll('.subcategory-card');

        subcategoryCards.forEach(card => {
            card.addEventListener('click', function() {
                const subcategory = this.dataset.subcategory;
                showPostsBySubcategory(subcategory);
            });
        });
    }

    // 카테고리 컨텐츠 표시 함수
    function showCategoryContent(category) {
        postsContainers.forEach(container => {
            if (container.dataset.category === category) {
                container.style.display = 'block';

                // 애니메이션 효과
                container.style.opacity = '0';
                setTimeout(() => {
                    container.style.opacity = '1';
                }, 50);
            } else {
                container.style.display = 'none';
            }
        });

        // 서브카테고리 이벤트 재설정
        setupSubcategoryEvents();
    }

    // 서브카테고리별 포스트 표시 함수
    function showPostsBySubcategory(subcategory) {
        const allPosts = document.querySelectorAll('.post-item');

        allPosts.forEach(post => {
            if (post.dataset.subcategory === subcategory) {
                post.style.display = 'block';
                post.classList.add('fade-in');
            } else {
                post.style.display = 'none';
                post.classList.remove('fade-in');
            }
        });
    }

    // 초기 로드 시 첫 번째 카테고리 활성화
    if (categoryItems.length > 0) {
        categoryItems[0].click();
    }
});
</script>

이벤트 리스너란? 웹페이지에서 사용자의 동작(이벤트)을 감지하고 반응하는 자바스크립트 함수입니다.

주요 이벤트 종류로는

  • click: 마우스 클릭
  • input: 입력 필드에 텍스트 입력
  • keydown: 키보드 누름
  • scroll: 스크롤
  • load: 페이지 로딩 완료

이벤트가 일어나면 어떤 동작을 할지 이렇게 하면 설정할 수 있습니다. 물론 매우 초보적인 내용이기 때문에 원하는 기능이 있다면 더 공부해야겠죠! 그치만 이 블로그에서 제가 하고싶은 동적 카테고리 시스템은 이 정도 입니다. 이제 사용자는 (제가 또 고장내지만 않는다면 … )카테고리를 클릭해서 전환할 수 있습니다.