μ λ¬Ό κ³ λ₯΄κΈ°λ λ§μ μ¬λλ€μκ² μ΄λ €μ΄ κ³Όμ μ λλ€. 125λͺ μ μ€λ¬Έ κ²°κ³Ό, μ¬λλ€μ΄ μλλ°©μ μ νΈλλ₯Ό μ§μ λ¬Όμ΄λ³΄μ§ λͺ»νλ κ°μ₯ ν° μ΄μ λ 'μ λ¬Όμ κ°μ±μ΄ μ¬λΌμ§κ³ μ±μκ° μμ΄ λ³΄μΌκΉλ΄' μμ΅λλ€.
Picktoryλ λ€μκ³Ό κ°μ μ루μ μ μ 곡ν©λλ€:
- μ λ¬Ό ν보 곡μ : μ¬λ¬ μ λ¬Ό μ΅μ μ ν λ²μ 곡μ νμ¬ μλλ°©μ μ견μ μμ°μ€λ½κ² μμ§
- μ€λΉ κ³Όμ 곡μ : μ λ¬Ό μ ν κ³Όμ μ κ³ λ―Όκ³Ό λ Έλ ₯μ ν¨κ» μ λ¬νμ¬ μ μ±μ νν
- μ λ¬Όμ μλ―Έ μ μ§: κΉμ§ μ λ¬Όμ μ€λ μ μ μ§νλ©΄μλ ν¨κ³Όμ μΈ μ λ¬Ό μ ν κ°λ₯
- μ μ°ν λ΅λ³ μμ€ν : λ°λ μ¬λμ΄ μμ λ‘κ² μ λ¬Όμ λ°μνκ³ μ견μ λ¨κΈΈ μ μμ
- 보λ°λ¦¬ κ°λ : μ¬λ¬ μ λ¬Ό μ΅μ μ νλμ 보λ°λ¦¬μ λ΄μ μ λ¬νλ νΉλ³ν κ²½ν
- μΊλ¦ν° λ°°λ¬λΆ: κ·μ¬μ΄ μΊλ¦ν°κ° 보λ°λ¦¬λ₯Ό λ°°λ¬νλ μ¬λ―Έ μμ μΆκ°
- κ°νΈν λ§ν¬ 곡μ : κ³ μ λ§ν¬λ‘ μ½κ² 보λ°λ¦¬ 곡μ κ°λ₯
- μν κ΄λ¦¬ μμ€ν : DRAFT β PUBLISHED β COMPLETED μν νλ¦μΌλ‘ ν¨μ¨μ μΈ κ³Όμ κ΄λ¦¬
- μΉ΄μΉ΄μ€ μμ λ‘κ·ΈμΈ: κ°νΈν λ‘κ·ΈμΈ λ° νμκ°μ ν΅ν© νλ‘μΈμ€
- JWT κΈ°λ° μΈμ¦: μμ ν ν ν° κ΄λ¦¬ λ° μ¬λ°κΈ μμ€ν
- μ μ κ΄λ¦¬: νμ μ 보 μ‘°ν, λ‘κ·Έμμ, νν΄ κΈ°λ₯
- μμ± λ° νΈμ§: λ€μν λμμΈμ 보λ°λ¦¬ μμ± λ° νΈμ§ κΈ°λ₯
- μ λ¬Ό κ΄λ¦¬: μ λ¬Ό μΆκ°, μμ , μμ λ° μ΄λ―Έμ§ μ λ‘λ
- λ°°λ¬ μ€μ : λ€μν μΊλ¦ν°λ‘ 보λ°λ¦¬ λ°°λ¬ μ€μ κΈ°λ₯
- κ³ μ λ§ν¬: UUID κΈ°λ° κ³΅μ λ§ν¬ μμ±
- 보λ°λ¦¬ μ΄λ: λ§ν¬λ₯Ό ν΅ν 보λ°λ¦¬ μ κ·Ό λ° μ΄λ
- μ λ¬Ό μλ΅: λ€μν νκ·Έλ₯Ό ν΅ν μ λ¬Ό μλ΅ κΈ°λ₯
- κ²°κ³Ό μ‘°ν: 보λ°λ¦¬ μ£ΌμΈμ μλ΅ κ²°κ³Ό μ‘°ν κΈ°λ₯
- μ½μ νμ: μλ΅ νμΈ μν νμ κΈ°λ₯
- AWS S3 ν΅ν©: μ΄λ―Έμ§ μ μ₯ λ° κ΄λ¦¬ μμ€ν
- μΈλ€μΌ μ²λ¦¬: μλ μΈλ€μΌ μμ± λ° κ΄λ¦¬
- λΈλμΉ μ λ΅:
main: μ ν λ°°ν¬λ₯Ό μν κΈ°μ€ λΈλμΉdevelop: κ°λ° ν΅ν© λΈλμΉfeature/<κΈ°λ₯λͺ >: κΈ°λ₯ κ°λ° λΈλμΉ
- Pull Request κ·μΉ:
- μ§μ
PushκΈμ§: λͺ¨λ μ½λ λ³κ²½μ PRμ ν΅ν΄ μ§ν - PR 곡μ : ν λ΄ κ³΅μ νμ
- μ§μ
- μ»€λ° λ©μμ§ κ΅¬μ‘°:
[<νμ >]: <μμ λ΄μ©> - μ»€λ° νμ
:
feat: μλ‘μ΄ κΈ°λ₯ ꡬνfix: λ²κ·Έ ν΄κ²°refactor: μ½λ 리ν©ν°λ§docs: λ¬Έμ μμ style: μ½λ μ€νμΌ λ³κ²½test: ν μ€νΈ μ½λ κ΄λ ¨
- JDK 17+
- MySQL 8.0+
- Gradle
- λ ν¬μ§ν 리 ν΄λ‘
git clone https://github.com/dnd-side-project/dnd-12th-5-backend.git
cd dnd-12th-5-backend- μ ν리μΌμ΄μ λΉλ
./gradlew build- μ ν리μΌμ΄μ μ€ν
./gradlew bootRun- API λ¬Έμ μ κ·Ό
http://localhost:8080/swagger-ui.html
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'ꡬν λ΄μ©
- β¨ API λ¬Έμνλ₯Ό μν SwaggerConfig ν΄λμ€ μμ±
- π οΈ Context pathλ₯Ό
/api/v1λ‘ μ€μ - π Swagger UI path:
/swagger-ui.html - π API docs path:
/v3/api-docs
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"ꡬν λ΄μ©
- βοΈ JPAQueryFactory Bean λ±λ‘
- π Qν΄λμ€ μλ μμ± μ€μ
- π Entity λ³κ²½ μ clean & rebuild νμ
ꡬν λ΄μ©
- π JWT μΈμ¦ νν° κ΅¬ν
- π‘οΈ API μλν¬μΈνΈλ³ μ κ·Ό κΆν μ€μ
- π CORS μ€μ
- νλ‘ νΈμλ λλ©μΈ μ€μ μ΄ν 보μ κ°ν μμ
- HTTP λ©μλ: GET, POST, PUT, DELETE, OPTIONS
ꡬν λ΄μ©
- β ν ν° μ ν¨μ± κ²μ¦ λ‘μ§
- π λ§λ£ ν ν° μ¬λ°κΈ κΈ°λ₯
- π ν ν° μλͺ λ° μνΈν μ²λ¦¬
- π οΈ μ¬μ©μ ID κΈ°λ° ν΄λ μ μ€κ³
ꡬν λ΄μ©
- π SecurityConfig ν΄λμ€ μ λ©΄ 리ν©ν λ§
- π‘οΈ JWT μΈμ¦ μν€ν μ² μ¬μ€κ³ λ° μ΅μ ν
- π μΈμ¦ νν° μ²΄μΈ κ°μ λ° κ³ λν
- π κΆν κ²μ¦ λ‘μ§ κ°ν
- π οΈ μλν¬μΈνΈλ³ μΈλΆνλ μ κ·Ό μ μ΄ κ΅¬ν
- π μΈμ¦ μμΈ μ²λ¦¬ νλ¦ κ°μ
OAuth μΈμ¦ νλ‘μ°
- π« μΈμ¦ μ½λλ‘ μΉ΄μΉ΄μ€ μ‘μΈμ€ ν ν° λ°κΈ
- π€ μΉ΄μΉ΄μ€ μ¬μ©μ μ 보 μ‘°ν
- π JWT ν ν° λ°κΈ
νμ κ΄λ¦¬ κΈ°λ₯
- π νμκ°μ /λ‘κ·ΈμΈ ν΅ν© νλ‘μΈμ€
- π€ λ΄ μ 보 μ‘°ν
- πͺ λ‘κ·Έμμ
- β νμ νν΄ (μΉ΄μΉ΄μ€ μ°λ ν΄μ ν¬ν¨)
ꡬν λ΄μ©
- π§Ή DatabaseCleaner ꡬν
- β JUnit 5 BeforeEachCallback νμ©
- π SecurityContextHolderλ₯Ό νμ©ν μΈμ¦ ν μ€νΈ
ꡬν λ΄μ©
- π μΈμ¦ κ΄λ ¨ μμΈλ₯Ό BaseExceptionμΌλ‘ ν΅μΌ
- π οΈ μλ¬ μλ΅μ BaseResponseStatus μ΄κ±°νμΌλ‘ νμ€ν
- π ν ν° λ§λ£ μμΈ μ²λ¦¬ λ‘μ§ κ°μ
- π μλ¬ λ©μμ§ νκΈν λ° μΌκ΄μ± μ μ§
ꡬν λ΄μ©
- β¨ TokenDtoμ refreshTokenExpiresIn νλ μΆκ°
- π οΈ λ¦¬νλ μ ν ν°μ userId μ 보 ν¬ν¨
- π RefreshTokenServiceμμ ν ν° μ λ°μ΄νΈ λ‘μ§ μμ
- π API λͺ μΈμμ μ€μ ꡬν μΌμΉν
ꡬν λ΄μ©
- π User μν°ν°μ reactivate() λ©μλ μΆκ°
- π οΈ AuthServiceμμ νν΄ μ¬μ©μ μ¬νμ±ν λ‘μ§ κ΅¬ν
- π νμ νν΄ λ° μ¬κ°μ μ μ± κ°μ
- π₯ μλΉμ€ μ κ·Όμ± ν₯μ
ꡬν λ΄μ©
- π¨ λ°°λ¬λΆ μΊλ¦ν° μ€μ API
- π κ³ μ λ§ν¬ μμ± ν΅ν©
- π¦ Bundle μν κ΄λ¦¬ κ°μ :
DRAFT(μ΄κΈ°)PUBLISHED(λ°°λ¬λΆ μ€μ & λ§ν¬ μμ±)
ꡬν λ΄μ©
- π QueryDSL κΈ°λ° λ°μ΄ν° μ‘°ν
- π μ λ¬Ό, μ΄λ―Έμ§, μλ΅ μ 보 ν΅ν© μ‘°ν
- β¨ Response μν°ν° ꡬν
- π οΈ QueryDSL κΈ°λ° μ»€μ€ν ꡬν체
ꡬν λ΄μ©
- π·οΈ GiftResponseTag κ΄λ¦¬ 체κ³
- π λ€μ€ μ λ¬Ό λ΅λ³ μ²λ¦¬
- β
μν κ²μ¦:
- λ²λ€ μν
- μ λ¬Ό λͺ©λ‘
- κΈ°μ‘΄ μλ΅ μ¬λΆ
- μλ΅ μλ£ μ¬λΆ
ꡬν λ΄μ©
- π κ°λ³ μ λ¬Ό μμΈ μ 보 μ‘°ν
- πΌοΈ μΈλ€μΌ λ° μ΄λ―Έμ§ λͺ©λ‘ λΆλ¦¬
- π κΆν κ²μ¦ λ° μμΈ μ²λ¦¬
ꡬν λ΄μ©
- π DRAFT μν 보λ°λ¦¬ μ‘°ν
- β‘ N+1 λ¬Έμ ν΄κ²°μ μν λ²ν¬ μ‘°ν
- πΌοΈ μ΄λ―Έμ§ μ²λ¦¬:
- μΈλ€μΌ λΆλ¦¬
- μ΄λ―Έμ§ λͺ©λ‘ λ§€ν
ꡬν λ΄μ©
- π λ§ν¬ κΈ°λ° μ λ¬Ό μλ΅ κ²°κ³Ό μ‘°ν API μΆκ°
- π λ‘κ·ΈμΈ μμ΄ λ³΄λ°λ¦¬ λ§ν¬λ‘ κ²°κ³Ό μ‘°ν κ°λ₯
- π COMPLETED μνμΈ λ³΄λ°λ¦¬λ§ μ‘°ν κ°λ₯νλλ‘ μ ν
- π¦ μ λ¬Ό μ΄λ¦, μΈλ€μΌ, ꡬ맀 λ§ν¬, μλ΅ νκ·Έ λ°ν ꡬν
ꡬν λ΄μ©
- π PATCH API ꡬνμΌλ‘ ν¨μ¨μ± κ°μ
- π BundleNameUpdateRequest DTO μμ±
- π οΈ λ³΄λ°λ¦¬ μ΄λ¦λ§ μμ νκΈ° μν λ³λ API λΆλ¦¬
- π DRAFT μνμμλ§ μ΄λ¦ μμ κ°λ₯νλλ‘ μ ν
ꡬν λ΄μ©
- π TokenDto ꡬ쑰 μ λ©΄ κ°νΈ λ° νμ€ν
- π ν ν° ν΄λ μ λ°μ΄ν° ꡬ쑰 μ΅μ ν
- π οΈ ν ν° μμ±/κ²μ¦ νλ¦ κ°μ μΌλ‘ μμ μ± μ¦κ°
- π API λͺ μΈμμμ λΆμΌμΉ ν΄μ
ꡬν λ΄μ©
- π JWT νν°μ μ λ¬Ό μλ΅ API κ²½λ‘ μΆκ°
- π·οΈ λ³κ²½λ UIμ λ§μΆ° GiftResponseTag enum κ° μ λ°μ΄νΈ
- π οΈ "μ λ§ μ΅κ³ μμ" νκ·Έ μΆκ°
- π 403 Forbidden μ€λ₯ ν΄κ²°
ꡬν λ΄μ©
- π RefreshTokenRepository ꡬν체 μ΅μ ν
- ποΈ ν ν° μ μ₯ λ° κ²μ μ±λ₯ κ°μ
- π ν ν° μ‘°ν λ©μλ ν¨μ¨ν
- π ν ν° μ€λ³΅ μ μ₯ λ²κ·Έ μμ
ꡬν λ΄μ©
- π ν ν° κ΄λ ¨ μλ¬ λ‘κΉ μμ€ν ꡬμΆ
- π λλ²κΉ κ°λ₯μ± ν₯μ
- π 리νλ μ ν ν° μλ¬ μμΈ μΆμ μ©μ΄
- π κ°λ° λ° μ΄μ νκ²½μμμ λ¬Έμ ν΄κ²° μ§μ
ꡬν λ΄μ©
- β±οΈ μ‘μΈμ€ ν ν° λ° λ¦¬νλ μ ν ν° μ μ μκ° μ€μ
- π μΈμ κ΄λ¦¬ μ΅μ ν
- π οΈ μ¬μ©μ λ‘κ·ΈμΈ μν μ μ§ κ°μ
- π ν ν° λ³΄μμ± κ°ν
ꡬν λ΄μ©
- π¨ design_type νλ μΆκ°
- ποΈ λ°°λ¬λΆ SVG λ³κ²½μ μν μμ μ 보 μ 곡
ꡬν λ΄μ©
- ποΈ μ²« λ²μ§Έ μ΄λ―Έμ§λ₯Ό μΈλ€μΌλ‘ μ¬μ©
- π μ΄λ―Έμ§ URL μ²λ¦¬ λ°©μ ν΅μΌ
- π API μλ΅ νμ μΌκ΄μ± ν보
ꡬν λ΄μ©
- π 보λ°λ¦¬ μ‘°ν API μλ΅μ ID ν¬ν¨
- π λ΅λ³ μ μ₯ API μ°λ κ°μ
ꡬν λ΄μ©
- π SecurityConfigμ PATCH λ©μλ νμ© μ€μ μΆκ°
- π οΈ CORS κ΄λ ¨ μ€μ 보κ°
- π 보λ°λ¦¬ μ΄λ¦ μμ API 403 μλ¬ ν΄κ²°
- π νλ‘ νΈμλμμ μνν ν΅μ μ§μ
ꡬν λ΄μ©
- π μ λ¬Ό μ΅μ κ°μ μꡬμ¬νμ 1κ°λ‘ λ³κ²½
- π οΈ BundleRequest DTO κ²μ¦ λ‘μ§ μμ
- π μ ν¨μ± κ²μ¬ λ©μμ§ μ λ°μ΄νΈ
- π₯ μ¬μ©μ κ²½ν κ°μ
ꡬν λ΄μ©
- π μμΈ νμ μ IllegalStateExceptionμμ BaseExceptionμΌλ‘ λ³κ²½
- π οΈ ν μ€νΈ λ‘μ§κ³Ό μ€μ ꡬν μΌμΉν
- β BaseResponseStatus κ²μ¦ λ‘μ§ μΆκ°
- π ν μ€νΈ μ€ν¨ λ¬Έμ ν΄κ²°
ꡬν λ΄μ©
- π ResponseServiceTest ν΄λμ€ μμ
- π οΈ Bundle μν°ν°μ ν μ€νΈ μ½λ μ¬μ΄μ λΆμΌμΉ ν΄κ²°
- β λ ν¬μ§ν 리 λ©μλ μ΄λ¦ μΌμΉν
- π ν μ€νΈ μ€ν¨ μμΈ ν΄κ²°
ꡬν λ΄μ©
- π μ€λ€μ΄ν¬ μΌμ΄μ€μμ μΉ΄λ© μΌμ΄μ€λ‘ λ³κ²½
- π οΈ Java μ½λ μ€νμΌ μ»¨λ²€μ μ μ©
- π μΌκ΄λ μ½λ μ€νμΌ μ μ°©
- π λ€μ΄λ°μΌλ‘ μΈν μ€λ₯ μμ
ꡬν λ΄μ©
- π
delivery_character_typeβdeliveryCharacterTypeλ±μΌλ‘ λ³ν - π οΈ Java λ€μ΄λ° 컨벀μ μ€μ
- π νλ‘ νΈμλμμ μΈν°νμ΄μ€ μΌκ΄μ± μ μ§
- π§° μ½λ κ°λ μ± ν₯μ
ꡬν λ΄μ©
- π bundleIdμ λ§ν¬(UUID)μ κ°λ λͺ νν λΆλ¦¬
- π οΈ API μμ² λ° μλΉμ€ λ‘μ§ κ°μ
- π κ²μ¦ λ‘μ§ λΆλ¦¬λ‘ μ½λ νμ§ ν₯μ
- π§° μ μ§λ³΄μμ± κ°μ





