Skip to content

Latest commit

Β 

History

History
566 lines (546 loc) Β· 22.7 KB

README.md

File metadata and controls

566 lines (546 loc) Β· 22.7 KB

κ³Όμ œμ— λŒ€ν•œ μš”κ΅¬μ‚¬ν•­ 및 API상세, 제좜 방법, 평가 방법에 λŒ€ν•œ μ•ˆλ‚΄κ°€ λ‚˜μ™€μžˆμœΌλ‹ˆ κΌ­ μ •λ…ν•΄μ£Όμ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

λͺ©μ°¨

  1. 과제 μ•ˆλ‚΄ κ°œμš”
  2. 과제 주의 사항
  3. 과제 제좜 방식
  4. 과제 채점 방식
  5. ν•©κ²©μž μ„ λ°œ 방식
  6. 과제 κ΅¬ν˜„ μ•ˆλ‚΄
    6-1. μ„œλΉ„μŠ€ μ„€λͺ…
    6-2. Model μ„€λͺ…
    6-3. μš”κ΅¬ 사항
    6-4. 곡톡 API Response μ•ˆλ‚΄
    6-5. API별 상세 μ„€λͺ…
  7. 과제 평가 1번 μ‹œλ‚˜λ¦¬μ˜€
  8. 기타 문의 사항

1. 과제 μ•ˆλ‚΄ κ°œμš”

Prography 9κΈ° Spring Part에 지원해주신 λͺ¨λ“  λΆ„λ“€κ»˜ μ§„μ‹¬μœΌλ‘œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.
Spring Partμ—μ„œ μ§„ν–‰λ˜λŠ” κ³Όμ œλŠ”, μ—¬λŸ¬λΆ„λ“€κ»˜μ„œ Prographyμ—μ„œ ν”„λ‘œμ νŠΈλ₯Ό κ΅¬ν˜„/운영 ν•  수 μžˆλŠ” μ΅œμ†Œν•œμ˜ 기쀀을 보기 μœ„ν•¨μž…λ‹ˆλ‹€.
κ³Όμ œμ— λŒ€ν•œ ν‰κ°€λŠ”, 정해진 μ‹œλ‚˜λ¦¬μ˜€μ— μ˜ν•œ μžλ™μ±„μ μ„ 톡해 μ§„ν–‰λ©λ‹ˆλ‹€.
ν‰κ°€μ‹œ μ§„ν–‰λ˜λŠ” μ‹œλ‚˜λ¦¬μ˜€λŠ” 총 5λ‹¨κ³„λ‘œ 이루어지며, κ°œλ°œμ‹œ μ°Έκ³ λ₯Ό ν•˜μ‹€ 수 μžˆλ„λ‘ 첫번째 μ‹œλ‚˜λ¦¬μ˜€μ— λŒ€ν•΄μ„œλ§Œ κ³΅κ°œν•˜μ—¬ μ§„ν–‰ν•©λ‹ˆλ‹€.
κ³Όμ œλŠ” ν•΄λ‹Ή λ ˆν¬μ§€ν† λ¦¬λ₯Ό forkν•΄μ„œ μ§„ν–‰ν•΄μ£Όμ‹œκ³ , Prography 9κΈ° λͺ¨μ§‘ 기간이 μ’…λ£Œλ˜λŠ” μ‹œμ (2024λ…„2μ›”19일) κΉŒμ§€ κ°€λŠ₯ν•œ Private둜 μœ μ§€ν•˜μ‹œλ˜, κ·Έ 이후 Public μ „ν™˜μ€ λ¬΄κ΄€ν•©λ‹ˆλ‹€.
κ³Όμ œλŠ” Java언어에 λŒ€ν•΄μ„œ μ§„ν–‰λœ μ½”λ“œλ§Œ μΈμ •λ˜λ‹ˆ μœ μ˜ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

2. 과제 주의 사항

주의 사항을 지킀지 μ•Šμ„ 경우, μžλ™ 채점에 λŒ€ν•΄ μ‹€νŒ¨ν•˜κ±°λ‚˜ μ˜€λ‹΅μ²˜λ¦¬ 될 수 μžˆμŠ΅λ‹ˆλ‹€. κΌ­ 확인 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.

  • κ³Όμ œλŠ” Java언어에 λŒ€ν•΄μ„œ μ§„ν–‰λœ μ½”λ“œλ§Œ μΈμ •λ˜λ‹ˆ μœ μ˜ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.
  • JDK 17을 μ΄μš©ν•΄μ„œ κ΅¬ν˜„ν•˜μ…”μ•Ό ν•©λ‹ˆλ‹€.
  • Request 및 Response에 λŒ€ν•΄μ„œ "과제 κ΅¬ν˜„ μ•ˆλ‚΄"μ—μ„œ μ œκ³΅ν•˜λŠ” 바와 λ³€μˆ˜λͺ… 등이 μ •ν™•ν•˜κ²Œ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • portλŠ” 8080으둜 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€λŠ” H2 Databaseλ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.
  • JPAλ₯Ό ν™œμš©ν•˜λ©°, ddl-auto 속성은 create λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 각 Entity에 λŒ€ν•œ deleteλŠ” soft-delete/hard-delete 에 λŒ€ν•΄ 자유둭게 κ°œλ°œν•©λ‹ˆλ‹€.

3. 과제 제좜 방식

과제 μ™„λ£ŒμΌμž(2024λ…„2μ›”3일(ν† μš”μΌ)μžμ •)κΉŒμ§€ μ•„λž˜ λ©”μΌλ‘œ 전솑해주셔야 ν•©λ‹ˆλ‹€.
메일 μ „μ†‘μ‹œ μ•„λž˜ λ…Έμ…˜λ§ν¬λ₯Ό μ°Έκ³ ν•˜μ—¬, 본인의 ν”„λ‘œμ νŠΈλ₯Ό jar파일둜 λΉŒλ“œ ν›„ ꡬ글 λ“œλΌμ΄λΈŒμ— μ—…λ‘œλ“œ ν›„ 링크λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.
ꡬ글 λ“œλΌμ΄λΈŒ μ—…λ‘œλ“œ 방법 : https://www.notion.so/prography-admin/Google-Drive-ef7eca6451434af58d0b3fcd0867291c?pvs=4
2024λ…„ 2μ›” 3일 μžμ •μ„ λ„˜κ²¨μ„œ μˆ˜μ‹ λœ 메일에 λŒ€ν•΄μ„œλŠ” ν‰κ°€λ˜μ§€ μ•ŠμœΌλ©°, κ³Όμ œμ „ν˜• λΆˆν•©κ²©μœΌλ‘œ μ²˜λ¦¬λ˜λ‹ˆ κΌ­ μ‹œκ°„μ— λ§žμΆ°μ„œ μ œμΆœν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.
λ˜ν•œ, λ‹€λ₯Έ partμ—μ„œλ„ λ™μΌν•œ λ©”μΌμ£Όμ†Œλ‘œ 과제λ₯Ό μ œμΆœν•˜μ—¬ ν˜Όλ™λ  수 μžˆμœΌλ‹ˆ, λ©”μΌμ œλͺ©μ€ κΌ­ 정해진 규격으둜 μž‘μ„±ν•˜μ—¬ μ œμΆœν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

  • 메일 μ£Όμ†Œ : [email protected]
  • 메일 제λͺ© : [Prography9κΈ°] Spring-이름-ν•Έλ“œν°λ²ˆν˜Έλ’·μžλ¦¬
    ex. [Prography9κΈ°] Spring-λ¬Έλ²”μš°-6809
  • 파일 제λͺ© : spring-이름-ν•Έλ“œν°λ²ˆν˜Έ
    ex. spring-λ¬Έλ²”μš°-01029356809

4. 과제 채점 방식

κ³Όμ œμ— λŒ€ν•œ 채점은 별도 κ°œλ°œλ˜μ–΄ μžˆλŠ” μžλ™ν™” 채점 μ½”λ“œλ₯Ό 톡해 μ±„μ λ©λ‹ˆλ‹€.
μ—¬λŸ¬λΆ„μ΄ μ œμΆœν•΄μ£Όμ‹  jarνŒŒμΌμ„ docker둜 λΉŒλ“œν•˜μ—¬, μš”μ²­μ„ 보내고 κΈ°λŒ€ν•˜λŠ” 응닡값이 μ˜€λŠ”μ§€λ₯Ό νŒλ‹¨ν•˜μ—¬ μ§„ν–‰λ©λ‹ˆλ‹€.
λ•Œλ¬Έμ—, Request 및 Response에 λŒ€ν•΄μ„œ "과제 κ΅¬ν˜„ μ•ˆλ‚΄"μ—μ„œ μ œκ³΅ν•˜λŠ” 바와 λ³€μˆ˜λͺ… 등이 μ •ν™•ν•˜κ²Œ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

5. ν•©κ²©μž μ„ λ°œ 방식

μœ„μ—μ„œ μ•ˆλ‚΄λ“œλ¦° 과제 채점 방식을 톡해, κ°œμΈλ³„ 과제 μ μˆ˜κ°€ κ²°μ •λ˜λ©° 이λ₯Ό 기반으둜 μ•„λž˜ μˆœμ„œμ— 따라 ν•©κ²©μžλ₯Ό μ„ λ°œν•©λ‹ˆλ‹€.

  1. 과제 만점자
  2. 1번 μΌ€μ΄μŠ€μ˜ 인원이 λ©΄μ ‘ μ΅œμ†ŒμΈμ›μ— 만쑱 λͺ»ν•  μ‹œ, 고득점 μˆœμœ„λ‘œ ν•©κ²©μžκ°€ μ„ λ°œλ©λ‹ˆλ‹€.
  3. 1번 μΌ€μ΄μŠ€μ˜ 인원이 λ‹€μˆ˜ λ°œμƒμ‹œ, 과제 만점자의 μ½”λ“œλ₯Ό ν™•μΈν•˜μ—¬ 가산점에 λŒ€ν•œ κ²€ν†  ν›„ μ΅œμ’… ν•©κ²©μžκ°€ μ„ λ°œλ©λ‹ˆλ‹€.
  4. μ„ λ°œλœ ν•©κ²©μžμ˜ λͺ¨λ“  μ½”λ“œλŠ” μž¬κ²€ν† ν•˜λ˜ μ½”λ“œ κ΅¬ν˜„μ— λŒ€ν•œ ν‰κ°€λŠ” μ§„ν–‰ν•˜μ§€ μ•Šκ³ , 어뷰징(ν•˜λ“œμ½”λ”©μ„ ν†΅ν•œ 응닡값 μ„€μ • λ“±) μ—¬λΆ€λ§Œ ν™•μΈν•©λ‹ˆλ‹€.
    λ§Œμ•½ 어뷰징 μ½”λ“œκ°€ 확인될 μ‹œ, λΆˆν•©κ²© μ²˜λ¦¬λ©λ‹ˆλ‹€.

3λ²ˆμΌ€μ΄μŠ€μ— λŒ€ν•΄, 과제 λ§Œμ μ‹œ 가산점이 λΆ€μ—¬λ˜λŠ” ν•­λͺ©μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • λ¬Έμ„œν™”(Swagger)κ°€ κ΅¬ν˜„λ˜μ–΄ μžˆλŠ”κ°€.
  • μ½”λ“œμ˜ μ•„ν‚€ν…μ²˜ ꡬ쑰가 μž‘ν˜€μžˆλŠ”κ°€.
  • 쀑볡 μ½”λ“œκ°€ μ—†μœΌλ©°, μ½”λ“œμ˜ 가독성이 μžˆλŠ”κ°€.
  • ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μž‘μ„±λ˜μ–΄ μžˆλŠ”κ°€.
  • μ½”λ“œκ°€ μ±…μž„μ— 맞게 λΆ„λ°°λ˜μ–΄ μžˆλŠ”κ°€.

6. 과제 κ΅¬ν˜„ μ•ˆλ‚΄

6-1. μ„œλΉ„μŠ€ μ„€λͺ…

  • 탁ꡬ κ²Œμž„ μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€.
  • 탁ꡬ κ²Œμž„μ˜ μ’…λ₯˜λŠ” 2가지가 μ‘΄μž¬ν•©λ‹ˆλ‹€.
    • 단식(SINGLE) : 1λŒ€1둜 κ²Œμž„μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.
    • 볡식(DOUBLE) : 2λŒ€2둜 κ²Œμž„μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.
  • μœ μ €λ“€μ€ 방을 μƒμ„±ν•˜κ±°λ‚˜ λ§Œλ“€μ–΄μ§„ 방에 μ°Έκ°€ν•΄ κ²Œμž„μ„ 진행 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 방에 μ°Έκ°€ν•œ μœ μ €λ“€μ€ RED, BLUE νŒ€ 쀑 ν•œ 개의 νŒ€μ— λ°°μ •λ°›μŠ΅λ‹ˆλ‹€.
  • νŒ€μ€ 변경이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

6-2. Model μ„€λͺ…

μ„œλΉ„μŠ€μ—μ„œ μ‚¬μš©λ˜λŠ” 데이터 Model 은 User, Room, UserRoom 3가지 λͺ¨λΈμ΄ μžˆμŠ΅λ‹ˆλ‹€.

User
- id : integer
- fakerId : integer
- name : string
- email : string
- status : string
  - WAIT(λŒ€κΈ°), ACTIVE(ν™œμ„±), NON_ACTIVE(λΉ„ν™œμ„±)
- created_at : datetime
- updated_at : datetime
Room
- id : integer
- title : string
- host : integer
  - User.id
- room_type : string
  - SINGLE(단식), DOUBLE(볡식)
- status : string
  - WAIT(λŒ€κΈ°), PROGRESS(진행쀑), FINISH(μ™„λ£Œ)
- created_at : datetime
- updated_at : datetime
UserRoom
- id : integer
- room_id : integer
- user_id : integer
- team : string
  - RED, BLUE

6-3. μš”κ΅¬ 사항

⭐️ portλŠ” 8080으둜 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.
⭐️ λ°μ΄ν„°λ² μ΄μŠ€λŠ” H2 Databaseλ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.
⭐️ JPAλ₯Ό ν™œμš©ν•˜λ©°, ddl-auto 속성은 create λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
⭐️ 각 Entity에 λŒ€ν•œ deleteλŠ” soft-delete/hard-delete 에 λŒ€ν•΄ 자유둭게 κ°œλ°œν•©λ‹ˆλ‹€.
⭐️ μ•„λž˜ 총 10개의 API듀을 κ΅¬ν˜„ ν•©λ‹ˆλ‹€.
각 API에 λŒ€ν•œ 상세 μ„€λͺ…은 ν•˜λ‹¨λΆ€μ— λ³„λ„λ‘œ μ•ˆλ‚΄λ©λ‹ˆλ‹€.

  1. ν—¬μŠ€μ²΄ν¬ API
  2. μ΄ˆκΈ°ν™” API
  3. μœ μ € 전체 쑰회 API
  4. λ°© 생성 API
  5. λ°© 전체 쑰회 API
  6. λ°© 상세 쑰회 API
  7. λ°© μ°Έκ°€ API
  8. λ°© λ‚˜κ°€κΈ° API
  9. κ²Œμž„μ‹œμž‘ API
  10. νŒ€ λ³€κ²½ API
  • ⭐️ κ²Œμž„μ€ μ‹œμž‘ν•˜κ³  1λΆ„ λ’€ μžλ™μœΌλ‘œ μ’…λ£Œλ©λ‹ˆλ‹€. ⭐️
    • 였차 λ²”μœ„ 30초 이내
    • μ’…λ£Œλœ κ²Œμž„μ˜ λ°© μƒνƒœλŠ” 'FINISH(μ™„λ£Œ)' μƒνƒœλ‘œ λ³€κ²½λ©λ‹ˆλ‹€.
  • 방을 μƒμ„±ν•œ μ‚¬λžŒμ„ host 라고 λͺ…μΉ­ν•˜κ³ , host κ°€ 방을 λ‚˜κ°€λ©΄ ν•΄λ‹Ή 방은 μ‚¬λΌμ§‘λ‹ˆλ‹€.
  • RED, BLUE 2개의 νŒ€μ΄ μ‘΄μž¬ν•˜κ³  μ„œλ‘œ 반/반 μ •ν™•ν•˜κ²Œ 인원이 λ‚˜λ‰˜μ–΄μ§„ μƒνƒœμ—μ„œλ§Œ κ²Œμž„μ„ 진행할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • κ²Œμž„μ€ 방에 인원이 λͺ¨λ‘ μ°¬ μƒνƒœμ—μ„œλ§Œ μ‹œμž‘ κ°€λŠ₯ν•©λ‹ˆλ‹€.
    • 단식 2λͺ…, 볡식 4λͺ…
  • 방에 λͺ¨λ“  인원이 가득찬 μƒνƒœλΌλ©΄ μ°Έκ°€ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • 방에 μ°Έκ°€ν•œ 인원에 λŒ€ν•œ νŒ€ λ°°μ • λ‘œμ§μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    • ν•œ μͺ½ νŒ€μ— 인원이 λͺ¨λ‘ μ°¬ 경우, λ°˜λŒ€νŒ€μœΌλ‘œ λ°°μ •ν•©λ‹ˆλ‹€.
    • μ–‘μͺ½ νŒ€μ— λͺ¨λ‘ μžλ¦¬κ°€ μžˆλŠ” 경우, REDνŒ€μ— λ¨Όμ € λ°°μ •λ©λ‹ˆλ‹€.
  • μž‘μ„±ν•˜μ‹  μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œ λ™μž‘ν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.
    • λ™μ‹œμ„± μ΄μŠˆμ— λŒ€ν•΄μ„œ κ³ λ €ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.
  • 각 κΈ°λŠ₯에 λŒ€ν•œ λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • APIλ₯Ό κ°œλ°œν•˜λ©° ν•„μš”ν•œ μœ μ € domain에 λŒ€ν•œ μ΄ˆκΈ°ν™” 방법은 "API μ„€λͺ…"을 μ°Έκ³ ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

6-4. 곡톡 API Response μ•ˆλ‚΄

  • ApiResponse λŠ” μ•„λž˜ 클래슀λ₯Ό ν™œμš©ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.
    • μš”μ²­μ΄ μ„±κ³΅ν–ˆμ„ λ•Œ, code = 200, message = "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€." λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • 잘λͺ»λœ API μš”μ²­μ€ code = 201, message = "λΆˆκ°€λŠ₯ν•œ μš”μ²­μž…λ‹ˆλ‹€." λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • κ·Έ μ™Έ μ„œλ²„ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” μΌ€μ΄μŠ€λŠ” code = 500, message = "μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€." λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
public class ApiResponse<T> {
    private Integer code;
    private String message;
    private T result;
}

6-5. API별 상세 μ„€λͺ…

ν—¬μŠ€μ²΄ν¬ API

  • μ„œλ²„μ˜ μƒνƒœλ₯Ό μ²΄ν¬ν•˜λŠ” APIμž…λ‹ˆλ‹€.
  • λͺ¨λ“  μ‹œλ‚˜λ¦¬μ˜€μ— λŒ€ν•΄ 졜초 1회 ν˜ΈμΆœλ©λ‹ˆλ‹€.

API λͺ…μ„Έ

GET /health

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€."
}

μ΄ˆκΈ°ν™” API

  • seed와 quantityλ₯Ό body에 λ‹΄μ•„μ„œ μš”μ²­ν•©λ‹ˆλ‹€.
  • 기쑴에 있던 λͺ¨λ“  νšŒμ› 정보 및 λ°© 정보λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€. (즉, λͺ¨λ“  table의 λͺ¨λ“  데이터λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.)
  • 이후 body둜 전달받은 seed와 quantity정보λ₯Ό 톡해 μ•„λž˜ APIλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ„œλΉ„μŠ€μ— ν•„μš”ν•œ νšŒμ› 정보λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
  • fakerapi의 응닡 결과둜 λ‚΄λ €μ˜€λŠ” 데이터λ₯Ό μ•„λž˜ κ·œμΉ™μ— 따라 μ„ΈνŒ…ν•©λ‹ˆλ‹€.
    • 응닡 κ°’μ˜ idν•„λ“œλŠ” fakerId둜 μ €μž₯ν•©λ‹ˆλ‹€.
    • 응닡 κ°’μ˜ id(fakerId)λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
    • username ν•„λ“œλŠ” name으둜 μ €μž₯ν•©λ‹ˆλ‹€.
    • email ν•„λ“œλŠ” κ·ΈλŒ€λ‘œ μ €μž₯ν•©λ‹ˆλ‹€.
    • uuid, firstname, lastname, password, ip, macAddress, website, image ν•„λ“œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • νšŒμ› μƒνƒœ(status)λŠ” 응닡 κ°’μ˜ id(fakerId)λ₯Ό κΈ°λ°˜ν•˜μ—¬ μ•„λž˜ κ·œμΉ™μ— 따라 μ €μž₯ν•©λ‹ˆλ‹€.
      • 응닡 κ°’μ˜ id(fakerId) 값이 30 μ΄ν•˜μ˜ νšŒμ›μ€ ν™œμ„±(ACTIVE) μƒνƒœλ‘œ μ„ΈνŒ…ν•©λ‹ˆλ‹€.
      • 응닡 κ°’μ˜ id(fakerId) 값이 31 이상, 60 μ΄ν•˜μ˜ νšŒμ›μ€ λŒ€κΈ°(WAIT) μƒνƒœλ‘œ μ„ΈνŒ…ν•©λ‹ˆλ‹€.
      • 응닡 κ°’μ˜ id(fakerId) 값이 61 이상인 νšŒμ›μ€ λΉ„ν™œμ„±(NON_ACTIVE) μƒνƒœλ‘œ μ„ΈνŒ…ν•©λ‹ˆλ‹€.
    • 데이터가 μ €μž₯λ˜λŠ” μ‹œμ μ— 따라 createdAtκ³Ό updatedAt을 μ €μž₯ν•©λ‹ˆλ‹€.

API λͺ…μ„Έ

POST /init
body
{
   "seed" : int,
   "quantity" : int,
}

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€."
}

μœ μ € 전체 쑰회 API

  • νŽ˜μ΄μ§• 처리λ₯Ό μœ„ν•œ size, page 값을 RequestParameter둜 λ°›μŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  νšŒμ› 정보λ₯Ό μ‘λ‹΅ν•©λ‹ˆλ‹€.
    • id κΈ°μ€€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•΄μ„œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

API λͺ…μ„Έ

GET /user?size={size}&page={page}

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.",
  "result" : {
		"totalElements" : int,
		"totalPages" : int,
		"userList" : [
			{
				"id" : int,
				"fakerId" : int,
				"name" : string,
				"email" : string,
				"status" : string, // WAIT(λŒ€κΈ°), ACTIVE(ν™œμ„±), NON_ACTIVE(λΉ„ν™œμ„±)
				"createdAt" : string, // yyyy-MM-dd HH:mm:ss ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
				"updatedAt" : string // yyyy-MM-dd HH:mm:ss ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
			}, ...
		]
	}
}

λ°© 생성 API

  • userId, roomType, title μ •λ³΄λŠ” body에 λ‹΄μ•„μ„œ μš”μ²­ν•©λ‹ˆλ‹€.
  • 방을 μƒμ„±ν•˜λ €κ³  ν•˜λŠ” user(userId)의 μƒνƒœκ°€ ν™œμ„±(ACTIVE)μƒνƒœμΌ λ•Œλ§Œ, 방을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ ν™œμ„±μƒνƒœκ°€ μ•„λ‹λ•ŒλŠ” 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • 방을 μƒμ„±ν•˜λ €κ³  ν•˜λŠ” user(userId)κ°€ ν˜„μž¬ μ°Έμ—¬ν•œ 방이 μžˆλ‹€λ©΄, 방을 생성할 수 μ—†μŠ΅λ‹ˆλ‹€. λ§Œμ•½ μ°Έμ—¬ν•˜κ³  μžˆλŠ” 방이 μžˆμ„λ•ŒλŠ” 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • 방은 μ΄ˆκΈ°μ— λŒ€κΈ°(WAIT) μƒνƒœλ‘œ μƒμ„±λ©λ‹ˆλ‹€.
  • 데이터가 μ €μž₯λ˜λŠ” μ‹œμ μ— 따라 createdAtκ³Ό updatedAt을 μ €μž₯ν•©λ‹ˆλ‹€.

API λͺ…μ„Έ

POST /room
body
{
   "userId" : int,
   "roomType" : String,
   "title" : String
}

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€."
}

λ°© 전체 쑰회 API

  • νŽ˜μ΄μ§• 처리λ₯Ό μœ„ν•œ size, page 값을 RequestParameter둜 λ°›μŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  방에 λŒ€ν•œ 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • id κΈ°μ€€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

API λͺ…μ„Έ

GET /room?size={size}&page={page}

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.",
  "result" : {
		"totelElements" : int,
		"totalPages" : int,
		"roomList" : [
			{
				"id" : int,
				"title" : string,
				"hostId" : int,
				"roomType" : string, // SINGLE(단식), DOUBLE(볡식)
				"status" : string, // WAIT(λŒ€κΈ°), PROGRESS(진행쀑), FINISH(μ™„λ£Œ)
			}, ...
		]
	}
}

λ°© 상세 쑰회 API

  • roomIdλ₯Ό λ°›μ•„ 방에 λŒ€ν•œ 상세 쑰회λ₯Ό ν•©λ‹ˆλ‹€.
  • createdAt, updatedAt을 ν•¨κ»˜ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” id에 λŒ€ν•œ μš”μ²­μ΄λΌλ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )

API λͺ…μ„Έ

GET /room/{roomId}

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.",
  "result" : {
		"id" : int,
		"title" : string,
		"hostId" : int,
		"roomType" : string, // SINGLE(단식), DOUBLE(볡식)
		"status" : string, // WAIT(λŒ€κΈ°), PROGRESS(진행쀑), FINISH(μ™„λ£Œ)
		"createdAt" : string, // yyyy-MM-dd HH:mm:ss ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
		"updatedAt" : string // yyyy-MM-dd HH:mm:ss ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
	}
}

λ°© μ°Έκ°€ API

  • λŒ€κΈ°(WAIT) μƒνƒœμΈ λ°©μ—λ§Œ μ°Έκ°€κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€. λ§Œμ•½ λŒ€κΈ°μƒνƒœκ°€ μ•„λ‹Œ 방이라면 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • μœ μ €(userId)κ°€ ν™œμ„±(ACTIVE) μƒνƒœμΌ λ•Œλ§Œ, 방에 μ°Έκ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ ν™œμ„±μƒνƒœκ°€ μ•„λ‹ˆλΌλ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • μœ μ €(userId)κ°€ ν˜„μž¬ μ°Έμ—¬ν•œ 방이 μ—†μ„λ•Œλ§Œ, 방에 μ°Έκ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ μ°Έμ—¬ν•œ 방이 μžˆλ‹€λ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • μ°Έκ°€ν•˜κ³ μž ν•˜λŠ” λ°©(roomId)의 정원이 미달일 λ•Œλ§Œ, μ°Έκ°€κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€. λ§Œμ•½ 방에 인원이 가득 μ°Όλ‹€λ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” id에 λŒ€ν•œ μš”μ²­μ΄λΌλ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )

API λͺ…μ„Έ

POST /room/attention/{roomId}
body
{
   "userId" : int
}

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€."
}

λ°© λ‚˜κ°€κΈ° API

  • μœ μ €(userId)κ°€ ν˜„μž¬ ν•΄λ‹Ή λ°©(roomId)에 μ°Έκ°€ν•œ μƒνƒœμΌ λ•Œλ§Œ, λ‚˜κ°€κΈ°κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€. λ§Œμ•½ μ°Έκ°€ν•œ μƒνƒœκ°€ μ•„λ‹ˆλΌλ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • 이미 μ‹œμž‘(PROGRESS) μƒνƒœμΈ λ°©μ΄κ±°λ‚˜ λλ‚œ(FINISH) μƒνƒœμ˜ 방은 λ‚˜κ°ˆ 수 μ—†μŠ΅λ‹ˆλ‹€. λ§Œμ•½ κ·ΈλŸ¬ν•œ μƒνƒœλΌλ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • ν˜ΈμŠ€νŠΈκ°€ 방을 λ‚˜κ°€κ²Œ 되면 방에 있던 λͺ¨λ“  μ‚¬λžŒλ„ ν•΄λ‹Ή λ°©μ—μ„œ λ‚˜κ°€κ²Œ λ©λ‹ˆλ‹€.
    • ν•΄λ‹Ή 방은 λλ‚œ(FINISH) μƒνƒœκ°€ λ©λ‹ˆλ‹€.
  • μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” id에 λŒ€ν•œ μš”μ²­μ΄λΌλ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )

API λͺ…μ„Έ

POST /room/out/{roomId}
body
{
   "userId" : int
}

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€."
}

κ²Œμž„μ‹œμž‘ API

  • 호슀트인 μœ μ €λ§Œ κ²Œμž„μ„ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ ν˜ΈμŠ€νŠΈκ°€ μ•„λ‹ˆλΌλ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • λ°© 정원이 방의 νƒ€μž…μ— 맞게 λͺ¨λ‘ 꽉 μ°¬ μƒνƒœμ—μ„œλ§Œ κ²Œμž„μ„ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 그렇지 μ•Šλ‹€λ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • ν˜„μž¬ 방의 μƒνƒœκ°€ λŒ€κΈ°(WAIT) μƒνƒœμΌ λ•Œλ§Œ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 그렇지 μ•Šλ‹€λ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • 방의 μƒνƒœλ₯Ό 진행쀑(PROGRESS) μƒνƒœλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€.
  • κ²Œμž„μ‹œμž‘μ΄ 된 방은 1λΆ„ λ’€ μ’…λ£Œ(FINISH) μƒνƒœλ‘œ λ³€κ²½λ©λ‹ˆλ‹€.
  • μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” id에 λŒ€ν•œ μš”μ²­μ΄λΌλ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )

API λͺ…μ„Έ

PUT /room/start/{roomId}
body
{
   "userId" : int
}

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€."
}

νŒ€ λ³€κ²½ API

  • μœ μ €(userId)κ°€ ν˜„μž¬ ν•΄λ‹Ή λ°©(roomId)에 μ°Έκ°€ν•œ μƒνƒœμ—μ„œλ§Œ νŒ€ 변경이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ§Œμ•½ 그렇지 μ•Šλ‹€λ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • μœ μ €(userId)κ°€ ν˜„μž¬ μ†ν•œ νŒ€ κΈ°μ€€ λ°˜λŒ€ νŒ€μœΌλ‘œ λ³€κ²½λ©λ‹ˆλ‹€. (RED -> BLUE / BLUE -> RED)
  • λ³€κ²½λ˜λ €λŠ” νŒ€μ˜ 인원이 이미 ν•΄λ‹Ή λ°© μ •μ›μ˜ 절반과 κ°™λ‹€λ©΄ νŒ€μ΄ λ³€κ²½λ˜μ§€ μ•Šκ³  201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • ν˜„μž¬ 방의 μƒνƒœκ°€ λŒ€κΈ°(WAIT) μƒνƒœμΌ λ•Œλ§Œ νŒ€μ„ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 그렇지 μ•Šλ‹€λ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )
  • μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” id에 λŒ€ν•œ μš”μ²­μ΄λΌλ©΄ 201 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. (곡톡 API Response μ•ˆλ‚΄ μ°Έκ³ )

API λͺ…μ„Έ

PUT /team/{roomId}
body
{
   "userId" : int
}

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€."
}

7. 과제 평가 1번 μ‹œλ‚˜λ¦¬μ˜€

κ³Όμ œμ— λŒ€ν•œ ν‰κ°€λŠ” μœ„μ—μ„œ μ•ˆλ‚΄λ“œλ¦° 것과 같이 총 5개의 μ‹œλ‚˜λ¦¬μ˜€λ‘œ μ§„ν–‰λ˜λ©°, κ°œλ°œμ‹œ μ°Έκ³ λ₯Ό ν•˜κΈ° μœ„ν•΄ 1번 μ‹œλ‚˜λ¦¬μ˜€μ— λŒ€ν•΄μ„œλ§Œ κ³΅κ°œλ©λ‹ˆλ‹€.
λ‹€λ§Œ, ν—¬μŠ€μ²΄ν¬ APIλŠ” λͺ¨λ“  μ‹œλ‚˜λ¦¬μ˜€ μ‹œμž‘μ— ν˜ΈμΆœλ©λ‹ˆλ‹€.

1. ν—¬μŠ€μ²΄ν¬

Request

curl -X GET http://localhost:8080/health

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€."
}

2. μœ μ € 전체 쑰회

Request

curl -X GET http://localhost:8080/user?size=100&page=0

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.",
  "result" : {
		"totalElements" : 0,
		"totalPages" : 0,
		"userList" : []
	}
}

3. μ΄ˆκΈ°ν™”

Request

curl -X POST http://localhost:8080/init -d '{"seed":123, "quantity":10}'

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€."
}

4. μœ μ € 전체 쑰회

Request

curl -X GET http://localhost:8080/user?size=10&page=0

Response

{
  "code" : 200,
  "message" : "API μš”μ²­μ΄ μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.",
  "result" : {
      "totalElements" : 10,
      "totalPages" : 0,
      "userList" : [
         {
            "id": 1,
            "fakerId": 1,
            "name": "jungran.gwon",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         },
         {
            "id": 2,
            "fakerId": 2,
            "name": "myungho.lim",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         },
         {
            "id": 3,
            "fakerId": 3,
            "name": "jiwoo.ko",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         },
         {
            "id": 4,
            "fakerId": 4,
            "name": "minseok.moon",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         },
         {
            "id": 5,
            "fakerId": 5,
            "name": "yunyoung01",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         },
         {
            "id": 6,
            "fakerId": 6,
            "name": "qheo",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         },
         {
            "id": 7,
            "fakerId": 7,
            "name": "myungho.han",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         },
         {
            "id": 8,
            "fakerId": 8,
            "name": "naree.gwon",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         },
         {
            "id": 9,
            "fakerId": 9,
            "name": "jo.hyunjun",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         },
         {
            "id": 10,
            "fakerId": 10,
            "name": "kwak.jumyoung",
            "email": "[email protected]",
            "status": "ACTIVE",
            "createdAt": "2024-01-14 02:22:45",
            "updatedAt": "2024-01-14 02:22:45"
         }
      ]
  }
}

8. 기타 문의 사항

μ•ˆλ‚΄λ˜μ–΄μžˆλŠ” λ‚΄μš© μ΄μ™Έμ˜ λ¬Έμ˜μ‚¬ν•­μ€ issueλ₯Ό 톡해 λ“±λ‘ν•΄μ£Όμ„Έμš”.
Prography 9κΈ° λͺ¨μ§‘κ³Ό κ΄€λ ¨λœ λ‚΄μš©μ€ μ•„λž˜ νŽ˜μ΄μ§€λ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”.
ν”„λ‘œκ·ΈλΌν”Ό 9κΈ° λͺ¨μ§‘ μƒμ„ΈνŽ˜μ΄μ§€

ν”„λ‘œκ·ΈλΌκΈ° 9κΈ° λͺ¨μ§‘에 μ§€μ›ν•΄μ£Όμ…”μ„œ, μ§„μ‹¬μœΌλ‘œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

2024λ…„, ν•¨κ»˜ ν™œλ™ν•  μ—¬λŸ¬λΆ„λ“€μ„ μœ„ν•΄μ„œ λ§€λ‹ˆμ € λͺ¨λ‘κ°€ μ΅œμ„ μ„ λ‹€ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€.

Prograhy.
[email protected]
Homepage : https://prography.org/
Instagram: https://www.instagram.com/prography_official