Skip to content

code-zero-to-one/zto-onboarding

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

1 Commit
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์•ˆ๋…•ํ•˜์„ธ์š”!

์•ˆ๋…•ํ•˜์„ธ์š”! ์Šคํ„ฐ๋”” ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ์— ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์ฐธ์—ฌํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•˜์‹œ๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ˆ˜ํ–‰ํ•˜์‹ค ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ œ์—์„œ ๋‹ค๋ฃจ๊ฒŒ ๋  ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์ €ํฌ ํŒ€์ด ์ง€๊ธˆ๊นŒ์ง€ ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ ์ค‘์— "ํšŒ์›" ์ปดํฌ๋„ŒํŠธ๋งŒ ๋–ผ์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๊ป˜์„œ๋Š” ํšŒ์› ๊ด€๋ จ ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•ด ์ฃผ์‹œ๊ณ , ๋˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์ˆ˜ํ–‰ํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฑฐ๋“ญ ๋ง์”€๋“œ๋ฆฌ์ง€๋งŒ, ์ด ๊ณผ์ œ๋Š” ์ €ํฌ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋”ฉ ์Šคํƒ€์ผ, ์—ญ๋Ÿ‰์„ ํŒŒ์•…ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๋ถ„ ๋˜ํ•œ ์ €ํฌ์˜ ์ˆ˜์ค€์„ ํŒŒ์•…ํ•˜์‹ค ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜์‹ ๋‹ค๊ณ  ํ•ด์„œ ์ €ํฌ๊ฐ€ ์›”๊ธ‰์„ ๋“œ๋ฆฌ๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋ผ ๊ณผ์ œ๋ฅผ ๋“œ๋ฆฌ๋Š” ๊ฒŒ ์กฐ๊ธˆ ๋ฏผ๋งํ•˜์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์„œ๋กœ๋ฅผ ์•Œ์•„๊ฐ„๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์ด ๊ณผ์ œ์— ์ฐธ์—ฌํ•ด ์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค!

๊ณผ์ œ ๋‚ด์šฉ

๊ณผ์ œ ๋‚ด์šฉ์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ฒซ์งธ, ๊ฐ„๋‹จํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„, ๋‘˜์งธ, ๊ธฐ์กด ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์ž…๋‹ˆ๋‹ค. ์ €ํฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๋‚ด์šฉ์˜ ๊ณผ์ œ๋ฅผ ๋“œ๋ฆฌ๋Š” ์ด์œ ๋Š”, ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ๊ฐ€์น˜๊ด€๊ณผ ์ง€์‹์„ ์ž˜ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœ CRUD ๊ฐœ๋ฐœ ๊ณผ์ œ๋ฅผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ์š”, ๊ทธ๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด ๊ณผ์ œ๋ฅผ ๋“œ๋ฆฌ๋Š” ์ €ํฌ ์ž…์žฅ์—์„œ๋„ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜ํ•˜๋ฉด์„œ ์‹œ๊ฐ„์  ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๊ณ , ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ฌ๋Ÿฌ๋ถ„ ์ž…์žฅ์—์„œ๋„ ์žฌ๋ฏธ๋„ ์—†๊ณ , ์ง€๋‚œํ•˜๊ณ , ๋˜ ์ €ํฌ ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฐจ๋ผ๋ฆฌ ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ œ๋ฅผ ๋“œ๋ฆฌ์ž, ํ•˜๋Š” ์ƒ๊ฐ์— ์ด๋Ÿฌํ•œ ๊ณผ์ œ๋ฅผ ๋“œ๋ฆฌ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋งŒ ๋“œ๋ฆฌ๊ณ  ๋ฆฌํŒฉํ† ๋ง์„ ์š”์ฒญํ•˜๊ธฐ๋งŒ ํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐฉํ–ฅ์„ฑ์„ ์žก๊ธฐ ์–ด๋ ต๊ฒ ๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ณผ์ œ๋ฅผ ๋“œ๋ฆฌ๋ฉด, ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ๋ณด๋‹ค ์ˆ˜์›”ํ•˜๊ฒŒ ๋ฐœ๊ฒฌํ•˜์‹ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ณผ์ œ๋„ ์š”์ฒญ๋“œ๋ฆฌ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ ๊ตฐ๋ฐ๊ตฐ๋ฐ TODO๋ฅผ ๋‹ฌ์•„์„œ ๋ฆฌํŒฉํ† ๋ง ์ง€์ ์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์ œ์‹œ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ถฉ์กฑ์‹œํ‚ค์‹ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งŽ์€ ํ•ญ๋ชฉ์ด ์™„๋ฃŒ๋˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ๊ผญ ๊ทธ๋Ÿฌ์ง€ ์•Š๋”๋ผ๋„ ์ €ํฌ์™€ ์—ฌ๋Ÿฌ๋ถ„์ด ์„œ๋กœ๋ฅผ ์ถฉ๋ถ„ํžˆ ์•Œ ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ˆ˜ํ–‰ํ•˜์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ œ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์ด ์žˆ๋Š” ๋ฐ˜๋ฉด, ํšŒ์‚ฌ์— ๋‹ค๋‹ˆ๊ณ , ์•ผ๊ทผ์„ ํ•˜๋Š” ๋“ฑ์˜ ์‚ฌ์œ  ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์„ ๋งŽ์ด ํˆฌ์žํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ„๋„ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”.

๊ณผ์ œ๋Š” domain ํŒจํ‚ค์ง€ ์•„๋ž˜์— ์žˆ๋Š” ๊ฒƒ๋งŒ ๋Œ€์ƒ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์‹œ๋ฉด ์ ์ ˆํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค. global ํŒจํ‚ค์ง€๊นŒ์ง€ ํฌํ•จ์‹œํ‚ค๋ฉด ๋„ˆ๋ฌด ๋งŽ์„ ๊ฒƒ ๊ฐ™๋„ค์š”. ์ณ๋‚ผ ๊ฑฐ ์ณ๋‚ธ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ๋„ ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜ํšจ๊ฐ€ ์ข€ ๋งŽ๋„ค์š”... ใ…Žใ…Ž global ํŒจํ‚ค์ง€์— ์žˆ๋Š” ์ฝ”๋“œ๋“ค์€ ํ•œ๋ฒˆ ์ฝ์–ด๋งŒ ๋ด ์ฃผ์„ธ์š”! ๋ฌผ๋ก  global ํŒจํ‚ค์ง€์— ์žˆ๋Š” ์ฝ”๋“œ์—์„œ๋„ ๊ฐœ์„  ์‚ฌํ•ญ์ด ๋ณด์—ฌ์„œ ๋ฆฌํŒฉํ† ๋งํ•ด ์ฃผ์‹œ๋ฉด ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฐฉํ–ฅ์„ฑ

์ €ํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์น˜๊ด€์„ ๊ฐ€์ง€๊ณ  ๊ฐœ๋ฐœํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

  • ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์™ธ๋ถ€ ์ธํ”„๋ผ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋„๋ก
  • ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ
  • ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•œ ๊ตฌํ˜„
  • ๋‹จ์ˆœํ•จ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
  • ๋ฌธ์„œ๋ฅผ ํ†ตํ•œ ์†Œํ†ต (API ๋ช…์„ธ, Javadocs ๋“ฑ)
  • ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜์ง€ ์•Š๊ธฐ
  • ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์˜ˆ์œ ์ด๋ฆ„

์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ ํ•„์š”ํ•œ ์นผ๋Ÿผ์ด ์žˆ์œผ๋ฉด ์ถ”๊ฐ€ํ•˜์‹œ๋ฉด ๋˜๊ณ , ํ•„์š”์—†๋Š” ์นผ๋Ÿผ์ด ์žˆ์œผ๋ฉด ์ œ๊ฑฐํ•˜์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

์ œ๋ชฉ ์š”๊ตฌ์‚ฌํ•ญ ์„ค๋ช…
ํšŒ์› ํƒˆํ‡ด ํšŒ์›์€ ํšŒ์› ํƒˆํ‡ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค. ์•„์ง ํšŒ์› ํƒˆํ‡ด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ํšŒ์› ํƒˆํ‡ด ๊ธฐ๋Šฅ์„ ์™„์„ฑํ•ด ์ฃผ์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ํšŒ์› ์ •์ง€ ๊ด€๋ฆฌ์ž๋Š” ํšŒ์›์˜ ๊ณ„์ •์„ ์ •์ง€์‹œํ‚ค๊ธฐ๋ฅผ ์›ํ•œ๋‹ค. MemberStauts๋ฅผ ํ™œ์šฉํ•ด ์ฃผ์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๋งŒ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” access_permission๊ณผ access_permission_role ํ…Œ์ด๋ธ”๊ณผ ๊ด€๋ จ ์žˆ์Šต๋‹ˆ๋‹ค.
ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ ๊ด€๋ฆฌ์ž๋Š” ํšŒ์› ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค. Pagination์„ ์ ์šฉํ•ด์•ผ ํ•˜๊ณ , ํŽ˜์ด์ง€ ํฌ๊ธฐ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜๋˜, ํด๋ผ์ด์–ธํŠธ๋Š” ํŽ˜์ด์ง€ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก ์•„์ดํ…œ์€ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ํšŒ์› ID, ์ด๋ฆ„, ์ƒ์„ฑ์‹œ๊ฐ„, ํšŒ์› ์ด๋ฆ„, ์—ฐ๋ฝ์ฒ˜, ์ƒ๋…„์›”์ผ, ์„ ํ˜ธํ•˜๋Š” ์Šคํ„ฐ๋”” ์ฃผ์ œ
์†Œ์…œ ๋ฏธ๋””์–ด ํƒ€์ž… ์ถ”๊ฐ€ ๊ด€๋ฆฌ์ž๋Š” ์†Œ์…œ ๋ฏธ๋””์–ด ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค. SocialMediaType ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์†Œ์…œ ๋ฏธ๋””์–ด ํƒ€์ž… ๋ชฉ๋ก ์กฐํšŒ ๊ด€๋ฆฌ์ž๋Š” ์†Œ์…œ ๋ฏธ๋””์–ด ํƒ€์ž… ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค.
์†Œ์…œ ๋ฏธ๋””์–ด ํƒ€์ž… ์‚ญ์ œ ๊ด€๋ฆฌ์ž๋Š” ์†Œ์…œ ๋ฏธ๋””์–ด ํƒ€์ž…์„ ์‚ญ์ œํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ณ ๋ฏผ

