1. 계획
요구사항
- 기간 : 1~2달
- 블로그 만들기
- 카테고리를 생성, 수정, 삭제할 수 있어야 한다.
- 카테고리는 이름과 아이콘을 가진다.
- 카테고리는 0개 이상의 포스트를 가질 수 있다.
- 카테고리는 다른 카테고리 안에 속할 수 있다.
- 카테고리는 순서를 가지고 있다.
(연결리스트처럼 내 다음 카테고리의 id를 참조하게 하는게 좋을듯)
- 카테고리는 글쓰기 권한을 설정할 수 있다.
- 카테고리는 뷰어 권한을 설정할 수 있다.
- 포스트를 생성, 수정, 삭제할 수 있어야 한다.
- 포스트는 제목과 본문, 첨부파일, 해시태그를 가진다.
- 포스트는 0개 이상의 해시태그를 가질 수 있다.
- 포스트는 0개 이상의 댓글을 가질 수 있다.
- 포스트는 카테고리와 1:1 관계를 가진다.
- 포스트는 0개 이상의 첨부파일을 가질 수 있다.
- 댓글을 생성, 수정, 삭제할 수 있어야 한다.
- 댓글은 내용과 첨부파일을 가진다.
- 댓글은 1개의 포스트와 1:1 관계를 가진다.
- 댓글은 다른 댓글에 속할 수 있다. (답글 기능)
- 해시태그는 생성, 삭제할 수 있어야 한다.
- 검색 기능
- ...
- 로깅 공부하고 제대로 적용하기
- 블로그에 LLM AI 적용하기
- 글 내용을 분석하고 이어서 작성하는 기능
- 해시태그를 생성해주는 기능
- 적절한 포스트 제목 추천하는 기능
- 부가목표
2. 설계
아키텍처
준비중
- 학습했었던 MSA를 적용할까 했었지만, 개인 프로젝트 레벨에 적용할 만한 기술이 아님.
AI의 경우, MSA로 기능을 분리하면 좋겠지만 일단 다른 방식을 찾아볼 예정. ex. RabbitMQ
- 가난한 개발자이기 때문에, Oracle Cloud에서 무료로 받은 서버에서 작동할 수 있는 최적화 필요.
기술스택
- React.js : 프론트엔드 프레임워크 중 가장 많이 학습했기 때문에 선택 (Velog를 참고해서 설계하기)
- Java Spring : 인증/인가, 간편한 CRUD (JPA)
- MySQL : 오픈소스에 가볍다고 알고 있음 → 더 가벼운 DB가 있다면 교체할 예정.
- Nginx : 하나의 서버에 Frontend, Backend를 다 돌릴 예정, 포트를 통해 구분해야함.
- Docker : 쉬운 환경 구축과 배포를 위해 사용.
- Github Actions : CI/CD 구축을 위해 사용. 여유가 된다면 Jenkins를 써보고 싶기도 함.
아직 결정되지 않은 부분
- 메시지 브로커 : Spring ↔ Python WebServer 간의 데이터 교환을 위한 선택 (좀 더 공부해보고 결정)
- Python WebServer : LLM AI 관련 기능을 처리하기 위한 서버 (Java에서도 처리는 가능함)
사실 가장 좋은 방법은 Spring에서 LLM API도 함께 처리하는 방식이다. (모놀리식)
현재는 기술을 써보고 싶어서 억지로 끼워넣었음. 하지만 이러한 기술스택 선택은 좋지 않다.
오픈소스
- React-MD-Editor : 포스트를 작성하기 위한 에디터, 툴바 수정, 코드 하이라이팅, 다이어그램 등등 지원하는 기능이 매우 많아서 선택.
CKEditor5도 있지만 React.js에서 쓰기가 너무 까다롭게 느껴졌었음.
여담
이전 프로젝트는 진행을 하려다가 던지게 되었는데 몇가지 이유가 있습니다.
- MSA를 개인프로젝트에 넣는 건 너무 비효율적이다. 프로젝트 규모가 어느정도 커졌거나, 처음부터 큰 규모의 프로젝트를 기획할 때 적용하는게 역시나 적절하다.
- LLM은 결국 저장된 데이터를 이용한 확률과 예측입니다. 면접이라는 서비스와는 소마에서 개발할 당시에도 그랬지만 어울리지 않는다고 생각한다.
- 기왕 만들거면 나에게 도움이 되던지, 어찌되었든 계속 운영이 되는 서비스를 개발해보고 싶음. 이전 프로젝트는 LLM이 메인이기 때문에 비용문제가 커서 항시 운영은 힘들 것으로 보임.