Skip to content

taeung515/team-click-war

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

135 Commits
 
 
 
 
 
 
 
 

Repository files navigation

👆클릭 전쟁[click war]


📚1. 프로젝트 소개

강의 등록부터 실시간 수강신청까지, 성능과 동시성, 사용자/관리자 편의성에 집중한 수강신청 시스템입니다.



2. 🪄기능 소개

  • 실시간 수강신청 상황에서도 안정적인 처리를 위한 동시성 제어 설계
  • 관리자/학생 역할에 따라 다른 기능 제공
  • 인기 검색어 캐시, JWT 기반 인증, Restful API 적용
  • excel 수강신청 목록 업로드 기능 지원
  • 기능 지속 확장 예정



3. 🛠️기술 스택

Language / Framework

DB / Cache

infra / CI-CD

Test

Version Control / Collaboration



4. 📁 프로젝트 구조

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
└──



5. 💻공통 응답 객체 / git 컨벤션

commit message convention

태그 설명
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);
    }
}

✏️코드 컨벤션 자세히 보기(노션으로 이동)



6. 📜wireframe/ERD/API 명세

wireframe image
ERD lecture
API 명세서

🔐Auth

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"
}



👤Member

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"
}



🗂️Keyword

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"
}



🗣️Lecture

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"
}



✏️LectureMember

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"
}

✏️API 명세서 상세 (notion으로 이동)



7. 🚀 트러블 슈팅 / 기술적 의사결정

✏️5분 기록보드(notion으로 이동)

8. 🚩 프로젝트 일정[Jira]

25.07.07 ~ 25.07.15 ✏️프로젝트 일정 자세히 보기(Jira로 이동)



9. 📌 기여자

최태웅 장아영 박소희 윤호준 이태겸 이영재

About

내일배움캠프 7기 수강신청 대규모 트래픽 성능 개선

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages