통합 도서 검색·수업자료 포털
교과서·참고서·단행본을 한 번에 찾는 통합 검색, 도서별 수록 자료 다운로드, 자료 중심 독서 교육 제안 카드, 작가·장르 탐색을 포함한 이용자 사이트를 Spring Boot + Thymeleaf + React 기반으로 설계·구현하는 프로젝트입니다.
프로젝트 개요
교과서·참고서·단행본을 한 번에 찾는 통합 검색, 도서별 수록 자료 다운로드, 자료 중심 독서 교육 제안 카드, 작가·장르 탐색을 포함한 이용자 사이트를 Spring Boot + Thymeleaf + React 기반으로 설계·구현하는 프로젝트입니다.
작업 범위
- 통합 검색: 하나의 검색창에서 도서명·작가명·시리즈를 동시에 조회하고 교과서·참고서·단행본을 구분해 보여줍니다
- 도서 상세·자료 다운로드: 도서 상세에서 수록 자료 목록을 확인하고 파일 유형별로 내려받습니다
- 독서 교육 제안: 자료 중심 카드 UI로 독서 교육 제안 자료를 보여주고 목록 안에서 바로 검색합니다
- 작가·카테고리 탐색: 작가별·장르별로 도서를 탐색하고 작가 상세에서 대표작과 관련 자료를 확인합니다
주요 업무
- 통합 검색 화면: GET 쿼리스트링 기반 검색으로 결과 URL을 그대로 공유할 수 있고, 유형별 탭과 필터 레일로 결과를 좁힙니다
- 도서 상세·자료 다운로드 화면: 도서와 연동된 자료를 유형별 그룹으로 보여주고 다운로드 이력을 기록합니다
- 독서 교육 제안 화면: 하나의 자료가 여러 도서에 연동된 모습을 카드 안 도서 칩으로 표현하고 상단 고정 자료를 먼저 노출합니다
- 작가·카테고리 탐색 화면: 도서가 여러 작가와 여러 장르에 동시에 속하는 구조를 반영한 탐색 화면입니다



프로젝트 핵심 과제
한글 도서명·작가명 부분 일치 검색에서 형태소 단위 차이로 결과가 누락될 수
ngram 파서와 보조 정렬 규칙으로 대응합니다
하나의 자료가 수십 권의 도서에 연동될 때 목록 쿼리의 N+1 문제가 생길 수
배치 페치와 프로젝션 조회로 대응합니다
교과서·참고서·단행본의 메타데이터 항목이 달라 통합 결과 카드의 표시 규칙이 복잡해질 수
유형별 카드 변형으로 대응합니다
서버 렌더링 화면과 React 화면 사이에서 검색 상태가 어긋날 수
URL을 단일 상태 출처로 삼아 대응합니다
핵심 기능 상세
통합 검색
하나의 검색창에서 도서명·작가명·시리즈를 동시에 조회하고 교과서·참고서·단행본을 구분해 보여줍니다. GET 쿼리스트링 기반 검색으로 결과 URL을 그대로 공유할 수 있고, 유형별 탭과 필터 레일로 결과를 좁힙니다.
- Spring Data JPA Specification으로 도서·작가·시리즈 복합 조건을 동적 쿼리로 조합
- MySQL FULLTEXT 인덱스(ngram 파서)로 한글 부분 일치 검색 구성
- React 필터 레일 상태를 URL 쿼리스트링과 동기화하여 검색 결과 링크 공유 지원
도서·작가·시리즈를 단일 검색 API로 묶고 유형 구분 배지로 노출하는 통합 검색 구조를 설계합니다.


도서 상세·자료 다운로드
도서 상세에서 수록 자료 목록을 확인하고 파일 유형별로 내려받습니다. 도서와 연동된 자료를 유형별 그룹으로 보여주고 다운로드 이력을 기록합니다.
- Spring MVC 스트리밍 응답과 Content-Disposition 헤더로 한글 파일명 다운로드 처리
- 도서-자료 연결 테이블을 조인하여 상세 화면의 자료 목록을 한 번의 쿼리로 구성
- Thymeleaf 프래그먼트로 도서 상세 영역을 재사용 가능한 단위로 분리
하나의 자료가 여러 도서에 연동되는 구조를 상세 화면에서 자연스럽게 노출하는 데이터 모델을 설계합니다.


독서 교육 제안
자료 중심 카드 UI로 독서 교육 제안 자료를 보여주고 목록 안에서 바로 검색합니다. 하나의 자료가 여러 도서에 연동된 모습을 카드 안 도서 칩으로 표현하고 상단 고정 자료를 먼저 노출합니다.
- React 카드 그리드와 디바운스 목록 내 검색으로 서버 호출 횟수 제어
- 자료-도서 N:M 관계를 DTO 프로젝션으로 내려 카드 하단 도서 칩 렌더링
- Intersection Observer 기반 무한 스크롤로 긴 자료 목록 분할 로딩
자료 하나에 여러 도서를 연결해 보여주는 N:M 카드 구조를 React 컴포넌트로 구현합니다.


작가·카테고리 탐색
작가별·장르별로 도서를 탐색하고 작가 상세에서 대표작과 관련 자료를 확인합니다. 도서가 여러 작가와 여러 장르에 동시에 속하는 구조를 반영한 탐색 화면입니다.
- 작가·카테고리 마스터 테이블과 매핑 테이블로 정규화된 JPA 연관 관계 설계
- 카테고리 트리를 재귀 쿼리 대신 경로 컬럼으로 저장하여 하위 장르 일괄 조회
- Thymeleaf 서버 렌더링으로 작가 상세 페이지의 초기 HTML을 구성
도서-작가, 도서-장르 N:M 구조를 이용자 탐색 경로와 일치시키는 데이터 모델을 구현합니다.


프로젝트 진행 단계
현행 구조 분석 및 스키마 개편 설계 · 2026.10
기존 세 사이트의 도서·작가·자료 구조를 분석하고 N:M 매핑 ERD와 MySQL 스키마를 설계합니다
검색·도서 API 개발 · 2026.10
Spring Boot 기반 통합 검색, 도서 상세, 자료 다운로드 REST API를 구현합니다
이용자 화면 구현 · 2026.10
Thymeleaf 서버 렌더링과 React 카드·필터 컴포넌트로 검색·상세·제안 화면을 구현합니다
작가·카테고리 탐색 및 통합 검증 · 2026.10
장르 트리 탐색과 작가 상세를 구현하고 API 통합 테스트로 화면 흐름을 검증합니다
개발 결과
기술적 주안점
- 도서·작가·시리즈를 단일 검색 API로 묶고 유형 구분 배지로 노출하는 통합 검색 구조를 설계합니다
- 하나의 자료가 여러 도서에 연동되는 구조를 상세 화면에서 자연스럽게 노출하는 데이터 모델을 설계합니다
- 자료 하나에 여러 도서를 연결해 보여주는 N:M 카드 구조를 React 컴포넌트로 구현합니다