Skip to content

๐ŸŽ IT ์—ฐํ•ฉ ๋™์•„๋ฆฌ DND 12๊ธฐ - ์„ ๋ฌผ ์ถ”์ฒœ ์„œ๋น„์Šค Pictory ํ”„๋กœ์ ํŠธ

Notifications You must be signed in to change notification settings

TaskerJang/dnd-12th-5-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽ Picktory

Picktory Logo

์„ ๋ฌผ์˜ ์˜๋ฏธ๋Š” ์œ ์ง€ํ•˜๋ฉด์„œ, ์ƒ๋Œ€๋ฐฉ์˜ ์ทจํ–ฅ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค

๐Ÿ’ก ์„œ๋น„์Šค ์†Œ๊ฐœ

๋ฐฐ๊ฒฝ ๋ฐ ๋ฌธ์ œ ์˜์‹

Service Background

์„ ๋ฌผ ๊ณ ๋ฅด๊ธฐ๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์–ด๋ ค์šด ๊ณผ์ œ์ž…๋‹ˆ๋‹ค. 125๋ช…์˜ ์„ค๋ฌธ ๊ฒฐ๊ณผ, ์‚ฌ๋žŒ๋“ค์ด ์ƒ๋Œ€๋ฐฉ์˜ ์„ ํ˜ธ๋„๋ฅผ ์ง์ ‘ ๋ฌผ์–ด๋ณด์ง€ ๋ชปํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” '์„ ๋ฌผ์˜ ๊ฐ์„ฑ์ด ์‚ฌ๋ผ์ง€๊ณ  ์„ฑ์˜๊ฐ€ ์—†์–ด ๋ณด์ผ๊นŒ๋ด' ์˜€์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…: Picktory

Solution

Picktory๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • ์„ ๋ฌผ ํ›„๋ณด ๊ณต์œ : ์—ฌ๋Ÿฌ ์„ ๋ฌผ ์˜ต์…˜์„ ํ•œ ๋ฒˆ์— ๊ณต์œ ํ•˜์—ฌ ์ƒ๋Œ€๋ฐฉ์˜ ์˜๊ฒฌ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ˆ˜์ง‘
  • ์ค€๋น„ ๊ณผ์ • ๊ณต์œ : ์„ ๋ฌผ ์„ ํƒ ๊ณผ์ •์˜ ๊ณ ๋ฏผ๊ณผ ๋…ธ๋ ฅ์„ ํ•จ๊ป˜ ์ „๋‹ฌํ•˜์—ฌ ์ •์„ฑ์„ ํ‘œํ˜„
  • ์„ ๋ฌผ์˜ ์˜๋ฏธ ์œ ์ง€: ๊นœ์ง ์„ ๋ฌผ์˜ ์„ค๋ ˜์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ํšจ๊ณผ์ ์ธ ์„ ๋ฌผ ์„ ํƒ ๊ฐ€๋Šฅ
  • ์œ ์—ฐํ•œ ๋‹ต๋ณ€ ์‹œ์Šคํ…œ: ๋ฐ›๋Š” ์‚ฌ๋žŒ์ด ์ž์œ ๋กญ๊ฒŒ ์„ ๋ฌผ์— ๋ฐ˜์‘ํ•˜๊ณ  ์˜๊ฒฌ์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Œ

์„œ๋น„์Šค ์ฐจ๋ณ„์ 

  • ๋ณด๋”ฐ๋ฆฌ ๊ฐœ๋…: ์—ฌ๋Ÿฌ ์„ ๋ฌผ ์˜ต์…˜์„ ํ•˜๋‚˜์˜ ๋ณด๋”ฐ๋ฆฌ์— ๋‹ด์•„ ์ „๋‹ฌํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝํ—˜
  • ์บ๋ฆญํ„ฐ ๋ฐฐ๋‹ฌ๋ถ€: ๊ท€์—ฌ์šด ์บ๋ฆญํ„ฐ๊ฐ€ ๋ณด๋”ฐ๋ฆฌ๋ฅผ ๋ฐฐ๋‹ฌํ•˜๋Š” ์žฌ๋ฏธ ์š”์†Œ ์ถ”๊ฐ€
  • ๊ฐ„ํŽธํ•œ ๋งํฌ ๊ณต์œ : ๊ณ ์œ  ๋งํฌ๋กœ ์‰ฝ๊ฒŒ ๋ณด๋”ฐ๋ฆฌ ๊ณต์œ  ๊ฐ€๋Šฅ
  • ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ: DRAFT โ†’ PUBLISHED โ†’ COMPLETED ์ƒํƒœ ํ๋ฆ„์œผ๋กœ ํšจ์œจ์ ์ธ ๊ณผ์ • ๊ด€๋ฆฌ

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

