이 서비스는 숭실대학교 기숙사생을 위한 통합 앱입니다. 크게 두 축으로 구성됩니다.
- 공동구매: 학생들이 물건을 공동구매로 올리고, 참여를 원하는 학생이 수량을 정해 참여를 신청하면 글쓴이(방장)가 신청자 프로필(거래횟수, 노쇼 신고이력 등)을 보고 수락/거절합니다. 방장이 수락하는 순간에만 1:1 채팅방이 열리고 수량이 차감되어, 방장의 피로도와 노쇼 리스크를 줄이는 구조입니다.
- 기숙사생활: 숭실대 기숙사 사이트(ssudorm) 계정을 앱에 연동하면, 외박신청/장기비움신청/고쳐주세요/공지사항/일반문의및상담/상벌점조회/입사신청내역/식단을 앱 안에서 그대로 조회·신청할 수 있습니다.
거래완료 후에는 서로 매너 키워드를 남길 수 있고, 문제가 있으면 신고할 수 있습니다(관리자가 신고를 확인해 경고/정지/영구정지 등을 결정).
- Spring Boot 3, Java 21
- Spring Data JPA, MySQL 8
- Spring Security + JWT (카카오 소셜로그인)
- WebSocket(STOMP) — 1:1 채팅
- Redis — 채팅 마지막 메시지 캐시 (없어도 DB로 폴백)
- Jsoup — 숭실대 기숙사 사이트(ssudorm) 연동을 위한 HTML 파싱/폼 자동 제출
- AWS EC2, AWS RDS, AWS S3(이미지 업로드)
- Swagger (API 문서화)
- 게시글 작성: 전체 결제금액 + 전체 상품개수를 입력하면 개당 가격(올림 계산)과 판매 개수가 자동으로 노출됨. 1인당 최소 구매 수량 설정 가능
- 참여 신청 → 수락/거절 흐름
- 구매자가 수량을 정해 참여 요청(
PENDING) — 이 시점엔 채팅방도 안 열리고 수량도 안 깎임 - 방장이 신청자 프로필(거래횟수, 노쇼 신고이력)을 보고 수락(
ACCEPTED, 이때 1:1 채팅방 생성 + 수량 차감)하거나 거절(REJECTED) - 방장 처리 전이면 구매자가 스스로 요청을 취소할 수 있음
- 이후 거래완료(
COMPLETED) 또는 취소(CANCELLED, 수량 복구) - 전량 소진되면 게시글이 자동으로 거래완료 처리됨
- 구매자가 수량을 정해 참여 요청(
- 좋아요, 검색/필터(카테고리·상태), 이미지 업로드(최대 5장)
- 채팅: 1:1 채팅(WebSocket/STOMP), 안읽음 뱃지, 게시글 정보 카드 노출
- 신고 카테고리: 노쇼(잠수) / 입금지연·미입금 / 현장네고 / 비매너·욕설 / 허위매물
- 관리자가 신고를 확인할 때마다 정지 기간을 직접 입력해 처리(경고/정지n일/영구정지/기각)
- 24시간 내 서로 다른 3명에게 신고당하면 관리자 확인 전까지 자동으로 임시 블라인드 처리
- 정지/블라인드 상태인 사용자는 게시글 작성 및 채팅 전송이 제한됨
- 거래완료 건에 대해 구매자와 방장(총대)이 서로 매너 키워드를 평가 (역할에 맞는 키워드만 선택 가능, 1~3개)
- 프로필 조회: 닉네임, 거래횟수, 가장 많이 받은 매너 배지 상위 3개, 모집중·완료된 게시글 목록, 신고 버튼
- 기숙사 계정 등록/검증 (계정 정보는 AES-256-GCM으로 암호화 저장)
- 외박신청 / 장기비움신청: 목록·상세·작성·삭제, 서버단 사전 검증(신청 일수 규칙 등)
- 고쳐주세요: 목록·검색·상세·작성·수정·삭제 (본인 글만 수정/삭제 가능)
- 공지사항: 읽기전용 목록·검색·상세
- 일반문의및상담: 위 기능 + 비밀글 지원(타인의 비밀글은
locked: true로 내용 비공개) - 상벌점조회: 전체 내역 + 연도별 총점
- 입사신청/선발내역: 목록·상세
- 식단: 주 단위 조회, 이전/다음 주 이동
- 카카오 소셜로그인 (닉네임 형식 검증: 한글 2
8자 또는 영문 412자) - 학교 계정 인증(
schoolVerified) 여부에 따라 게시글 작성·참여 신청 게이팅 (실제 학교 인증 연동 전까지는 관리자가 수동 처리) - 마이페이지: 좋아요한 글, 내가 쓴 글, 내 참여 신청 내역
| 영역 | 경로 |
|---|---|
| 인증 | /api/auth/** |
| 게시글 | /api/board/** |
| 참여요청(예약) | /api/board/{id}/reservations, /api/reservations/** |
| 채팅 | /api/chat/**, WebSocket /ws/chat |
| 신고 | /api/reports, /api/admin/reports/** |
| 매너평가 | /api/manner-keywords, /api/reservations/{id}/manner-review |
| 프로필 | /api/users/{id}/profile |
| 마이페이지 | /api/mypage/** |
| 기숙사생활 | /api/dorm/** (계정 연동, 외박/장기비움, 고쳐주세요, 공지사항, 일반문의, 상벌점, 입사신청, 식단) |
| 관리자 | /api/admin/** |
자세한 요청/응답 형식은 로컬 실행 후 /swagger-ui.html에서 확인 가능합니다.
./gradlew bootRunapplication.yml의 값들은 전부 환경변수로 오버라이드 가능하며(${ENV_VAR:기본값} 형식), Firebase/S3/Redis가 로컬에 없어도 해당 기능만 비활성화된 채 서버가 정상 기동됩니다. 개발 전용 테스트 로그인 API(/api/dev/auth/token)가 있으니 배포 시 app.feature.dev-tools.enabled=false로 반드시 꺼야 합니다.
- 학교 계정(usaint) 실제 인증 연동 (현재는 관리자 수동 처리)
- 매너 배지 전체 히스토리 조회 API
- 기숙사 계정 연동 해제 API
- 관리자 대시보드 UI (현재 API만 존재)
- 자체 회원가입/로그인은 검토 후 카카오 로그인만 사용하기로 결정되어 미포함