Skip to content

snikuz12/TEENKIRI_BACKEND

Repository files navigation

null_틴키리

팀원

팀장 팀원 팀원 팀원 팀원
김창현 김정은 이예나 이한아 황요한
김창현 김정은 이예나 이한아 황요한


✏️TEENKIRI: 초등학생을 위한 온라인 교육 사이트

TEENKIRI는 초등학생을 위한 혁신적인 온라인 교육 플랫폼입니다. 현대 사회에서 교육의 질은 학생의 미래를 결정짓는 중요한 요소입니다. TEENKIRI는 모든 학생이 차별 없이 양질의 교육을 받을 수 있도록, 무료로 최고의 학습 콘텐츠를 제공합니다.


💡프로젝트 목표

TEENKIRI의 목표는 무상으로 제공되는 고품질 교육을 통해 경제적 격차로 인한 교육 불평등을 해소하고, 모든 학생에게 공정한 교육 기회를 제공하는 것입니다. 이를 통해 학부모의 경제적 부담을 줄이고, 학생들이 자신의 잠재력을 최대한 발휘할 수 있도록 지원합니다.

주요 기능

기능 설명
간편한 회원가입 구글 로그인 또는 이메일 인증을 통한 간편한 회원가입으로, 학생들은 빠르고 쉽게 TEENKIRI의 모든 강의를 수강할 수 있습니다.
다양한 강좌 과목별로 다채로운 강좌와 강의를 그리고 추천목록을 제공하여 학생들이 자신에게 맞는 선생님과 강좌를 자유롭게 선택할 수 있습니다.
온라인 영상 강의 언제 어디서든 수강 가능한 고품질 녹화 강의를 제공하여 학생들이 자신의 학습 속도에 맞춰 체계적으로 학습하고 진행률을 확인할 수 있습니다.
소통 기능 채팅, 자유게시판, 댓글 등을 통해 다른 학생들과 자유롭게 의견을 나누고 소통할 수 있습니다.
질의응답 시스템 학습 중 어려운 부분이나 궁금한 점이 생기면 사진이나 글로 질문을 남길 수 있으며, 실시간 알림을 통해 해당 강좌의 강사가 신속하고 정확한 답변을 제공합니다.
실시간 알림 질문에 대한 답변이나 댓글 알림을 학생들에게 실시간으로 전달하여 빠르고 원활한 학습 환경을 지원합니다.
실시간 채팅 과목별 실시간 채팅을 이용하여, 궁금한 점이 생기면 사용자간 실시간으로 질문을 주고 받을 수 있습니다.
신고 기능 부적절한 게시글이나 댓글, 채팅을 신고하여 관리하며, 안전하고 건전한 학습 환경을 유지합니다.

API 명세서

API 명세서

스택

BACKEND

Java Spring socketdotio

DB

mariadb redis amazons3

TOOLS

Notion Git GitHub Gather figma github-actions postman

배포툴

kubernetes nginx amazonec2

WBS

WBS 보기

프로젝트 요구사항 명세서

요구사항 명세서 보기

ER Diagram


Teenieping

배포 아키텍쳐

배포아키텍쳐

아키텍쳐 선택이유

Kubernetes docker compose
아키텍처 다중호스트 단일호스트
확상성 Scale-Out Scale-Up
로드밸런싱 자동설정 직접설정
HA 장애 감지 및 자동 복구 장애 발생 시 서비스 다운
설정편의성 내부 서비스 디스커버리 자동 설정 서비스의 IP 주소나 도메인을 직접 지정



시스템 아키텍쳐

백엔드 아키텍쳐

백엔드아키텍쳐

통신플로우

세션 로그인 플로우

구성 스크립트

Back-End
teenkiri_k8s.yml
  name: deploy ordersystem with k8s
  on:
    push:
      branches:
        - main
  jobs:
    build-and-deploy:
      runs-on: ubuntu-latest
      steps:
        - name: checkout github (source code checkout)
          uses: actions/checkout@v2
        
        - name: install kubectl
          uses: azure/setup-kubectl@v3
          with:
            version: "v1.25.9"
          id: install

        - name: configure aws (key setting)
          uses: aws-actions/configure-aws-credentials@v1
          with:
            aws-access-key-id: ${{secrets.AWS_KEY}}
            aws-secret-access-key: ${{secrets.AWS_SECRET}}
            aws-region: ap-northeast-2

        - name: update cluster information
          run : aws eks update-kubeconfig --name teenkiri-cluster --region ap-northeast-2

        - name: login ECR
          id: login-ecr
          uses: aws-actions/amazon-ecr-login@v1

        - name: build and push docker images to ecr (env:변수명지정)
          env:
            REGISTRY: 346903264902.dkr.ecr.ap-northeast-2.amazonaws.com
            REPOSITORY: teenkiri
          run: |
            docker build -t $REGISTRY/$REPOSITORY:latest -f ./Dockerfile .
            docker push $REGISTRY/$REPOSITORY:latest

        - name: eks kubectl apply
          run: |
            kubectl apply -f ./k8s/teenkiri_depl.yml
            kubectl rollout restart deployment teenkiri-deployment -n teenkiri
