πŸ”μŠ€νŒ‘μž‡μΈ  ν”„λ‘œμ νŠΈ

coldrice99Β·2024λ…„ 11μ›” 7일
0

ν”„λ‘œμ νŠΈ μ†Œκ°œ

  • 진행 κΈ°κ°„: 2024-11-01 ~ 2024-11-07
  • μŠ€νŒ‘μž‡μΈ λŠ” λ°°λ‹¬μ˜λ―Όμ‘±κ³Ό 쿠팑이츠λ₯Ό λ²€μΉ˜λ§ˆν‚Ήν•˜μ—¬ 개발된
    배달 μ„œλΉ„μŠ€ μ•±μ˜ λ°±μ—”λ“œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.
  • μ‚¬μš©μžλŠ” λ‹€μ–‘ν•œ κ°€κ²Œμ˜ 메뉴λ₯Ό κ²€μƒ‰ν•˜κ³  μ£Όλ¬Έν•  수 있으며,
    사μž₯λ‹˜μ€ κ°€κ²Œμ™€ 메뉴λ₯Ό 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ£Όμš” κΈ°λŠ₯μœΌλ‘œλŠ” νšŒμ› 관리, κ°€κ²Œ 및 메뉴 관리, μ£Όλ¬Έ 관리, 리뷰 κΈ°λŠ₯ 등이 ν¬ν•¨λ©λ‹ˆλ‹€.

νŒ€μ› ꡬ성

νŒ€μ›μ—­ν• GitHub
μ΄ν•œμ‹νšŒμ› κΈ°λŠ₯ (둜그인, νšŒμ›κ°€μž…, νšŒμ›νƒˆν‡΄ λ“±)@coldrice99
김신희주문 관리 (μ£Όλ¬Έ 생성, μƒνƒœ λ³€κ²½, 둜그 기둝)@shinheekim
λ°•μ§€μ˜ˆλ©”λ‰΄ 관리 (메뉴 μΆ”κ°€, μˆ˜μ •, μ‚­μ œ)@bbobsang
μ§€μ°½ν˜„λ¦¬λ·° κΈ°λŠ₯ (리뷰 μž‘μ„±, μˆ˜μ •, μ‚­μ œ, 필터링)@tesbro1194
μ΅œμ„œμ˜κ°€κ²Œ 관리 (κ°€κ²Œ 등둝, 쑰회, μˆ˜μ •, 폐업)@seoyeong-4811

μ±„νƒν•œ 개발 기술과 브랜치 μ „λž΅

Spring Boot & JPA

  • Spring Bootλ₯Ό μ‚¬μš©ν•˜μ—¬ RESTful API 섀계와 μ„œλ²„ ꡬ좕을 μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • JPA둜 λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 맀핑을 톡해 효율적인 데이터 관리 및 νŠΈλžœμž­μ…˜μ„ μœ μ§€ν–ˆμŠ΅λ‹ˆλ‹€.

JWT 인증

  • μ‚¬μš©μž 인증에 JWT(Json Web Token)λ₯Ό μ μš©ν•˜μ—¬ νšŒμ› 둜그인과 인증을 μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

브랜치 μ „λž΅

  • Git-flow μ „λž΅μ„ ν™œμš©ν•˜μ—¬Β main,Β develop,Β issue 브랜치λ₯Ό κ΄€λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
    • main: 배포 버전을 κ΄€λ¦¬ν•˜λŠ” 브랜치
    • develop: 개발 λ‹¨κ³„μ—μ„œ ν†΅ν•©λ˜λŠ” 브랜치
    • issue: κΈ°λŠ₯λ³„λ‘œ μž‘μ—… ν›„ develop λΈŒλžœμΉ˜μ— 병합


초기 κΉƒ μ»¨λ²€μ…˜

  • PR - μž‘μ€ λ‹¨μœ„μ˜ μž‘μ—…μ„ 올리고, TESTκΉŒμ§€ μ™„λ£Œν–ˆμ„ λ•Œλ§ˆλ‹€ 보내기⭐
    PR 제λͺ© - λ‚΄κ°€ μ™„λ£Œν•œ κΈ°λŠ₯/ λΆ€λΆ„ - μ•žμœΌλ‘œ λ‚΄κ°€ κ°œλ°œν•  κ±°

  • Issues 관리 - Issue λ²ˆν˜Έμ— 맞게 브랜치 생성

  • commit message

    [#1] feat: κ²Œμ‹œκΈ€ 쑰회
    

  • merge β‡’ approve 2λͺ…

ν”„λ‘œμ νŠΈ ꡬ쑰

β”œβ”€β”€ README.md
β”œβ”€β”€ .gitignore
β”œβ”€β”€ build.gradle
β”œβ”€β”€ src
β”‚   β”œβ”€β”€ main
β”‚   β”‚   β”œβ”€β”€ java
β”‚   β”‚   β”‚   └── com.sparta.spangeats
β”‚   β”‚   β”‚       β”œβ”€β”€ common
β”‚   β”‚   β”‚       β”œβ”€β”€ domain
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ address
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ auth
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ basket
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ cart
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ member
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ menu
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ order
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ orders
β”‚   β”‚   β”‚       β”‚   β”œβ”€β”€ review
β”‚   β”‚   β”‚       β”‚   └── store
β”‚   β”‚   β”‚       └── security
β”‚   β”‚   └── resources
β”‚   └── test
└── SpangEatsApplicationTests.java

μ—­ν•  λΆ„λ‹΄

  • πŸ§‘β€πŸ’» μ΄ν•œμ‹: νšŒμ› κΈ°λŠ₯ (둜그인, νšŒμ›κ°€μž…, νšŒμ›νƒˆν‡΄, 카카였 μ†Œμ…œ 둜그인, κ΄€λ¦¬μž κΈ°λŠ₯)
  • πŸ‘©β€πŸ’» 김신희: μ£Όλ¬Έ κΈ°λŠ₯ (μ£Όλ¬Έ 생성, μƒνƒœ λ³€κ²½, 둜그 기둝), νšŒμ› μ£Όμ†Œ 관리, μž₯λ°”κ΅¬λ‹ˆ κΈ°λŠ₯(+μŠ€μΌ€μ€„λŸ¬)
  • πŸ‘©β€πŸ’» λ°•μ§€μ˜ˆ: 메뉴 관리 (메뉴 μΆ”κ°€, μˆ˜μ •, μ‚­μ œ, μΉ΄ν…Œκ³ λ¦¬)
  • πŸ‘¨β€πŸ’» μ΅œμ„œμ˜: κ°€κ²Œ 관리 (κ°€κ²Œ 등둝, 쑰회, μˆ˜μ •, 폐업, 곡지)
  • πŸ‘©β€πŸ’» μ§€μ°½ν˜„: 리뷰 κΈ°λŠ₯ (리뷰 μž‘μ„±, μˆ˜μ •, μ‚­μ œ, κ°€κ²Œ 별 쑰회, νšŒμ› 별 쑰회)

ν•„μˆ˜ κΈ°λŠ₯ κ΅¬ν˜„μ—λ§Œ μ§‘μ€‘ν•˜μ—¬ μ΅œλŒ€ν•œ ν™”μš”μΌκΉŒμ§€ 개발 μ™„λ£Œλ₯Ό λͺ©ν‘œ, 이후 μΆ”κ°€ κΈ°λŠ₯λ“€ κ΅¬ν˜„


ν”„λ‘œμ νŠΈ 섀계

https://www.figma.com/design/b4yYQvAKbWrzVL82929thO/%EC%8A%A4%ED%8C%A1%EC%9D%B4%EC%B8%A0?node-id=0-1&t=LnlR7lOuCwpRsVzp-1

μ™€μ΄μ–΄ν”„λ ˆμž„

1.νšŒμ› 관리

2.κ°€κ²Œκ΄€λ¦¬

3.메뉴관리

4.주문관리

5.리뷰관리

  • API λͺ…μ„Έμ„œ

νšŒμ› API

κΈ°λŠ₯URLMethodRequest BodyResponse
νšŒμ›κ°€μž…/api/auth/signupPOSTemail (이메일 ν˜•μ‹), password (λΉ„λ°€λ²ˆν˜Έ), nickname (λ‹‰λ„€μž„), memberRole (USER/OWNER/ADMIN), phoneNumber (μ „ν™”λ²ˆν˜Έ), adminSecretKey (κ΄€λ¦¬μž νšŒμ›κ°€μž… μ‹œ ν•„μš”)성곡 μ‹œ: "νšŒμ› κ°€μž…μ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!"
μ‹€νŒ¨ μ‹œ: μ—λŸ¬ λ©”μ‹œμ§€
둜그인/api/auth/loginPOSTemail (이메일 ν˜•μ‹), password (λΉ„λ°€λ²ˆν˜Έ)성곡 μ‹œ: JWT 토큰 λ°˜ν™˜
μ‹€νŒ¨ μ‹œ: μ—λŸ¬ λ©”μ‹œμ§€
νšŒμ› 정보 쑰회/api/auth/meGETHeaders: Authorization: Bearer {JWT}μ‚¬μš©μž 정보 λ°˜ν™˜
전체 νšŒμ› 쑰회 (κ΄€λ¦¬μž)/api/admin/membersGETHeaders: Authorization: Bearer {JWT}전체 νšŒμ› λͺ©λ‘ λ°˜ν™˜
νšŒμ› νƒˆν‡΄/api/auth/deleteDELETEHeaders: Authorization: Bearer {JWT}, password (νšŒμ› νƒˆν‡΄ μ‹œ λΉ„λ°€λ²ˆν˜Έ 확인)성곡 μ‹œ: "νšŒμ› νƒˆν‡΄ μ™„λ£Œ" λ©”μ‹œμ§€ λ°˜ν™˜

κ°€κ²Œ 관리 API

κΈ°λŠ₯URLMethodRequest BodyResponse
κ°€κ²Œ 등둝/api/storesPOSTstoreName (κ°€κ²Œ 이름), category (μΉ΄ν…Œκ³ λ¦¬), notice (κ°€κ²Œ 곡지)성곡 μ‹œ: λ“±λ‘λœ κ°€κ²Œ 정보 λ°˜ν™˜
κ°€κ²Œ 정보 쑰회/api/stores/{storeId}GET-κ°€κ²Œ 정보와 메뉴 λͺ©λ‘ λ°˜ν™˜
κ°€κ²Œ λͺ©λ‘ 쑰회/api/storesGETname (μ΄λ¦„μœΌλ‘œ 검색), category (μΉ΄ν…Œκ³ λ¦¬λ³„ 쑰회)검색 쑰건에 λ§žλŠ” κ°€κ²Œ λͺ©λ‘ λ°˜ν™˜
κ°€κ²Œ 곡지 μˆ˜μ •/api/stores/{storeId}/noticePATCHnotice (λ³€κ²½ν•  곡지 λ‚΄μš©)성곡 μ‹œ: μˆ˜μ •λœ κ°€κ²Œ 곡지 λ°˜ν™˜
κ°€κ²Œ μ‚­μ œ/api/stores/{storeId}DELETE-성곡 μ‹œ: μ‚­μ œ μ™„λ£Œ λ©”μ‹œμ§€ λ°˜ν™˜

메뉴 관리 API

κΈ°λŠ₯URLMethodRequest BodyResponse
메뉴 μΆ”κ°€/api/stores/{storeId}/menusPOSTmenuName (메뉴 이름), price (가격), description (μ„€λͺ…)성곡 μ‹œ: μΆ”κ°€λœ 메뉴 정보 λ°˜ν™˜
메뉴 쑰회/api/menus/{menuId}GET-메뉴 상세 정보 λ°˜ν™˜
메뉴 μˆ˜μ •/api/menus/{menuId}PATCHmenuName (메뉴 이름), price (가격), description (μ„€λͺ…)성곡 μ‹œ: μˆ˜μ •λœ 메뉴 정보 λ°˜ν™˜
메뉴 μ‚­μ œ/api/menus/{menuId}DELETE-성곡 μ‹œ: μ‚­μ œ μ™„λ£Œ λ©”μ‹œμ§€ λ°˜ν™˜

μž₯λ°”κ΅¬λ‹ˆ API

κΈ°λŠ₯URLMethodRequest BodyResponse
μž₯λ°”κ΅¬λ‹ˆ μΆ”κ°€/api/cartPOSTmenuId (메뉴 ID), quantity (μˆ˜λŸ‰)성곡 μ‹œ: μž₯λ°”κ΅¬λ‹ˆ ν•­λͺ© μΆ”κ°€ κ²°κ³Ό λ°˜ν™˜
μž₯λ°”κ΅¬λ‹ˆ 쑰회/api/cartGET-μ‚¬μš©μžμ˜ μž₯λ°”κ΅¬λ‹ˆ λͺ©λ‘ λ°˜ν™˜
μž₯λ°”κ΅¬λ‹ˆ μˆ˜λŸ‰ μˆ˜μ •/api/cart/{cartItemId}PATCHquantity (μˆ˜μ •ν•  μˆ˜λŸ‰)성곡 μ‹œ: μˆ˜μ •λœ μž₯λ°”κ΅¬λ‹ˆ ν•­λͺ© λ°˜ν™˜
μž₯λ°”κ΅¬λ‹ˆ ν•­λͺ© μ‚­μ œ/api/cart/{cartItemId}DELETE-성곡 μ‹œ: μ‚­μ œ μ™„λ£Œ λ©”μ‹œμ§€ λ°˜ν™˜

μ£Όλ¬Έ API

κΈ°λŠ₯URLMethodRequest BodyResponse
μ£Όλ¬Έ 생성/api/ordersPOSTstoreId (κ°€κ²Œ ID), menuList (menuId, quantity)성곡 μ‹œ: μ£Όλ¬Έ 생성 κ²°κ³Ό λ°˜ν™˜
μ£Όλ¬Έ μƒνƒœ λ³€κ²½/api/orders/{orderId}/statusPATCHstatus (REQUEST, ACCEPTED, CANCEL λ“±)성곡 μ‹œ: μ£Όλ¬Έ μƒνƒœ λ³€κ²½ κ²°κ³Ό λ°˜ν™˜
νŠΉμ • μ£Όλ¬Έ 쑰회/api/orders/{orderId}GET-μ£Όλ¬Έ 상세 정보 λ°˜ν™˜
전체 μ£Όλ¬Έ λ‚΄μ—­ 쑰회/api/orders/historyGET-μ‚¬μš©μžμ˜ λͺ¨λ“  μ£Όλ¬Έ λ‚΄μ—­ λ°˜ν™˜

리뷰 API

κΈ°λŠ₯URLMethodRequest BodyResponse
리뷰 μž‘μ„±/api/reviewsPOSTorderId (μ£Όλ¬Έ ID), rating (1-5), comment (리뷰 λ‚΄μš©)성곡 μ‹œ: μž‘μ„±λœ 리뷰 정보 λ°˜ν™˜
리뷰 쑰회/api/reviews/{reviewId}GET-리뷰 상세 정보 λ°˜ν™˜
리뷰 μˆ˜μ •/api/reviews/{reviewId}PATCHrating (μˆ˜μ •ν•  평점), comment (μˆ˜μ •ν•  리뷰 λ‚΄μš©)성곡 μ‹œ: μˆ˜μ •λœ 리뷰 정보 λ°˜ν™˜
리뷰 μ‚­μ œ/api/reviews/{reviewId}DELETE-성곡 μ‹œ: μ‚­μ œ μ™„λ£Œ λ©”μ‹œμ§€ λ°˜ν™˜

ERD


νŽ˜μ΄μ§€λ³„ κΈ°λŠ₯

νšŒμ› κΈ°λŠ₯

νšŒμ›κ°€μž… 및 둜그인

  • νšŒμ›κ°€μž…: 이메일과 λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯λ°›μ•„ κ²€μ¦ν•œ ν›„, λΉ„λ°€λ²ˆν˜ΈλŠ” CustomPasswordEncoderλ₯Ό μ‚¬μš©ν•΄ μ•”ν˜Έν™”ν•˜μ—¬ μ €μž₯ν•©λ‹ˆλ‹€.
  • 일반 둜그인: 둜그인 μ‹œ, 검증을 ν†΅κ³Όν•˜λ©΄ JWT 토큰을 λ°œκΈ‰ν•˜μ—¬ μ‚¬μš©μž 인증을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • κ΄€λ¦¬μž 둜그인: μš”μ²­ 바디에 μΆ”κ°€λ‘œ admin ν‚€λ₯Ό μž…λ ₯λ°›μ•„ 검증을 거친 λ’€ 둜그인 κ°€λŠ₯ν•˜λ„λ‘ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

νšŒμ› 정보 쑰회 및 μˆ˜μ •

  • 정보 쑰회: μ‚¬μš©μžκ°€ μžμ‹ μ˜ 정보λ₯Ό μ‘°νšŒν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • 정보 μˆ˜μ •: μ‚¬μš©μžκ°€ μžμ‹ μ˜ 정보λ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νšŒμ› νƒˆν‡΄

  • νƒˆν‡΄ 처리: μ‚¬μš©μž 본인의 μš”μ²­μœΌλ‘œ 계정을 νƒˆν‡΄ μ²˜λ¦¬ν•  수 있으며, νƒˆν‡΄λœ 계정은 μž¬μ‚¬μš©μ΄ λΆˆκ°€ν•˜λ„λ‘ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

κ΄€λ¦¬μž κΈ°λŠ₯

  • 전체 νšŒμ› 쑰회: κ΄€λ¦¬μž κΆŒν•œμœΌλ‘œ 전체 νšŒμ›μ˜ 정보λ₯Ό μ‘°νšŒν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ μ‚¬μš©μž 관리가 κ°€λŠ₯ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

카카였 μ†Œμ…œ 둜그인

  • μ œν•œ 사항: 카카였 APIλ₯Ό ν†΅ν•œ μ†Œμ…œ 둜그인으둜 μ‚¬μš©μž 아이디, 이메일, λ‹‰λ„€μž„ 정보λ₯Ό λ°›μ•„ λ‘œκ·ΈμΈν•  수 μžˆμ§€λ§Œ, λΉ„λ°€λ²ˆν˜Έ 검증이 ν•„μš”ν•œ 일뢀 κΈ°λŠ₯μ—λŠ” 접근이 μ œν•œλ©λ‹ˆλ‹€.

κ°€κ²Œ 등둝 및 쑰회

  • 사μž₯λ‹˜ κΆŒν•œμ„ κ°€μ‘Œμ„ κ²½μš°μ—λ§Œ μ΅œλŒ€ 3개 κΉŒμ§€ κ°€κ²Œ 생성이 κ°€λŠ₯
  • κ°€κ²Œ 곡지 μž…λ ₯μ‹œ, κΈˆμ§€μ–΄λŠ” μž…λ ₯ λΆˆκ°€
  • νŠΉμ • κ°€κ²Œ μ‘°νšŒμ‹œ 메뉴도 ν•¨κ»˜ 쑰회 κ°€λŠ₯
  • μ΄λ¦„μœΌλ‘œ κ°€κ²Œ μ‘°νšŒμ‹œ, open μƒνƒœμΈ κ°€κ²Œλ§Œ μ΅œκ·Όλ“±λ‘μΌ κΈ°μ€€μœΌλ‘œ 쑰회됨

메뉴 관리

  • 메뉴 μΆ”κ°€, μˆ˜μ •, μ‚­μ œ (μ‚­μ œλœ λ©”λ‰΄λŠ” μ‘°νšŒμ—μ„œ μ œμ™Έ)

μž₯λ°”κ΅¬λ‹ˆ 및 μ£Όλ¬Έ 관리

  • μž₯λ°”κ΅¬λ‹ˆ 메뉴듀을 담을 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ‹€λ₯Έ 맀μž₯의 메뉴듀을 λ‹΄λŠ” 경우 이미 있던 μž₯λ°”κ΅¬λ‹ˆλ“€μ„ μ΄ˆκΈ°ν™” ν•˜κ³  λ‹΄μŠ΅λ‹ˆλ‹€.
    • λ˜ν•œ 같은 맀μž₯의 같은 메뉴λ₯Ό 또 λ‹΄λŠ” κ²½μš°μ—λŠ” μˆ˜λŸ‰μ„ μ—…λ°μ΄νŠΈν•˜κ³ , μ—†μœΌλ©΄ μƒˆλ‘œμš΄ μž₯λ°”κ΅¬λ‹ˆ ν•­λͺ©μ„ μƒμ„±ν•˜μ—¬ μ €μž₯ν•©λ‹ˆλ‹€.
  • μž₯λ°”κ΅¬λ‹ˆ 쑰회, μˆ˜λŸ‰ μ—…λ°μ΄νŠΈ, μ‚­μ œκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • ν•˜λ£¨ 이상 μ§€λ‚œ μž₯λ°”κ΅¬λ‹ˆ ν•­λͺ©λ“€μ„ μ‚­μ œν•©λ‹ˆλ‹€.
    이 μž‘μ—…μ€ μŠ€μΌ€μ€„λŸ¬λ₯Ό 톡해 맀일 μžμ •μ— μžλ™μœΌλ‘œ μ§„ν–‰λ©λ‹ˆλ‹€.
    ---
  • 주문을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. μž₯λ°”κ΅¬λ‹ˆμ— λ‹΄μ•˜λ˜ 기둝듀을 ν”„λ‘ νŠΈμ—μ„œ 리슀트둜 λ„˜κ²¨μ€€ ν›„ 각 μ£Όλ¬Έ ν•­λͺ©μ— λŒ€ν•œ Menu 쑴재 μ—¬λΆ€λ₯Ό ν™•μΈν•œ ν›„ μ£Όλ¬Έκ³Ό 메뉴 μ‚¬μ΄μ˜ 쀑간 ν…Œμ΄λΈ” λ˜ν•œ μƒμ„±ν•΄μ€λ‹ˆλ‹€.
    • μ΅œμ†Œ μ£Όλ¬Έ κΈˆμ•‘ 이상 μ£Όλ¬Έν•΄μ•Ό 주문이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
    • μ˜€ν”ˆ μ‹œκ°„ μ „, 마감 μ‹œκ°„ μ΄ν›„λŠ” 주문이 λΆˆκ°€ν•©λ‹ˆλ‹€.
  • μ‚¬μš©μžλŠ” νŠΉμ • μ£Όλ¬Έ, λͺ¨λ“  μ£Όλ¬Έ 내역을 μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ£Όλ¬Έ μƒνƒœλŠ” 총 4κ°€μ§€λ‘œ, REQUEST, CANCEL, ACCEPTED, REJECTED의 μƒνƒœκ°€ μžˆμŠ΅λ‹ˆλ‹€.
    μΆ”ν›„μ—λŠ” 배달 μ‹œμž‘, 배달 μ™„λ£ŒκΉŒμ§€ μ£Όλ¬Έ μƒνƒœλ₯Ό 늘렀보렀고 ν•©λ‹ˆλ‹€.
  • 주문을 μƒμ„±ν•œ 경우, 또 μƒνƒœκ°€ λ³€κ²½λœ 후에 λͺ¨λ‘ 둜그 관리λ₯Ό ν•©λ‹ˆλ‹€.

리뷰 μž‘μ„± 및 쑰회

  • 객체λ₯Ό μ°Έμ‘°ν•˜μ§€ μ•Šκ³ , ν•„λ“œλ₯Ό κ°€μ§€λŠ” κ²ƒμœΌλ‘œ κ΅¬ν˜„
  • 리뷰 μž‘μ„± μ‹œ μ£Όλ¬Έ ν•˜λ‚˜ λ‹Ή ν•œ 건 κ°€λŠ₯
  • λͺ¨λ“  쑰회 - νŽ˜μ΄μ§€λ„€μ΄μ…˜
  • κ°€κ²Œ 별 쑰회, νšŒμ› 별 쑰회
  • κ°€κ²Œ 별 쑰회 μ‹œ JPQL μ‚¬μš©
  • 각 λ©”μ„œλ“œμ— λŒ€ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± μ™„λ£Œ

κ°œμ„  λͺ©ν‘œ

νšŒμ› κΈ°λŠ₯

  • 검증 둜직의 일관성 μœ μ§€: μ„œλΉ„μŠ€ λ ˆμ΄μ–΄ λ˜λŠ” ν•„ν„° 쀑 ν•œ 곳에 검증 λ‘œμ§μ„ μΌκ΄€λ˜κ²Œ 톡합해 μ½”λ“œ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 μ˜ˆμ •μž…λ‹ˆλ‹€.
  • κ΄€λ¦¬μž κΈ°λŠ₯ ν™•μž₯: ADMIN μ—­ν• μ˜ κ΄€λ¦¬μž κΈ°λŠ₯ μΆ”κ°€λ₯Ό 톡해 λ‹€μ–‘ν•œ 관리 κΈ°λŠ₯을 μΆ”κ°€ν•  μ˜ˆμ •μž…λ‹ˆλ‹€.
  • 카카였 μ†Œμ…œ 둜그인 μ œν•œμ‚¬ν•­ κ°œμ„ : 카카였 API의 κΆŒν•œ ν•œκ³„λ‘œ 인해 일뢀 κΈ°λŠ₯이 μ œν•œλ˜μ–΄, λŒ€μ²΄ 인증 λ°©μ•ˆ λͺ¨μƒ‰ μ˜ˆμ •μž…λ‹ˆλ‹€

κ°€κ²Œ 및 메뉴 κΈ°λŠ₯

  • 연관관계 κ°œμ„ : κ°€κ²Œμ™€ 메뉴 κ°„μ˜ 1:N(μ–‘λ°©ν–₯) κ΄€κ³„μ—μ„œ μ°Έμ‘° μˆœν™˜ 문제 해결을 μœ„ν•΄ ν•„μš”ν•œ μ •λ³΄λ§Œ λ°˜ν™˜ν•˜λ„λ‘ κ°œμ„  μ˜ˆμ •μž…λ‹ˆλ‹€.
  • μΉ΄ν…Œκ³ λ¦¬λ³„ 쑰회 κΈ°λŠ₯ μΆ”κ°€: κ°€κ²Œλ₯Ό μΉ΄ν…Œκ³ λ¦¬λ³„λ‘œ μ‘°νšŒν•  수 μžˆλ„λ‘ κΈ°λŠ₯ ν™•μž₯ μ˜ˆμ •μž…λ‹ˆλ‹€.

메뉴 관리 κΈ°λŠ₯

  • μΉ΄ν…Œκ³ λ¦¬ 및 μ˜΅μ…˜ κΈ°λŠ₯ μΆ”κ°€: μΉ΄ν…Œκ³ λ¦¬μ™€ μ˜΅μ…˜ κΈ°λŠ₯을 κ΅¬ν˜„ν•œ ν”„λ‘œμ νŠΈμ˜ 포슀트맨 ν…ŒμŠ€νŠΈλ₯Ό μ™„λ£Œν•  μ˜ˆμ •μž…λ‹ˆλ‹€.

μ£Όλ¬Έ 관리 κΈ°λŠ₯

  • μ˜ˆμ™Έ 처리: μ‹€μ œ μ„œλΉ„μŠ€λ₯Ό λ‹€μ‹œ λ– μ˜¬λ € λ³΄λ©΄μ„œ μΆ”κ°€λ λ§Œν•œ μ˜ˆμ™Έμ²˜λ¦¬λ“€μ„ μ μš©ν•΄λ³΄κ³ ,
  • ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±

리뷰 관리 κΈ°λŠ₯

  • μ˜ˆμ™Έ 처리 μΆ”κ°€
  • μ£Όλ¬Έ μ™„λ£Œ ν›„ λ¦¬λ·°λŠ” 14일 이내 μž‘μ„±
  • 리뷰 μž‘μ„± ν›„ μˆ˜μ •μ€ 리뷰 μž‘μ„± 7일 이내 κ°€λŠ₯
  • μ—°κ΄€ 관계λ₯Ό 맺지 μ•Šμ•„ νšŒμ›μ΄ νƒˆν‡΄ 이후에도 데이터가 DB에 λ‚¨λŠ” 문제 ν•΄κ²°

ν”„λ‘œμ νŠΈ ν›„κΈ°(+ μ•½κ°„μ˜ νŠΈλŸ¬λΈ” μŠˆνŒ…)

  • πŸ§‘β€πŸ’»μ΄ν•œμ‹
    • 이번 ν”„λ‘œμ νŠΈμ—μ„œ νšŒμ›κ°€μž…, 둜그인, νšŒμ›νƒˆν‡΄ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ©°, Spring Security와 JWT λ°©μ‹μ˜ 이점에 λŒ€ν•΄ 깊이 μ΄ν•΄ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄ˆκΈ°μ—λŠ” νŒ¨μŠ€μ›Œλ“œ 인코더λ₯Ό 직접 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€λŠ” 발제 쑰건 λ•Œλ¬Έμ— JWT만으둜 인증을 κ΅¬ν˜„ν•˜λ € ν–ˆμ§€λ§Œ, Spring Security의 λ‚΄μž₯ κΈ°λŠ₯이 λ³΄μ•ˆμ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„± μΈ‘λ©΄μ—μ„œ μš°μˆ˜ν•˜λ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ–΄ μ΅œμ’…μ μœΌλ‘œ Spring Security와 JWT 방식을 λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€.
    • λ˜ν•œ, 인증 및 인가 ν•„ν„°λ₯Ό 직접 κ΅¬ν˜„ν•˜κ³ , USER와 OWNER 외에 ADMIN 역할을 μΆ”κ°€ν•΄ κ΄€λ¦¬μžλ§Œ μ ‘κ·Όν•  수 μžˆλŠ” κΈ°λŠ₯을 /api/admin μ—”λ“œν¬μΈνŠΈλ‘œ μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. 비둝 전체 νšŒμ› 정보 쑰회 κΈ°λŠ₯만 κ΅¬ν˜„μ΄ λμ§€λ§Œ, λ‹€μ–‘ν•œ 관리 κΈ°λŠ₯을 ν™•μž₯ν•  κ³„νšλ„ μ„Έμ› μŠ΅λ‹ˆλ‹€.
    • λ§ˆμ§€λ§‰μœΌλ‘œ, 카카였 μ†Œμ…œ 둜그인 κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆμœΌλ‚˜ API κΆŒν•œ ν•œκ³„λ‘œ 인해 아이디, 이메일, λ‹‰λ„€μž„ μ •λ³΄λ§Œ ν™œμš©ν•  수 μžˆμ–΄ νŒ¨μŠ€μ›Œλ“œ 검증이 ν•„μš”ν•œ 일뢀 κΈ°λŠ₯에 μ ‘κ·Όν•˜μ§€ λͺ»ν•œ 점은 μ•„μ‰¬μ› μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ œν•œ 사항을 μ–΄λ–»κ²Œ κ°œμ„ ν• μ§€μ— λŒ€ν•΄ κ³ λ―Όν•˜κ²Œ λ˜λŠ” 계기가 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • νŠΈλŸ¬λΈ” μŠˆνŒ… 문제 1: νšŒμ› μƒνƒœ 확인 μ‹œ 403 μ—λŸ¬ 및 NullPointerException λ°œμƒ
      • 원인:Β permitAll()Β μ„€μ • κ²½λ‘œμ—μ„œλŠ”Β UserDetails 객체가 μƒμ„±λ˜μ§€ μ•Šμ•„Β null이 λ°˜ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

      • ν•΄κ²°:Β UserDetails 없이 이메일 쀑볡 μ—¬λΆ€λ‘œ νƒˆν‡΄ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λ„λ‘ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

        문제 2: ν•„ν„° μ²΄μΈμ—μ„œ μš”μ²­μ΄ μ°¨λ‹¨λ˜μ–΄ νšŒμ›κ°€μž… APIκ°€ λ„λ‹¬ν•˜μ§€ μ•ŠμŒ

      • 원인:Β JwtAuthorizationFilter의 doFilter() 호좜이 쑰건문 내뢀에 μžˆμ–΄ μš”μ²­μ΄ ν•„ν„°μ—μ„œ 차단됨.

      • ν•΄κ²°:Β doFilter()Β ν˜ΈμΆœμ„ 쑰건문 λ°–μœΌλ‘œ 이동해 μš”μ²­μ΄ μ»¨νŠΈλ‘€λŸ¬κΉŒμ§€ μ „λ‹¬λ˜λ„λ‘ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

  • πŸ§‘β€πŸ’» 김신희
    • μ²˜μŒμ—λŠ” μ™œ μž₯λ°”κ΅¬λ‹ˆκ°€ μ£Όλ¬Έκ³Ό λ©”λ‰΄μ˜ μ€‘κ°„ν…Œμ΄λΈ”μ΄ λ˜λŠ” 것보닀 μž₯λ°”κ΅¬λ‹ˆλŠ” view둜 보여지고 λ”°λ‘œ 쀑간 ν…Œμ΄λΈ”μ„ λ§Œλ“œλŠ” 것이 쒋은 지 μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ νŠœν„°λ‹˜λ“€μ˜ μ„€λͺ…κ³Ό 고민을 μ˜€λž˜ν•΄λ³Έ κ²°κ³Ό ν›„μžλ₯Ό μ„ νƒν•˜λŠ” 것이 더 λ‚«λ‹€κ³  νŒλ‹¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μž₯λ°”κ΅¬λ‹ˆμ˜ κ²½μš°λŠ” μ‚¬μš©μžκ°€ μ£Όλ¬Έν•  메뉴듀을 κ³ λ―Όν•˜λŠ” 쀑간 μƒνƒœλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. λ”°λΌμ„œ μ‹€μ œ μ£Όλ¬Έν•˜μ§€ μ•Šκ³ λ„ ν•­λͺ©μ„ 자유둭게 μΆ”κ°€ν•˜κ³  μ œκ±°ν•  수 μžˆλŠ” μƒνƒœλ‘œμ¨ β€œμž‘μ—… μ˜μ—­β€μ— κ°€κΉμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ£Όλ¬Έκ³Ό μž₯λ°”κ΅¬λ‹ˆ ν…Œμ΄λΈ”μ„ λ”°λ‘œ λ§Œλ“€μ–΄μ„œ ν™•μ •λœ ν•­λͺ©λ“€μ΄ λ„˜μ–΄μ˜€λŠ” 것이 더 λ°μ΄ν„°μ˜ 일관성을 지킬 수 μžˆλ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€.
      λ˜ν•œ μž₯λ°”κ΅¬λ‹ˆμ™€ 주문을 λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ μ‹€μ œ μ£Όλ¬Έ 기둝에 영ν–₯을 주지 μ•Šκ³  μ‚¬μš©μžκ°€ 관심 μžˆλŠ” ν˜„μž¬ ν•­λͺ©μ„ 보여쀄 수 μžˆλ‹€λŠ” 것이 μ’‹λ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. ERDλ₯Ό μ§œλ‹€λ³΄λ©΄ 항상 μ΄μœ κ°€ μžˆλŠ” λ‹€λ₯Έ 방법듀이 μžˆμ–΄μ„œ μƒˆλ‘­κ³  μž¬λ°Œλ‹€κ³  λŠκΌˆμŠ΅λ‹ˆλ‹€.
    • 처음 Rebase μ „λž΅ 및 issue에 λ§žλŠ” 브랜치 μ „λž΅μ„ μ‚¬μš©ν•΄λ΄€λŠ”λ°, 생각보닀 어렡지 μ•Šκ²Œ κ²½ν—˜ν•  수 μžˆμ–΄μ„œ μ’‹μ•˜μŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œλ„ issue 생성 후에 ν•΄λ‹Ή μ΄μŠˆμ— λ§žλŠ” 브랜치λ₯Ό λ§Œλ“€μ–΄ κ°œλ°œν•˜λ €κ³  ν•©λ‹ˆλ‹€.
  • πŸ§‘β€πŸ’» λ°•μ§€μ˜ˆ
    • κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” κ³Όμ •μ—μ„œ λ§Žμ€ μ‹€μˆ˜λ₯Ό κ²ͺμ—ˆλŠ”λ°, κ·Έ μ‹€μˆ˜λ₯Ό ν•΄κ²°ν•˜μ§€ λͺ»ν•˜κ³  λλ‚΄λŠ” 것이 맀우 μ†μƒν•˜κ³  μ•„μ‰½μŠ΅λ‹ˆλ‹€. ν–₯ν›„μ—λŠ” μ‹œκ°„κ΄€λ¦¬λ₯Ό μ²΄κ³„μ μœΌλ‘œ λΆ„λ°°ν•˜κ³  관리해야할 ν•„μš”μ„±μ΄ μžˆλ‹€κ³  λŠκΌˆμŠ΅λ‹ˆλ‹€. μ‹€λ ₯이 λͺ¨μžλΌ νŒ€μ› λΆ„λ“€κ»˜ ν”Όν•΄λ§Œ λΌμΉœκ²ƒκ°™μ•„ μ£„μ†‘μŠ€λŸ½κΈ°λ„ ν•œ λ§ˆμŒμž…λ‹ˆλ‹€. κ·Έλž˜λ„ 쒋은 νŒ€μ›λΆ„λ“€ 덕뢄에 λ¬΄μ‚¬νžˆ ν”„λ‘œμ νŠΈλ₯Ό μ™„μˆ˜ν•  수 μžˆμ—ˆλ˜κ²ƒ κ°™μŠ΅λ‹ˆλ‹€. 고생듀 λ§ŽμœΌμ…¨κ³  κ°μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€
  • πŸ§‘β€πŸ’» μ§€μ°½ν˜„
    • λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„μ„ ν•  수 있고, λ°©μ‹λ§ˆλ‹€ μž₯단점이 μžˆλ‹€λŠ” κ±Έ ν™•μ‹€νžˆ λŠκΌˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μžλ©΄ κ°€κ²Œ 별 리뷰λ₯Ό μ‘°νšŒν•  λ•Œ, κ°€κ²Œμ™€ 리뷰의 μ—°κ΄€ 관계가 μ—†λŠ” 문제λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•  것인가? λΌλŠ” λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
    1. κ°€κ²Œμ™€ 리뷰의 IDλ₯Ό κ°–λŠ” ν…Œμ΄λΈ”μ„ λ§Œλ“ λ‹€.

    2. κ°€κ²Œμ™€ 리뷰가 연관관계λ₯Ό κ°–κ²Œ ν•œλ‹€.

    3. κ°€κ²Œ - μ£Όλ¬Έ - 리뷰 λΌλŠ” 연결고리λ₯Ό μ΄μš©ν•˜μ—¬ 둜직으둜 ν’€μ–΄λ‚Έλ‹€.

    4. μ—°κ΄€ 관계λ₯Ό 맺지 μ•Šκ³  ν•„μš”λ‘œ ν•˜λŠ” μ—”ν‹°ν‹°μ˜ idλ₯Ό ν•„λ“œλ‘œ κ°–κ²Œ ν•œλ‹€.

      β†’ μ €λŠ” 4λ²ˆμ„ μ„ νƒν–ˆμŠ΅λ‹ˆλ‹€.

    • μ½”λ“œ 리뷰λ₯Ό 많이 ν•˜μ§€ λͺ»ν•΄ μ•„μ‰½μŠ΅λ‹ˆλ‹€.
    • μ œκ°€ λΆ€μ‘±ν•΄μ„œ νŒ€μ›λ“€μ—κ²Œ λ―Έμ•ˆν•©λ‹ˆλ‹€β€¦.
  • πŸ§‘β€πŸ’» μ΅œμ„œμ˜
    • νŒ€μ›λ“€κ³Ό 큰 λ¬Έμ œμ™€ κ°ˆλ“± 없이 ν”„λ‘œμ νŠΈλ₯Ό 마무리 ν•  수 μžˆμ–΄μ„œ 닀행인것 κ°™μŠ΅λ‹ˆλ‹€. 이번 ν”„λ‘œμ νŠΈμ—μ„œ κ°€μž₯ 기본적인 crudλ₯Ό λ‹΄λ‹Ήν•˜μ˜€λŠ”λ°, νŒ€μ›λ“€μ˜ μžμ„Έν•œ μ½”λ“œλ¦¬λ·°μ™€ 쑰언듀을 톡해 λΆ€μ‘±ν–ˆλ˜ 뢀뢄듀을 보완할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ œκ°€ λ‹΄λ‹Ήν•˜μ§€ μ•Šμ•˜λ˜ νšŒμ›κ°€μž…/둜그인 λΆ€λΆ„κ³Ό 연관관계 뢀뢄듀을 μ°Έκ³ ν•˜λ©΄μ„œ 곡뢀가 많이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 브랜치 μ „λž΅κ³Ό rebase μ‚¬μš© μ „λž΅μ€ 아직도 ν—·κ°ˆλ¦¬λŠ” 뢀뢄듀이 λ§Žμ•„μ„œ 이 뢀뢄도 곡뢀가 ν•„μš”ν•˜κ² λ‹€λŠ” 생각을 ν–ˆμŠ΅λ‹ˆλ‹€. λ°°μš΄κ²ƒλ„ 많고 뢀쑱함도 많이 느끼게 λ˜λŠ” ν”„λ‘œμ νŠΈ μ˜€μŠ΅λ‹ˆλ‹€.

https://github.com/KimLeeParkJiChoi/spang-eats.git

profile
μ„œλ‘λ₯΄μ§€ μ•ŠμœΌλ‚˜ 쉬지 μ•Šκ³ 

0개의 λŒ“κΈ€