알고리즘 이론 정리와 문제 풀이를 체계적으로 기록하고 검색하기 위한 개인 블로그입니다. 글 작성부터 분류, 탐색까지 한 흐름으로 묶어 실제 운영 가능한 수준의 서비스로 구현했습니다.
- 글 작성/수정/삭제: CKEditor 5 기반 WYSIWYG 에디터로 코드 블록, 표, 미디어 임베드 지원
- 알고리즘 분류 태그: 자동완성 기반 태그 입력, 다중 선택 및 삭제, 목록/상세 화면 배지 표시
- 탐색 경험 개선: 검색, 정렬(최신/오래된/제목), 페이지 크기(2/4/8), 미리보기 토글
- 필터 구조: 이론정리/문제풀이 분리 + 분류 태그 필터
- 인증/보안: OAuth2(구글) 로그인 + JWT 기반 인증/리프레시 토큰
- SEO:
sitemap.xml,robots.txt제공 및 공유 메타 태그 적용
- Backend: Java 21, Spring Boot 3.2.5, Spring MVC, Spring Security, Spring Data JPA
- Frontend: Thymeleaf, Vanilla JS, CKEditor 5, 커스텀 CSS
- DB: MySQL(운영), H2(Test 프로파일)
- Infra/DevOps: Docker, GitHub Actions, Nginx 리버스 프록시(배포 구성)
Article: 제목, 본문, 타입(이론정리/문제풀이), 작성자, 작성/수정일AlgorithmCategory: 알고리즘 분류(한글/영문명, 출처, 문제 수)Article <-> AlgorithmCategory: 다대다 관계(article_category조인 테이블)User,RefreshToken: 로그인 및 토큰 관리
src/main/java/com/hihat/blog
controller/ service/ repository/ domain/ dto/ util/
src/main/resources
templates/ static/ data.sql seed/algorithm-categories.tsv
deploy/
README.md docker-compose.yml nginx.conf cicd.yml
./gradlew bootRun --args='--spring.profiles.active=test'
application.yml에서 아래 환경 변수를 사용합니다.
DB_NAME, DB_USERNAME, DB_PASSWORD
ISSUER, SECRET_KEY
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET
또한 /config/application-key.yml을 선택적으로 로드합니다.
./gradlew test
./gradlew bootJar
- GitHub Actions에서 멀티 아키텍처 이미지를 빌드하고 레지스트리에 업로드
deploy/디렉토리에 Docker Compose, Nginx 설정, CI 워크플로 샘플 제공- 예시 실행:
docker compose --env-file .env up -d
data.sql에 테스트용 글/사용자 샘플 포함AlgorithmCategorySeeder가seed/algorithm-categories.tsv를 읽어 분류 데이터 자동 삽입
- 목록 화면의 미리보기/정렬/페이지 크기 설정을 세션 스토리지에 저장해 UX 개선
- 분류 태그를 중심으로 글 탐색 경로를 단순화
- SEO, 공유 메타, 사이트맵으로 검색 노출을 고려한 구성