프로젝트 개요
지난 2024년 8월 19일부터 10월 11일까지 약 7주간 삼성 청년 SW 아카데미(SSAFY)에서 진행된 특화 프로젝트를 마무리했습니다.
- 프로젝트 주제: 어린이 문해력 검사 및 향상 서비스 (GLU)
- 팀 구성: 6명
- 프론트엔드: 2명
- 백엔드: 3명
- 데이터 분석: 1명
- 협업 도구:
- GitLab
- Jira
- Notion
- Mattermost
- 기술 스택:
- Frontend: React, Redux, Next.js, TypeScript
- Backend: Spring Boot, JPA, Spring Security, Spring Cloud, FastAPI, QueryDSL, JWT
- Database: MySQL, MongoDB, Redis
- MessageQueue: Kafka
- Infra: AWS EC2, Docker, Jenkins, Nginx
프로젝트 소개
GLU
: 어린이 문해력 검사 및 향상 서비스
GLU는 글을 여러 번 반복하여 학습하는 어린이 문해력 학습 서비스로, 이름에 "여러 루(루자)"의 의미를 담았습니다. 이 서비스는 어린이의 문해력 수준을 종합적으로 평가하고, 수준에 맞는 문제를 추천하여 반복 학습을 통해 문해력을 향상시키는 것을 목표로 합니다.
최근 문해력의 중요성이 강조되면서 어린이들의 문해력을 효과적으로 평가하고 향상시킬 수 있는 서비스의 필요성이 커졌습니다. 기존의 문해력 진단 서비스들은 단순한 진단에 그치거나, 훈련 기능이 부족한 경우가 많았습니다. GLU는 이러한 문제를 해결하기 위해 어린이의 반복 학습을 통한 문해력 향상을 목표로 한 맞춤형 학습 플랫폼입니다.
주요 기능
- 문해력 진단
- 사용자 나이를 기반으로 한 레벨 테스트
- 문해력 레벨과 학습 이력을 바탕으로 한 맞춤형 문제 추천
- 학습 지원 도구
- 메모, 문제 다시보기, 찜하기 기능 제공
- 틀린 문제와 학습 이력을 저장하여 학습 동기 부여
- 학습 성과 시각화
- 귀여운 캐릭터 성장 시스템
- 출석 포인트로 학습 흥미 유발
핵심 기술 및 아키텍처
1. MSA 구조
- 각 서비스가 독립적으로 운영되는 구조를 설계하여 확장성과 유지보수성을 높였습니다.
- 주요 구성 요소:
- API Gateway: 요청 라우팅
- Config Server: 환경 설정 관리
- Web Server: Next.js 기반 웹 애플리케이션
2. 데이터베이스 분리
- MySQL: 문제의 주요 정보와 학습 이력을 저장.
- MongoDB: 로그 데이터 및 다양한 형태의 문제 데이터를 유연하게 관리.
3. 문제 추천 시스템
- 속성 벡터화 및 코사인 유사도를 기반으로 문제를 추천.
- 학습 로그가 없는 경우에는 레벨 기반으로, 있는 경우에는 개인화된 문제 추천.
4. Kafka 기반 이벤트 처리
- 문제 채점 시 빠른 응답을 위해 부가적인 동작을 비동기로 처리.
나의 역할
- DB 설계 및 서비스 별 적합한 DB 분할
- 각 도메인의 특성과 접근 패턴을 고려해 데이터베이스를 분리하여 서비스간 독립성 확보 및 확장성 개선
- 문제 메모 관리, 찜, 테스트 API 구현
- 문제 리스트 채점 및 테스트 결과 조회, 문제 메모 및 찜 CRUD API 설계 및 구현
프로젝트 회고
좋았던 점:
MSA 도입
- 이번 프로젝트에서는 처음으로 마이크로서비스 아키텍처(MSA)를 도입해보는 경험을 했습니다. MSA를 통해 서비스 간의 독립성과 확장성을 고려한 설계를 직접 해보며, 시스템을 보다 유연하게 구성하는 방법을 배울 수 있었습니다. 각 서비스가 독립적으로 운영되면서도 필요에 따라 유기적으로 연결되도록 설계함으로써, 유지보수성과 확장성을 높일 수 있었습니다.
MySQL과 MongoDB 함께 사용
- 또한, 관계형 데이터베이스(RDB)인 MySQL과 NoSQL인 MongoDB를 함께 사용하며, 정형화된 데이터를 RDB에 저장하고 비정형 데이터를 MongoDB에 저장하여 데이터의 특성에 맞는 유연한 관리를 경험할 수 있었습니다. 예를 들어, 문제와 관련된 주요 정보는 MySQL에 저장하고, 문제 풀이와 관련된 로그 데이터는 MongoDB에 저장하여 보다 효율적인 데이터 처리가 가능했습니다.
코드 리뷰 경험
- 코드 리뷰도 큰 학습의 기회가 되었습니다. 팀원들의 다양한 코드를 리뷰하고, 저 또한 피드백을 주면서 코드의 가독성과 품질을 높이는 방법을 고민했습니다. 이를 통해 팀 내 코드 스타일을 통일하고, 서로의 코드를 이해하는 데 있어 많은 도움이 되었습니다.
코드 컨벤션
- 더불어, 설계 단계에서 Git 전략과 Spring Boot 코드 컨벤션을 팀과 맞추어 사용함으로써 클린 코드를 유지하는 데에도 많은 도움이 되었습니다. (나중에 컨벤션만 따로 모아 정리할 예정입니다..!)
코드 설계
- 또한, 코드 작성 시에는 코드의 재사용성과 유지보수성을 고려하며 코드를 구현했습니다. 특히, 데코레이터 패턴과 같은 디자인 패턴을 적용해 복잡한 비즈니스 로직과 검증 로직을 분리함으로써 코드의 가독성과 확장성을 높일 수 있었습니다.
공통 코드
- 공통 코드를 별도로 정의하고 여러 서비스에서 이를 재사용하면서 개발 효율성도 크게 향상되었습니다.
아쉬운 점:
- 프로젝트 과정에서 SonarQube와 JMeter와 같은 품질 관리 및 성능 테스트 툴을 사용해볼 기회가 있었습니다.
- 그러나 이 도구들을 충분히 활용하지 못한 점이 아쉬웠습니다.
- SonarQube를 통해 코드 품질을 개선하고, JMeter를 통해 성능 테스트를 수행하고 싶었지만, 시간적 여유가 부족해 이러한 툴을 심도 있게 사용해보지 못한 점이 아쉽습니다.
- 또한, 성능 테스트를 진행하고 성능을 최적화하는 과정에 더 집중했더라면 서비스의 안정성 및 확장성 측면에서 더 나은 결과를 얻을 수 있었을 것이라고 생각합니다.
팀원들의 회고
팀원들의 회고를 들어보니, 이번 프로젝트에서 다양한 기술과 개발 방법론을 배우며 많은 성장을 이루었다는 의견들이 많았습니다. 백엔드 측에서는 스프링 기반의 체계적인 개발 방식과 코딩 컨벤션 준수를 통해 코드의 일관성과 가독성을 높였고, 프론트엔드 측에서는 Next.js의 SSR을 활용해 사용자 경험을 향상시키는 방법을 익혔다고 합니다.
하지만 아쉬움도 있었습니다. FastAPI와 같은 새로운 기술을 처음 다루며 명확한 구조를 정립하지 못하거나, MSA 환경에서 테스트 코드 작성의 어려움을 느끼는 등 기술적인 도전 과제가 있었습니다. 데이터 품질 관리와 추천 시스템 개발 과정에서는 더 나은 데이터셋 확보와 전문가 협업의 필요성을 느꼈으며, 사용자 피드백 부족으로 실사용 관점에서의 개선점을 발견하지 못한 점도 아쉬움으로 남았습니다.
마무리
이번 프로젝트는 많은 도전과 배움의 기회가 되었습니다. 특히 MSA를 처음 도입해보며, 서비스 간 독립성과 확장성을 고려한 설계, 데이터베이스 분리, 코드 리뷰, Git 전략의 활용 등을 통해 백엔드 개발자로서 한 단계 성장할 수 있었습니다. 앞으로 있을 자율 프로젝트에서는 이번 프로젝트에서 아쉬웠던 부분을 보완하고, 더욱 발전된 서비스를 만들 수 있도록 노력하겠습니다.
'SSAFY' 카테고리의 다른 글
[SSAFY] SSAFY 마무리, 기억에 남는 순간 (6) | 2024.12.26 |
---|---|
[SSAFY] SSAFY 마지막 프로젝트, 자율 프로젝트 소개 (0) | 2024.11.24 |
[SSAFY] 특화 프로젝트 2주차 기록📝 (0) | 2024.10.25 |
[SSAFY] 특화 프로젝트 1주차 기록📝 (0) | 2024.10.04 |
[SSAFY] 특화 프로젝트 부트캠프 기록📝 (3) | 2024.09.10 |