프로젝트 소개
서비스 기획 의도
우리 사회가 급속도로 고령화되면서, 은퇴 후의 삶이 중요한 사회적 이슈로 대두되고 있습니다. 저희 서비스는 이러한 사회적 요구에 부응하여, 은퇴자분들에게 의미 있는 소셜 연결과 지속적인 학습 기회를 제공하고자 합니다.
저희 서비스는 중년 세대에게 최적화된 학습과 소셜 네트워킹 플랫폼입니다. 은퇴 후의 삶을 더욱 의미 있고 풍요롭게 만들어 줄 다양한 기능들을 통해, 중년 세대의 요구에 부응하고 있습니다.
흥미롭고 유익한 강의를 직접 수강하세요!
중년 세대를 위한 맞춤형 오프라인 강의를 제공하여, 새로운 배움의 기회를 제공합니다. 건강, 취미, 재테크, 여행 등 다양한 주제의 강의를 통해 자기 계발과 삶의 질을 향상시킬 수 있습니다.
함께 배우고 소통하는 즐거움!
수강생들끼리 자유롭게 의견을 나누고, 강의 관련 정보를 공유할 수 있는 게시판 기능을 제공합니다. 동료 수강생들과의 소통을 통해 더 풍부한 학습 경험을 누려보세요.
강의 중 궁금한 점은 언제든지 물어보세요!
질문이 생기면 강사와 직접 1:1 채팅으로 소통할 수 있습니다. 강의 내용이나 추가적인 설명이 필요할 때, 빠르고 간편하게 해결하세요.
수업 외에도 활발한 소통을 이어가세요!
수업 기능 외에도 밴드 기능을 통해 수강생들끼리 단체 채팅방을 만들고, 자유롭게 게시글을 등록할 수 있습니다. 같은 관심사를 가진 사람들과 네트워크를 형성하고, 공동의 목표를 향해 함께 나아가세요.
편리하고 안전한 결제 프로세스!
강의 수강 신청부터 결제까지, 모든 과정을 쉽고 안전하게 처리할 수 있습니다. 결제 후 강의 정보를 한눈에 확인하고, 필요할 때 언제든지 관리할 수 있습니다.
저희 서비스는 중년 세대의 새로운 배움과 소통을 지원하며, 은퇴 후 삶의 질을 높이기 위한 다양한 기능을 제공합니다. 함께 배우고, 소통하고, 성장하는 기회를 지금 경험해 보세요!
서비스 핵심 기능
Gallery view
Search
서비스 아키텍처
기술 스택 및 기술적 의사결정
Integrated Services
기술 스택 | 기술 설명 및 의사 결정 |
Toss | 토스 페이먼츠는 간편하고 안전한 결제 통합을 위해 RESTful API와 SDK를 제공하여 다양한 결제 수단을 빠르게 연동할 수 있도록 지원합니다. 이를 통해 사용자가 강의 수강 신청을 할 때 신뢰할 수 있는 결제 환경을 제공하고자 했습니다.
Paypal이나 Stripe와 같은 글로벌 결제 플랫폼들과 토스를 두고 고민할 때 로컬 지원/ 개발 편의성 / 확장 가능성 / 결제 안정성 4가지 기준을 두고 평가해 보았습니다.
위 기준을 두고 평가했을 때 토스가 가지는 강점은 다음과 같았습니다.
1. 한국 시장에 최적화된 결제 시스템을 제공하여 국내 사용자와 상점이 주로 사용하는 다양한 로컬 결제 수단을 지원합니다. 결제 관련 이슈 발생 시 글로벌 플랫폼에 비해 빠른 대응이 가능합니다.
2. 개발자가 쉽게 결제 시스템을 구축할 수 있도록 API와 SDK를 제공하며 개발 도중 문제가 생겼을 때 토스 개발자 커뮤니티를 통해 빠르게 소통하고 피드백 받을 수 있습니다.
3. 정기 결제, 구독 관리 등 다양한 서비스를 지원하여 추후 서비스 확장에도 용이합니다.
4. 국내 규정과 보안 요건을 준수하여 보안, 규정 변화에 따른 리스크가 적습니다.
개발자 친화적인 Stripe도 장점이 많았지만, 토스 또한 높은 수준의 개발 편의성을 제공했고, 문서를 통해 이슈를 해결하지 못할 때 개발 커뮤니티에 직접적인 문의와 피드백이 더 쉬운 장점이 있었습니다. 그리고 무엇보다 국내 서비스임을 고려할 때 사용자가 느끼는 신뢰감, 결제 이슈 처리 등을 생각하면 토스가 가장 좋은 선택지라 생각되어 토스로 결정하게 되었습니다. |
SendBird (단체 채팅) | 수강생들 간의 활발한 소통과 네트워킹을 지원하기 위해 SendBird를 도입
했습니다. 이 솔루션은 안정적이고 확장성 있는 단체 채팅 기능을 제공하여, 수강생들이 강의 외에도 서로 소통하고 정보를 공유할 수 있는 환경을 만들어줍니다. 프로젝트 상에 여러 가지 기술을 써보고 싶었기에 프로젝트가 크게 성장한다는 가정하에 다양한 기능을 쉽게 통합하고 확장할 수 있는 점에서 도입하였습니다. |
Solapi (문자 발송 시스템) | 회원 가입 시, 사용자의 핸드폰 번호 인증은 향후 중요한 기능에서 활용될 수 있기에 필수적인 절차로 선택하였습니다. 이를 위해 SOLAPI를 사용하여 신뢰할 수 있는 핸드폰 번호 인증을 구현 하였습니다.
서비스 내에서 결제 기능이 포함되어 있으며, 오프라인 수업을 중심으로 운영되는 것을 목표로 하였기에 번호는 매우 중요합니다. 따라서 구글 회원가입이나 일반 회원가입 과정에서도 사용자가 반드시 모바일 인증을 거치도록 유도 하고 있습니다. |
Sentry (오류 모니터링) | 애플리케이션의 안정성을 유지하고, TypeScript와 Nest.JS 같은 다양한 프레임워크 및 언어화 통합될 수 있고 발생하는 오류를 실시간으로 알림을 받을 수 있고 직관적인 대시보드로 문제를 추적하여 빠르게 대응하기 위해 Sentry를 통합했습니다. 빠른 주기의 프로젝트에 적절한 선택이라고 생각해서 도입했습니다. (재정 상의 문제로 현재는 무료 버전이 끝났습니다.) |
BACKEND
기술 스택 | 기술 설명 및 의사 결정 |
NestJS | Nest.JS는 모듈화된 구조와 강력한 의존성 주입 시스템을 통해 대규모 애플리케이션을 안정적이고 일관성 있게 관리할 수 있습니다. TypeScript를 기반으로 한 안전한 개발 환경을 제공하여, 복잡한 비즈니스 로직을 관리하기에 적합합니다. |
Redis | Redis는 빠른 데이터 액세스가 필요한 캐시 및 세션 관리에 최적화된 솔루션입니다. 메모리 기반의 데이터 저장소로 높은 처리량과 저지연을 제공해, 실시간 데이터 처리에서 발생할 수 있는 병목현상을 줄이는 데 효과적입니다. 특히, 수강생 데이터나 알림, 토큰 재발급 등의 DB에 I/O 작업이 많은 데이터 위주로 redis를 사용하여 시스템의 효율성을 극대화할 수 있습니다. |
Redis Bull Queue
(결제 시스템 동시성 처리) | 결제 처리와 같은 중요한 작업에서 동시성 문제를 해결하는 것이 매우 중요합니다. 저희는 동시성 처리를 위해 Redis/BullMQ 라이브러리를 사용했습니다. BullMQ는 작업 큐 시스템으로, 결제와 관련된 각 작업을 큐에 넣고 순차적으로 처리할 수 있습니다. 이를 통해 여러 결제 요청이 동시에 들어오더라도 작업이 중복되거나 누락되지 않도록 처리할 수 있습니다.
BullMQ를 사용해 동시성 처리를 한 이유는 다음과 같습니다.
Kafka와 같은 다른 메시지 큐 시스템들과 비교하여 쉽게 설정하고 관리할 수 있습니다. Node.JS 환경, 서비스의 크기를 생각했을 때 기본적인 기능들을 간편하게 구현할 수 있는 장점이 있고, 구현의 간편함 이외에도 추후 서비스가 확장되어 더 많은 트래픽과 동시성을 처리해야 할 때 worker를 추가하여 부하를 분산시킬 수 있다는 점, Redis 위에서 동작하기 때문에 빠른 읽기/쓰기 성능을 제공한다는 점들을 고려하여 BullMQ를 사용하게 되었습니다.
|
Redis Pub/Sub | 실시간 채팅과 알림 기능의 서버 간 통신을 위해 Redis Pub/Sub을 선택했습니다. 이는 여러 서버 간의 실시간 데이터 동기화와 수평적 확장성에 최적화되어 있으며, 간편한 설정으로 높은 성능을 제공합니다. 또한, 대규모 알림 시스템 등 비동기 작업 처리가 필요한 기능 확장을 고려했을 때도 적합합니다. Redis Streams도 고려하였으나, 설정의 복잡성과 실제 요구 사항에 비해 불필요한 리소스로 인해 배제하고, Redis Pub/Sub을 최종적으로 선택했습니다. |
ChatGPT API | 자연어 처리 능력을 활용해 수강생들의 다양한 질문에 자동으로 답변할 수 있는 챗봇 기능을 제공하고자 구글의 OpenAI API를 통해 챗봇을 구현하려고 시도했으나 http통신 방식은 챗봇과 다르게 실시간 상호작용에 한계가 있어 지속적인 연결을 하기 위해 ChatGPT API를 도입했습니다. Your GPT는 이미 검증된 실시간 채팅기술을 쉽게 도입할 수 있어 개발 시간을 크게 줄일 수 있었습니다. 이를 통해 24시간 사용자 지원이 가능해지고, 사용자 경험을 향상시킬 수 있다고 생각합니다. |
Elasticsearch | Elasticsearch는 오픈 소스 분산 검색 및 분석 엔진으로, 대량의 데이터를 실시간으로 검색하고 분석하는 데 최적화된 도구입니다. 이 도구는 대규모 데이터에서도 실시간 검색이 가능하며, 데이터를 여러 샤드(shard)에 분산 저장하여, 각 샤드를 여러 노드에 복제함으로써 장애 발생 시에도 데이터를 안전하게 보관할 수 있습니다. 검색할 데이터를 미리 인덱싱해 저장하므로, 쿼리가 실행될 때 빠르게 결과를 받아볼 수 있습니다. 또한, Elasticsearch는 RESTful API를 통해 모든 기능에 쉽게 접근할 수 있어 개발자들이 유연하고 편리하게 사용할 수 있으며, 쿼리 설정을 통해 최적화된 검색 결과를 얻어낼 수 있습니다.
강의 검색의 특성상, 게시글처럼 대량의 데이터를 다룰 필요는 없었지만, RESTful API를 통해 쉽게 접근할 수 있다는 점과 빠른 검색 속도, 그리고 쿼리 설정을 통해 유사한 검색 결과를 효과적으로 얻어낼 수 있다는 점에서 검색 기능에 Elasticsearch를 사용하게 되었습니다. |
Socket.IO
| 강사와 수강생 간의 1:1 실시간 채팅과 실시간 알림 기능을 구현하기 위해 Socket.IO를 선택했습니다. Socket.IO는 클라이언트와 서버 간의 실시간 상호작용이 중요한 상황에서 자연스럽고 효율적으로 동작하며, 특정 방(room)으로 채팅을 분리하여 관리할 수 있는 이점이 있습니다.
SSE와 HTTP 요청을 조합하여 실시간 양방향 통신을 구현할 수 있지만, Socket.IO는 더 단순하고 강력한 양방향 통신을 제공하여 네트워크 오버헤드와 지연시간을 줄여줍니다. 특히 웹 소켓 기반으로 지속적인 연결을 유지하므로, 리소스 사용이 효율적입니다.
또한, 알림 기능에서 확장성이 필요한 경우(예: 읽음/안 읽음 상태 추적, 클릭 시 상호작용)에도 Socket.IO는 높은 유연성을 제공하여 추후 기능 확장이 용이합니다. 이로써 수강생들이 강의 중 실시간으로 궁금한 점을 해결할 수 있도록 빠르고 신뢰할 수 있는 실시간 통신을 구현할 수 있었습니다. |
FRONTEND
기술 스택 | 기술 설명 및 의사 결정 |
Bubble.io | Bubble.io는 코딩 없이 웹 애플리케이션을 개발할 수 있는 노코드 플랫폼입니다. 사용자 인터페이스 디자인과 비즈니스 로직을 쉽게 구현할 수 있으며, 다양한 플러그인과 통합 기능을 통해 복잡한 애플리케이션도 빠르게 구축할 수 있습니다. 특히, 시간이나 개발 리소스가 제한된 상황에서 코딩 없이도 효율적으로 웹 애플리케이션을 제작할 수 있는 점이 큰 장점이 되었습니다. |
Database
기술 스택 | 기술 설명 및 의사 결정 |
AWS S3 | AWS에서 제공하는 객체 스토리지 서비스인 AWS S3는 대규모 데이터를 저장하고 관리하는 데 최적화되어 있으며 사용자가 필요한 만큼 용량을 확장하기에 용이하고, 내구성이 99.999999999%일 정도로 데이터 손실의 위험이 매우 낮습니다.. 또한 보안을 위해 다양한 권한을 세밀하게 제어할 수 있고, AWS의 다른 서비스들과도 원활하게 통합됩니다.
정해진 용량이 아닌 사용자의 상황에 따라 용량이 자동으로 늘어나기 때문에 용량이 없는 경우에 업로드 시 데이터 유실될 가능성을 방지할 수 있고, I AM키를 사용하거나 다양한 권한 정책으로 보안이 뛰어나며 더 빠른 서비스 제공을 위해 CloudFront를 도입할 예정이였어서 AWS S3를 도입하게 되었습니다. |
Redis | Redis는 메모리 기반의 데이터 스토어로, 빠른 속도와 성능이 필요한 작업에 최적화되어 있습니다. 주로 회원 가입시 인증코드 관리 사용자 토큰 관리 등과 같은 실시간 데이터 처리에 활용됩니다. |
Mysql | 정형화된 데이터를 안전하게 관리하고 관계형 데이터베이스가 필요한 사용자 정보, 결제 기록 등 민감한 데이터 처리에서는 트랜잭션 관리가 필수적입니다. RDBMS는 트랜잭션을 통해 데이터의 일관성과 무결성을 보장하기 위하여 선택하였습니다. |
DevOps / Infra
기술 스택 | 기술 설명 및 의사 결정 |
CloudFront | CloudFront는 전 세계에 분산된 엣지 로케이션을 통해 사용자에게 콘텐츠를 빠르고 안전하게 전달합니다. 또한 자주 요청되는 콘텐츠를 캐싱 되어 S3나 원본 서버로의 트래픽을 줄임으로써 비용을 절감할 수 있습니다. HTTP 헤더나 쿠키에 따라 개인화하거나 특정 경로에 대한 캐시 동장을 정의 할 수 있습니다.
분산된 엣지 로케이션을 통해 강의 영상, 이미지, 웹 콘텐츠 등을 사용자에게 더 가까운 위치에서 제공하여 로딩 시간을 줄이고 사용자 경험을 향상시킬 수 있습니다. 또한, 이미 S3를 도입하기로 계획했기 때문에, CloudFront를 통해 트래픽을 줄여 비용을 절감하고 효율성을 극대화할 수 있다는 점에서 CloudFront를 선택하게 되었습니다. |
Elasticsearch (EC2 호스팅) | 검색 및 분석 기능을 지원하는 Elasticsearch를 EC2 인스턴스에 배포하여,VPC 내부로 연결을 통해 검색 데이터를 신속하게 처리하고 필요한 정보를 즉시 검색할 수 있습니다. |
GitHub Actions | GitHub Actions는 CI/CD파이프라인을 자동화하기 위해 도입되었습니다. 다양한 CI/CD 도구 중에서 Github Actions를 선택한 이유는 Github와의 원활한 통합이 가능하였기 때문입니다.
코드를 Github에 푸시할 때마다 자동으로 빌드, 테스트, 배포 프로세스가 실행됩니다. |
Elastic Load Balancing | ELB는 애플리케이션의 가용성과 안정성을 높이기 위해 도입되었습니다. ELB를 사용함으로써 HTTPS 배포로 데이터 전송을 암호화하여 보안을 강화했습니다. |
AWS CodeDeploy | AWS CodeDeploy는 애플리케이션의 배포 자동화를 위해 도입되었습니다. Github Actions와 AWS S3와 함께 사용하여, 코드를 푸시할 때 자동으로 배포가 이루어지도록 설정했습니다.
이를 통해 점진적 배포와 롤백 기능을 통해 배포중 발생할 수 있는 위험을 최소화할 수 있고 안정적이라 생각하여 도입하였습니다. |
Nginx | Nginx는 웹 서버와 리버스 프록시 서버로 도입되어, 서비스 컨트롤러를 호스트 기반으로 나누고 트래픽을 효율적으로 관리하기 위해 사용되었습니다. 이를 통해 다양한 서비스로부터의 요청을 정확하게 라우팅할 수 있으며, 웹 애플리케이션의 성능과 안정성을 크게 향상했습니다. |
트러블 슈팅
추후 기술적 도전계획
추후 기술적 도전 계획
•
Docker 적용
◦
목표 개발 및 배포 환경의 일관성을 유지하기위해, Docker를 도입할 계획입니다.
◦
기대효과 :
▪
환경 일관성 : 모든 개발자 및 배포 환경에서 동일한 설정으로 애플리케이션을 실행할수있어 환경차이로 인한 문제를 최소화 할수있습니다.
▪
확장성 : Docker를 사용해서 쉽게 확장하고, 마이크로 서비스로 전환을 기대해볼수있습니다.
•
테스트 코드
◦
코드 품질을 향상과 변경 사항 검증, 버그 식별을 위해 테스트 코드를 작성해볼 계획입니다.
◦
기대효과 :
▪
CI 테스트 : 테스트 자동화를 Github Actions와 연동 하여, 자동으로 테스트를 실행하고 결과를 확인가능.
▪
안정성 : 코드 변경 시 발생할 수 있는 문제를 사전에 방지하여, 애플리케이션의 안정성을 높일 수 있다.
•
NestJS 마이크로 서비스로의 전환
◦
초기 기획 하였던 시스템을 구현하기위해 현재 모놀리식 아키텍처를 마이크로 서비스 아키텍처로 전환할 계획입니다.
◦
기대효과 :
▪
확장성 : 마이크로서비스 아키텍처를 도입하면, 각각의 서비스가 독립적으로 배포 및 확장 될 수 있어, 시스템 전체의 확장성이 크게 향상됩니다. 특정 기능에 대한 트래픽이 급증할 경우, 해당 서비스만 확장하여 대응할 수 있습니다.
▪
장애 격리 : 마이크로서비스 아키텍처는 서비스 간의 결합도를 낮추기 때문에, 하나의 서비스에서 장애가 발생하더라고 다른서비스에 미치는 영향을 최소화 할수 있습니다.
•
서비스 간 통신
◦
메시지 브로커는 비동기 통신을 통해 서비스 간 메시지를 전달하는 중개자 역할을 합니다. Kafka나 RabbitMQ와 같은 메시지 브로커는 각 서비스가 독립적으로 동작하면서도 메시지를 주고받아 협업할 수 있도록 합니다.
◦
기대효과 :
▪
안정성 : 메시지 브로커는 메시지를 큐에 저장하여 전달 보장을 지원하므로, 일시적인 장애가 발생하더라도 메시지가 손실되지않아 안정성을 높일 수 있습니다.
유저 테스트 결과 분석
유저 테스트 결과 분석 및 피드백 자체 평가
긍정 평가
•
전반적으로 서비스 기획 의도인 은퇴 후 삶의 질 향상을 목표로 하는 서비스의 목적이
명확하게 이해되고 있다고 답변하였습니다.
•
쉽게 접근할 수 있는 UI와 큰 글씨, 빠르게 답변을 얻을 수 있는 챗봇으로 어르신들이 쉽게 사용할 수 있도록 구현되었다는 의견이 많았습니다.
•
빠른 검색 성능과 결제 처리에 있어 서비스의 완성도가 높고 안정적인 경험을 사용자에게 성공적으로 전달되고 있다고 판단됩니다.
부정 평가
•
특정 페이지에서 버튼과 내용이 겹치거나 챗봇 작성칸이 보이지 않는 등 UI/UX 개선이 필요하다는 의견이 많았습니다.
•
사이트 전반적으로 오류메세지나 예외 처리가 부족하다는 의견이 많아서 개선이 필요해 보입니다.
•
로그인을 필요로 하는 시점이 너무 이른 부분이 문제로 지적받았습니다.
•
사이트 로딩 속도가 느리다는 불만이 여러 차례 제기되었습니다. 성능 처리에 개선이 필요해 보입니다.
•
사랑방과 밴드라는 용어가 번갈아 사용되어 혼란을 유발하여 일관성이 필요해 보입니다.
•
챗봇 답변의 다양성이 부족하고 받을 수 있는 답변이 한정적이다는 의견이 많았습니다.
•
사용자가 기대한 결과와 다른 검색 결과가 나타나는 경우가 많아, 키워드 검색의 정확성 개선이 필요합니다.
새로운 의견
•
커뮤니티 활성화를 위해 사진, 동영상 등의 멀티미디어를 게시글에 추가할 수 있으면 좋겠다는 의견을 받았습니다.
•
검색 조건 중 카테고리가 있으면 좋겠다는 의견이 있었습니다(취미, 기술, AI, 요리, 금융, 예술 등)
유저 피드백 개선 방향 및 계획
추가 개선 과제
•
프론트엔드 UI, UX 개선
◦
뒤로 가기 버튼 추가
◦
장바구니 UX 개선
◦
회원가입 시 닉네임 5글자 제한 완화
◦
카테고리별 수업 필터 기능 추가
◦
댓글 사용자 선호에 따라 정렬 방식 선택
◦
사진, 영상을 게시글 중간에 추가 가능하게 만들기
•
회원가입, 로그인 로직 개선
◦
회원가입 시 해당 이메일로 인증을 추가 수행, 이메일 계정 소유자 검증
◦
반복적, 악의적인 로그인 시도를 차단하여 보안 문제 보완
•
에러 메세지 및 오류 처리 개선
◦
로그를 기록하여 문제를 파악
◦
사용자가 이해하기 쉬운 에러 메세지로 개선
◦
다양한 상황에 대응하는 예외 처리 추가
•
챗봇 답변 다양화
•
추천 수업 시스템
•
수업 리뷰 작성 프론트엔드 구현
•
블랙리스트 관리 시스템
◦
Admin 페이지에서 사용자를 서비스에 접근할 수 없게 블랙리스트에 추가하는 기능을 구현합니다.
개선 사항
•
검색 정확성 개선
◦
현재의 검색 기능은 전혀 상관없는 키워드나 문구까지 포함되어 정확도가 부족한 경우가 있습니다. 이를 개선하기 위해 , 검색 알고리즘의 최적화와 Elasticsearch의 설정 조정 등을 통해서 검색 결과의 정확성을 높이는 방향으로 작업을 진행할 계획입니다.
•
알림 및 채팅 페이지 네이션
◦
알림 목록은 시간이 지남에 따라 데이터베이스에 지속적으로 쌓이고 있습니다. 이에 따라 주기적으로 오래된 알림을 정리하는 작업을 추가하여, 불필요한 데이터가 시스템에 부담을 주지 않도록 개선할 계획입니다.
◦
채팅 기능의 경어 대량의 데이터가 로드되는 경우 성능 저하가 발생할 수 있습니다. 이를 해결하기 위해서 페이지 네이션 기능을 도입하여 데이터 로딩을 효율적으로 개선할 예정입니다.
•
Redis 활용한 데이터 캐싱
◦
자주 조회되는 데이터를 Redis를 통해 캐싱 하여, DB에 부담을 줄이고 사용자 프로필, 대시보드와 같은 자주 접근하는 데이터를 빠르게 제공하여 응답속도를 향상시킬 계획입니다.
•
검색 인덱스 스케줄링 시 최적화
◦
현재 스케줄링된 검색 인덱스 작업을 개별적으로 처리하는 대신, bulk 작업으로 전환 한 번에 처리하도록 개선할 계획입니다 이를 통해 인덱싱 과정에서 발생하는 오버헤드를 줄일 계획입니다.
이후 구체적인 개선 방향에 대한 논의와 충분한 학습을 거쳐 기술적 도전 과제를 이행할 계획을 가지고 있습니다.