Backend

Java Spring Boot Spring Security Spring Data JPA Hibernate MySQL JWT QueryDSL AWS

DevOps & Tools

Git GitHub Jira Swagger

๐Ÿงฉ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ์ธ์ฆ ์‹œ์Šคํ…œ

  • ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ: ๊ฐ„ํŽธํ•œ ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… ํ†ตํ•ฉ ํ”„๋กœ์„ธ์Šค
  • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ: ์•ˆ์ „ํ•œ ํ† ํฐ ๊ด€๋ฆฌ ๋ฐ ์žฌ๋ฐœ๊ธ‰ ์‹œ์Šคํ…œ
  • ์œ ์ € ๊ด€๋ฆฌ: ํšŒ์› ์ •๋ณด ์กฐํšŒ, ๋กœ๊ทธ์•„์›ƒ, ํƒˆํ‡ด ๊ธฐ๋Šฅ

2. ๋ณด๋”ฐ๋ฆฌ ๊ด€๋ฆฌ

  • ์ƒ์„ฑ ๋ฐ ํŽธ์ง‘: ๋‹ค์–‘ํ•œ ๋””์ž์ธ์˜ ๋ณด๋”ฐ๋ฆฌ ์ƒ์„ฑ ๋ฐ ํŽธ์ง‘ ๊ธฐ๋Šฅ
  • ์„ ๋ฌผ ๊ด€๋ฆฌ: ์„ ๋ฌผ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ๋ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ
  • ๋ฐฐ๋‹ฌ ์„ค์ •: ๋‹ค์–‘ํ•œ ์บ๋ฆญํ„ฐ๋กœ ๋ณด๋”ฐ๋ฆฌ ๋ฐฐ๋‹ฌ ์„ค์ • ๊ธฐ๋Šฅ
  • ๊ณ ์œ  ๋งํฌ: UUID ๊ธฐ๋ฐ˜ ๊ณต์œ  ๋งํฌ ์ƒ์„ฑ

3. ์‘๋‹ต ์‹œ์Šคํ…œ

  • ๋ณด๋”ฐ๋ฆฌ ์—ด๋žŒ: ๋งํฌ๋ฅผ ํ†ตํ•œ ๋ณด๋”ฐ๋ฆฌ ์ ‘๊ทผ ๋ฐ ์—ด๋žŒ
  • ์„ ๋ฌผ ์‘๋‹ต: ๋‹ค์–‘ํ•œ ํƒœ๊ทธ๋ฅผ ํ†ตํ•œ ์„ ๋ฌผ ์‘๋‹ต ๊ธฐ๋Šฅ
  • ๊ฒฐ๊ณผ ์กฐํšŒ: ๋ณด๋”ฐ๋ฆฌ ์ฃผ์ธ์˜ ์‘๋‹ต ๊ฒฐ๊ณผ ์กฐํšŒ ๊ธฐ๋Šฅ
  • ์ฝ์Œ ํ‘œ์‹œ: ์‘๋‹ต ํ™•์ธ ์ƒํƒœ ํ‘œ์‹œ ๊ธฐ๋Šฅ

4. ํŒŒ์ผ ๊ด€๋ฆฌ

  • AWS S3 ํ†ตํ•ฉ: ์ด๋ฏธ์ง€ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ
  • ์ธ๋„ค์ผ ์ฒ˜๋ฆฌ: ์ž๋™ ์ธ๋„ค์ผ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ

๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

Frontend Architecture

Frontend Architecture

Backend Architecture

Backend Architecture

๐Ÿงช ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค

1. ์ฝ”๋“œ ๊ด€๋ฆฌ ์ „๋žต

  • ๋ธŒ๋žœ์น˜ ์ „๋žต:
    • main: ์ œํ’ˆ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๊ธฐ์ค€ ๋ธŒ๋žœ์น˜
    • develop: ๊ฐœ๋ฐœ ํ†ตํ•ฉ ๋ธŒ๋žœ์น˜
    • feature/<๊ธฐ๋Šฅ๋ช…>: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜

2. PR(Pull Request) ํ”„๋กœ์„ธ์Šค

  • Pull Request ๊ทœ์น™:
    • ์ง์ ‘ Push ๊ธˆ์ง€: ๋ชจ๋“  ์ฝ”๋“œ ๋ณ€๊ฒฝ์€ PR์„ ํ†ตํ•ด ์ง„ํ–‰
    • PR ๊ณต์œ : ํŒ€ ๋‚ด ๊ณต์œ  ํ•„์ˆ˜

3. ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜

  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ: [<ํƒ€์ž…>]: <์ž‘์—…๋‚ด์šฉ>
  • ์ปค๋ฐ‹ ํƒ€์ž…:
    • feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • fix: ๋ฒ„๊ทธ ํ•ด๊ฒฐ
    • refactor: ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง
    • docs: ๋ฌธ์„œ ์ˆ˜์ •
    • style: ์ฝ”๋“œ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ
    • test: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ด€๋ จ

๐Ÿš€ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ๋ฐฉ๋ฒ•

์š”๊ตฌ์‚ฌํ•ญ

  • JDK 17+
  • MySQL 8.0+
  • Gradle

์„ค์น˜ ๋ฐ ์‹คํ–‰ ๋‹จ๊ณ„

  1. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ํด๋ก 
git clone https://github.com/dnd-side-project/dnd-12th-5-backend.git
cd dnd-12th-5-backend
  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ
./gradlew build
  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
./gradlew bootRun
  1. API ๋ฌธ์„œ ์ ‘๊ทผ
http://localhost:8080/swagger-ui.html

๐ŸŒŸ ๋‚ด๊ฐ€ ์ˆ˜ํ–‰ํ•œ ์ฃผ์š” ๊ฐœ๋ฐœ ์ด๋ ฅ

1. ๊ธฐ๋ณธ ์ธํ”„๋ผ ๊ตฌ์ถ•

1.1. Swagger ์ดˆ๊ธฐ ์„ค์ • : PR #3

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

1.2. QueryDSL ํ™˜๊ฒฝ ๊ตฌ์„ฑ : PR #4

implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"

๊ตฌํ˜„ ๋‚ด์šฉ

  • โš™๏ธ JPAQueryFactory Bean ๋“ฑ๋ก
  • ๐Ÿ”„ Qํด๋ž˜์Šค ์ž๋™ ์ƒ์„ฑ ์„ค์ •
  • ๐Ÿ“ Entity ๋ณ€๊ฒฝ ์‹œ clean & rebuild ํ•„์š”

1.3. Spring Security ๊ธฐ๋ณธ ์„ค์ • : PR #5

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ” JWT ์ธ์ฆ ํ•„ํ„ฐ ๊ตฌํ˜„
  • ๐Ÿ›ก๏ธ API ์—”๋“œํฌ์ธํŠธ๋ณ„ ์ ‘๊ทผ ๊ถŒํ•œ ์„ค์ •
  • ๐ŸŒ CORS ์„ค์ •
    • ํ”„๋ก ํŠธ์—”๋“œ ๋„๋ฉ”์ธ ์„ค์ • ์ดํ›„ ๋ณด์•ˆ ๊ฐ•ํ™” ์˜ˆ์ •
    • HTTP ๋ฉ”์†Œ๋“œ: GET, POST, PUT, DELETE, OPTIONS

2. ์ธ์ฆ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ

2.1. JWT ํ† ํฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌํ˜„ : PR #7

๊ตฌํ˜„ ๋‚ด์šฉ

  • โœ… ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋กœ์ง
  • ๐Ÿ”„ ๋งŒ๋ฃŒ ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ๊ธฐ๋Šฅ
  • ๐Ÿ”’ ํ† ํฐ ์„œ๋ช… ๋ฐ ์•”ํ˜ธํ™” ์ฒ˜๋ฆฌ
  • ๐Ÿ› ๏ธ ์‚ฌ์šฉ์ž ID ๊ธฐ๋ฐ˜ ํด๋ ˆ์ž„ ์„ค๊ณ„

2.2. JWT ์ธ์ฆ ๋ฐ ๋ณด์•ˆ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  : PR #68

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”’ SecurityConfig ํด๋ž˜์Šค ์ „๋ฉด ๋ฆฌํŒฉํ† ๋ง
  • ๐Ÿ›ก๏ธ JWT ์ธ์ฆ ์•„ํ‚คํ…์ฒ˜ ์žฌ์„ค๊ณ„ ๋ฐ ์ตœ์ ํ™”
  • ๐ŸŒ ์ธ์ฆ ํ•„ํ„ฐ ์ฒด์ธ ๊ฐœ์„  ๋ฐ ๊ณ ๋„ํ™”
  • ๐Ÿ”‘ ๊ถŒํ•œ ๊ฒ€์ฆ ๋กœ์ง ๊ฐ•ํ™”
  • ๐Ÿ› ๏ธ ์—”๋“œํฌ์ธํŠธ๋ณ„ ์„ธ๋ถ„ํ™”๋œ ์ ‘๊ทผ ์ œ์–ด ๊ตฌํ˜„
  • ๐Ÿ”„ ์ธ์ฆ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ๋ฆ„ ๊ฐœ์„ 

2.3. ์นด์นด์˜ค OAuth ์ธ์ฆ ์‹œ์Šคํ…œ ๊ตฌ์ถ• : PR #8

OAuth ์ธ์ฆ ํ”Œ๋กœ์šฐ

  1. ๐ŸŽซ ์ธ์ฆ ์ฝ”๋“œ๋กœ ์นด์นด์˜ค ์•ก์„ธ์Šค ํ† ํฐ ๋ฐœ๊ธ‰
  2. ๐Ÿ‘ค ์นด์นด์˜ค ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ
  3. ๐Ÿ”‘ JWT ํ† ํฐ ๋ฐœ๊ธ‰

ํšŒ์› ๊ด€๋ฆฌ ๊ธฐ๋Šฅ

  • ๐Ÿ“ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ํ†ตํ•ฉ ํ”„๋กœ์„ธ์Šค
  • ๐Ÿ‘ค ๋‚ด ์ •๋ณด ์กฐํšŒ
  • ๐Ÿšช ๋กœ๊ทธ์•„์›ƒ
  • โŒ ํšŒ์› ํƒˆํ‡ด (์นด์นด์˜ค ์—ฐ๋™ ํ•ด์ œ ํฌํ•จ)

2.3. ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ• : PR #9

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿงน DatabaseCleaner ๊ตฌํ˜„
  • โœ… JUnit 5 BeforeEachCallback ํ™œ์šฉ
  • ๐Ÿ”’ SecurityContextHolder๋ฅผ ํ™œ์šฉํ•œ ์ธ์ฆ ํ…Œ์ŠคํŠธ

2.4. ์ธ์ฆ ๊ด€๋ จ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ†ต์ผ : PR #73

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ ์ธ์ฆ ๊ด€๋ จ ์˜ˆ์™ธ๋ฅผ BaseException์œผ๋กœ ํ†ต์ผ
  • ๐Ÿ› ๏ธ ์—๋Ÿฌ ์‘๋‹ต์„ BaseResponseStatus ์—ด๊ฑฐํ˜•์œผ๋กœ ํ‘œ์ค€ํ™”
  • ๐Ÿ“ ํ† ํฐ ๋งŒ๋ฃŒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง ๊ฐœ์„ 
  • ๐ŸŒ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ•œ๊ธ€ํ™” ๋ฐ ์ผ๊ด€์„ฑ ์œ ์ง€

2.5. JWT ํ† ํฐ ๊ด€๋ฆฌ ๊ฐœ์„  : PR #104

๊ตฌํ˜„ ๋‚ด์šฉ

  • โœจ TokenDto์— refreshTokenExpiresIn ํ•„๋“œ ์ถ”๊ฐ€
  • ๐Ÿ› ๏ธ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์— userId ์ •๋ณด ํฌํ•จ
  • ๐Ÿ”„ RefreshTokenService์—์„œ ํ† ํฐ ์—…๋ฐ์ดํŠธ ๋กœ์ง ์ˆ˜์ •
  • ๐Ÿ“ API ๋ช…์„ธ์„œ์™€ ์‹ค์ œ ๊ตฌํ˜„ ์ผ์น˜ํ™”

2.6. ํšŒ์› ํƒˆํ‡ด ํ›„ ์žฌ๊ฐ€์ž… ์˜ค๋ฅ˜ ํ•ด๊ฒฐ : PR #111

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ User ์—”ํ‹ฐํ‹ฐ์— reactivate() ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
  • ๐Ÿ› ๏ธ AuthService์—์„œ ํƒˆํ‡ด ์‚ฌ์šฉ์ž ์žฌํ™œ์„ฑํ™” ๋กœ์ง ๊ตฌํ˜„
  • ๐Ÿ“ ํšŒ์› ํƒˆํ‡ด ๋ฐ ์žฌ๊ฐ€์ž… ์ •์ฑ… ๊ฐœ์„ 
  • ๐Ÿ‘ฅ ์„œ๋น„์Šค ์ ‘๊ทผ์„ฑ ํ–ฅ์ƒ

3. ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ

3.1. ๋ฐฐ๋‹ฌ๋ถ€ ์บ๋ฆญํ„ฐ ์„ ํƒ ์‹œ์Šคํ…œ : PR #24

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐ŸŽจ ๋ฐฐ๋‹ฌ๋ถ€ ์บ๋ฆญํ„ฐ ์„ค์ • API
  • ๐Ÿ”— ๊ณ ์œ  ๋งํฌ ์ƒ์„ฑ ํ†ตํ•ฉ
  • ๐Ÿ“ฆ Bundle ์ƒํƒœ ๊ด€๋ฆฌ ๊ฐœ์„ :
    1. DRAFT (์ดˆ๊ธฐ)
    2. PUBLISHED (๋ฐฐ๋‹ฌ๋ถ€ ์„ค์ • & ๋งํฌ ์ƒ์„ฑ)

3.2. ๋ณด๋”ฐ๋ฆฌ ํ†ตํ•ฉ ์กฐํšŒ ๊ธฐ๋Šฅ : PR #28

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ” QueryDSL ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ
  • ๐ŸŽ ์„ ๋ฌผ, ์ด๋ฏธ์ง€, ์‘๋‹ต ์ •๋ณด ํ†ตํ•ฉ ์กฐํšŒ
  • โœจ Response ์—”ํ‹ฐํ‹ฐ ๊ตฌํ˜„
  • ๐Ÿ› ๏ธ QueryDSL ๊ธฐ๋ฐ˜ ์ปค์Šคํ…€ ๊ตฌํ˜„์ฒด

3.3. ๋ณด๋”ฐ๋ฆฌ ๋‹ต๋ณ€ ์‹œ์Šคํ…œ ๊ตฌํ˜„ : PR #35

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿท๏ธ GiftResponseTag ๊ด€๋ฆฌ ์ฒด๊ณ„
  • ๐Ÿ“ ๋‹ค์ค‘ ์„ ๋ฌผ ๋‹ต๋ณ€ ์ฒ˜๋ฆฌ
  • โœ… ์ƒํƒœ ๊ฒ€์ฆ:
    • ๋ฒˆ๋“ค ์ƒํƒœ
    • ์„ ๋ฌผ ๋ชฉ๋ก
    • ๊ธฐ์กด ์‘๋‹ต ์—ฌ๋ถ€
    • ์‘๋‹ต ์™„๋ฃŒ ์—ฌ๋ถ€

3.4. ๋ณด๋”ฐ๋ฆฌ ์ƒ์„ธ ์กฐํšŒ ๊ธฐ๋Šฅ : PR #44

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐ŸŽ ๊ฐœ๋ณ„ ์„ ๋ฌผ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ
  • ๐Ÿ–ผ๏ธ ์ธ๋„ค์ผ ๋ฐ ์ด๋ฏธ์ง€ ๋ชฉ๋ก ๋ถ„๋ฆฌ
  • ๐Ÿ”’ ๊ถŒํ•œ ๊ฒ€์ฆ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

3.5. ๋ณด๋”ฐ๋ฆฌ ์ž‘์„ฑ ์™„๋ฃŒ ๊ธฐ๋Šฅ : PR #45

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ“ DRAFT ์ƒํƒœ ๋ณด๋”ฐ๋ฆฌ ์กฐํšŒ
  • โšก N+1 ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋ฒŒํฌ ์กฐํšŒ
  • ๐Ÿ–ผ๏ธ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ:
    • ์ธ๋„ค์ผ ๋ถ„๋ฆฌ
    • ์ด๋ฏธ์ง€ ๋ชฉ๋ก ๋งคํ•‘

3.6. ์„ ๋ฌผ ๋‹ต๋ณ€ ๊ฒฐ๊ณผ ์กฐํšŒ API : PR #98

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ†• ๋งํฌ ๊ธฐ๋ฐ˜ ์„ ๋ฌผ ์‘๋‹ต ๊ฒฐ๊ณผ ์กฐํšŒ API ์ถ”๊ฐ€
  • ๐Ÿ”“ ๋กœ๊ทธ์ธ ์—†์ด ๋ณด๋”ฐ๋ฆฌ ๋งํฌ๋กœ ๊ฒฐ๊ณผ ์กฐํšŒ ๊ฐ€๋Šฅ
  • ๐Ÿ”’ COMPLETED ์ƒํƒœ์ธ ๋ณด๋”ฐ๋ฆฌ๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œํ•œ
  • ๐Ÿ“ฆ ์„ ๋ฌผ ์ด๋ฆ„, ์ธ๋„ค์ผ, ๊ตฌ๋งค ๋งํฌ, ์‘๋‹ต ํƒœ๊ทธ ๋ฐ˜ํ™˜ ๊ตฌํ˜„

3.7. ๋ณด๋”ฐ๋ฆฌ ์ด๋ฆ„ ์ˆ˜์ • API : PR #106

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ†• PATCH API ๊ตฌํ˜„์œผ๋กœ ํšจ์œจ์„ฑ ๊ฐœ์„ 
  • ๐Ÿ“ BundleNameUpdateRequest DTO ์ƒ์„ฑ
  • ๐Ÿ› ๏ธ ๋ณด๋”ฐ๋ฆฌ ์ด๋ฆ„๋งŒ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„ API ๋ถ„๋ฆฌ
  • ๐Ÿ”’ DRAFT ์ƒํƒœ์—์„œ๋งŒ ์ด๋ฆ„ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œํ•œ

4. ๊ฐœ์„  ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •

4.1. JWT ํ† ํฐ ์‹œ์Šคํ…œ ์‹ฌ์ธต ๋ฆฌํŒฉํ† ๋ง

4.1.1. JWT ํ† ํฐ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  : PR #101

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ TokenDto ๊ตฌ์กฐ ์ „๋ฉด ๊ฐœํŽธ ๋ฐ ํ‘œ์ค€ํ™”
  • ๐Ÿ” ํ† ํฐ ํด๋ ˆ์ž„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ตœ์ ํ™”
  • ๐Ÿ› ๏ธ ํ† ํฐ ์ƒ์„ฑ/๊ฒ€์ฆ ํ๋ฆ„ ๊ฐœ์„ ์œผ๋กœ ์•ˆ์ •์„ฑ ์ฆ๊ฐ€
  • ๐Ÿ“ API ๋ช…์„ธ์„œ์™€์˜ ๋ถˆ์ผ์น˜ ํ•ด์†Œ
4.1.2. JWT ํ•„ํ„ฐ ๋ฐ ์‘๋‹ต ํƒœ๊ทธ ๊ฐœ์„  : PR #86

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”’ JWT ํ•„ํ„ฐ์— ์„ ๋ฌผ ์‘๋‹ต API ๊ฒฝ๋กœ ์ถ”๊ฐ€
  • ๐Ÿท๏ธ ๋ณ€๊ฒฝ๋œ UI์— ๋งž์ถฐ GiftResponseTag enum ๊ฐ’ ์—…๋ฐ์ดํŠธ
  • ๐Ÿ› ๏ธ "์ •๋ง ์ตœ๊ณ ์—์š”" ํƒœ๊ทธ ์ถ”๊ฐ€
  • ๐Ÿ› 403 Forbidden ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
4.1.3. ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์ €์žฅ์†Œ ์ตœ์ ํ™” : PR #102

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ RefreshTokenRepository ๊ตฌํ˜„์ฒด ์ตœ์ ํ™”
  • ๐Ÿ—„๏ธ ํ† ํฐ ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ๊ฐœ์„ 
  • ๐Ÿ” ํ† ํฐ ์กฐํšŒ ๋ฉ”์„œ๋“œ ํšจ์œจํ™”
  • ๐Ÿ› ํ† ํฐ ์ค‘๋ณต ์ €์žฅ ๋ฒ„๊ทธ ์ˆ˜์ •
4.1.4. ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์—๋Ÿฌ ๋กœ๊น… ๊ฐœ์„  : PR #90

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ“Š ํ† ํฐ ๊ด€๋ จ ์—๋Ÿฌ ๋กœ๊น… ์‹œ์Šคํ…œ ๊ตฌ์ถ•
  • ๐Ÿ” ๋””๋ฒ„๊น… ๊ฐ€๋Šฅ์„ฑ ํ–ฅ์ƒ
  • ๐Ÿ› ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์—๋Ÿฌ ์›์ธ ์ถ”์  ์šฉ์ด
  • ๐Ÿ“ ๊ฐœ๋ฐœ ๋ฐ ์šด์˜ ํ™˜๊ฒฝ์—์„œ์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ง€์›
4.1.5. ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ • ์ตœ์ ํ™” : PR #109

๊ตฌํ˜„ ๋‚ด์šฉ

  • โฑ๏ธ ์•ก์„ธ์Šค ํ† ํฐ ๋ฐ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์ ์ • ์‹œ๊ฐ„ ์„ค์ •
  • ๐Ÿ”„ ์„ธ์…˜ ๊ด€๋ฆฌ ์ตœ์ ํ™”
  • ๐Ÿ› ๏ธ ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€ ๊ฐœ์„ 
  • ๐Ÿ”’ ํ† ํฐ ๋ณด์•ˆ์„ฑ ๊ฐ•ํ™”

4.2. ๋ณด๋”ฐ๋ฆฌ ๋ฐ UI ๊ฐœ์„ 

4.2.1. ๋ณด๋”ฐ๋ฆฌ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ฐœ์„  : PR #47

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐ŸŽจ design_type ํ•„๋“œ ์ถ”๊ฐ€
  • ๐Ÿ–Œ๏ธ ๋ฐฐ๋‹ฌ๋ถ€ SVG ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์ƒ‰์ƒ ์ •๋ณด ์ œ๊ณต
4.2.2. ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋กœ์ง ๊ฐœ์„  : PR #56

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿž๏ธ ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ์ธ๋„ค์ผ๋กœ ์‚ฌ์šฉ
  • ๐Ÿ”„ ์ด๋ฏธ์ง€ URL ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ํ†ต์ผ
  • ๐Ÿ“ API ์‘๋‹ต ํ˜•์‹ ์ผ๊ด€์„ฑ ํ™•๋ณด
4.2.3. ๋ณด๋”ฐ๋ฆฌ ์‹๋ณ„์ž ์‹œ์Šคํ…œ ๊ฐœ์„  : PR #57

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ†” ๋ณด๋”ฐ๋ฆฌ ์กฐํšŒ API ์‘๋‹ต์— ID ํฌํ•จ
  • ๐Ÿ”„ ๋‹ต๋ณ€ ์ €์žฅ API ์—ฐ๋™ ๊ฐœ์„ 

4.3. API ๋ณด์•ˆ ๋ฐ ํ˜ธํ™˜์„ฑ ๊ฐœ์„ 

4.3.1. PATCH ๋ฉ”์†Œ๋“œ CORS ์„ค์ • : PR #107

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”’ SecurityConfig์— PATCH ๋ฉ”์†Œ๋“œ ํ—ˆ์šฉ ์„ค์ • ์ถ”๊ฐ€
  • ๐Ÿ› ๏ธ CORS ๊ด€๋ จ ์„ค์ • ๋ณด๊ฐ•
  • ๐Ÿ› ๋ณด๋”ฐ๋ฆฌ ์ด๋ฆ„ ์ˆ˜์ • API 403 ์—๋Ÿฌ ํ•ด๊ฒฐ
  • ๐ŸŒ ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ ์›ํ™œํ•œ ํ†ต์‹  ์ง€์›
4.3.2. Bundle ์ตœ์†Œ ์„ ๋ฌผ ๊ฐœ์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ : PR #105

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ ์„ ๋ฌผ ์ตœ์†Œ ๊ฐœ์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ 1๊ฐœ๋กœ ๋ณ€๊ฒฝ
  • ๐Ÿ› ๏ธ BundleRequest DTO ๊ฒ€์ฆ ๋กœ์ง ์ˆ˜์ •
  • ๐Ÿ“ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฉ”์‹œ์ง€ ์—…๋ฐ์ดํŠธ
  • ๐Ÿ‘ฅ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ 

4.4. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ

4.4.1. ์นด์นด์˜ค ํด๋ผ์ด์–ธํŠธ ํ…Œ์ŠคํŠธ ๊ฐœ์„  : PR #97

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ ์˜ˆ์™ธ ํƒ€์ž…์„ IllegalStateException์—์„œ BaseException์œผ๋กœ ๋ณ€๊ฒฝ
  • ๐Ÿ› ๏ธ ํ…Œ์ŠคํŠธ ๋กœ์ง๊ณผ ์‹ค์ œ ๊ตฌํ˜„ ์ผ์น˜ํ™”
  • โœ… BaseResponseStatus ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€
  • ๐Ÿ› ํ…Œ์ŠคํŠธ ์‹คํŒจ ๋ฌธ์ œ ํ•ด๊ฒฐ
4.4.2. ๋‹ต๋ณ€ ์ €์žฅ ํ…Œ์ŠคํŠธ ์ˆ˜์ • : PR #96

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ ResponseServiceTest ํด๋ž˜์Šค ์ˆ˜์ •
  • ๐Ÿ› ๏ธ Bundle ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‚ฌ์ด์˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ
  • โœ… ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„ ์ผ์น˜ํ™”
  • ๐Ÿ› ํ…Œ์ŠคํŠธ ์‹คํŒจ ์›์ธ ํ•ด๊ฒฐ

4.5. ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ฐœ์„ 

4.5.1. ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ํ‘œ์ค€ํ™” : PR #100

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค์—์„œ ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ๋ณ€๊ฒฝ
  • ๐Ÿ› ๏ธ Java ์ฝ”๋“œ ์Šคํƒ€์ผ ์ปจ๋ฒค์…˜ ์ ์šฉ
  • ๐Ÿ“ ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ ์ •์ฐฉ
  • ๐Ÿ› ๋„ค์ด๋ฐ์œผ๋กœ ์ธํ•œ ์˜ค๋ฅ˜ ์ˆ˜์ •
4.5.2. ResponseBundleDto ํ•„๋“œ ๋„ค์ด๋ฐ ๊ฐœ์„  : PR #87

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ delivery_character_type โ†’ deliveryCharacterType ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜
  • ๐Ÿ› ๏ธ Java ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜
  • ๐Ÿ“ ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ ์œ ์ง€
  • ๐Ÿงฐ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
4.5.3. SaveGiftResponsesRequest ๊ฒ€์ฆ ๋กœ์ง ๋ถ„๋ฆฌ : PR #88

๊ตฌํ˜„ ๋‚ด์šฉ

  • ๐Ÿ”„ bundleId์™€ ๋งํฌ(UUID)์˜ ๊ฐœ๋… ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ
  • ๐Ÿ› ๏ธ API ์š”์ฒญ ๋ฐ ์„œ๋น„์Šค ๋กœ์ง ๊ฐœ์„ 
  • ๐Ÿ“ ๊ฒ€์ฆ ๋กœ์ง ๋ถ„๋ฆฌ๋กœ ์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ
  • ๐Ÿงฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ฐœ์„ 

๐Ÿ” ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

User Flow

About

๐ŸŽ IT ์—ฐํ•ฉ ๋™์•„๋ฆฌ DND 12๊ธฐ - ์„ ๋ฌผ ์ถ”์ฒœ ์„œ๋น„์Šค Pictory ํ”„๋กœ์ ํŠธ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages