Skip to content

syumz/ScheduleApp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

18 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ScheduleApp

πŸ‘¨β€πŸ« ν”„λ‘œμ νŠΈ μ†Œκ°œ

일정 관리 μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜κ³ , μžλ°”μ˜ 객체 μ§€ν–₯ 섀계와 ν•¨κ»˜ 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/

βš™οΈ ν”„λ‘œμ νŠΈ μ„€λͺ…

Lv0. -- μ™„λ£Œ --

  • API λͺ…μ„Έμ„œ μž‘μ„±
  • ERD μž‘μ„±
  • SQL μž‘μ„±

Lv1. -- μ™„λ£Œ --

  • 일정 생성(일정 μž‘μ„±ν•˜κΈ°)

    • 일정 생성 μ‹œ 할일, μž‘μ„±μžλͺ…, λΉ„λ°€λ²ˆν˜Έ, μž‘μ„±/μˆ˜μ •μΌμ„ μ €μž₯
    • μž‘μ„±/μˆ˜μ •μΌμ€ λ‚ μ§œμ™€ μ‹œκ°„μ„ λͺ¨λ‘ ν¬ν•¨ν•œ μƒνƒœ
    • 각 μΌμ •μ˜ 고유 μ‹λ³„μžλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜μ—¬ 관리
    • 졜초 μž…λ ₯ μ‹œ μˆ˜μ •μΌμ€ μž‘μ„±μΌκ³Ό 동일
  • 전체 일정 쑰회(λ“±λ‘λœ 일정 뢈러였기)

    • λ‹€μŒ 쑰건을 λ°”νƒ•μœΌλ‘œ λ“±λ‘λœ 일정 λͺ©λ‘μ„ μ „λΆ€ 쑰회
      • μˆ˜μ •μΌ(ν˜•μ‹ : YYYY-MM-DD)
      • μž‘μ„±μžλͺ…
      • μœ„ 쑰건 쀑 ν•œκ°€μ§€λ§Œ μΆ©μ‘±ν•˜κ±°λ‚˜ λ‘˜ λ‹€ μΆ©μ‘±ν•˜μ§€ μ•Šμ„ μˆ˜λ„ λ‘˜ λ‹€ μΆ©μ‘±ν•  해도 μ‹€ν–‰
      • μˆ˜μ •μΌ κΈ°μ€€ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬
  • 선택 일정 쑰회(μ„ νƒν•œ 일정 정보 뢈러였기)

    • μΌμ •μ˜ 고유 μ‹λ³„μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 쑰회

Lv2. -- μ™„λ£Œ --

  • μ„ νƒν•œ 일정 μˆ˜μ •

    • 제λͺ©, λ‚΄μš©, μž‘μ„±μžλͺ…λ§Œ μˆ˜μ • κ°€λŠ₯
    • μˆ˜μ •μ„ μš”μ²­ν•  λ•Œ λΉ„λ°€λ²ˆν˜Έλ₯Ό ν•¨κ»˜ 전달
    • μˆ˜μ • μ™„λ£Œμ‹œ μˆ˜μ •μΌμ΄ μˆ˜μ • μ‹œμ μœΌλ‘œ λ³€κ²½
  • μ„ νƒν•œ 일정 μ‚­μ œ

    • μ„œλ²„μ— 일정 μ‚­μ œλ₯Ό μš”μ²­ν•  λ•Œ λΉ„λ°€λ²ˆν˜Έλ₯Ό ν•¨κ»˜ 전달

Lv3. -- μ™„λ£Œ --

  • μž‘μ„±μžμ™€ μΌμ •μ˜ μ—°κ²°
    • μž‘μ„±μžλ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•΄ μ΄λ¦„μœΌλ‘œλ§Œ κ΄€λ¦¬ν•˜λ˜ μž‘μ„±μžμ—κ²Œ 고유 μ‹λ³„μžλ₯Ό λΆ€μ—¬
    • μž‘μ„±μžλ₯Ό ν•  일과 λΆ„λ¦¬ν•΄μ„œ 관리
    • μž‘μ„±μž ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜κ³  일정 ν…Œμ΄λΈ”μ— FKλ₯Ό μƒμ„±ν•˜μ—¬ 연관관계 μ„€μ •
    • 쑰건
      • μž‘μ„±μžλŠ” 이름, 이메일, 등둝일, μˆ˜μ •μΌ 정보λ₯Ό κ°€μ§€κ³  μžˆλ‹€.
      • μž‘μ„±μžμ˜ 고유 μ‹λ³„μžλ₯Ό 톡해 일정이 검색이 될 수 μžˆλ„λ‘ 전체 일정 쑰회 μ½”λ“œ μˆ˜μ •
      • μž‘μ„±μžμ˜ 고유 μ‹λ³„μžκ°€ 일정 ν…Œμ΄λΈ”μ˜ μ™Έλž˜ν‚€κ°€ 될 수 μžˆλ„λ‘ ν•œλ‹€.

