- 서비스명: Research SCI Paper (RSP)
- 프로젝트 기간: 2025. 09.01 ~ 2025.10.01
- SSAFY 13기 특화 프로젝트
- 목표: 논문 찾기 시간 단축
-
메인 검색창 화면입니다. 인터랙티브한 UI 구현에 집중하였습니다.
-
마우스 X축 이동에 따른 파도의 움직임, 마우스 호버에 반응하는 RSP 로고와 “+” 버튼을 구현하였습니다.
-
검색했던 내용을 local storage에 저장하고 불러와 최근검색내역 목록을 보여줍니다.
-
키보드 네비게이션(↑↓ 키) 적용으로 검색어 선택을 이동시킬 수 있습니다.
- 검색어를 입력하면 실시간 자동완성 기능을 제공합니다.
- PDF 검색도 제공합니다.
- 상세검색
- 왼쪽 사이드바에서 시간, 정렬방식, 논문 타입을 선택하여 필터링할 수 있습니다.
- 한 카드에는 키워드, 제목, 저자, 저널명, 년도, 인용수, 자체제작한 유사도/신뢰도 지수, 다운로드 버튼, 디테일페이지 이동 버튼, 마인드맵 페이지 이동 버튼이 있습니다.
- 왼쪽에는 중앙 화면에 뜬 논문들 리스트를 보여주고, 오른쪽에는 해당 논문의 정보를 보여줍니다.
-
더블클릭하여 유사논문들을 계층별로 확장해나갈 수 있습니다.
-
cntrl z로 되돌릴 수 있고 delete로 삭제할 수 있습니다.
-
논문의 전체요약과 인덱스별 요약을 제공합니다.
-
오른쪽엔 논문 pdf원본이 나타나며 논문의 페이지수, 확대비율, 하이라이팅 여부, 인쇄버튼, 저장버튼이 있습니다.
- 하이라이팅 버튼을 누르면 중요부분이 강조됩니다.
- 키워드 기반 정확 매칭(BM25), 의미 기반 유사도 검색(임베딩 기반 코사인 유사도)과 논문의 신뢰도를 유기적으로 결합하여, 학술논문 검색의 정확도를 향상
- 요청 매개변수 설정, 비동기 HTTP, 제목 초록부터 파싱해서 정보가 충분하다고 판단되면 추가 파싱을 안하는 최적화를 통해 pdf 검색 시간을 78페이지 논문 기준 55-> 10초로 줄임
- 배치 조회를 활용해 필요한 데이터만, 최소 쿼리로 가져와 성능 최적화
- 기존: 논문 리스트에서 반복문 O(n) -> 논문 ID로 HashMap 생성하여 중복 제거 O1
- Hbase cold start : Spring 서버 시작 시 HBase 웜업 코드를 자동 실행하여 HBase 상태를 미리 점검(헬스 체크)하고, 실제 사용자 요청 전에 HBase를 깨워둠으로써 서비스 사용 시 데이터 접근 속도 향상
- pdf url cors : Access-Control-Allow-* 헤더 추가해 프론트에서 pdf url 접근 가능하도록 PDF 프록시 서버 역할하는 api 제작
- PostgreSQL 배치 조회(N+1 문제 해결), Stream 처리로 메모리 효율성 향상
- 임베딩 모델: sentence transformer(all-mpnet-base-v2) 사용
- 가장 많이 사용되는 SOTA 임베딩 모델 중 하나/성능 속도 밸런스 제일 좋음
- 요약이 있는 경우 기존 요약을 들고오고, 없는 경우 새로 생성함
- 없는 엔티티를 요청한경우 404, 있는데 요약이 불가능한경우 422, 이외는 500을 반환
- 요약이 가능한 경우, 전문 요약과 섹터별 요약을 진행하며, 요약 이후 저장한 요약을 반환함
- 이때, 단순 요약만 반환하는 것이 아니라 각 요약의 출처를 청킹하여 하이라이트가 가능하게 반환함
- 개발용 서버와 시연/릴리스용 서버를 별도 배포
- 개발용 서버는 docker compose를 활용하여 프론트, 백, 프록시 컨테이너를 관리함
- 릴리스용 서버는 k3s를 활용하여 무중단 배포를 구현하였으며 프론트 3, 백 3, 로드밸런서 1의 파드를 관리함
- 또한 AWS ECR로 이미지를 관리하며, helm 패키지 관리자를 사용하여 롤백에 용이한 시스템을 구축하였음
- ReactFlow + d3-force 레이아웃을 활용해 논문 간 관계를 직관적으로 시각화
- 히스토리 관리(Undo 20단계), 노드 캐싱(paperDetailCache, searchCache) 으로 성능 최적화
- Radial + Force Layout 혼합 배치로 확장 시 겹침 최소화, 뷰포트 자동 포커싱 제공
- Alt+클릭으로 collapse/expand 전환, transition 애니메이션으로 자연스러운 UX 구현
- PDF Blob 캐시(pdfCache) 를 활용해 50MB 용량 관리 및 재사용 → 로딩 속도 단축
- 하이라이팅 파이프라인: 문장 인덱싱 + 임베딩 유사도(all-MiniLM-L6-v2) 비교로 키문장 자동 강조
- 컨트롤러 단축키 (Ctrl+±/0, 페이지 점프), 사이드바 접기로 사용자 편의성 강화
- 요약 API 연동해 섹션별 요약·출처 기반 하이라이팅을 제공
검색 메인 화면
- 커서 x축 움직임에 따라 높이 약 20% 높아지는 인터랙티브한 파도 구현
- 커서 호버할때 인터랙티브한 로고 움직임 구현
- PDF drag and drop 구현
검색 결과리스트 화면
- 검색 시 React Router state로 복잡한 데이터 전달하여 상태 관리
- 최근 검색어 캐싱(local storage) 및 리스트 10개씩 페이지네이션으로 성능 최적화
- 검색 시 자동완성, 최근검색에서 키보드 네비게이션(↑↓ 키) 적용하여 UX 향상
rsp/ # React + TypeScript + Vite 기반 프론트엔드 프로젝트
│
├── 📁 public/ # 정적 자산 (favicon, 이미지 등)
│
├── 📁 src/ # 소스 코드 메인 디렉토리
│ ├── 📄 App.tsx # 루트 컴포넌트 (라우팅 설정)
│ ├── 📄 main.tsx # 엔트리 포인트
│ │
│ ├── 📁 components/ # 재사용 가능한 UI 컴포넌트
│ │ ├── 📁 common/ # 공통 컴포넌트 (ErrorBoundary, LoadingSpinner 등)
│ │ ├── 📁 dialog/ # 모달/다이얼로그 컴포넌트
│ │ ├── 📁 layout/ # 레이아웃 컴포넌트 (Header, PageHeader)
│ │ ├── 📁 mindmap/ # 마인드맵 관련 컴포넌트
│ │ │ ├── 📁 nodes/ # 마인드맵 노드 컴포넌트
│ │ │ ├── 📁 panels/ # 마인드맵 패널 컴포넌트
│ │ │ └── 📁 utils/ # 마인드맵 유틸리티 함수
│ │ ├── 📁 paper/ # 논문 관련 컴포넌트
│ │ ├── 📁 pdf/ # PDF 관련 컴포넌트
│ │ ├── 📁 search/ # 검색 관련 컴포넌트
│ │ └── 📁 ui/ # 기본 UI 컴포넌트
│ │
│ ├── 📁 pages/ # 페이지 컴포넌트
│ │ ├── 📄 SearchPage.tsx # 검색 메인 페이지
│ │ ├── 📄 SearchResultsPage.tsx # 검색 결과 페이지
│ │ ├── 📄 MindmapPage.tsx # 마인드맵 페이지
│ │ └── 📄 PaperDetailPage.tsx # 논문 상세 페이지
│ │
│ ├── 📁 hooks/ # 커스텀 React hooks
│ ├── 📁 services/ # API 호출 및 외부 서비스 연동
│ ├── 📁 types/ # TypeScript 타입 정의
│ ├── 📁 utils/ # 유틸리티 함수
│ ├── 📁 lib/ # 외부 라이브러리 설정
│ ├── 📁 assets/ # 에셋 파일 (폰트, 아이콘)
│ ├── 📁 styles/ # 스타일 파일
│ ├── 📁 workers/ # Web Workers
│ └── 📁 __tests__/ # 테스트 파일
│
├── 📁 dist/ # 빌드 산출물 디렉토리
├── 📁 node_modules/ # npm 패키지 의존성
│
├── 📄 package.json # 프로젝트 설정 및 의존성 정의
├── 📄 package-lock.json # 의존성 버전 고정
├── 📄 tsconfig.json # TypeScript 설정
├── 📄 vite.config.ts # Vite 빌드 도구 설정
├── 📄 tailwind.config.js # Tailwind CSS 설정
├── 📄 eslint.config.js # ESLint 린트 설정
├── 📄 jest.config.js # Jest 테스트 설정
├── 📄 postcss.config.js # PostCSS 설정
├── 📄 nginx.conf # Nginx 웹서버 설정
├── 📄 Dockerfile # Docker 컨테이너 설정
└── 📄 README.md # 프로젝트 문서 ● Spring Boot 프로젝트의 패키지 구조입니다:
📁 패키지 구조 및 기능
src/main/java/com/butakhae/rsp/
├── 📁 author/ - 저자 관련 기능
│ ├── entity/ - 저자 엔티티 클래스
│ └── repository/ - 저자 데이터 접근 계층
│
├── 📁 common/ - 공통 기능 및 유틸리티
│ ├── config/ - 공통 설정 클래스들
│ ├── constant/ - 상수 정의
│ └── exception/ - 예외 처리 클래스들
│
├── 📁 concept/ - 개념/컨셉 관련 기능
│ ├── entity/ - 개념 엔티티 클래스
│ └── repository/ - 개념 데이터 접근 계층
│
├── 📁 config/ - 애플리케이션 설정
│
├── 📁 hbase/ - HBase 데이터베이스 연동
│ ├── client/ - HBase 클라이언트
│ ├── config/ - HBase 설정
│ └── model/ - HBase 모델 클래스
│
├── 📁 journal/ - 저널/학술지 관련 기능
│ ├── entity/ - 저널 엔티티 클래스
│ └── repository/ - 저널 데이터 접근 계층
│
├── 📁 mindmap/ - 마인드맵 기능
│ ├── controller/ - 마인드맵 REST API 컨트롤러
│ └── service/ - 마인드맵 비즈니스 로직
│
└── 📁 paper/ - 논문 관련 핵심 기능
├── controller/ - 논문 REST API 컨트롤러
├── dto/ - 데이터 전송 객체
├── entity/ - 논문 엔티티 클래스
│ └── id/ - 복합키 관련 클래스
├── exception/ - 논문 관련 예외 클래스
├── repository/ - 논문 데이터 접근 계층
├── service/ - 논문 비즈니스 로직
└── util/ - 논문 관련 유틸리티
기타 구조
- src/main/resources/ - 설정 파일, 정적 리소스
- src/test/java/ - 테스트 코드| 박경찬 | 박승균 | 박준형 | 오승연 | 김민 | 김수진 |
|---|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| 마인드맵 페이지 구현, 논문 상세 페이지 구현 | opensearch 검색 최적화, UI 디테일 수정 | 논문 데이터 수집 및 저장, 임베딩 | 메인페이지, 검색페이지 구현 | CI/CD 구축, 논문 요약 API | UI/UX 디자인, 검색/마인드맵/논문상세 API |



















