μΌμ κ΄λ¦¬ μμ€ν μ μ€κ³νκ³ , μλ°μ κ°μ²΄ μ§ν₯ μ€κ³μ ν¨κ» Springμ μ ν¨μ± κ²μ¦, μμΈ μ²λ¦¬, JPA μ°κ΄κ΄κ³, νμ΄μ§ κΈ°λ₯μ νμ©ν νλ‘μ νΈμ λλ€.
- 2025.05.07(μ) ~ 2023.05.17(μ)
- Version : Java 17
- Framework : Spring Boot
- IDE : IntelliJ
Schedule/
βββ build.gradle
βββ settings.gradle
βββ schedule.sql
βββ README.md
βββ HELP.md
βββ .gitignore
βββ src/
β βββ main/
β βββ java/
β β βββ com.example.schedule/
β β βββ controller/
β β β βββ ScheduleAddController.java
β β βββ dto/
β β β βββ ScheduleRequestDto.java
β β β βββ ScheduleResponseDto.java
β β βββ entity/
β β βββ repository/
β β β βββ ScheduleRepository.java
β β β βββ JdbcTemplateScheduleRepository.java
β β βββ service/
β β β βββ ScheduleService.java
β β β βββ ScheduleServiceImpl.java
β β βββ ScheduleApplication.java
β βββ resources/
β βββ static/
β βββ templates/
β βββ application.properties
βββ test/
- API λͺ μΈμ μμ±
- ERD μμ±
- SQL μμ±
-
μΌμ μμ±(μΌμ μμ±νκΈ°)
- μΌμ μμ± μ ν μΌ, μμ±μλͺ , λΉλ°λ²νΈ, μμ±/μμ μΌμ μ μ₯
- μμ±/μμ μΌμ λ μ§μ μκ°μ λͺ¨λ ν¬ν¨ν μν
- κ° μΌμ μ κ³ μ μλ³μλ₯Ό μλμΌλ‘ μμ±νμ¬ κ΄λ¦¬
- μ΅μ΄ μ λ ₯ μ μμ μΌμ μμ±μΌκ³Ό λμΌ
-
μ 체 μΌμ μ‘°ν(λ±λ‘λ μΌμ λΆλ¬μ€κΈ°)
- λ€μ 쑰건μ λ°νμΌλ‘ λ±λ‘λ μΌμ λͺ©λ‘μ μ λΆ μ‘°ν
- μμ μΌ(νμ : YYYY-MM-DD)
- μμ±μλͺ
- μ 쑰건 μ€ νκ°μ§λ§ μΆ©μ‘±νκ±°λ λ λ€ μΆ©μ‘±νμ§ μμ μλ λ λ€ μΆ©μ‘±ν ν΄λ μ€ν
- μμ μΌ κΈ°μ€ λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬
- λ€μ 쑰건μ λ°νμΌλ‘ λ±λ‘λ μΌμ λͺ©λ‘μ μ λΆ μ‘°ν
-
μ ν μΌμ μ‘°ν(μ νν μΌμ μ 보 λΆλ¬μ€κΈ°)
- μΌμ μ κ³ μ μλ³μλ₯Ό μ¬μ©νμ¬ μ‘°ν
-
μ νν μΌμ μμ
- μ λͺ©, λ΄μ©, μμ±μλͺ λ§ μμ κ°λ₯
- μμ μ μμ²ν λ λΉλ°λ²νΈλ₯Ό ν¨κ» μ λ¬
- μμ μλ£μ μμ μΌμ΄ μμ μμ μΌλ‘ λ³κ²½
-
μ νν μΌμ μμ
- μλ²μ μΌμ μμ λ₯Ό μμ²ν λ λΉλ°λ²νΈλ₯Ό ν¨κ» μ λ¬
- μμ±μμ μΌμ μ μ°κ²°
- μμ±μλ₯Ό μλ³νκΈ° μν΄ μ΄λ¦μΌλ‘λ§ κ΄λ¦¬νλ μμ±μμκ² κ³ μ μλ³μλ₯Ό λΆμ¬
- μμ±μλ₯Ό ν μΌκ³Ό λΆλ¦¬ν΄μ κ΄λ¦¬
- μμ±μ ν μ΄λΈμ μμ±νκ³ μΌμ ν μ΄λΈμ FKλ₯Ό μμ±νμ¬ μ°κ΄κ΄κ³ μ€μ
- 쑰건
- μμ±μλ μ΄λ¦, μ΄λ©μΌ, λ±λ‘μΌ, μμ μΌ μ 보λ₯Ό κ°μ§κ³ μλ€.
- μμ±μμ κ³ μ μλ³μλ₯Ό ν΅ν΄ μΌμ μ΄ κ²μμ΄ λ μ μλλ‘ μ 체 μΌμ μ‘°ν μ½λ μμ
- μμ±μμ κ³ μ μλ³μκ° μΌμ ν μ΄λΈμ μΈλν€κ° λ μ μλλ‘ νλ€.
- νμ΄μ§ λ€μ΄μ
- λ§μ μμ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ νμνκΈ° μν΄ λ°μ΄ν°λ₯Ό μ¬λ¬ νμ΄μ§λ‘ λλλ€.
νμ΄μ§ λ²νΈμνμ΄μ§ ν¬κΈ°λ₯Ό 쿼리 νλΌλ―Έν°λ‘ μ λ¬νμ¬ μμ²νλ νλͺ©μ λνλΈλ€.- μ λ¬λ°μ νμ΄μ§ λ²νΈμ ν¬κΈ°λ₯Ό κΈ°μ€μΌλ‘ 쿼리λ₯Ό μμ±νμ¬ νμν λ°μ΄ν°λ§μ μ‘°ννκ³ λ°ν
- 쑰건
- λ±λ‘λ μΌμ λͺ©λ‘μ
νμ΄μ§ λ²νΈμν¬κΈ°λ₯Ό κΈ°μ€μΌλ‘ λͺ¨λ μ‘°ν - μ‘°νν μΌμ λͺ©λ‘μλ
μμ±μ μ΄λ¦μ΄ ν¬ν¨ - λ²μλ₯Ό λμ΄μ νμ΄μ§λ₯Ό μμ²νλ κ²½μ° λΉ λ°°μ΄μ λ°ν
- Paging κ°μ²΄ νμ©
- λ±λ‘λ μΌμ λͺ©λ‘μ
- μμΈ λ°μ μ²λ¦¬
- μμΈ μν©μ λν μ²λ¦¬λ₯Ό μν΄
HTTP μν μ½λ(λ§ν¬)μμλ¬ λ©μμ§λ₯Ό ν¬ν¨ν μ 보λ₯Ό μ¬μ©νμ¬ μμΈλ₯Ό κ΄λ¦¬ - μμΈκ° λ°μν κ²½μ° μ μ ν HTTP μν μ½λμ ν¨κ» μ¬μ©μμκ² λ©μμ§λ₯Ό μ λ¬νμ¬ μν©μ κ΄λ¦¬
- μμΈ μν©μ λν μ²λ¦¬λ₯Ό μν΄
- 쑰건
- μμ , μμ μ μμ²ν λ 보λ΄λ
λΉλ°λ²νΈκ° μΌμΉνμ§ μμ λ μμΈ λ°μ - μ νν μΌμ μ 보λ₯Ό μ‘°νν μ μμ λ μμΈ λ°μ
- μλͺ»λ μ λ³΄λ‘ μ‘°ννλ €κ³ ν λ
- μ΄λ―Έ μμ λ μ 보λ₯Ό μ‘°ννλ €κ³ ν λ
- μμ , μμ μ μμ²ν λ 보λ΄λ
- null μ²΄ν¬ λ° νΉμ ν¨ν΄μ λν κ²μ¦ μν
- μ ν¨μ± κ²μ¬
- μλͺ»λ μ λ ₯μ΄λ μμ²μ 미리 λ°©μ§ν μ μλ€.
- λ°μ΄ν°μ
무결μ±μ 보μ₯νκ³ μ ν리μΌμ΄μ μ μμΈ‘ κ°λ₯μ±μ λμ¬μ€λ€. - Springμμ μ 곡νλ
@Validμ΄λ Έν μ΄μ μ μ΄μ©ν μ μλ€.
- 쑰건
ν μΌμ μ΅λ 200μ μ΄λ΄λ‘ μ ν, νμκ° μ²λ¦¬λΉλ°λ²νΈλ νμκ° μ²λ¦¬- λ΄λΉμμ
μ΄λ©μΌμ λ³΄κ° νμμ λ§λμ§ νμΈ
- μ ν¨μ± κ²μ¬
- μΌμ μμ± μ ν μΌ, μμ±μλͺ , λΉλ°λ²νΈ, μμ±/μμ μΌ μ μ₯ (μλ ID μμ±)
- μ 체 μΌμ μ‘°ν μ μμ μΌΒ·μμ±μλͺ 쑰건μΌλ‘ νν°λ§ κ°λ₯, μμ μΌ κΈ°μ€ λ΄λ¦Όμ°¨μ μ λ ¬
- κ³ μ IDλ‘ μΌμ μμΈ μ‘°ν
- μΌμ μμ μ μ λͺ©Β·λ΄μ©Β·μμ±μλͺ λ³κ²½ κ°λ₯, λΉλ°λ²νΈ νμ, μμ μΌ κ°±μ
- μΌμ μμ μ λΉλ°λ²νΈ νμΈ ν μμ
- μμ±μ μ 보λ₯Ό λ³λ ν μ΄λΈλ‘ κ΄λ¦¬ (μ΄λ¦, μ΄λ©μΌ, λ±λ‘μΌ, μμ μΌ)
- μΌμ κ³Ό μμ±μ μ°κ΄κ΄κ³ μ€μ (μμ±μ ID β μΌμ FK)
- νμ΄μ§ μ²λ¦¬λ‘ μΌμ λͺ©λ‘μ νμ΄μ§ λ¨μλ‘ μ‘°ν (μμ±μ μ΄λ¦ ν¬ν¨)
- νμ΄μ§ λ²μ λ²μ΄λλ©΄ λΉ κ²°κ³Ό λ°ν
- λΉλ°λ²νΈ λΆμΌμΉ λλ μλͺ»λ IDλ‘ μ κ·Ό μ μμΈ μ²λ¦¬
- ν μΌμ 200μ μ ν, ν μΌΒ·λΉλ°λ²νΈλ νμ
- μ΄λ©μΌ νμ μ ν¨μ± κ²μ¬, @Validλ‘ μ λ ₯ κ²μ¦
- μ€λͺ : μΌμ μμ±νκΈ°
- Request
{
"name": "μ΄λ¦",
"password" : 1234,
"title" : "μ λͺ©μ
λλ€.",
"contents" : "λ΄μ©μ
λλ€."
}- Response
{
"id" : 1,
"userId" : 1,
"name": "μ΄λ¦",
"title" : "μ λͺ©μ
λλ€.",
"contents" : "λ΄μ©μ
λλ€."
βcreatedAtβ : "2025-05-08 12:00:00",
βupdatedAtβ : "2025-05-08 12:00:00"
}-
μ€λͺ : μΌμ μ 체 μ‘°ν
-
Response
// μ±κ³΅μ 200 OK
[
{
"id": 1,
"userId" : 1,
"name": "μ΄λ¦1",
"title": "μ λͺ©μ
λλ€.",
"contents": "λ΄μ©μ
λλ€.",
βcreatedAtβ : "2025-05-08 12:00:00",
βupdatedAtβ : "2025-05-08 12:00:00"
},
{
"id": 2,
"userId" : 2,
"name": "μ΄λ¦1",
"title": "μ λͺ©μ
λλ€.2",
"contents": "λ΄μ©μ
λλ€.2",
βcreatedAtβ : "2025-05-08 12:10:00",
βupdatedAtβ : "2025-05-08 12:10:00"
}
// ...
]
// μμΌλ©΄ 200 OKμ λΉμ΄μλ λ°°μ΄ μλ΅
[]- μ€λͺ : μΌμ μ ν μ‘°ν
- Response
// μ±κ³΅μ 200 OK
{
"id" : 1,
"userId" : 1,
"name": "μ΄λ¦",
"title" : "μ λͺ©μ
λλ€.",
"contents" : "λ΄μ©μ
λλ€.",
βcreatedAtβ : "2025-05-08 12:00:00",
βupdatedAtβ : "2025-05-08 12:00:00"
}
// μ€ν¨μ 404 NotFound ν΄λΉ μλ³μμ λ©λͺ¨κ° μ‘΄μ¬νμ§ μλ κ²½μ°- μ€λͺ : μΌμ μμ (μ λͺ©, λ΄μ©, μ΄λ¦λ§ λ³κ²½)
- Request
{
"name": "μ΄λ¦",
"password" : 1234,
"title" : "μμ λ μ λͺ©μ
λλ€.",
"contents" : "μμ λ λ΄μ©μ
λλ€."
}- Response
// μ±κ³΅μ 200 OK
{
"id" : 1,
"userId" : 1,
"name": "μ΄λ¦",
"title" : "μμ λ μ λͺ©μ
λλ€.",
"contents" : "μμ λ λ΄μ©μ
λλ€.",
βcreatedAtβ : "2025-05-08 12:00:00",
βupdatedAtβ : "2025-05-08 12:25:00"
}
// μ€ν¨μ 404 NotFound
ν΄λΉ μλ³μμ λ©λͺ¨κ° μ‘΄μ¬νμ§ μλ κ²½μ°
// 400 BadRequest
νμκ°μ΄ μλ κ²½μ°- μ€λͺ : μΌμ μμ
- Request
{
"password" : "1234"
}- Response
// μ±κ³΅μ 200 OK, μ€ν¨μ 404 NotFound ν΄λΉ μλ³μμ λ©λͺ¨κ° μ‘΄μ¬νμ§ μλ κ²½μ°μ΄ νλ‘μ νΈλ₯Ό μ§ννλ©΄μ λ°°μ΄ λ΄μ©μ μλ 벨λ‘κ·Έμ μ 리νμμ΅λλ€.