์šฐ๋ฆฌ ๊ฐœ๋ฐœํŒ€์˜ ๊ณ ๋ฏผ์„ ๋ง์”€๋“œ๋ฆฌ๋ฉด ์ข€ ๋” ๋ฆฌํŒฉํ† ๋งํ•˜์‹œ๊ธฐ ํŽธํ•˜์‹ค ๊ฒƒ ๊ฐ™๋„ค์š”!

  • ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ๋ผ๋ฆฌ ์˜์กดํ•  ๋•Œ, ์„œ๋น„์Šค ๋ ˆ์ด์–ด์— ์˜์กดํ•ด์•ผ ํ•˜๋Š”๊ฐ€, ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ ˆ์ด์–ด์— ์˜์กดํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฝ”๋“œ๋ฅผ JPA์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์•„๋ฆ„๋‹ต๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์„๊นŒ?
    • ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด Persistence ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ JPA์—์„œ MyBatis๋กœ ๋ฐ”๊พธ๋“ , JOOQ๋กœ ๋ฐ”๊พธ๋“ , Spring Data JDBC๋กœ ๋ฐ”๊พธ๋“ , ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„๊นŒ?
  • @ManyToMany์„ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ์„๊นŒ?
  • ๋กœ๊ทธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚จ๊ธฐ๋ฉด ์ข‹์„๊นŒ?
  • Authorization ํ—ค๋”์— ๋‹ด๊ฒจ์„œ ์ „๋‹ฌ๋˜๋Š” Bearer ํ† ํฐ์—์„œ ํšŒ์›ID๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ค ํšŒ์›์ด ์ž์‹ ์ด ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ๋ฆฌ์†Œ์Šค (์˜ˆ๋ฅผ ๋“ค์–ด ํšŒ์›์ด ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€ ๋“ฑ)์— ๋Œ€ํ•œ Operation์„ ์ˆ˜ํ–‰ํ•˜๋Š” API์—์„œ ํšŒ์›ID๋Š” URI์— ๋‚˜ํƒ€๋‚ด์•ผ ํ• ๊นŒ, ์•„๋‹ˆ๋ฉด URI์—๋Š” ๋‚˜ํƒ€๋‚ด์ง€ ์•Š๊ณ  Bearer ํ† ํฐ์—์„œ ํšŒ์›ID๋ฅผ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?
  • DDL์„ SCM์—์„œ ๊ด€๋ฆฌํ•ด๋„ ๊ดœ์ฐฎ์„๊นŒ?
  • Springdoc์„ ํ™œ์šฉํ•˜์—ฌ Swagger UI๋ฅผ ์ž๋™ํ™”ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Example Parameter๋‚˜ Example Response๋Š” ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค (์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ, ์•„์ง ๊ทธ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค). API ์ˆ˜์ •์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค Example๋„ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, Example์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ? ์•„๋‹ˆ๋ฉด Example์„ ์ž๋™ํ™”ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ? ( Springdoc์˜ @ExampleObject)
  • ์ด๋ฏธ์ง€ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ enum์œผ๋กœ ๊ทธ ์ข…๋ฅ˜๋ฅผ ์ œ์•ฝํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ?
  • ์ด๋ฏธ์ง€ ํŒŒ์ผ๋ช…์„ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ UUID์™€ Unix Time์„ ์กฐํ•ฉํ•˜์—ฌ ์ƒ์„ฑํ•ด ์ฃผ๊ณ  ์žˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์ด ์ด๋ฏธ์ง€ ํŒŒ์ผ๋ช…์˜ ์œ ์ผ์„ฑ์„ ๋ฐ˜๋“œ์‹œ ๋ณด์ฆํ•˜๋Š”๊ฐ€? ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ?
  • Repository ๊ฐ์ฒด๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ง€์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์—๋งŒ ๊ตญํ•œ์‹œํ‚ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?
    • ํ˜„์žฌ ํšŒ์› ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ soft delete๋ฅผ ์ •์ฑ…์„ ์ฑ„ํƒํ–ˆ๋‹ค. ์‚ญ์ œ๋˜์ง€ ์•Š์€ ํšŒ์›์„ ๊ฐ€์ ธ์˜ค๋Š” Repository ๊ฐ์ฒด API๋Š” ๋‹ค์Œ ๋‘ ๊ฐœ ์ค‘ ์–ด๋–ค ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅผ๊นŒ?
      1. findNotDeletedByMemberId(Long memberId)
      2. findByMemberIdAndDeleted(Long memberId, boolean deleted)
  • ๊ฐ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ Java ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅผ๊นŒ?
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ธธ์ด๋ฅผ ํ˜„๊ฒฉํ•˜๊ฒŒ ์ฆ๊ฐ€์‹œํ‚ค๋Š” Given ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ์„๊นŒ?
  • @BeforeEach์—๋Š” ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์˜ฌ ์ˆ˜ ์—†์„๊นŒ?
  • Composite key๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€?

ํ”„๋กœ์ ํŠธ ์„ค๋ช…

๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ค ๋•Œ ๋„์›€์ด ๋˜๋„๋ก, ์ €ํฌ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

์ €ํฌ ํ”„๋กœ์ ํŠธ๋Š” ์ฐธ์—ฌ์ž๋“ค์ด ๋‘˜์”ฉ ์ง์ง€์–ด ์กฐ๋ฅผ ์ด๋ฃจ๊ณ  ์„œ๋กœ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ๋ฉด์ ‘์ž์™€ ํ”ผ๋ฉด์ ‘์ž์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋ฉด์ ‘์„ ํ†ตํ•ด ๊ณต๋ถ€ํ•œ ๊ฒƒ๋“ค์„ ๋ณต์Šตํ•˜๋Š” ๋ฐฉ์‹์˜ ์Šคํ„ฐ๋””๋ฅผ ํ”Œ๋žซํผํ™”ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์— ์˜คํ”ˆ ์นด์นด์˜คํ†ก๊ณผ ๋…ธ์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง„ํ–‰๋˜๋˜ ์Šคํ„ฐ๋””๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ”Œ๋žซํผ์—์„œ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์˜ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค.

์„œ๋ธŒ๋„๋ฉ”์ธ

์ด ๊ณผ์ œ ํ”„๋กœ์ ํŠธ์— ํฌํ•จ๋œ ์„œ๋ธŒ๋„๋ฉ”์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํšŒ์› (member)
    • ์ธ์ฆ/์ธ๊ฐ€ (auth)
    • ํšŒ์› (member)
    • ํšŒ์› ํ”„๋กœํ•„ (member profile)
  • ์ด๋ฏธ์ง€ (image)
  • ์นดํ…Œ๊ณ ๋ฆฌ (category)
    • ๊ธฐ์ˆ ์Šคํƒ (tech stack)

๋ถ€๊ฐ€์„ค๋ช…

  • StudySubject: ์Šคํ„ฐ๋”” ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ํšŒ์›์ด ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ๋˜ ์Šคํ„ฐ๋””ํ•˜๋ ค๋Š” ์ฃผ์ œ๋ฅผ ์ผ์ปซ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ CS, ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ์—”๋“œ ์„ธ ๊ฐ€์ง€ ์ฃผ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ์›์€ ์ด ์„ธ ๊ฐ€์ง€ ์ฃผ์ œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • MemberInterest: ํšŒ์›์˜ ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค. ํšŒ์›์ด ์ž„์˜๋กœ ์ž์‹ ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • AvailableStudyTime: ์Šคํ„ฐ๋”” ๊ฐ€๋Šฅ ์‹œ๊ฐ„๋Œ€์ž…๋‹ˆ๋‹ค. ๊ฐ ์Šคํ„ฐ๋”” ์ฐธ์—ฌ์ž๋“ค์ด ๋ฉด์ ‘์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„๋Œ€๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” 6๊ฐ€์ง€์˜ ์Šคํ„ฐ๋”” ๊ฐ€๋Šฅ ์‹œ๊ฐ„๋Œ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. base_record.sql์— ์ •์˜๋œ available_study_time INSERT๋ฌธ์„ ๋ณด์‹œ๋ฉด ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์‹œ๋ฆฌ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • SocialMedia: ํšŒ์›์€ ์ž์‹ ์˜ GitHub, ํ˜น์€ ๋ธ”๋กœ๊ทธ ๋“ฑ์˜ ์†Œ์…œ ๋ฏธ๋””์–ด ๋งํฌ๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SocialMedia๋Š” ๊ฐ ํšŒ์›์ด ์„œ๋น„์Šค์— ํ‘œ์‹œํ•œ ์ž์‹ ์˜ SNS ๋งํฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ์„ธํŒ…

JDK

  • Java 21

  • Amazon Corretto

  • Amazon Corretto๋ฅผ ์ฑ„ํƒํ•œ ์ด์œ 

    • AWS์— ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— AWS์—์„œ ์žฅ๊ธฐ ์—…๋ฐ์ดํŠธ ์ง€์›์„ ์ œ๊ณตํ•ด ์ฃผ๋Š” Amazon Corretto ๋ฐฐํฌํŒ์„ ์ฑ„ํƒ

    Amazon Corretto FAQ

Container Images

JDK

  • amazoncorreto:21

Database

  • mariadb:10.11

  • MariaDB๋ฅผ Docker๋กœ ์‹คํ–‰ํ•˜๊ธฐ

    docker run --name ${์„ค์ •ํ•˜๊ณ  ์‹ถ์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„} -d -p 3306:3306 -e MARIADB_ROOT_PASSWORD=${๋ฃจํŠธ ์œ ์ € ํŒจ์Šค์›Œ๋“œ} -e MARIADB_DATABASE=${๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„} -e MARIADB_USER=${์œ ์ € ์ด๋ฆ„} -e MARIADB_PASSWORD=${๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ์œ ์ €์˜ ํŒจ์Šค์›Œ๋“œ} mariadb:10.11

    ๋ณผ๋ฅจ/๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋ฅผ ํ™œ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ /docker-entrypoint-initdb.d ๊ฒฝ๋กœ์— ์ดˆ๊ธฐํ™” DDL ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์œ„์น˜์‹œํ‚ด์œผ๋กœ์จ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ์ ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ํ›„, DDL๋ฌธ์„ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์‹œ๊ณ , base_record.sql์„ ์‹คํ–‰ํ•˜์—ฌ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ์ค๋‹ˆ๋‹ค.

Environment Variable

ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” Spring configuration ํŒŒ์ผ์˜ property์— ๋Œ€์ž…๋ฉ๋‹ˆ๋‹ค (application.yml). ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์„ธํŒ…๋ผ ์žˆ์ง€ ์•Š๋”๋ผ๋„ ๊ธฐ๋ณธ๊ฐ’์ด ์„ธํŒ…๋ผ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์—†๋”๋ผ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ •์ƒ ์ž‘๋™๋ฉ๋‹ˆ๋‹ค.

Name ์„ค๋ช… Example value Required on profile (v2 ์ถ”๊ฐ€) Default (v2 ์ถ”๊ฐ€)
DB_URL ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ URL์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ Example value์—์„œ localhost์™€ zto_local_core ๋ถ€๋ถ„์„ ์ ์ ˆํ•˜๊ฒŒ ๋ฐ”๊พธ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. (๋กœ์ปฌ DB๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ) jdbc:mariadb://localhost:3306/zto_local_core?createDatabaseIfNotExist=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 jdbc:mariadb://localhost:3306/zto_local_core?createDatabaseIfNotExist=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
DB_USERNAME ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ ์ €์˜ ์•„์ด๋””์ž…๋‹ˆ๋‹ค. user root
DB_PASSWORD ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ ์ €์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. secret root
GOOGLE_CLIENT_ID ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์šฉ Client ID์ž…๋‹ˆ๋‹ค. qa.test, prod
GOOGLE_CLIENT_SECRET ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์šฉ Client Secret์ž…๋‹ˆ๋‹ค. qa.test, prod
KAKAO_CLIENT_ID ์นด์นด์˜ค ๋กœ๊ทธ์ธ์šฉ Client ID์ž…๋‹ˆ๋‹ค. qa.test, prod
SERVER_ORIGIN ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ์˜ค๋ฆฌ์ง„์ž…๋‹ˆ๋‹ค. scheme, domain, port๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. http://localhost:8080 http://localhost:8080
CLIENT_ORIGIN ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„์˜ ์˜ค๋ฆฌ์ง„์ž…๋‹ˆ๋‹ค. ์†Œ์…œ ๋กœ๊ทธ์ธ ์‹œ ํ”„๋ก ํŠธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋“ฑ์˜ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ ์„œ๋ฒ„๊ฐ€ localhost์—์„œ 3000๋ฒˆ ํฌํŠธ์—์„œ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋‹ค๋ฉด CLIENT_ORIGIN ๊ฐ’์€ http://localhost:3000์ด ๋ฉ๋‹ˆ๋‹ค. http://localhost:3000 http://localhost:3000
CLIENT_DOMAIN ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ์ž…๋‹ˆ๋‹ค. ์ฟ ํ‚ค์˜ ๋„๋ฉ”์ธ ๊ฐ’์„ ์„ธํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„๊ฐ€ localhost์—์„œ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋‹ค๋ฉด, CLIENT_DOMAIN์˜ ๊ฐ’์€ localhost๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„๊ฐ€ test.zeroone.it.kr:3000์—์„œ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋‹ค๋ฉด, CLIENT_DOMAIN์˜ ๊ฐ’์€ zeroone.it.kr์ด ๋ฉ๋‹ˆ๋‹ค. localhost localhost
SPRING_PROFILES_ACTIVE ํ™œ์„ฑํ™”ํ•  Spring Profile์„ ๋ช…์‹œํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. qa.test default
STATIC_RESOURCE_PATH ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๋“ฑ์„ ์—…๋กœ๋“œํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. none์ผ ๊ฒฝ์šฐ, ์ •์  ์ฝ˜ํ…์ธ  ์—…๋กœ๋“œ ์‹œ classpath:/static ์•„๋ž˜์— ์ฝ˜ํ…์ธ ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. /app/app-resource none

๋ฌธ์„œ ์ผ๋žŒ

Auth

์ธ์ฆ/์ธ๊ฐ€ ๊ธฐ๋Šฅ์€ no-auth Profile์„ ํ™œ์„ฑํ™”ํ•จ์œผ๋กœ์จ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆ/์ธ๊ฐ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ ‘๊ทผ์ด ์ œํ•œ๋œ ์—”๋“œํฌ์ธํŠธ์— ์ ‘๊ทผํ•  ๋•Œ Authorization ํ—ค๋”์— Bearer ํ† ํฐ์„ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Postman์„ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒŒ ํŽธํ•  ๊ฒ๋‹ˆ๋‹ค. qa.test, prod Profile์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด JSON ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ €ํฌ ํ”„๋กœ์ ํŠธ ์‚ฌ์ •์ƒ OAuth 2.0 API ํ‚ค๋ฅผ ์ œ๊ณตํ•ด ๋“œ๋ฆฌ๊ธฐ ์–ด๋ ค์šธ ๋“ฏํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” JSON ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ์ฃผ์„ธ์š”. JSON ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํฌ์ŠคํŠธ๋งจ ๋“ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ, Authorization ํ—ค๋”์— {"id": "123"} ์ด๋Ÿฐ ์‹์œผ๋กœ JSON ํ˜•์‹์˜ ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, JSON ํ† ํฐ์˜ id ํ”„๋กœํผํ‹ฐ๋Š” memberId๊ฐ€ ์•„๋‹Œ oidcId์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. oidcId์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜ ERD ์„น์…˜์—์„œ member ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”. ํ˜น์€ OAuth 2.0 ๊ฐ€์ด๋“œ ๋ฌธ์„œ๋ฅผ ๋ณด์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. OAuth 2.0 ๊ฐ€์ด๋“œ ๋ฌธ์„œ์— JSON ํ† ํฐ์— ๋Œ€ํ•œ ์„ค๋ช…๋„ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜น์€, ์ž„์˜๋กœ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํ˜น์€ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ API ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API ํ‚ค๋ฅผ ๋”ฐ๋กœ ๋ฐœ๊ธ‰๋ฐ›์œผ๋ฉด ํ•ด๋‹น API ํ‚ค๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์„ธํŒ…ํ•˜์‹œ๊ณ  (ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์œ„์— ๋‚˜ํƒ€๋‚œ ์„ค๋ช…์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”) Spring Profile ์ค‘ qa.test ํ˜น์€ prod๋ฅผ ํ™œ์„ฑํ™”ํ•ด ์ฃผ์„ธ์š”. ์›ฌ๋งŒํ•˜๋ฉด qa.test๋ฅผ ํ™œ์„ฑํ™”ํ•ด ์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค (prod๋Š” ์•„์ง ๊ฒ€์ฆ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค).

ERD

Copy of code zero to one ERD.png

ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š” ํ…Œ์ด๋ธ”๊ณผ ์นผ๋Ÿผ๋งŒ ์ทจ์‚ฌ์„ ํƒํ•ด์„œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

member

ํšŒ์› ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.

  • oidc_id
    • ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ•  ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • OAuth 2.0 Authorization ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ํšŒ์› ๊ณ ์œ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • login_id
    • ์ €ํฌ ์„œ๋น„์Šค ์ž์ฒด ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์—์„œ ์œ ํšจํ•œ ์นผ๋Ÿผ์ž…๋‹ˆ๋‹ค.
    • ์ง€๊ธˆ ์ €ํฌ ์„œ๋น„์Šค๋Š” ์ž์ฒด ๋กœ๊ทธ์ธ์ด ์—†์œผ๋ฏ€๋กœ, ์ง€๊ธˆ์€ ์˜๋ฏธ ์—†๋Š” ์นผ๋Ÿผ์ž…๋‹ˆ๋‹ค.
  • deleted_at
    • ํšŒ์›์ด ์‚ญ์ œ๋œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
    • deleted_at์ด NULL์ผ ๊ฒฝ์šฐ, ์‚ญ์ œ๋˜์ง€ ์•Š์€ ํšŒ์›์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

access_permission

์ ‘๊ทผํ—ˆ๊ฐ€ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ ‘๊ทผ์„ ํ—ˆ๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ์™€ HTTP ๋ฉ”์†Œ๋“œ๋Š” ์ด ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • endpoint
    • ์ ‘๊ทผํ—ˆ๊ฐ€๋ฅผ ์ •์˜ํ•  ์—”๋“œํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.
  • http_method
    • HTTP ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.
    • GET, POST, PATCH, PUT, DELETE, ...

access_permission_role

access_permission ํ…Œ์ด๋ธ”๊ณผ role ํ…Œ์ด๋ธ”์˜ ์—ฐ๊ด€ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.

member_profile

ํšŒ์› ํ”„๋กœํ•„ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ํšŒ์› ํ…Œ์ด๋ธ”๊ณผ ์—ญํ• ์ด ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํšŒ์› ํ…Œ์ด๋ธ”์ด ํšŒ์›์˜ ๊ถŒํ•œ, ๋กœ๊ทธ์ธ ์ •๋ณด ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š”๋‹ค๋ฉด, ํšŒ์› ํ”„๋กœํ•„ ํ…Œ์ด๋ธ”์€ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€, ์ž๊ธฐ์†Œ๊ฐœ, ์—ฐ๋ฝ์ฒ˜, ์ด๋ฆ„ ๋“ฑ ํšŒ์› ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • member_id
    • member ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” FK์ด์ž, member_profile ํ…Œ์ด๋ธ”์˜ PK์ž…๋‹ˆ๋‹ค. member_profile ํ…Œ์ด๋ธ”๊ณผ member ํ…Œ์ด๋ธ”์€ ์‹๋ณ„ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

available_study_time

์Šคํ„ฐ๋”” ๊ฐ€๋Šฅ ์‹œ๊ฐ„๋Œ€์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด 6๊ฐœ์˜ ์‹œ๊ฐ„๋Œ€๊ฐ€ ์žˆ๊ณ , ํšŒ์›๋“ค์€ 6๊ฐœ์˜ ์‹œ๊ฐ„๋Œ€ ์ค‘ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ member_profile ํ…Œ์ด๋ธ”๊ณผ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ๋งบ์Šต๋‹ˆ๋‹ค.

  • label
    • "์˜ค์ „", "์˜คํ›„", "์ €๋…", "์‹ฌ์•ผ" ๋“ฑ ๊ฐ ์‹œ๊ฐ„๋Œ€์˜ ๋ ˆ์ด๋ธ”์ž…๋‹ˆ๋‹ค.

member_interest

ํšŒ์›์˜ ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค. ๊ด€์‹ฌ์‚ฌ๋Š” ํšŒ์›์ด ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

social_media

ํšŒ์›์˜ SNS, ๋ธ”๋กœ๊ทธ ๋“ฑ ์†Œ์…œ ๋ฏธ๋””์–ด์ž…๋‹ˆ๋‹ค. ํ•œ ๋ช…์˜ ํšŒ์›์€ ๋ธ”๋กœ๊ทธ๋‚˜ SNS, GitHub ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์†Œ์…œ ๋ฏธ๋””์–ด ๋งํฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

social_media_type

ํšŒ์›์ด ๋“ฑ๋กํ•œ ์†Œ์…œ ๋ฏธ๋””์–ด์˜ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. GitHub, ๋ธ”๋กœ๊ทธ/SNS ๋“ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

์ด๋ฏธ์ง€ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋œ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ์‹ค์ œ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋Š” resized_image ํ…Œ์ด๋ธ”์— ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.

  • location
    • ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋œ ์œ„์น˜์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ, ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋œ ์„œ๋ฒ„ ๋„๋ฉ”์ธ์ด ๋‹ด๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ex) http://localhost:8080, https://aws.s3.com (S3 ๊ฒฝ๋กœ๊ฐ€ ์–ด๋–ค ์‹์ด์—ˆ๋Š”์ง€ ๊ธฐ์–ต ์•ˆ ๋‚˜๋„ค์š”), sftp://some.fileserver.com
    • ๊ฐ ๊ฐ’์€ /๋กœ ๋๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

resized_image

๋ฆฌ์‚ฌ์ด์ง• ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๊ณ , ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • image_size_type
    • ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ์˜ ํƒ€์ž…์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ํฌ๊ธฐ, ์ด๋ฏธ์ง€ ๋น„์œจ ๋“ฑ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ ํƒ€์ž…์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์•„์ง ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—, ORIGINAL ๊ฐ’๋งŒ ๊ฐ–์Šต๋‹ˆ๋‹ค.

๋งบ์Œ๋ง

ํ™”์ดํŒ…! ์ฆ๊ฒ๊ฒŒ ํ•ฉ์‹œ๋‹ค :)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages