🍃 schedulerJPA
📌 GitHub 저장소: https://github.com/sukh115/schedulerJpa
GitHub - sukh115/schedulerJpa
Contribute to sukh115/schedulerJpa development by creating an account on GitHub.
github.com
📌 ERD설계

2. 📚 레벨별 기능 구현 요약
| 레벨 | 구현 기능 | 주요 학습 포인트 |
| Lv 1 | 일정 CRUD | MVC 흐름, 기본 JPA, Request/Response DTO |
| Lv 2 | 유저 CRUD | 도메인 연관관계, 유효성 검사 |
| Lv 3 | 회원가입 | 비밀번호 저장 구조, 중복 체크 |
| Lv 4 | 로그인(인증) | 세션 기반 로그인/로그아웃 |
| Lv 5 | 예외처리 | 전역 예외 핸들러, 도메인별 예외 코드 설계 |
| Lv 6 | 비밀번호 암호화 | BCryptPasswordEncoder 직접 사용 |
| Lv 7 | 댓글 CRUD | 다대일 관계 처리, 작성자 권한 체크 |
| Lv 8 | 일정 페이징 조회 | Pageable, Page 응답 구조 설계 |
📄 일정 관리 API 명세서
일정 관련
| 기능 | Method | URL | Request (JSON) | Response (JSON) | 상태 코드 |
|---|---|---|---|---|---|
| 일정 생성 | POST | /schedules |
{ "title": "회의", "content": "팀 미팅" } |
{ "id": 1, "title": "회의", "content": "팀 미팅", "date": "2025-03-20", "create_date": "2025-03-19T12:00:00", "update_date": "2025-03-19T12:00:00" } |
201 Created |
| 일정 전체 조회 | GET | /schedules |
- | [ { "title": "회의", "content": "팀 미팅", "updatedDate": "2025-03-20", "name": "홍길동" } ] |
200 OK |
| 일정 페이징 조회 | GET | /schedules/paged?page=0&size=10 |
- | [ { "title": "회의", "content": "팀 미팅", "updatedDate": "2025-03-20", "name": "홍길동" } ] |
200 OK / 빈 배열 |
| 일정 단건 조회 | GET | /schedules/{scheduleId} |
- | { "title": "회의", "content": "팀 미팅", "date": "2025-03-20", "create_date": "2025-03-19T12:00:00", "update_date": "2025-03-19T12:00:00" } |
200 OK |
| 일정 수정 | PATCH | /schedules/{scheduleId} |
{ "title": "변경된 제목", "content": "변경된 내용" } |
{ "title": "변경된 제목", "content": "변경된 내용", "updatedDate": "2025-03-21", "name": "홍길동" } |
200 OK / 401 / 403 / 404 |
| 일정 삭제 | DELETE | /schedules/{scheduleId} |
- | - | 200 OK / 401 / 404 |
작성자 관련
| 기능 | Method | URL | Request (JSON) | Response (JSON) | 상태 코드 |
|---|---|---|---|---|---|
| 작성자 등록 | POST | /authors/signup |
{ "loginId": "hong123", "name": "홍길동", "password": "1234" } |
{ "id": 1, "loginId": "hong123", "name": "홍길동", "createdDate": "2025-03-20", "updatedDate": "2025-03-21" } |
201 Created |
| 작성자 조회 | GET | /authors/{authorId} |
- | { "authorId": 1, "loginId": "hong123", "name": "홍길동", "createdDate": "2025-03-20", "updatedDate": "2025-03-21" } |
200 OK |
| 작성자 수정 | PATCH | /authors/{authorId} |
{ "name": "수정된 이름", "password": "1234" } |
{ "authorId": 1, "loginId": "hong123", "name": "수정된 이름", "updatedDate": "2025-03-21" } |
200 OK / 400 / 404 |
| 작성자 삭제 | DELETE | /authors/{authorId} |
- | - | 200 OK / 404 |
로그인 관련
| 기능 | Method | URL | Request (JSON) | Response (JSON) | 상태 코드 |
|---|---|---|---|---|---|
| 로그인 | POST | /login |
{ "loginId": "hong123", "password": "1234" } |
{ "authorId": 1, "loginId": "hong123", "name": "홍길동" } |
200 OK / 401 |
| 로그아웃 | POST | /login/logout |
- | "로그아웃 되었습니다." |
200 OK / 401 |
댓글 관련
| 기능 | Method | URL | Request (JSON) | Response (JSON) | 상태 코드 |
|---|---|---|---|---|---|
| 댓글 작성 | POST | /comments/schedules/{scheduleId} |
{ "content": "좋은 일정입니다!" } |
{ "commentId": 1, "content": "좋은 일정입니다!", "author": "홍길동" } |
200 OK |
| 댓글 전체 조회 | GET | /comments/schedules/{scheduleId} |
- | [ { "commentId": 1, "content": "좋은 일정입니다!", "author": "홍길동" } ] |
200 OK |
| 댓글 수정 | PATCH | /comments/schedules/{scheduleId}/{commentId} |
{ "content": "수정된 댓글입니다." } |
{ "commentId": 1, "content": "수정된 댓글입니다.", "author": "홍길동" } |
200 OK / 403 / 404 |
| 댓글 삭제 | DELETE | /comments/schedules/{scheduleId}/{commentId} |
- | - | 200 OK / 403 / 404 |
에러 코드 명세서
| 도메인 | 에러 코드 | 메시지 | 상태 코드 |
|---|---|---|---|
| AUTHOR | AUTHOR_001 | 작성자를 찾을 수 없습니다. | 404 |
| AUTHOR_002 | 이름과 이메일을 입력해주세요. | 400 | |
| AUTHOR_003 | 작성자 수정에 실패했습니다. | 404 | |
| AUTHOR_004 | 작성자 삭제에 실패했습니다. | 404 | |
| AUTHOR_005 | 이미 사용 중인 로그인 ID입니다. | 409 | |
| SCHEDULE | SCHEDULE_001 | 존재하지 않는 일정입니다. | 404 |
| SCHEDULE_002 | 제목과 내용을 입력해주세요. | 400 | |
| SCHEDULE_003 | 일정 수정 실패 | 404 | |
| SCHEDULE_004 | 일정 삭제 실패 | 404 | |
| SCHEDULE_005 | 존재하지 않는 일정 입니다. | 401 | |
| AUTH | AUTH_001 | 작성자만 일정을 수정할 수 있습니다. | 403 |
| AUTH_002 | 비밀번호가 일치하지 않습니다. | 401 | |
| AUTH_003 | 아이디가 일치하지 않습니다. | 401 | |
| AUTH_004 | 존재하지 않는 로그인 ID입니다. | 401 | |
| AUTH_005 | 이미 로그아웃된 상태입니다. | 401 | |
| COMMENT | COMMENT_001 | 존재하지 않는 댓글입니다. | 404 |
| COMMENT_002 | 내용을 입력해주세요. | 400 | |
| COMMENT_003 | 댓글 수정 실패 | 404 | |
| COMMENT_004 | 댓글 삭제 실패 | 404 | |
| COMMON | COMMON_001 | 요청한 페이지 범위가 유효하지 않습니다. | 400 |
| --- | |||
| ## 💡사용 기술 | |||
| - Spring Boot 3.4.3 | |||
| - Java 21 | |||
| - MySQL | |||
| - Gradle | |||
| - JPA | |||
| - Postman | |||
🗂️ 계층 구조 (MVC + Service + Repository)
controller/
├── AuthorController.java
├── LoginController.java
├── ScheduleController.java
└── CommentController.java
entity/
├── Author.java
├── Login.java
├── BaseEntity.java
└── Commentr.java
service/
├── author/
│ └── AuthorService.java
│ └── AuthorServiceImpl.java
├── login/
│ └── LoginService.java
│ └── LoginServiceImpl.java
├── schedule/
│ └── ScheduleService.java
│ └── ScheduleServiceImpl.java
└── comment/
└── ScheduleService.java
└── ScheduleServiceImpl.java
dto/
├── request/
│ └── ...
└── response/
└── ...
repository/
├── AuthorRepository.java
├── ScheduleRepository.java
└── CommentRepository.java
exception/
├── CustomException.java
├── ExceiptionResponse.java
├── GlobalExceptionHandler.java
├── ValidationExceptionResponse.java
└── exceptionCode/
└─── ExceptionCode.java
session/
└── SessionConst.java
config/
└── FilterConfig.java
fiter/
└── AuthFilter.java
securitiy/
└── PasswordEncorder.java
└── SimplePasswordEncorder.java
🔢레벨 별 branch 구현
✅ 필수
1️⃣ Lv 1. 일정 CRUD
2️⃣ Lv 2. 유저 CRUD
3️⃣ Lv 3. 회원가입
4️⃣ Lv 4. 로그인(인증)
🔥도전
5️⃣ Lv 5. 다양한 예외처리 적용하기
6️⃣ Lv 6. 비밀번호 암호화
7️⃣ Lv 7. 댓글 CRUD
8️⃣ Lv 8. 일정 페이징 조회
😎 다음 목표
- Spring Security로 인증 전환
- JWT 방식 인증/인가 도입
'SPRING' 카테고리의 다른 글
| [SPRING] QueryDSL (1) | 2025.03.30 |
|---|---|
| [SPRING] 동적 쿼리 (1) | 2025.03.30 |
| [Spring Boot + JPA] LV.8 (1) | 2025.03.28 |
| [Spring Boot + JPA] LV.7 (1) | 2025.03.28 |
| [Spring Boot + JPA] LV.5+ Lv.6 (1) | 2025.03.28 |