certificate.yml
  apiVersion: cert-manager.io/v1
  kind: ClusterIssuer
  metadata:
    name: letsencrypt-prod
  spec:
    acme:
      # 인증서 서버 주소. 해당 서버의 리소스를 통해 인증서 발행
      server: https://acme-v02.api.letsencrypt.org/directory
      email: snikuz12@naver.com
      privateKeySecretRef:
        name: letsencrypt-prod
      solvers:
      - http01:
          ingress:
            class: nginx
  # 3. Certificate 생성
  ---
  apiVersion: cert-manager.io/v1
  kind: Certificate
  metadata:
    name: teenkiri-com-tls
    namespace: teenkiri
  spec:
    secretName: teenkiri-com-tls
    duration: 2160h # 90일
    renewBefore: 36h # 15일전에 갱신
    issuerRef:
      name: letsencrypt-prod
      kind: ClusterIssuer
    commonName: server.teenkiri.site
    dnsNames:
      - server.teenkiri.site
teenkiri_depl.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: teenkiri-deployment
  namespace: teenkiri
spec:
  replicas: 3
  selector:
    matchLabels:
      app: teenkiri
  template:
    metadata:
      labels:
        app: teenkiri
    spec:
      containers:
        - name: teenkiri
          image: 346903264902.dkr.ecr.ap-northeast-2.amazonaws.com/teenkiri:latest
          ports:
            - containerPort: 8080
          resources:
            limits:
              cpu: "1"
              memory: "500Mi"
            requests:
              cpu: "0.5"
              memory: "500Mi"

          env:
            - name: REDIS_HOST
              valueFrom:
                secretKeyRef:
                  key: REDIS_HOST
                  name: teenkiri-app-secrets
            - name: REDIS_PORT
              valueFrom:
                secretKeyRef:
                  key: REDIS_PORT
                  name: teenkiri-app-secrets
            - name: DB_HOST
              valueFrom:
                secretKeyRef:
                  key: DB_HOST
                  name: teenkiri-app-secrets
            - name: DB_USERNAME
              valueFrom:
                secretKeyRef:
                  key: DB_USERNAME
                  name: teenkiri-app-secrets
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: DB_PASSWORD
                  name: teenkiri-app-secrets
            - name: JWT_SECRET
              valueFrom:
                secretKeyRef:
                  key: JWT_SECRET
                  name: teenkiri-app-secrets
            - name: JWT_SECRET_RT
              valueFrom:
                secretKeyRef:
                  key: JWT_SECRET_RT
                  name: teenkiri-app-secrets
            - name: AWS_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  key: AWS_ACCESS_KEY
                  name: teenkiri-app-secrets
            - name: AWS_SECRET_KEY
              valueFrom:
                secretKeyRef:
                  key: AWS_SECRET_KEY
                  name: teenkiri-app-secrets
            - name: JWT_TIME
              valueFrom:
                secretKeyRef:
                  key: JWT_TIME
                  name: teenkiri-app-secrets
            - name: JWT_TIME_RT
              valueFrom:
                secretKeyRef:
                  key: JWT_TIME_RT
                  name: teenkiri-app-secrets
            - name: GOOGLE_TOKEN
              valueFrom:
                secretKeyRef:
                  key: GOOGLE_TOKEN
                  name: teenkiri-app-secrets
            - name: GOOGLE_SECRET
              valueFrom:
                secretKeyRef:
                  key: GOOGLE_SECRET
                  name: teenkiri-app-secrets
            - name: KAKAO_TOKEN
              valueFrom:
                secretKeyRef:
                  key: KAKAO_TOKEN
                  name: teenkiri-app-secrets
            - name: KAKAO_SECRET
              valueFrom:
                secretKeyRef:
                  key: KAKAO_SECRET
                  name: teenkiri-app-secrets
            - name: NAVER_TOKEN
              valueFrom:
                secretKeyRef:
                  key: NAVER_TOKEN
                  name: teenkiri-app-secrets
            - name: NAVER_SECRET
              valueFrom:
                secretKeyRef:
                  key: NAVER_SECRET
                  name: teenkiri-app-secrets
            - name: AUTH_HOST
              valueFrom:
                secretKeyRef:
                  key: AUTH_HOST
                  name: teenkiri-app-secrets
            - name: AUTH_PORT
              valueFrom:
                secretKeyRef:
                  key: AUTH_PORT
                  name: teenkiri-app-secrets
            - name: AUTH_EMAIL
              valueFrom:
                secretKeyRef:
                  key: AUTH_EMAIL
                  name: teenkiri-app-secrets
            - name: AUTH_KEY
              valueFrom:
                secretKeyRef:
                  key: AUTH_KEY
                  name: teenkiri-app-secrets
            - name: BUCKET
              valueFrom:
                secretKeyRef:
                  key: BUCKET
                  name: teenkiri-app-secrets
