본문으로 건너뛰기
KUWEB 로고

KUWEB

소속감 하나로 직접 팀을 꾸리고, 사용자 피드백 기반 리뉴얼과 마이그레이션을 이끈 동아리 사이트

담당
  • 팀장 및 프론트엔드 개발 (2023~)
  • 배포·운영 · 온라인 설문과 대면 인터뷰 기반 개선 주도
  • v3 단독 마이그레이션
기간
2026.06 — 2026.07
4인 팀 + 개인
KUWEB 대표 화면

Overview

프로젝트 한눈에 보기

배경
2023년부터 운영하며 교내 오케스트라 동아리의 정보와 연주회 기록, 클래식 게임 콘텐츠를 제공하는 공식 웹사이트입니다. 표시된 2026년 6~7월은 전체 운영 기간이 아니라 2차 마이그레이션 기간입니다.
구현 범위
v1·v2 팀 리딩 후 v3를 단독 마이그레이션했습니다. 사용자 피드백을 반영하고 Next.js·TypeScript·Firestore로 마이그레이션해 검색성과 운영 구조를 개선했습니다.

주요 기능

  1. 01

    동아리 소개 및 연혁

    동아리의 역사, 활동 내용, 주요 성과를 정리해 제공

  2. 02

    연주회 아카이브

    과거 연주회 정보와 사진, 영상 자료 제공

  3. 03

    클래식 기반 콘텐츠

    심리테스트, 이상형 월드컵, 능력고사 등 사용자 참여형 콘텐츠 제공

  4. 04

    반응형 UI

    다양한 디바이스 환경에서도 일관된 사용자 경험 제공

Technology

기술 선택 이유

핵심 사용 기술

  • Next.js

    동아리 소개와 연주회 정보를 사전 렌더링하거나 서버에서 제공해 검색 접근성을 개선했습니다. 별도 Express 서버가 담당하던 데이터 조회와 통계 기록을 Next.js 서버 기능으로 통합해 운영 구조를 단순화했습니다.

  • Tailwind CSS

    Next.js와 TypeScript로 마이그레이션하면서 스타일 작성 방식도 함께 정리했습니다. 기존 styled-components에서는 스타일을 위한 컴포넌트를 별도로 정의했는데, Tailwind는 마크업 안에서 스타일을 바로 확인하고 수정할 수 있다는 점이 편리했습니다. 또 간격이나 색상 같은 값을 정해진 유틸리티 기준으로 적용할 수 있어 스타일의 일관성을 유지하기 좋다고 판단했습니다.

  • Firebase · Firestore

    연주회와 연주곡, 월드컵과 후보 목록처럼 함께 조회하는 데이터 단위가 명확해 문서 기반 구조가 적합했습니다. 공개 콘텐츠는 서버, 게임 데이터는 클라이언트에서 조회하고 통계는 서버에서 Firestore 트랜잭션으로 기록했습니다. 별도 RDS 운영 경계를 줄이고 관리형 데이터베이스를 사용하기 위한 선택입니다.

사용 기술

  • AI Coding Agent(Codex, Claude Code)

    CRA·React 프론트엔드와 Express 백엔드로 분리된 기존 프로젝트의 페이지·컴포넌트·API 흐름을 분석하고 Next.js·TypeScript 기반 구조로 옮기는 과정에 활용했습니다. 기존 기능을 유지하면서 서버·클라이언트의 역할과 데이터 흐름을 재구성하고, 반복적인 코드 변환과 구조 변경 작업의 생산성을 높였습니다.

  • TypeScript

    연주회·게임마다 필요한 데이터와 전달할 값을 명확히 정리하기 위해 도입했습니다. 데이터를 잘못 사용하거나 필요한 값을 빠뜨린 부분을 실행 전에 확인하여 마이그레이션의 실수를 줄이고자 했습니다.

  • Firebase Admin SDK

    클라이언트에서 직접 처리할 필요가 없는 통계 기록과 데이터 갱신을 Next.js 서버 영역에서 수행하기 위해 사용했습니다. 게임 결과처럼 여러 사용자의 요청이 동시에 들어올 수 있는 데이터는 Firestore 트랜잭션으로 갱신해 읽기와 쓰기를 하나의 작업으로 처리했습니다.

  • TanStack Query

    게임 데이터 조회의 로딩·오류 상태와 캐시를 일관되게 관리했습니다. 게임별로 캐시를 구분하고, 변경 빈도가 낮은 후보·문제 데이터는 캐시가 유지되는 동안 불필요한 자동 재조회를 억제했습니다.

Key Points

주요 경험 및 설계 결정

  1. 01

    이미지 사전 로딩으로 이상형 월드컵의 반복 대기 해소

    문제

    클래식 이상형 월드컵에서 새로운 후보 이미지가 등장할 때마다 로딩이 발생해 선택 흐름이 끊겼습니다.

    64강의 32개 대결에서 새로운 이미지 요청이 반복되며, 대결마다 최대 약 2초의 대기가 발생했습니다. 반면 32강부터는 이미 로드한 이미지를 재사용해, 이미지 리소스가 캐시에서 약 2ms에 처리됐습니다.

    해결

    KUWEB 이미지 사전 로딩 적용 전 소요 시간
    64강의 32개 대결에서 새로운 이미지 요청이 반복되며, 대결마다 최대 약 2초의 대기 발생

    캐시된 이미지가 빠르게 처리되는 점에 착안해, 선정된 64장의 이미지를 게임 시작 전에 한 번에 병렬로 로딩했습니다. 이미지의 onload 이벤트로 준비 상태를 확인하고, 대기 중에는 로딩 UI를 제공했습니다. 게임 진행 중에는 미리 받아 둔 이미지를 사용하도록 구성했습니다.

    KUWEB 이미지 사전 로딩 처리 화면
    선정된 64장의 이미지를 게임 시작 전에 한 번에 병렬로 로딩
    KUWEB 이미지 사전 로딩 적용 후 소요 시간
    게임 진행 중에는 미리 받아 둔 이미지를 사용하도록 구성

    결과

    측정 환경에서 전체 사전 로딩은 약 2초가 걸렸고, 이후 캐시된 이미지의 리소스 처리 시간은 최대 약 2ms였습니다.

    64강에서 새로운 후보가 등장할 때마다 발생하던 대기를 게임 시작 전 한 번의 준비 과정으로 옮겼습니다. 다운로드 속도 자체를 높인 것이 아니라, 대기 시점을 조정해 게임 흐름을 개선했습니다.

  2. 02

    공개 콘텐츠의 검색 접근성 개선

    문제

    기존 CRA 기반 사이트는 JavaScript 실행 후 콘텐츠가 표시되어 초기 HTML에 동아리 소개와 연주회 정보가 담기지 않았습니다.

    또한 robots 정책이 홈을 제외한 대부분의 경로를 차단하고 있기에 검색 엔진이 공개 콘텐츠를 수집하기 어려웠습니다.

    해결

    Next.js App Router로 전환해 공개 콘텐츠를 사전 렌더링하거나 서버에서 제공했습니다.

    경로별 제목·설명·Open Graph·canonical을 설정하고, 실제 연주회 상세 페이지를 sitemap에 포함했습니다. 주요 이동 요소를 링크로 구성해 검색 엔진이 페이지 간 경로를 따라갈 수 있도록 했습니다. 공개 경로의 크롤링을 허용하도록 robots 정책도 수정했습니다.

    결과

    공개 페이지와 연주회 상세 페이지를 포함한 약 50개 URL을 sitemap에 등록했습니다. Google에서 특정 연주회를 검색했을 때 해당 상세 페이지가 노출되는 것을 확인했습니다.

    Google 검색 결과에 노출된 KUWEB 연주회 상세 페이지
    연주회 상세 페이지 검색 노출 결과

Gallery

  1. KUWEB 프로젝트 화면 1
  2. KUWEB 프로젝트 화면 2
  3. KUWEB 프로젝트 화면 3
  4. KUWEB 프로젝트 화면 4