← 목록으로
👥 팀 프로젝트📅 2025.07 - Present

MJSEC LMS

MJSEC 내부 스터디 운영에서 과제 제출, 출석 관리, 활동 기록, 관리자 알림, 외부 Wiki.js 계정 연동을 자동화하기 위한 Spring Boot 기반 LMS 백엔드입니다.

담당 역할

과제(Assignment), 스터디 계획(Calendar/Plan), 출석체크, 스터디 그룹, 스터디 활동 이미지, 관리자 알림, Wiki.js 연동 일부를 담당했습니다. 단순 CRUD보다 운영 중 발생할 수 있는 중복 제출, 알림 누적, 다중 이미지 정리, 파일 업로드 보안 문제를 백엔드에서 제어하는 데 집중했습니다.

Tech Stack

Spring BootMySQLRedisJPASpring SchedulerJavaMailSenderApache TikaWiki.js GraphQL

아키텍처 / ERD

LMS의 중심 도메인은 User, StudyGroup, GroupMember, Calendar/Plan, Assignment, AssignmentSubmission, Attendance로 구성됩니다. 스터디 그룹에 멘토와 멘티가 소속되고, 그룹 단위로 계획과 과제가 생성되며, 사용자는 과제를 제출하고 출석 상태를 기록합니다.

MJSEC LMS ERD

주요 기능

  • 과제 제출, 멘토 피드백, 수정 요청, 완료 처리까지 이어지는 과제 운영 흐름을 상태 기반으로 관리하도록 구현했습니다.
  • 동일 과제에 대한 동시 제출 요청이 중복 저장되지 않도록 Plan 기준 비관적 락과 동시성 테스트를 적용했습니다.
  • 수동으로 확인하던 과제 미제출자와 장기 결석자를 자동으로 파악하도록 스케줄러 기반 메일 알림을 구현했습니다.
  • 스터디 활동 게시글의 다중 이미지 업로드, 수정, 삭제 흐름을 구현하고 게시글 변경 시 기존 파일 정리까지 처리했습니다.
  • 클라이언트 Content-Type을 신뢰하지 않고 Apache Tika, Magic Number, 이중 확장자 차단으로 이미지 업로드 검증을 강화했습니다.
  • 관리자 승인 시 LMS 계정 생성과 오픈소스 위키 플랫폼 Wiki.js 계정 생성을 연동하되, 외부 API 실패가 LMS 가입 흐름을 막지 않도록 분리했습니다.

트러블슈팅

  • 과제 중복 제출 문제중복 여부 확인과 저장 사이에 동시에 요청이 들어오면 같은 과제가 여러 번 저장될 수 있었습니다.과제가 속한 Plan 행에 비관적 락을 걸어 검증과 저장 구간을 직렬화하고, 동시 요청 테스트로 1건만 성공하는지 확인했습니다.
  • 과제 알림 누적 문제오래전에 마감된 과제까지 매주 알림 대상에 포함될 수 있었습니다.최근 1주일 내 마감된 과제만 조회하도록 조건을 좁혀 실제 운영에 필요한 알림만 발송되도록 수정했습니다.
  • 다중 이미지 수정 문제활동 게시글 이미지를 교체할 때 DB의 이미지 목록과 실제 업로드 파일이 어긋날 수 있었습니다.수정/삭제 시 기존 파일을 함께 정리하는 흐름을 추가해 저장소에 불필요한 파일이 남지 않도록 했습니다.

성능 / 안정성

  • 알림 대상 조회 범위 제한 알림 쿼리는 전체 과제/출석 데이터를 매번 훑지 않도록 기간 조건과 상태 조건을 명확히 두었습니다. 이를 통해 발송 대상 계산 범위를 줄이고, 오래된 데이터가 반복적으로 포함되는 문제를 방지했습니다.
  • DB 트랜잭션 기반 정합성 유지 중복 제출 방지는 애플리케이션 레벨 플래그보다 DB 트랜잭션과 비관적 락을 사용했습니다. 서버 인스턴스가 늘어나도 동일한 정합성 기준을 유지할 수 있도록 설계했습니다.

보안 고려 사항

  • 실제 파일 타입 검증 이미지 업로드는 확장자와 Content-Type만 확인하지 않고 Apache Tika 기반 MIME 탐지, Magic Number 검증, 이중 확장자 차단, 위험 확장자 블랙리스트를 함께 적용했습니다.
  • 파일 저장 안정성 강화 파일 저장 경로는 정규화해 의도하지 않은 경로 접근을 방지했습니다. 스트림 기반 복사와 이미지 크기 검증으로 과도한 메모리 사용과 비정상 이미지 업로드를 방어했습니다.

아쉬웠던 점

초기에는 기능 구현 속도에 집중했지만, 실제 운영 시나리오에서는 중복 제출, 오래된 알림 누적, 파일 정리 누락처럼 기능 사이의 경계에서 문제가 발생했습니다. 이후 PR 리뷰와 운영 이슈를 반영하면서 단순 기능 구현보다 데이터 정합성, 알림 정책, 실패 격리를 먼저 고려해야 한다는 점을 배웠습니다.

프로젝트 유형

팀 프로젝트

기간

2025.07 - Present

완료

In Progress

사용 기술

8 Technologies