teenkiri_ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: teenkiri-ingress
  namespace: teenkiri
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "3G"
    nginx.ingress.kubernetes.io/client-body-buffer-size: "3G"
    nginx.ingress.kubernetes.io/affinity: "cookie"  # 세션 스티키니스 활성화
    nginx.ingress.kubernetes.io/session-cookie-name: "teenkiri-session"  # 세션 쿠키 이름
    nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"  # 쿠키 해시 알고리즘
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - "server.teenkiri.site"
      secretName: teenkiri-com-tls
  rules:
    - host: server.teenkiri.site
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: teenkiri-service
                port:
                  number: 80
teenkiri_service.yml
apiVersion: v1
kind: Service
metadata:
  name: teenkiri-service
  namespace: teenkiri  
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 80
      targetPort: 8080
    - name: tomcat
      port: 8090
      targetPort: 8090
  selector:
    app: teenkiri
Configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
data:
  proxy-body-size: "3G"
  client-body-buffer-size: "3G"   

시행착오 관련 사항

소셜로그인 오류 이유
소셜로그인 오류 해결
파일업로드 nginx 파일크기 미설정으로 인한 오류 tomcat 파일크기 미설정으로 인한 오류
ingress.yml 수정내역
    nginx.ingress.kubernetes.io/affinity: "cookie"  # 세션 스티키니스 활성화
    nginx.ingress.kubernetes.io/session-cookie-name: "teenkiri-session"  # 세션 쿠키 이름
    nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"  # 쿠키 해시 알고리즘
ingress.yml 수정내역
    nginx.ingress.kubernetes.io/affinity: "cookie"  # 세션 스티키니스 활성화
    nginx.ingress.kubernetes.io/session-cookie-name: "teenkiri-session"  # 세션 쿠키 이름
    nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"  # 쿠키 해시 알고리즘
application.yml 수정내역
  spring:
    servlet:
      multipart:
        max-file-size: 3GB   # 파일당 최대 크기
        max-request-size: 3GB  # 전체 요청 크기

프로젝트 시연

👤 로그인, 회원가입

회원가입 및 로그인, 회원탈퇴
구글 로그인
카카오 로그인
아이디 저장
아이디 찾기
비밀번호 찾기
비밀번호 재설정 링크 사용자 이메일로 전송 비밀번호_재설정_링크
구글 로그인
id 저장
로그인 및 로그아웃
로그인
로그아웃
회원탈퇴
회원탈퇴 확인

📚 강좌 및 강의

강좌 생성 및 강좌 리스트, 강좌 상세
강좌 추천
강좌 수강신청 및 내가 수강중인 강좌 리스트
강의 시청 플레이어, 강의 진행률 서버와 통신, 강의 수강완료 여부 통신
강의 후기 작성 및 조회 별점 및 후기
강좌 찜, 찜 목록

📋 게시판

자유게시판 검색
자유게시판 작성, 수정, 삭제, 댓글, 신고
질문 게시판 검색
질문 게시판 작성, 수정, 삭제, 댓글, 신고, 알림

💬 실시간 채팅

실시간 채팅

🔔 알림

알림 드롭다운, 알림 목록 조회

🚨 신고

게시판별 신고 목록 - 관리자
신고 누적으로 계정 정지된 회원 확인 - 관리자
회원 탈퇴 처리 확인

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors