{"id":19302622,"url":"https://github.com/beomseokyu/algorithm-blog","last_synced_at":"2026-05-16T15:32:06.309Z","repository":{"id":188431794,"uuid":"678441098","full_name":"BeomSeokYu/Algorithm-Blog","owner":"BeomSeokYu","description":"[토이프로젝트] SpringBoot3 + Thymeleaf를 이용한 SSR 개인 알고리즘 블로그","archived":false,"fork":false,"pushed_at":"2026-01-01T05:14:55.000Z","size":1011,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-05T03:20:21.296Z","etag":null,"topics":["aws-codedeploy","aws-s3","cicd","codex-cli","github-actions","jpa","oauth2-jwt","spring-boot-3","workflows"],"latest_commit_sha":null,"homepage":"https://algorithm.beomdev.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BeomSeokYu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-14T15:00:18.000Z","updated_at":"2026-01-02T08:15:47.000Z","dependencies_parsed_at":"2024-11-09T23:24:23.310Z","dependency_job_id":"8af6ae0a-bb38-4bdb-bee0-b7816e5082b1","html_url":"https://github.com/BeomSeokYu/Algorithm-Blog","commit_stats":null,"previous_names":["beomseokyu/spring-boot-3-blog"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BeomSeokYu/Algorithm-Blog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeomSeokYu%2FAlgorithm-Blog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeomSeokYu%2FAlgorithm-Blog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeomSeokYu%2FAlgorithm-Blog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeomSeokYu%2FAlgorithm-Blog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BeomSeokYu","download_url":"https://codeload.github.com/BeomSeokYu/Algorithm-Blog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeomSeokYu%2FAlgorithm-Blog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33108118,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws-codedeploy","aws-s3","cicd","codex-cli","github-actions","jpa","oauth2-jwt","spring-boot-3","workflows"],"created_at":"2024-11-09T23:22:51.474Z","updated_at":"2026-05-16T15:32:06.304Z","avatar_url":"https://github.com/BeomSeokYu.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Algorithm Blog\n\n알고리즘 이론 정리와 문제 풀이를 체계적으로 기록하고 검색하기 위한 개인 블로그입니다. 글 작성부터 분류, 탐색까지 한 흐름으로 묶어 실제 운영 가능한 수준의 서비스로 구현했습니다.\n\n## 핵심 기능\n- 글 작성/수정/삭제: CKEditor 5 기반 WYSIWYG 에디터로 코드 블록, 표, 미디어 임베드 지원\n- 알고리즘 분류 태그: 자동완성 기반 태그 입력, 다중 선택 및 삭제, 목록/상세 화면 배지 표시\n- 탐색 경험 개선: 검색, 정렬(최신/오래된/제목), 페이지 크기(2/4/8), 미리보기 토글\n- 필터 구조: 이론정리/문제풀이 분리 + 분류 태그 필터\n- 인증/보안: OAuth2(구글) 로그인 + JWT 기반 인증/리프레시 토큰\n- SEO: `sitemap.xml`, `robots.txt` 제공 및 공유 메타 태그 적용\n\n## 기술 스택\n- Backend: Java 21, Spring Boot 3.2.5, Spring MVC, Spring Security, Spring Data JPA\n- Frontend: Thymeleaf, Vanilla JS, CKEditor 5, 커스텀 CSS\n- DB: MySQL(운영), H2(Test 프로파일)\n- Infra/DevOps: Docker, GitHub Actions, Nginx 리버스 프록시(배포 구성)\n\n## 도메인 모델 요약\n- `Article`: 제목, 본문, 타입(이론정리/문제풀이), 작성자, 작성/수정일\n- `AlgorithmCategory`: 알고리즘 분류(한글/영문명, 출처, 문제 수)\n- `Article \u003c-\u003e AlgorithmCategory`: 다대다 관계(`article_category` 조인 테이블)\n- `User`, `RefreshToken`: 로그인 및 토큰 관리\n\n## 프로젝트 구조\n```\nsrc/main/java/com/hihat/blog\n  controller/  service/  repository/  domain/  dto/  util/\nsrc/main/resources\n  templates/  static/  data.sql  seed/algorithm-categories.tsv\ndeploy/\n  README.md  docker-compose.yml  nginx.conf  cicd.yml\n```\n\n## 실행 방법\n### Test 프로파일(H2 메모리 DB)\n```\n./gradlew bootRun --args='--spring.profiles.active=test'\n```\n\n### 기본 프로파일(MySQL)\n`application.yml`에서 아래 환경 변수를 사용합니다.\n```\nDB_NAME, DB_USERNAME, DB_PASSWORD\nISSUER, SECRET_KEY\nGOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET\n```\n또한 `/config/application-key.yml`을 선택적으로 로드합니다.\n\n## 빌드/테스트\n```\n./gradlew test\n./gradlew bootJar\n```\n\n## 배포/CI\n- GitHub Actions에서 멀티 아키텍처 이미지를 빌드하고 레지스트리에 업로드\n- `deploy/` 디렉토리에 Docker Compose, Nginx 설정, CI 워크플로 샘플 제공\n- 예시 실행:\n```\ndocker compose --env-file .env up -d\n```\n\n## 데이터 초기화\n- `data.sql`에 테스트용 글/사용자 샘플 포함\n- `AlgorithmCategorySeeder`가 `seed/algorithm-categories.tsv`를 읽어 분류 데이터 자동 삽입\n\n## 개발 포인트\n- 목록 화면의 미리보기/정렬/페이지 크기 설정을 세션 스토리지에 저장해 UX 개선\n- 분류 태그를 중심으로 글 탐색 경로를 단순화\n- SEO, 공유 메타, 사이트맵으로 검색 노출을 고려한 구성\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeomseokyu%2Falgorithm-blog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeomseokyu%2Falgorithm-blog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeomseokyu%2Falgorithm-blog/lists"}