Skip to content

[Feat] 관리자 페이지 개편 (디자인, 로그인 유지, 데이터 조회, 통계) - #342

Merged
KiSeungMin merged 7 commits into
developfrom
feat/admin-page-renewal
Sep 21, 2026
Merged

KiSeungMin merged 7 commits into
developfrom
feat/admin-page-renewal

Conversation

@KiSeungMin

Copy link
Copy Markdown
Contributor

✔️ 연관 이슈

📝 작업 내용

관리자 화면을 새 디자인으로 다시 만들고, 대규모 업데이트로 늘어난 치장, 업적, 미션, 스터디룸 데이터와 통계를 볼 수 있게 했습니다.

  • 로그인 유지: 세션 만료 설정이 없어 톰캣 기본값 30분이 적용되고 있었습니다. 24시간으로 늘렸고, 로그인 유지 쿠키를 붙여 배포 뒤에도 로그인이 풀리지 않습니다.
  • 로그아웃 수정: logoutUrl 에 전체 URL 이 들어가 있어 로그아웃이 동작하지 않던 설정을 경로로 고쳤습니다.
  • 유저 삭제 제거: 관리자 화면의 DELETE /admin/user/{id} 를 없앴습니다.
  • 디자인: 공통 레이아웃(admin.css, admin.js, fragments/admin-layout.html)을 만들었습니다. 사이드바는 접을 수 있고 모바일에서는 서랍으로 열립니다.
  • 데이터: 화면을 새로 만들거나 늘렸습니다.
    • 유저 상세에 치장, 업적, 미션, 스터디룸 탭을 추가했습니다.
    • 복습노트 상세 화면을 새로 만들었습니다.
    • 스터디룸 상세에 챌린지, 공유 문제, 피드, 주간 리포트를 추가했습니다.
    • 미션, 업적, 치장 화면을 새로 만들었습니다.
  • 통계: 복습 수를 mission_log 대신 problem_solve 기준으로 셉니다. 방문 횟수는 출석 유저 수와 항상 같은 값이라 지웠습니다. 날짜별 숫자를 누르면 그날 목록으로 이동합니다.
  • 게스트 제외: 모든 집계 숫자에서 게스트와 관리자 계정을 뺍니다. 조건은 AdminSqlFilters 한 곳에 있습니다.

👤 사용자 영향

  • 앱 사용자에게는 영향이 없습니다. 관리자 화면(/admin/**, /login)만 바뀝니다.

🔌 API 호환성

  • 요청/응답 DTO 변경 없음
  • 기존 Flutter 앱 버전과 호환 확인
  • breaking change 있음

🗄️ DB migration

  • 없음
  • 있음: migration 파일과 기존 데이터 호환성 확인

🔐 인증/권한

  • 영향 없음
  • 사용자별 데이터 소유권 검증 확인
  • 관리자/특수 권한 영향 확인
    • 로그인 없이 관리자 화면(GET)을 열면 401 JSON 대신 로그인 화면으로 보냅니다. 화면이 아닌 요청은 그대로 401 입니다.
    • 새 엔드포인트와 공지 엔드포인트를 AdminEndpointAuthorizationTest 에 넣어 멤버와 게스트는 403, 비로그인은 차단되는 것을 확인합니다.
    • 로그인 유지 쿠키의 서명 키는 jwt.accessToken.secret 에서 만듭니다. 설정 추가는 없습니다.

✅ 검증 결과

  • 전체 테스트 3,574개가 로컬에서 통과했습니다.
  • 로컬 서버에서 관리자 화면 17개를 데스크톱과 모바일 폭으로 확인했습니다. 나란한 카드의 높이가 어긋난 곳이 없는 것도 스크립트로 확인했습니다.

🚀 배포 리스크

  • 통계 쿼리 증가: 통계와 홈 화면이 한 번에 수십 개의 집계 쿼리를 보냅니다. 모두 기간 조건과 GROUP BY 한 번으로 끝나지만, dev 에서 응답 시간을 한 번 확인해 주시면 좋을 것 같습니다.
  • 배포 직후 1회 재로그인: 로그인 유지 쿠키는 이 배포 이후 로그인부터 발급됩니다.

↩️ 롤백/대응 방법

  • 이 PR 을 revert 하면 됩니다. 스키마와 데이터 변경이 없어서 되돌려도 남는 흔적이 없습니다.

- 로그인 성공 시 세션 유휴 만료를 24시간으로 늘린다 (설정이 없어 톰캣 기본값 30분이 적용되고 있었다)
- 로그인 유지 쿠키를 붙여 배포로 컨테이너가 바뀌어도 24시간 동안 다시 로그인하지 않는다
- logoutUrl 에 전체 URL 이 들어가 어떤 요청과도 맞지 않던 설정을 경로로 고친다
- 로그인이 풀린 채 관리자 화면을 열면 JSON 401 대신 로그인 화면으로 보낸다
- 관리자 화면의 유저 삭제 엔드포인트를 없앤다
- 온보딩 페이지의 브랜드 초록(#1cba1a)과 회색 바탕 위 흰 카드 구성으로 공통 스타일을 만든다
- 사이드바, 페이지 이동, 탭 밑줄, 숫자 카운트업, 화면 전환 효과를 공통 조각과 스크립트로 둔다
- 페이지 링크가 지금 걸린 필터를 유지하도록 AdminPager 를 추가한다
- 공지는 실사용자 전원에게 뜨므로 걸기 전과 내리기 전에 한 번 더 확인받는다
- 유저 목록에 검색과 가입 경로 필터, 정렬 7종을 넣고 상세를 치장, 업적, 미션, 스터디룸까지 탭 7개로 나눈다
- 복습 기록을 mission_log 대신 problem_solve 기준으로 바꾸고 복습노트 상세 화면을 추가한다
- 오답노트와 복습 기록, 복습노트 목록에 날짜와 유저, 상태 필터를 넣는다
- 스터디룸 상세에 챌린지, 공유 문제와 댓글, 피드, 주간 리포트를 추가한다
- 미션, 업적, 치장 현황 화면을 새로 만든다
- 통계를 사용자, 학습, AI 분석, 성장, 스터디룸으로 나누고 재방문율과 고착도, 직전 기간 비교를 넣는다
- 날짜별 표의 숫자를 누르면 그날 목록으로 이동한다
- 권한 테스트에 새 엔드포인트와 공지 엔드포인트를 넣는다
- 그리드 안 두 번째 카드에만 위 여백이 붙어 나란한 박스 높이가 어긋나던 규칙을 고친다
- 화면이 뜬 뒤 카드를 투명하게 되돌리던 등장 효과와 숫자 카운트업을 없애 이동할 때 깜빡이지 않게 한다
- 탭과 세그먼트를 화면이 그려지기 전에 붙이고, 페이지 전환은 브라우저 기본 교차 전환만 짧게 쓴다
- 로고를 OnO 전체 브랜드색으로 칠한다
- 데스크톱은 사이드바를 접고 펼 수 있고 상태를 기억한다. 모바일은 상단 메뉴로 여닫는 서랍으로 바꾼다
- 미션 달성률을 시작한 유저 대비 달성으로 이름을 바꾸고 계산 기준을 적는다
- 출시 때 섞인 게스트와 스모크 테스트용 게스트가 지표를 부풀려서 모든 집계 쿼리에 같은 조건을 붙인다
- 조건은 AdminSqlFilters 한 곳에 두고 통계, 홈, 유저, 학습 기록, 스터디룸, 성장 집계에 적용한다
- 목록의 행과 상세 화면은 그대로 두고, 게스트 수와 비율 지표는 없앤다
- 게스트가 만든 데이터가 집계에서 빠지는지 영역별 테스트를 추가한다
- 관리자 컨트롤러의 인자 없는 LocalDate.now() 를 Asia/Seoul 기준으로 바꾼다 (PersistenceRulesTest 위반)
- 로그인 없이 관리자 화면을 열면 로그인 화면으로 보내는 동작을 AuthApiTest 에 반영하고, 화면이 아닌 요청은 401 인지 따로 확인한다
@KiSeungMin KiSeungMin self-assigned this Sep 21, 2026
@KiSeungMin
KiSeungMin merged commit 191b7ca into develop Sep 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant