강의 등록부터 실시간 수강신청까지, 성능과 동시성, 사용자/관리자 편의성에 집중한 수강신청 시스템입니다.
- 실시간 수강신청 상황에서도 안정적인 처리를 위한 동시성 제어 설계
- 관리자/학생 역할에 따라 다른 기능 제공
- 인기 검색어 캐시, JWT 기반 인증, Restful API 적용
- excel 수강신청 목록 업로드 기능 지원
- 기능 지속 확장 예정
lectureflow ├── domain │ ├── auth │ │ ├── controller │ │ ├── dto │ │ │ ├── request │ │ │ └── response │ │ ├── exception │ │ ├── repository │ │ └── service │ ├── keyword │ │ ├── controller │ │ ├── dto │ │ ├── repository │ │ └── service │ ├── lecture │ │ ├── controller │ │ ├── dto │ │ │ ├── request │ │ │ └── response │ │ ├── enums │ │ ├── exception │ │ ├── repository │ │ └── service │ ├── lectureMember │ │ ├── controller │ │ ├── dto │ │ │ ├── request │ │ │ └── response │ │ ├── exception │ │ ├── repository │ │ └── service │ ├── member │ │ ├── controller │ │ ├── dto │ │ │ ├── request │ │ │ └── response │ │ ├── enums │ │ ├── exception │ │ ├── repository │ │ └── service │ ├── response │ └── user │ └── enums ├── global │ ├── config │ ├── dto │ ├── entity │ ├── exception │ └── filter └──
| 태그 | 설명 |
|---|---|
| Feat | 새로운 파일 및 기능 생성 |
| Imp | 기존 기능 수정 |
| Fix | 오류 수정 |
| Refactor | 리팩토링 -> 기능 변경 없이 코드 개선 |
| Docs | 주석 및 ReadMe 생성 |
| Chore | 그 외 기능 |
| Style | 코드 스타일 수정 (띄어쓰기, import 정리 등) |
@Getter
@NoArgsConstructor
public class ApiResponse<T> {
private boolean success;
private String message;
private T data;
private LocalDateTime timestamp;
private ApiResponse(boolean success, String message, T data) {
this.success = success;
this.message = message;
this.data = data;
this.timestamp = LocalDateTime.now();
}
public static <T> ApiResponse<T> success(String message, T data) {
return new ApiResponse<>(true, message, data);
}
public static <T> ApiResponse<T> error(String message) {
return new ApiResponse<>(false, message, null);
}
public static <T> ApiResponse<T> error(T data) {
return new ApiResponse<>(false, "요청실패", data);
}
}
API 명세서
| Method | URL | 설명 | Request 예시 | Response 예시 |
|---|---|---|---|---|
| POST | /auth/signup | 회원가입 | { "email": "student@example.com", "password": "testPassword456!", "name": "홍길동", "phone": "010-1234-5678", "role": "STUDENT" } |
{ "success": true, "message": "회원가입 성공", "data": { "memberId": 1 }, "timestamp": "2025-07-09T11:17:15.0377381" } |
| POST | /auth/signin | 로그인 | { "email": "student@example.com", "password": "testPassword123!" } |
{ "success": true, "message": "로그인 성공", "data": { "memberId": 1, "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLtmY3quLjrj5kiLCJtZW1iZXJJZCI6MSwiYXV0aCI6IlNUVURFTlQiLCJleHAiOjE3NTIxMTQxODgsImlhdCI6MTc1MjAyNzc4OH0.COQn16rWAvXqdo0wfijWIgRt7i-56avIq_Lyo_zX9HM" }, "timestamp": "2025-07-09T11:23:08.9962236" } |
| Method | URL | 설명 | Request 예시 | Response 예시 |
|---|---|---|---|---|
| GET | /members/me | 내 정보 조회 | { "success": true, "message": "내 정보 조회 성공", "data": { "memberId": 1, "email": "student@naver.com", "name": "윤호준", "phone": "010-1234-5678", "role": "STUDENT" }, "timestamp": "2025-07-09T12:10:00.123456" } |
|
| PUT | /members/me | 회원 정보 수정 | { "name": "윤호준", "phone": "010-1234-5678", "password": "Pw1235678!" } |
{ "success": true, "message": "회원 정보 수정 완료", "data": null, "timestamp": "2025-07-09T12:10:00.123456" } |
| DELETE | /members/withdraw | 회원 탈퇴 | { "password": "Password123!" } |
{ "success": true", "message": "회원 탈퇴 완료", "data": null, "timestamp": "2025-07-09T12:10:00.123456" } |
| Method | URL | 설명 | Request 예시 | Response 예시 |
|---|---|---|---|---|
| GET | /keywords/v1/popular | 인기 검색어 상위 10개 조회 | { "success": true, "message": "탑 10 인기 검색어 조회 성공", "data": { "topTenKeywords": [ "과학", "인공지능", "데이터베이스", "자바", "쿠버네티스", "리액트", "알고리즘", "파이썬", "마이크로서비스", "Redis" ] }, "timestamp": "2025-07-14T19:29:44.1534889" } |
|
| GET | /keywords/v2/popular | 인기 검색어 상위 10개 조회 v2 캐시 사용 | { "success": true, "message": "탑 10 인기 검색어 조회 성공", "data": { "topTenKeywords": [ "과학", "인공지능", "데이터베이스", "자바", "쿠버네티스", "리액트", "알고리즘", "파이썬", "마이크로서비스", "Redis" ] }, "timestamp": "2025-07-14T19:29:44.1534889" } |
| Method | URL | 설명 | Request 예시 | Response 예시 |
|---|---|---|---|---|
| POST | /admin/lectures/upload | 강의 엑셀 업로드 등록 | .xlsx 파일 업로드 | { "success": true, "message": "강의를 성공적으로 업로드했습니다.", "data": null, "timestamp": "2025-07-09T11:17:15.0377381" } |
| POST | /admin/lectures | 강의 단건 등록 | { "department": "COMPUTER_SCIENCE_ENGINEERING", "gradeLevel": 2, "isForeignLanguage": false, "lectureName": "자료구조", "grade": 3, "professor": "김철수", "day": "TUE", "startTime": "13:00:00", "endTime": "15:00:00", "classroom": 1301, "maxStudent": 40 } |
{ "success": true, "message": "강의를 성공적으로 업로드했습니다.", "data": null, "timestamp": "2025-07-09T11:17:15.0377381" } |
| PATCH | /admin/lectures/{lectureId} | 개별 강의 수정 | { "department": "COMPUTER_SCIENCE_ENGINEERING", "professor": "김영희" } |
{ "success": true, "message": "강의를 성공적으로 수정했습니다.", "data": null, "timestamp": "2025-06-18T10:45:33Z" } |
| DELETE | /admin/lectures/{lectureId} | 개별 강의 삭제 | { "success": true, "message": "강의 삭제", "data": null, "timestamp": "2025-07-09T11:17:15.0377381" } |
|
| GET | /lectures/{lectureId} | 강의 단건 조회 | { "success": true, "message": "Lecture 조회 성공", "data": { "lectureId": 1, "majorOrGeneral": "MAJOR", "department": "COMPUTER_SCIENCE_ENGINEERING", "gradeLevel": 1, "lectureName": "컴퓨터개론", "grade": 1, "professor": "김철수", "day": "MON", "startTime": "09:00", "endTime": "10:15", "classroom": "101", "maxStudent": 40, "foreignLanguage": false }, "timestamp": "2025-07-10T12:17:51.8790942" } |
|
| GET | /lectures/search?keyword=value&majorOrGeneral=MAJOR,GENERAL | 조건에 따른 강의 목록 조회 | { "success": true, "message": "Lectures 조회 성공", "data": { "content": [ ... 5개 강의 객체 ... ], "page": { "size": 5, "number": 0, "totalElements": 5, "totalPages": 1 } }, "timestamp": "2025-07-10T17:01:40.3826776" } |
| Method | URL | 설명 | Request 예시 | Response 예시 |
|---|---|---|---|---|
| POST | /lectures/enroll | 수강신청 | { "lectureId": 4 } |
{ "success": true, "message": "수강신청 완료", "data": { "lectureMemberId": 2, "memberId": 4, "lectureId": 5 }, "timestamp": "2025-07-09T11:17:15.0377381" } |
| GET | /lectures/enroll | 로그인한 사용자의 수강 과목 전체 조회 | { "success": true, "message": "수강신청 목록 조회", "data": [ { "id": 1, "lectureId": 2, "lectureName": "논리학 개론", ... }, { "id": 3, "lectureId": 3, "lectureName": "화학 실험", ... }, { "id": 4, "lectureId": 1, "lectureName": "웹 프로그래밍", ... } ], "timestamp": "2025-07-12T14:44:26.4098048" } |
|
| GET | /lectures/enroll/{lectureId}/count | 특정 강의 수강신청 인원 수 조회 | { "success": true, "message": "해당 강의 수강신청 인원 수 조회", "data": { "lectureId": 2, "maxStudent": 25, "student": 1 }, "timestamp": "2025-07-12T15:37:47.0010355" } |
|
| DELETE | /lectures/enroll/{lectureMemberId} | 수강신청 취소 | { "success": true, "message": "수강신청 취소", "data": null, "timestamp": "2025-07-09T11:17:15.0377381" } |
25.07.07 ~ 25.07.15 ✏️프로젝트 일정 자세히 보기(Jira로 이동)
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|---|---|
| 최태웅 | 장아영 | 박소희 | 윤호준 | 이태겸 | 이영재 |







