프로젝트 개요
프로젝트 동기
살아가면서 경제는 절대 빼놓을 수 없는 부분이다. 하지만 경제에 대해 관심이 생겨도, 현업에 치이고 커리어 개발을 위해 공부하다보면 경제 공부 및 경제 동향(뉴스)을 챙겨볼 시간이 턱없이 부족하다. 나의 경우도 그렇다. 특히, 우리 개발자들은 평생 공부해야하는 직업 (다른 직업도 마찬가지긴 함)이기 때문에 개발 공부를 하다보면 경제 공부를 놓쳐 뒤늦게 후회하곤 한다.
이번 프로젝트를 통해 경제 뉴스를 한 번에 모아보고, AI를 통해 분석 및 요약하여 바쁜 와중에도 많은 정보를 얻을 수 있는 서비스를 만들고자 한다. 또, 내 포트폴리오를 AI와 함께 관리할 수 있는 서비스도 제공해보려고 한다.
이 프로젝트를 수행하면 자연스레 경제에 대한 지식이 쌓일 것으로 기대되기 때문에, 나는 개발 + 경제공부의 두 마리 토끼를 다 잡을 수 있어 여러모로 설레는 프로젝트이다.
프로젝트 명: 미정 (지어지면 글을 수정하겠다)
프로젝트 목표
사이드 프로젝트를 오랜만에 하기 때문에 목표가 꽤 많다.
- TDD와 클린코드를 적극적으로 사용해야한다.
- 이번 사이드 프로젝트에서 가장 중요한 목표이다.
- 귀찮다고 TDD를 소홀히하지 말자. 실무에서 겪었을 때, 디버깅과 수동 테스트가 더 귀찮다.
- 클린코드를 위해 Sonarqube같은 정적분석도구를 적극 사용하자.
- 점진적으로 프로젝트 사이즈를 키우자
- 사이드 프로젝트를 생각하면 자꾸 MSA로 해보고 싶어지는 욕심이 생긴다.
- 일단 모놀리식으로 개발하고, 필요시에 MSA로 전환해보는 것도 좋은 경험이 될 것 같으므로 우선 모놀리식으로 개발한 후 점진적으로 사이즈를 키우자.
- 동시성과 성능을 생각하면서 코딩하자.
- 다중 서버나 많은 트래픽은 없겠지만, 스프링 + 톰캣은 기본적으로 멀티스레드로 작동한다.
- 아무 생각없이 개발하지 말고, 동시성과 원자성 문제를 항상 생각하자.
- 객체지향 원칙을 최대한 지키자
- Controller, Service, Repository 계층에서 모든 걸 개발하지 말자.
- 최대한 도메인, 컴포넌트로 분리하여 객체지향적으로 개발하자.
- 특히, DTO가 아니면 Getter 메서드는 웬만하면 쓰지말자.
- 예광탄을 쏘자
- 예광탄을 쏘는 것은 '실용주의 프로그래머' 책에 나오는 개념이다.
- 1인 프로젝트인 만큼 거대한 프로젝트를 막상 시작하기 어렵다.
- 중요하다고 생각되는 요구사항(기능)에 대해 일단 화면, 컨트롤러, 서비스, DB(혹은 외부 API)를 관통하도록 개발해보자. 그러면 어느정도 템플릿이 잡혔기 때문에 기능을 추가하는 것은 쉬울 것이다.
- 스프링의 기능을 최대한 활용하자
- 스프링 AOP, 인터셉터등을 적극 활용하자
- JPA와 QueryDSL을 사용하자
- JPA에 대해 깊이 있게 이해하고, 조금 복잡한 쿼리도 최대한 JPA와 QueryDSL로 해결해보자.
- 그래도 안되면 JdbcTemplate을 사용하면 된다.
- 모든 클래스와 public 메서드에 주석을 작성하자
- 이 부분은 호불호가 갈리는 부분이지만, 나는 한 번도 해본 적이 없기에 적용해보려고 한다.
- DB보다 객체(도메인)를 먼저 설계하자
- NEXTSTEP에서 배운 내용인데, DB먼저 설계하면 개발하면서 수정할 내용일 계속 나온다.
- JPA의 엔티티를 사용하여 Auto DDL로 개발한 후, 나중에 DB를 설계하자.
- 나는 기획자가 아니다
- 프로젝트를 기획하다보니 이것도 해야하고 저것도 작성해야하고 개발을 시작할 수 있을까? 라는 의문이 들었다.
- 기획에 너무 신경쓰지 말자. 개발 시작도 못하고 프로젝트 접는다.
- 테스트, 개발 서버와 운영 서버를 구분하자
- 실무 처럼 둘을 구분해서 사용해보자.
- 이 부분은 비용적인 문제로 지키지 못 할 수도 있다..
기능 목록
초기에 구상한 기능은 크게 세 가지이다.
1. 경제 뉴스 분석 및 요약 서비스
전 세계(국내 포함)의 뉴스를 수집 및 스크래핑하여 AI(NLP)를 통해 분석 및 요약해주는 서비스
2. 경제 지표 대시보드
실시간 주요 경제 지표를 모니터링 및 검색할 수 있는 서비스이다.
3. 개인 투자 포트폴리오 관리
개인 투자 포트폴리오를 관리하는 서비스이다. 실제 모든 증권회사와 연동하긴 어려우므로, 상품과 비중 정도만 등록하고, 현재 경제 지표 및 시장 상황에 기반하여 AI가 추천해주는 서비스이다.
가능성 검증
한창 개발하고 있는데, 기술적으로 불가능하게 되면 안되니 간단하게 POC를 진행했다.
1. 경제 뉴스 분석 및 요약 서비스 POC
뉴스 API
- NewsAPI (채택)
- 뉴스의 Content를 모두 가져오지 않아서 분석 및 요약하는 데에 제약이 있음.
- CORS 정책이 있음.
- EC2에서 curl 테스트 -> 응답에 문제 없음
- 자바 RestTemplate으로도 문제없이 작동
- 비동기 뉴스 조회를 위해 WebClient도 고려해보기
- TheNewsAPI
- 요청 한 번에 최대 3개 / 하루에 100 요청 제한
- GoogleNewsApi
- 검색 결과가 마음에 들지 않음
번역앱
- deepL:
- 가장 자연스러운 문장으로 번역됨
- 구독형 서비스로 무료 사용 시 번역 글자 제한이 있음
- LLM 사용(채택 예정)
- 훈련된 모델이 있으면 굳이 deepL을 사용하지 않아도 될 것 같음
- 로컬에서 모델을 받아 사용하면 비용이 들지 않음.
분석 및 요약
- NewsAPI에서 full content를 제공해주지 않기 때문에 스크래핑 필요
- 뉴스 사이트 마다 HTML 태크 구조가 다르기 때문에, 스크래핑 방법 모색해봐야 함.
- 스크래핑 정책(법적 문제)도 고려
- NLP 도입해야 함.
- 오픈소스 경량 모델인 Gemma 사용
- 가장 최신의 초대형 언어 모델임
- 2024년 2월에 공개된 최신 모델이기 때문에, 데이터의 질적, 양적으로 뛰어날 것이라 생각
- 구글의 모델이다보니 이미 커뮤니티가 매우 활성화되어 있음
- 시간이 된다면
- 모델 사용에는 파이썬 + FastAPI + LangChain으로 모델 사용
- 한글 뉴스도 가져와야하기 때문에 모델 Fine tuning을 통해 한글 작업
- 경제 뉴스 분석을 위해 데이터셋을 찾고 fine tuning 수행
2. 경제 지표 대시 보드
- 지표
- python library FinanceDataReader를 사용하면 종가 확인 가능
- 한국 투자증권 API를 사용하면 실시간 시세 및 뉴스 조회 가능
- 자바에서 API 모두 해결 가능. 인공지능만 Python하면 될 듯
- 대시보드
- 차트를 그려주는 자바스크립트 라이브러리 Chart.js 사용
3. 개인 투자 포트폴리오 관리
- 내 포트폴리오 비율 설정
- 해외 주식, 국내 주식, 현물 등 다양한 상품 등록 및 비중 선택
- NLP (Gemma)를 통해 현재 시장 상황에 따른 해당 상품과 그 비중에 대한 추천(귀여운 느낌으로 추천 정도로만 하기)
기술 스택
- 백엔드
- Framwork & Language: Spring boot + Java
- ORM: JPA + QueryDSL
- DBMS: Postgresql
- 핫한 DBMS이기도 하고, 실무에서 MySQL, MariaDB, Oracle은 사용해봤지만 Postgresql은 사용해보지 않았기 때문에 채택했다.
- 프론트엔드 (고민 중)
- 내가 개발하는 게 맞을 지 고민이다.
- 내가 하게 된다면 사실 웹 보다는 앱이 더 접근성이 좋기 때문에 우선은 앱 친화적이면서 학습곡선이 비교적 완만한 vue.js를 사용하지 않을까 싶다. (React 계열은 너무 복잡하다.)
- 인프라
- 우선은 Docker와 Jenkins를 통해 빌드 및 배포할 예정이며, 필요 시 다양한 서비스(ex. Redis, Kafka)를 활용하여 분산환경으로 확장해보고 싶다.
- 운영은 AWS에서 하려고 하는데, 비용 문제가 있으므로 우선 나중에 생각해보겠다.
- AI
- LLM으로 구글의 Gemma를 사용하고, 약간의 Fine tuning도 할 예정이다.
- Gemma를 활용할 때에는 Python + FastAPI + LangChain으로 웹 애플리케이션을 구축하겠다.
나가며
지금도 이 글을 작성하면서도 내가 이걸 혼자 할 수 있을까? 라는 생각이 든다. 막막하기도 하다. 하지만 완성되었을 때 엄청나게 성장해있을 내 모습이 기대된다. 책과 강의만 보는 학자형 개발자에서 실전 야생형 개발자로 거듭나보도록 하자.
'프로젝트' 카테고리의 다른 글
[사이드프로젝트] 특정 디렉토리 소나큐브 커버리지 제외하기 (0) | 2024.06.19 |
---|---|
[사이드 프로젝트] 소나큐브 사용하기 (1) | 2024.06.14 |
[사이드 프로젝트] 홈 서버 구축하기 (0) | 2024.05.16 |