νλ‘μ νΈ μκ°
- μ§ν κΈ°κ°:
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 μ λͺ© - λ΄κ° μλ£ν κΈ°λ₯/ λΆλΆ - μμΌλ‘ λ΄κ° κ°λ°ν κ±°
νλ‘μ νΈ κ΅¬μ‘°
βββ 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
κΈ°λ₯ | URL | Method | Request Body | Response |
---|
νμκ°μ
| /api/auth/signup | POST | email (μ΄λ©μΌ νμ), password (λΉλ°λ²νΈ), nickname (λλ€μ), memberRole (USER/OWNER/ADMIN), phoneNumber (μ νλ²νΈ), adminSecretKey (κ΄λ¦¬μ νμκ°μ
μ νμ) | μ±κ³΅ μ: "νμ κ°μ
μ΄ μλ£λμμ΅λλ€!" μ€ν¨ μ: μλ¬ λ©μμ§ |
λ‘κ·ΈμΈ | /api/auth/login | POST | email (μ΄λ©μΌ νμ), password (λΉλ°λ²νΈ) | μ±κ³΅ μ: JWT ν ν° λ°ν μ€ν¨ μ: μλ¬ λ©μμ§ |
νμ μ 보 μ‘°ν | /api/auth/me | GET | Headers: Authorization: Bearer {JWT} | μ¬μ©μ μ 보 λ°ν |
μ 체 νμ μ‘°ν (κ΄λ¦¬μ) | /api/admin/members | GET | Headers: Authorization: Bearer {JWT} | μ 체 νμ λͺ©λ‘ λ°ν |
νμ νν΄ | /api/auth/delete | DELETE | Headers: Authorization: Bearer {JWT} , password (νμ νν΄ μ λΉλ°λ²νΈ νμΈ) | μ±κ³΅ μ: "νμ νν΄ μλ£" λ©μμ§ λ°ν |
κ°κ² κ΄λ¦¬ API
κΈ°λ₯ | URL | Method | Request Body | Response |
---|
κ°κ² λ±λ‘ | /api/stores | POST | storeName (κ°κ² μ΄λ¦), category (μΉ΄ν
κ³ λ¦¬), notice (κ°κ² 곡μ§) | μ±κ³΅ μ: λ±λ‘λ κ°κ² μ 보 λ°ν |
κ°κ² μ 보 μ‘°ν | /api/stores/{storeId} | GET | - | κ°κ² μ 보μ λ©λ΄ λͺ©λ‘ λ°ν |
κ°κ² λͺ©λ‘ μ‘°ν | /api/stores | GET | name (μ΄λ¦μΌλ‘ κ²μ), category (μΉ΄ν
κ³ λ¦¬λ³ μ‘°ν) | κ²μ 쑰건μ λ§λ κ°κ² λͺ©λ‘ λ°ν |
κ°κ² κ³΅μ§ μμ | /api/stores/{storeId}/notice | PATCH | notice (λ³κ²½ν κ³΅μ§ λ΄μ©) | μ±κ³΅ μ: μμ λ κ°κ² κ³΅μ§ λ°ν |
κ°κ² μμ | /api/stores/{storeId} | DELETE | - | μ±κ³΅ μ: μμ μλ£ λ©μμ§ λ°ν |
λ©λ΄ κ΄λ¦¬ API
κΈ°λ₯ | URL | Method | Request Body | Response |
---|
λ©λ΄ μΆκ° | /api/stores/{storeId}/menus | POST | menuName (λ©λ΄ μ΄λ¦), price (κ°κ²©), description (μ€λͺ
) | μ±κ³΅ μ: μΆκ°λ λ©λ΄ μ 보 λ°ν |
λ©λ΄ μ‘°ν | /api/menus/{menuId} | GET | - | λ©λ΄ μμΈ μ 보 λ°ν |
λ©λ΄ μμ | /api/menus/{menuId} | PATCH | menuName (λ©λ΄ μ΄λ¦), price (κ°κ²©), description (μ€λͺ
) | μ±κ³΅ μ: μμ λ λ©λ΄ μ 보 λ°ν |
λ©λ΄ μμ | /api/menus/{menuId} | DELETE | - | μ±κ³΅ μ: μμ μλ£ λ©μμ§ λ°ν |
μ₯λ°κ΅¬λ API
κΈ°λ₯ | URL | Method | Request Body | Response |
---|
μ₯λ°κ΅¬λ μΆκ° | /api/cart | POST | menuId (λ©λ΄ ID), quantity (μλ) | μ±κ³΅ μ: μ₯λ°κ΅¬λ νλͺ© μΆκ° κ²°κ³Ό λ°ν |
μ₯λ°κ΅¬λ μ‘°ν | /api/cart | GET | - | μ¬μ©μμ μ₯λ°κ΅¬λ λͺ©λ‘ λ°ν |
μ₯λ°κ΅¬λ μλ μμ | /api/cart/{cartItemId} | PATCH | quantity (μμ ν μλ) | μ±κ³΅ μ: μμ λ μ₯λ°κ΅¬λ νλͺ© λ°ν |
μ₯λ°κ΅¬λ νλͺ© μμ | /api/cart/{cartItemId} | DELETE | - | μ±κ³΅ μ: μμ μλ£ λ©μμ§ λ°ν |
μ£Όλ¬Έ API
κΈ°λ₯ | URL | Method | Request Body | Response |
---|
μ£Όλ¬Έ μμ± | /api/orders | POST | storeId (κ°κ² ID), menuList (menuId, quantity) | μ±κ³΅ μ: μ£Όλ¬Έ μμ± κ²°κ³Ό λ°ν |
μ£Όλ¬Έ μν λ³κ²½ | /api/orders/{orderId}/status | PATCH | status (REQUEST, ACCEPTED, CANCEL λ±) | μ±κ³΅ μ: μ£Όλ¬Έ μν λ³κ²½ κ²°κ³Ό λ°ν |
νΉμ μ£Όλ¬Έ μ‘°ν | /api/orders/{orderId} | GET | - | μ£Όλ¬Έ μμΈ μ 보 λ°ν |
μ 체 μ£Όλ¬Έ λ΄μ μ‘°ν | /api/orders/history | GET | - | μ¬μ©μμ λͺ¨λ μ£Όλ¬Έ λ΄μ λ°ν |
리뷰 API
κΈ°λ₯ | URL | Method | Request Body | Response |
---|
리뷰 μμ± | /api/reviews | POST | orderId (μ£Όλ¬Έ ID), rating (1-5), comment (리뷰 λ΄μ©) | μ±κ³΅ μ: μμ±λ 리뷰 μ 보 λ°ν |
리뷰 μ‘°ν | /api/reviews/{reviewId} | GET | - | 리뷰 μμΈ μ 보 λ°ν |
리뷰 μμ | /api/reviews/{reviewId} | PATCH | rating (μμ ν νμ ), 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 μμ± νμ ν΄λΉ μ΄μμ λ§λ λΈλμΉλ₯Ό λ§λ€μ΄ κ°λ°νλ €κ³ ν©λλ€.
- π§βπ» λ°μ§μ
- κΈ°λ₯μ ꡬννλ κ³Όμ μμ λ§μ μ€μλ₯Ό κ²ͺμλλ°, κ·Έ μ€μλ₯Ό ν΄κ²°νμ§ λͺ»νκ³ λλ΄λ κ²μ΄ λ§€μ° μμνκ³ μμ½μ΅λλ€. ν₯νμλ μκ°κ΄λ¦¬λ₯Ό 체κ³μ μΌλ‘ λΆλ°°νκ³ κ΄λ¦¬ν΄μΌν νμμ±μ΄ μλ€κ³ λκΌμ΅λλ€. μ€λ ₯μ΄ λͺ¨μλΌ νμ λΆλ€κ» νΌν΄λ§ λΌμΉκ²κ°μ μ£μ‘μ€λ½κΈ°λ ν λ§μμ
λλ€. κ·Έλλ μ’μ νμλΆλ€ λλΆμ 무μ¬ν νλ‘μ νΈλ₯Ό μμν μ μμλκ² κ°μ΅λλ€. κ³ μλ€ λ§μΌμ
¨κ³ κ°μ¬νμ΅λλ€
- π§βπ» μ§μ°½ν
- λ€μν λ°©μμΌλ‘ ꡬνμ ν μ μκ³ , λ°©μλ§λ€ μ₯λ¨μ μ΄ μλ€λ κ±Έ νμ€ν λκΌμ΅λλ€. μλ₯Ό λ€μλ©΄ κ°κ² λ³ λ¦¬λ·°λ₯Ό μ‘°νν λ, κ°κ²μ 리뷰μ μ°κ΄ κ΄κ³κ° μλ λ¬Έμ λ₯Ό μ΄λ»κ² ν΄κ²°ν κ²μΈκ°? λΌλ λ¬Έμ κ° μμ΅λλ€.
-
κ°κ²μ 리뷰μ IDλ₯Ό κ°λ ν
μ΄λΈμ λ§λ λ€.
-
κ°κ²μ λ¦¬λ·°κ° μ°κ΄κ΄κ³λ₯Ό κ°κ² νλ€.
-
κ°κ² - μ£Όλ¬Έ - 리뷰
λΌλ μ°κ²°κ³ 리λ₯Ό μ΄μ©νμ¬ λ‘μ§μΌλ‘ νμ΄λΈλ€.
-
μ°κ΄ κ΄κ³λ₯Ό λ§Ίμ§ μκ³ νμλ‘ νλ μν°ν°μ idλ₯Ό νλλ‘ κ°κ² νλ€.
β μ λ 4λ²μ μ ννμ΅λλ€.
- μ½λ 리뷰λ₯Ό λ§μ΄ νμ§ λͺ»ν΄ μμ½μ΅λλ€.
- μ κ° λΆμ‘±ν΄μ νμλ€μκ² λ―Έμν©λλ€β¦.
- π§βπ» μ΅μμ
- νμλ€κ³Ό ν° λ¬Έμ μ κ°λ± μμ΄ νλ‘μ νΈλ₯Ό λ§λ¬΄λ¦¬ ν μ μμ΄μ λ€νμΈκ² κ°μ΅λλ€. μ΄λ² νλ‘μ νΈμμ κ°μ₯ κΈ°λ³Έμ μΈ crudλ₯Ό λ΄λΉνμλλ°, νμλ€μ μμΈν μ½λ리뷰μ μ‘°μΈλ€μ ν΅ν΄ λΆμ‘±νλ λΆλΆλ€μ 보μν μ μμμ΅λλ€. λν μ κ° λ΄λΉνμ§ μμλ νμκ°μ
/λ‘κ·ΈμΈ λΆλΆκ³Ό μ°κ΄κ΄κ³ λΆλΆλ€μ μ°Έκ³ νλ©΄μ 곡λΆκ° λ§μ΄ λμμ΅λλ€. λΈλμΉ μ λ΅κ³Ό rebase μ¬μ© μ λ΅μ μμ§λ ν·κ°λ¦¬λ λΆλΆλ€μ΄ λ§μμ μ΄ λΆλΆλ 곡λΆκ° νμνκ² λ€λ μκ°μ νμ΅λλ€. λ°°μ΄κ²λ λ§κ³ λΆμ‘±ν¨λ λ§μ΄ λλΌκ² λλ νλ‘μ νΈ μμ΅λλ€.
https://github.com/KimLeeParkJiChoi/spang-eats.git