Lv4. -- μ§„ν–‰ 쀑 --

  • νŽ˜μ΄μ§€ λ„€μ΄μ…˜
    • λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό 효율적으둜 ν‘œμ‹œν•˜κΈ° μœ„ν•΄ 데이터λ₯Ό μ—¬λŸ¬ νŽ˜μ΄μ§€λ‘œ λ‚˜λˆˆλ‹€.
    • νŽ˜μ΄μ§€ λ²ˆν˜Έμ™€ νŽ˜μ΄μ§€ 크기λ₯Ό 쿼리 νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬ν•˜μ—¬ μš”μ²­ν•˜λŠ” ν•­λͺ©μ„ λ‚˜νƒ€λ‚Έλ‹€.
    • 전달받은 νŽ˜μ΄μ§€ λ²ˆν˜Έμ™€ 크기λ₯Ό κΈ°μ€€μœΌλ‘œ 쿼리λ₯Ό μž‘μ„±ν•˜μ—¬ ν•„μš”ν•œ λ°μ΄ν„°λ§Œμ„ μ‘°νšŒν•˜κ³  λ°˜ν™˜
    • 쑰건
      • λ“±λ‘λœ 일정 λͺ©λ‘μ„ νŽ˜μ΄μ§€ λ²ˆν˜Έμ™€ 크기λ₯Ό κΈ°μ€€μœΌλ‘œ λͺ¨λ‘ 쑰회
      • μ‘°νšŒν•œ 일정 λͺ©λ‘μ—λŠ” μž‘μ„±μž 이름이 포함
      • λ²”μœ„λ₯Ό λ„˜μ–΄μ„  νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜λŠ” 경우 빈 배열을 λ°˜ν™˜
      • Paging 객체 ν™œμš©

Lv5. -- μ™„λ£Œ --

  • μ˜ˆμ™Έ λ°œμƒ 처리
    • μ˜ˆμ™Έ 상황에 λŒ€ν•œ 처리λ₯Ό μœ„ν•΄ HTTP μƒνƒœ μ½”λ“œ(링크)와 μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό ν¬ν•¨ν•œ 정보λ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜ˆμ™Έλ₯Ό 관리
    • μ˜ˆμ™Έκ°€ λ°œμƒν•  경우 μ μ ˆν•œ HTTP μƒνƒœ μ½”λ“œμ™€ ν•¨κ»˜ μ‚¬μš©μžμ—κ²Œ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜μ—¬ 상황을 관리
  • 쑰건
    • μˆ˜μ •, μ‚­μ œ μ‹œ μš”μ²­ν•  λ•Œ λ³΄λ‚΄λŠ” λΉ„λ°€λ²ˆν˜Έκ°€ μΌμΉ˜ν•˜μ§€ μ•Šμ„ λ•Œ μ˜ˆμ™Έ λ°œμƒ
    • μ„ νƒν•œ 일정 정보λ₯Ό μ‘°νšŒν•  수 없을 λ•Œ μ˜ˆμ™Έ λ°œμƒ
      1. 잘λͺ»λœ μ •λ³΄λ‘œ μ‘°νšŒν•˜λ €κ³  ν•  λ•Œ
      2. 이미 μ‚­μ œλœ 정보λ₯Ό μ‘°νšŒν•˜λ €κ³  ν•  λ•Œ

Lv6. -- μ™„λ£Œ --

  • null 체크 및 νŠΉμ • νŒ¨ν„΄μ— λŒ€ν•œ 검증 μˆ˜ν–‰
    • μœ νš¨μ„± 검사
      1. 잘λͺ»λœ μž…λ ₯μ΄λ‚˜ μš”μ²­μ„ 미리 λ°©μ§€ν•  수 μžˆλ‹€.
      2. λ°μ΄ν„°μ˜λ¬΄κ²°μ„±μ„ 보μž₯ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 예츑 κ°€λŠ₯성을 λ†’μ—¬μ€€λ‹€.
      3. Springμ—μ„œ μ œκ³΅ν•˜λŠ”@Validμ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•  수 μžˆλ‹€.
    • 쑰건
    • 할일은 μ΅œλŒ€ 200자 μ΄λ‚΄λ‘œ μ œν•œ, ν•„μˆ˜κ°’ 처리
      • λΉ„λ°€λ²ˆν˜ΈλŠ” ν•„μˆ˜κ°’ 처리
      • λ‹΄λ‹Ήμžμ˜ 이메일 정보가 ν˜•μ‹μ— λ§žλŠ”μ§€ 확인

πŸ“Œ μ£Όμš” κΈ°λŠ₯

  • 일정 생성 μ‹œ 할일, μž‘μ„±μžλͺ…, λΉ„λ°€λ²ˆν˜Έ, μž‘μ„±/μˆ˜μ •μΌ μ €μž₯ (μžλ™ ID 생성)
  • 전체 일정 쑰회 μ‹œ μˆ˜μ •μΌΒ·μž‘μ„±μžλͺ… 쑰건으둜 필터링 κ°€λŠ₯, μˆ˜μ •μΌ κΈ°μ€€ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬
  • 고유 ID둜 일정 상세 쑰회
  • 일정 μˆ˜μ • μ‹œ 제λͺ©Β·λ‚΄μš©Β·μž‘μ„±μžλͺ… λ³€κ²½ κ°€λŠ₯, λΉ„λ°€λ²ˆν˜Έ ν•„μš”, μˆ˜μ •μΌ κ°±μ‹ 
  • 일정 μ‚­μ œ μ‹œ λΉ„λ°€λ²ˆν˜Έ 확인 ν›„ μ‚­μ œ
  • μž‘μ„±μž 정보λ₯Ό 별도 ν…Œμ΄λΈ”λ‘œ 관리 (이름, 이메일, 등둝일, μˆ˜μ •μΌ)
  • 일정과 μž‘μ„±μž 연관관계 μ„€μ • (μž‘μ„±μž ID β†’ 일정 FK)
  • νŽ˜μ΄μ§• 처리둜 일정 λͺ©λ‘μ„ νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ 쑰회 (μž‘μ„±μž 이름 포함)
  • νŽ˜μ΄μ§€ λ²”μœ„ λ²—μ–΄λ‚˜λ©΄ 빈 κ²°κ³Ό λ°˜ν™˜
  • λΉ„λ°€λ²ˆν˜Έ 뢈일치 λ˜λŠ” 잘λͺ»λœ ID둜 μ ‘κ·Ό μ‹œ μ˜ˆμ™Έ 처리
  • 할일은 200자 μ œν•œ, ν• μΌΒ·λΉ„λ°€λ²ˆν˜ΈλŠ” ν•„μˆ˜
  • 이메일 ν˜•μ‹ μœ νš¨μ„± 검사, @Valid둜 μž…λ ₯ 검증

πŸ“Œ API λͺ…μ„Έ

1. [POST] /schedules

  • μ„€λͺ…: 일정 μƒμ„±ν•˜κΈ°
  • 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"
}

2. [GET] /schedules?updated_at=...&name=…

  • μ„€λͺ…: 일정 전체 쑰회

  • 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와 λΉ„μ–΄μžˆλŠ” λ°°μ—΄ 응닡
[]

3. [GET] /schedules/{user_id}

  • μ„€λͺ…: 일정 선택 쑰회
  • 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 ν•΄λ‹Ή μ‹λ³„μžμ˜ λ©”λͺ¨κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우

4. [PATCH] /schedules/{user_id}

  • μ„€λͺ…: 일정 μˆ˜μ •(제λͺ©, λ‚΄μš©, μ΄λ¦„λ§Œ λ³€κ²½)
  • 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
ν•„μˆ˜κ°’μ΄ μ—†λŠ” 경우

5. [DEL] /schedules/{user_id}

  • μ„€λͺ…: 일정 μ‚­μ œ
  • Request
{
   "password" : "1234"
}
  • Response
// μ„±κ³΅μ‹œ 200 OK,  μ‹€νŒ¨μ‹œ 404 NotFound ν•΄λ‹Ή μ‹λ³„μžμ˜ λ©”λͺ¨κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우

πŸ“Œ ERD

img.png


πŸ“š TIL

이 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ μ•„λž˜ λ²¨λ‘œκ·Έμ— μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages