Skip to content

๐Ÿง ์ทจ์—… ๋งค์นญ ์„œ๋น„์Šค hirehigher - ํ•œ๊ตญ์—์„œ์˜ ์‹œ์ž‘์„ ๋” ๋†’์ด

Notifications You must be signed in to change notification settings

kakao-tech-campus-2nd-step3/Team18_BE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation


์™ธ๊ตญ์ธ ๊ทผ๋กœ์ž ์ทจ์—… ๋งค์นญ ์„œ๋น„์Šค : Hire Higher ๐Ÿง

ํ•œ๊ตญ์—์„œ์˜ ์‹œ์ž‘์„ ๋” ๋†’์ด!



๐Ÿช ๊ฐœ์š”

  • 2024 ์นด์นด์˜ค ํ…Œํฌ ์บ ํผ์Šค 2๊ธฐ ์ถฉ๋‚จ๋Œ€ 18์กฐ ๋‚ด๊ฐ€๋จน์€์ฟ ํ‚ค ํŒ€์˜ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ : 2024๋…„ 9์›” 2์ผ ~ 2024๋…„ 11์›” 15์ผ

โš™ ๊ธฐ์ˆ ์Šคํƒ

stackticon stackticon


๐Ÿ‘‹ ํŒ€ ์†Œ๊ฐœ

๊ฐ•๋ณ‘ํ˜„ ๊น€์ง€์•ˆ ์ด์šฉ์ง„ ์ž„์„ธ๋นˆ ๊น€๋ฏผ์ง€ ๋ฐฐ๋ฏผ์ˆ˜ ์ดํƒ ์ด์€๊ฒฝ
@kang-kibong @KimJi-An @tteokbokki-master @YIMSEBIN @alsswl @minsu-cnu @LeeTaek2T @pkyung
Front-end Front-end Front-end Front-end Back-end Back-end Back-end Back-end

ํ”„๋ก ํŠธ์—”๋“œ 4์ธ, ๋ฐฑ์—”๋“œ 4์ธ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ 8์ธ ํŒ€ ๋‚ด๊ฐ€๋จน์€์ฟ ํ‚ค ์ž…๋‹ˆ๋‹ค.



๐Ÿง Hire Higher

Hire higher๋Š” ์™ธ๊ตญ์ธ ๊ทผ๋กœ์ž์™€ ๊ณ ์šฉ์ฃผ ๊ฐ„์˜ ์•ˆ์ „ํ•œ ์ฑ„์šฉ ๊ณ„์•ฝ์„ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

  • ํƒ€๊ฒŸ ์‚ฌ์šฉ์ž : ์™ธ๊ตญ์ธ ๋…ธ๋™์ž๋ฅผ ๊ตฌ์ธํ•˜๋Š” '๊ณ ์šฉ์ฃผ' / ํ•œ๊ตญ์—์„œ ์ผ์„ ํ•˜๊ธฐ ์›ํ•˜๋Š” '์™ธ๊ตญ์ธ ๋…ธ๋™์ž'
  • ๋‹ค๊ตญ์–ด ํ‘œ์ค€ ๊ทผ๋กœ๊ณ„์•ฝ์„œ, ์„œ๋ช… ์‹œ์Šคํ…œ, ๋น„์ž ๋“ฑ๋ก ๋ฐ ๊ฒ€์ฆ ์‹œ์Šคํ…œ์„ ํ†ตํ•œ ์–‘์ธก์˜ ์‹ ๋ขฐ์„ฑ ํ™•๋ณด๊ฐ€ Hire Higher์˜ ์ฃผ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ญ ์„œ๋น„์Šค ๊ธฐํš ์˜๋„

ํ•œ๊ตญ์—์„œ ์ผํ•˜๋Š” ์™ธ๊ตญ์ธ ๋…ธ๋™์ž๋Š”, ๊ทผ๋กœ์˜ ์ „ ๊ณผ์ •์—์„œ ๋ถˆ๋ฆฌํ•จ์„ ๋Š๋ผ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

ํ•œ๊ตญ์—์„œ ์™ธ๊ตญ์ธ ๋…ธ๋™์ž๋ฅผ ๊ณ ์šฉํ•˜๋ ค๋Š” ์‚ฌ์—…์ฃผ๋Š” ์™ธ๊ตญ์ธ ๋…ธ๋™์ž๋ฅผ ์‰ฝ๊ฒŒ ๊ณ ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์™ธ๊ตญ์ธ์„ ๊ณ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•œ๊ตญ์ธ์˜ ์‹ ๋ถ„์„ ๊ฒ€์ฆํ•  ๋•Œ์™€ ๋‹ค๋ฅธ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผํ•˜๊ณ , ๋•Œ๋ฌธ์— ํ•ด์™ธ ๋…ธ๋™ ๊ทผ๋กœ์ž์—๊ฒŒ ์‹ ๋ขฐ์„ฑ์„ ๋Š๋ผ๊ธฐ๊ฐ€ ๋น„๊ต์  ์–ด๋ ต์Šต๋‹ˆ๋‹ค.


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



๐Ÿ”— Link

๊ฐœ๋ฐœ ๋ฌธ์„œ

โœจ ์ตœ์ข… ๊ธฐํš์•ˆ ๐Ÿ“– API ๋ฌธ์„œ ๐Ÿ–Š ์ฝ”๋“œ ์ปจ๋ฒค์…˜ โœ‰ ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ ๐Ÿ“ข ์ด์Šˆ ์ŠคํŽ˜์ด์Šค

ํŒ€ ์ŠคํŽ˜์ด์Šค

๐Ÿ  ๋…ธ์…˜ ํŒ€ ์ŠคํŽ˜์ด์Šค ๐Ÿช ์นดํ…Œ์บ  ์ŠคํŽ˜์ด์Šค ๐ŸŽจ ํ”ผ๊ทธ๋งˆ




โš™๏ธย ์ „์ฒด ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

แ„‹แ…กแ„แ…ตแ„แ…ฆแ†จแ„Žแ…ฅ



๐Ÿ”จ ERD

ERD




๐Ÿ“ƒ ์ฃผ์š”๊ธฐ๋Šฅ ์†Œ๊ฐœ

1. ๊ณตํ†ต (์‚ฌ์—…์ฃผ/๊ทผ๋กœ์ž) ํ™ˆํŽ˜์ด์ง€

1.1. ๋ฉ”์ธ ํŽ˜์ด์ง€

์‚ฌ์šฉ์ž๋Š” ๋ฉ”์ธํŽ˜์ด์ง€์—์„œ ๊ตฌ์ธ๊ธ€ ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฏธ๊ฐ€์ž… ์‚ฌ์šฉ์ž ๋ฐ ๊ทผ๋กœ์ž๋Š” ์™ผ์ชฝ ์‚ฌ์ง„, ๊ณ ์šฉ์ฃผ๋Š” ์˜ค๋ฅธ์ชฝ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ๋ฉ”์ธํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ์šฉ์ฃผ๋กœ ๋กœ๊ทธ์ธํ•œ ๊ฒฝ์šฐ ๋ฐฐ๋„ˆ๋ฅผ ํ†ตํ•ด ๊ณต๊ณ ๊ธ€ ๋“ฑ๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต๊ณ ๊ธ€ ๋ชฉ๋ก ์šฐ์ธก ์ƒ๋‹จ์˜ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด '์ตœ์‹ ์ˆœ / ๊ธ‰์—ฌ ๋งŽ์€ ์ˆœ'์œผ๋กœ ๊ณต๊ณ ๊ธ€์„ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
home ์„ ํƒ



1.2. ํ•œ๊ตญ์–ด/๋ฒ ํŠธ๋‚จ ๋ฒˆ์—ญ ๊ธฐ๋Šฅ

์‚ฌ์šฉ์ž๋Š” ํ—ค๋”์— ์œ„์น˜ํ•œ ๋ฒˆ์—ญ ์˜ต์…˜์„ ์ด์šฉํ•˜์—ฌ ํ•œ๊ตญ์–ด ๋˜๋Š” ๋ฒ ํŠธ๋‚จ์–ด๋กœ ํŽ˜์ด์ง€๋ฅผ ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‡แ…ฅแ†ซแ„‹แ…งแ†จ



1.3. ๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ

์‚ฌ์šฉ์ž๋Š” ๋ณธ์ธ์˜ Google ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ๋ฐ ๊ฐ€์ž…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋น„์Šค์— ์ฒ˜์Œ ๊ฐ€์ž…ํ•œ ๊ฒฝ์šฐ ๊ณ ์šฉ์ฃผ ํ˜น์€ ๊ทผ๋กœ์ž ์—ญํ• ์„ ์„ ํƒํ•จ์œผ๋กœ์จ ๊ฐ€์ž…์ ˆ์ฐจ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ถ”ํ›„ ๋งˆ์ดํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์—ญํ• ์— ๋งž๋Š” ๋งˆ์ดํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด์— ๊ฐ€์ž…ํ•œ ์‚ฌ์šฉ์ž๋Š” ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜๋ฉฐ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
๋กœ๊ทธ์ธ ์„ ํƒ



1.4. ๊ตฌ์ธ๊ธ€ ์ƒ์„ธ

์‚ฌ์šฉ์ž๋Š” ๊ณ ์šฉ์ฃผ๋“ค์ด ๋“ฑ๋กํ•œ ๊ตฌ์ธ๊ธ€์˜ ์ƒ์„ธ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทผ๋กœ์ž๋Š” '์ง€์›ํ•˜๊ธฐ'๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ํ•ด๋‹น ๊ณต๊ณ ๊ธ€์— ๋Œ€ํ•œ ์ง€์›์„œ ์ž‘์„ฑ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
recruitDetail




2. ๊ณ ์šฉ์ฃผ ๊ธฐ์ค€

2.1. ํšŒ์‚ฌ ๋“ฑ๋ก

๊ณ ์šฉ์ฃผ๋Š” ๋ณธ์ธ์ด ์šด์˜ํ•˜๋Š” ํšŒ์‚ฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํšŒ์‚ฌ ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ž…๋ ฅ์€ ์„ ํƒ์ด๋ฉฐ, ๊ทธ ์™ธ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  ์ œ์ถœ ์‹œ ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ์ œ์ถœ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ '์ •๋ง ์ œ์ถœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?' ํŒ์—…์˜ ์ œ์ถœ ๋ฒ„ํŠผ์„ ํ•œ๋ฒˆ ๋” ํด๋ฆญํ•ด์•ผ ์ œ์ถœ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
แ„’แ…ฌแ„‰แ…กแ„ƒแ…ณแ†ผแ„…แ…ฉแ†จ



2.2. ๊ตฌ์ธ๊ธ€ ๋“ฑ๋ก

ํšŒ์‚ฌ ๋“ฑ๋ก ์ดํ›„, ๊ณ ์šฉ์ฃผ๋Š” ๋ณธ์ธ์ด ๋“ฑ๋กํ•œ ํšŒ์‚ฌ์— ๋Œ€ํ•œ ๊ตฌ์ธ๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  ์ œ์ถœ ์‹œ ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ์ œ์ถœ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ '์ •๋ง ์ œ์ถœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?' ํŒ์—…์˜ ์ œ์ถœ ๋ฒ„ํŠผ์„ ํ•œ๋ฒˆ ๋” ํด๋ฆญํ•ด์•ผ ์ œ์ถœ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • ๋“ฑ๋กํ•œ ๊ตฌ์ธ๊ธ€์€ ํ™ˆํŽ˜์ด์ง€ ๋ฉ”์ธ ํ™”๋ฉด์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
แ„€แ…ฎแ„‹แ…ตแ†ซแ„ƒแ…ณแ†ผแ„…แ…ฉแ†จ



2.3. ๋งˆ์ดํŽ˜์ด์ง€, ๋“ฑ๋ก ํšŒ์‚ฌ ํ™•์ธ ๋ฐ ์ง€์›์ž ๋ชฉ๋ก ํ™•์ธ

๊ณ ์šฉ์ฃผ๋Š” ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ž์‹ ์˜ ํšŒ์‚ฌ ์ •๋ณด, ๊ตฌ์ธ๊ธ€ ์ •๋ณด, ์ง€์›์ž ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ํŠน์ • ํšŒ์‚ฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด, ํ•ด๋‹น ํšŒ์‚ฌ์— ๋Œ€ํ•œ ๊ตฌ์ธ๊ธ€ ๋ชฉ๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์ธ๊ธ€ ๋ชฉ๋ก ์ค‘ ํŠน์ • ๊ตฌ์ธ๊ธ€์„ ํด๋ฆญํ•˜๋ฉด, ํ•ด๋‹น ๊ตฌ์ธ๊ธ€์— ๋Œ€ํ•œ ์ง€์›์ž ๋ชฉ๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
แ„†แ…กแ„‹แ…ตแ„‘แ…ฆแ„‹แ…ตแ„Œแ…ต แ„’แ…ฌแ„‰แ…กแ„†แ…ฉแ†จแ„…แ…ฉแ†จ
๊ณ ์šฉ์ฃผ ๋งˆ์ดํŽ˜์ด์ง€ ์ง€์›์ž ๋ชฉ๋ก ํ™•์ธ



2.4. ์ด๋ ฅ์„œ ๋ฐ ์ง€์›์„œ ํ™•์ธ

  • ์ง€์›์ž ๋ชฉ๋ก ํŽ˜์ด์ง€์—์„œ ๊ฐ ์ง€์›์ž์— ๋Œ€ํ•œ ์ง€์›์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ์šฉ์ฃผ๊ฐ€ ์ฑ„์šฉ์„ ์›ํ•˜๋Š” ์ง€์›์ž์— ๋Œ€ํ•ด '๊ณ„์•ฝํ•˜๊ธฐ'๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ํ•ด๋‹น ์ง€์›์ž์™€์˜ ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
แ„Œแ…ตแ„‹แ…ฏแ†ซแ„‰แ…ฅแ„’แ…ชแ†จแ„‹แ…ตแ†ซ1 แ„Œแ…ตแ„‹แ…ฏแ†ซแ„‰แ…ฅแ„’แ…ชแ†จแ„‹แ…ตแ†ซ2
์ „์ฒด ํ™”๋ฉด ์ด๋ ฅ์„œ ๋ฐ ์ง€์›์„œ ํ™•์ธ ํ™•์ธ



2.5. ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ž‘์„ฑ

  • ๊ณ ์šฉ์ฃผ๊ฐ€ '๊ณ„์•ฝํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํ›„ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ž‘์„ฑ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ ์šฉ์ฃผ๋Š” ๊ณ„์•ฝ์„œ ์ž‘์„ฑ ์ „ ์ฃผ์˜์‚ฌํ•ญ ๋ชจ๋‹ฌ์„ ํ†ตํ•ด ์ง€์›์ž์˜ ์™ธ๊ตญ์ธ ๋“ฑ๋ก๋ฒˆํ˜ธ์™€ ๋น„์ž ๋ฐœ๊ธ‰์ผ์ž๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์˜์‚ฌํ•ญ ๋ชจ๋‹ฌ์—์„œ๋Š” Hi Korea ํ•˜์ดํผ๋งํฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ํ•ด๋‹น ์‚ฌ์ดํŠธ์—์„œ ์œ„ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ๊ทผ๋กœ์ž์˜ ์™ธ๊ตญ์ธ ๋“ฑ๋ก๋ฒˆํ˜ธ ๋ฐ ๋น„์ž ๋ฐœ๊ธ‰์ผ์ž ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ์šฉ์ฃผ๊ฐ€ ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์„œ๋ช…ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ •์ƒ ์ œ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด, ๊ทผ๋กœ์ž๋Š” ๋ณธ์ธ์˜ ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ํ•ด๋‹น ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 3.3 ๋‹จ๊ณ„์™€ ๊ฐ™์ด ๊ทผ๋กœ์ž๊ฐ€ ๊ณ„์•ฝ์„œ์— ์„œ๋ช…์„ ์™„๋ฃŒํ•˜๋ฉด ์ฑ„์šฉ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
แ„€แ…ณแ†ซแ„…แ…ฉ๊ณ„์•ฝ์„œ์•ˆ๋‚ด แ„€แ…ณแ†ซแ„…แ…ฉ๊ณ„์•ฝ์„œ
๊ณ ์šฉ์ฃผ ์ฃผ์˜์‚ฌํ•ญ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ž‘์„ฑ




3. ๊ทผ๋กœ์ž ๊ธฐ์ค€

3.1. ์ด๋ ฅ์„œ ๋ฐ ๊ฐœ์ธ์ •๋ณด ๋“ฑ๋ก

๊ทผ๋กœ์ž๋Š” ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ด๋ ฅ์„œ / ์„œ๋ช… / ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ ๋ฐ ๋น„์ž๋ฐœ๊ธ‰์ผ์ž ๋“ฑ๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทผ๋กœ์ž๊ฐ€ ๊ณต๊ณ  ์ง€์›์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ์œ„ 3๊ฐ€์ง€ ์ •๋ณด ๋“ฑ๋ก์„ ๋งˆ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋“ฑ๋ก์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋งˆ์ดํŽ˜์ด์ง€์˜ ์ด๋ ฅ์„œ / ์„œ๋ช… / ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ ๋ฐ ๋น„์ž๋ฐœ๊ธ‰์ผ์ž ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™” ๋˜๋ฉฐ, ๋“ฑ๋กํ•œ ๊ฒฝ์šฐ ์•„์ด์ฝ˜์ด ์ฒดํฌํ‘œ์‹œ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉฐ ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
แ„‹แ…ตแ„…แ…งแ†จแ„‰แ…ฅ แ„‰แ…กแ„‹แ…ตแ†ซแ„ƒแ…ณแ†ผแ„…แ…ฉแ†จ แ„‡แ…ตแ„Œแ…กแ„ƒแ…ณแ†ผแ„…แ…ฉแ†จ
์ด๋ ฅ์„œ ๋“ฑ๋ก ์‚ฌ์ธ ๋“ฑ๋ก ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ ๋ฐ ๋น„์ž๋ฐœ๊ธ‰ ์ผ์ž ๋“ฑ๋ก



3.2. ์ง€์›์„œ ์ž‘์„ฑ

๊ทผ๋กœ์ž๋Š” ํŠน์ • ๊ณต๊ณ ๊ธ€์— ๋Œ€ํ•ด ์ง€์›์„œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทผ๋กœ์ž๊ฐ€ ๊ณต๊ณ ๊ธ€์˜ '์ง€์›ํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋จผ์ € ์ฑ„์šฉ ์ „๋ฐ˜์— ๋Œ€ํ•œ ์•ˆ๋‚ด๋ฌธ๊ตฌ, ํŠนํžˆ ๊ทผ๋กœ๊ณ„์•ฝ์„œ์— ๋Œ€ํ•œ ์ฃผ์˜์‚ฌํ•ญ์„ ๋‹ด์€ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทผ๋กœ์ž๊ฐ€ '์ง€์›์„œ ์ž‘์„ฑํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ง€์›์„œ ์ž‘์„ฑ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
แ„‘แ…ณแ„…แ…ฉแ„‰แ…ฆแ„‰แ…ณ แ„Œแ…ตแ„‹แ…ฏแ†ซแ„‰แ…ฅ
์ง€์› ํ”„๋กœ์„ธ์Šค ์ง€์›์„œ ์ž‘์„ฑ



3.3. ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ง€์› ํ˜„ํ™ฉ ํ™•์ธ

๊ทผ๋กœ์ž๋Š” ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ž์‹ ์ด ์ง€์›ํ•œ ๊ณต๊ณ ์— ๋Œ€ํ•œ ํ˜„ํ™ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทผ๋กœ์ž๊ฐ€ ์ง€์›ํ•œ ์ดํ›„, ํ˜„ํ™ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฒ„ํŠผ์€ ์ด 3๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ๋ณ€ํ™”ํ•ฉ๋‹ˆ๋‹ค. [์ง€์›์„œ ๊ฒ€ํ† ์ค‘] -> ๊ณ ์šฉ์ฃผ๊ฐ€ ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ ์ž‘์„ฑํ•จ -> [๊ทผ๋กœ๊ณ„์•ฝ์„œ ์„œ๋ช…ํ•˜๊ธฐ] -> [๊ทผ๋กœ๊ณ„์•ฝ์„œ ๋‹ค์šด๋กœ๋“œ]
  • ๋งŒ์•ฝ ๊ณ ์šฉ์ฃผ๊ฐ€ ์ฑ„์šฉ์„ ํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์ธ๊ธ€์„ ๋งˆ๊ฐํ•œ๋‹ค๋ฉด [์ฑ„์šฉ ๋งˆ๊ฐ] ๋ฒ„ํŠผ์ด ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
แ„†แ…กแ„‹แ…ตแ„‘แ…ฆแ„‹แ…ตแ„Œแ…ต_แ„€แ…ณแ†ซแ„…แ…ฉแ„Œแ…ก



3.3. ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ž‘์„ฑ

๊ณ ์šฉ์ฃผ๊ฐ€ '๊ณ„์•ฝํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ž‘์„ฑ์„ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด, ๊ทผ๋กœ์ž๋Š” ํ•ด๋‹น ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทผ๋กœ์ž๊ฐ€ ์„œ๋ช… ํ›„ ์ œ์ถœํ•˜๋ฉด ์ฑ„์šฉ ๊ณผ์ •์ด ๋งˆ๋ฌด๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ดํ›„ ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ๋‹ค๊ตญ์–ด ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ ๋‹ค์šด๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
แ„‰แ…กแ†ผแ„แ…ข
แ„€แ…ณแ†ซแ„…แ…ฉ
๊ณ„์•ฝ์„œ




๐Ÿ”ฅ ๊ฐœ์ธ๋ณ„ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‚ฌํ•ญ

๊ฐ ํŒ€์› ๋ณ„ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•œ ๊ธฐ๋Šฅ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๊น€๋ฏผ์ง€_BE

๊ธฐ๋Šฅ ์ƒ์„ธ ๋‚ด์šฉ ๊ตฌํ˜„๋ฐฉ๋ฒ•
๊ตฌ์ธ๊ธ€ ์ €์žฅ ๊ณ ์šฉ์ฃผ๊ฐ€ ๊ตฌ์ธ๊ธ€์„ ์ €์žฅํ•˜๋ฉด, ๊ตฌ์ธ๊ธ€ ๋‚ด์˜ ์ •๋ณด๋“ค์„ ai๋ฅผ ํ†ตํ•ด์„œ ์š”์•ฝํ•œ ํ›„, ์ด ๋‚ด์šฉ๊ณผ ๊ตฌ์ธ๊ธ€์˜ ์ œ๋ชฉ์„ ๋ฒ ํŠธ๋‚จ์–ด๋กœ ๋ฒˆ์—ญํ•˜์—ฌ ํ…Œ์ด๋ธ”์— ์ €์žฅ RestTemplate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ openAi์— ํ•ด๋‹น ๋‚ด์šฉ์„ ์š”์ฒญํ•˜๊ณ , ์‘๋‹ต์œผ๋กœ ์˜ค๋Š” ๊ฐ’์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ €์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ตฌ์ธ๊ธ€ ๋ฐ˜ํ™˜ ๊ตฌ์ธ์ค‘์ธ ๋ชจ๋“  ๊ตฌ์ธ๊ธ€์„ ๋ฐ˜ํ™˜ ๊ตฌ์ธ๊ธ€ ๋‚ด์˜ ๊ตฌ์ธ ์—ฌ๋ถ€ ํ•„๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•„ํ„ฐ๋ง์„ ํ•œ ํ›„, DTO๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธํŽ˜์ด์ง€์— ํ‘œ์‹œ๋˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€๊ณตํ•ด์„œ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
๊ตฌ์ธ๊ธ€ ์ƒ์„ธ ์ •๋ณด ๋ฐ˜ํ™˜ RequestParam์— ๋“ค์–ด์žˆ๋Š” id์— ํ•ด๋‹นํ•˜๋Š” ๊ตฌ์ธ๊ธ€์˜ ์ƒ์„ธ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ ์š”์ฒญ๋ฐ›์€ id์— ํ•ด๋‹นํ•˜๋Š” ๊ตฌ์ธ๋“ค์„ ์กฐํšŒํ•˜์—ฌ, ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ํšŒ์‚ฌ๋ณ„ ๊ตฌ์ธ๊ธ€ ์กฐํšŒ RequestParam์— ๋“ค์–ด์žˆ๋Š” id์— ํ•ด๋‹นํ•˜๋Š” ํšŒ์‚ฌ๊ฐ€ ์ž‘์„ฑํ•œ ๊ตฌ์ธ๊ธ€์„ ๋ฐ˜ํ™˜ ๊ตฌ์ธ๊ธ€๊ณผ ํšŒ์‚ฌ๋Š” 1๋Œ€๋‹ค ๊ด€๊ณ„์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ํšŒ์‚ฌ ๊ฐ์ฒด๋ฅผ ์ฐพ์€ ํ›„ findByCompany ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ํšŒ์‚ฌ ๋ณ„ ๊ตฌ์ธ๊ธ€์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
์ตœ๊ทผ ๋“ฑ๋ก๋œ ๊ตฌ์ธ๊ธ€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ ๋ชจ๋“  ๊ตฌ์ธ๊ธ€์„ ์ตœ๊ทผ ๋“ฑ๋ก๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ JPA์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ findAllByHiringTrueOrderByUploadDateDesc ๋ฉ”์„œ๋“œ๋กœ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. HiringTrue๋Š” ๊ตฌ์ธ์ค‘์ธ ๊ตฌ์ธ๊ธ€์„ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด, OrderByUploadDateDesc๋Š” ์ตœ๊ทผ ๋“ฑ๋ก๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๊ธ‰์—ฌ๊ฐ€ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ ๋ชจ๋“  ๊ตฌ์ธ๊ธ€์„ ๊ธ‰์—ฌ๊ฐ€ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•˜์—ฌ ๋ฐ˜ํ™˜ JPA์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ findAllByHiringTrueOrderByUploadSalaryDesc ๋ฉ”์„œ๋“œ๋กœ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. HiringTrue๋Š” ๊ตฌ์ธ์ค‘์ธ ๊ตฌ์ธ๊ธ€์„ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด, OrderByUploadSalaryDesc๋Š” ๊ธ‰์—ฌ๊ฐ€ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๊ตฌ์ธ์ข…๋ฃŒ ๊ตฌ์ธ ์ข…๋ฃŒ api๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ํ•ด๋‹น ๊ตฌ์ธ๊ธ€์˜ ์ƒํƒœ๋ฅผ ๊ตฌ์ธ ๋งˆ๊ฐ์œผ๋กœ ๋ณ€๊ฒฝ ํ•ด๋‹น api๋กœ ๋“ค์–ด์˜จ id์— ํ•ด๋‹นํ•˜๋Š” ๊ตฌ์ธ๊ธ€์˜ hiring ํ•„๋“œ๋ฅผ false๋กœ ๋ฐ”๊พธ์–ด, ๊ตฌ์ธ๊ธ€์„ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•  ๋•Œ ํ•„ํ„ฐ๋ง ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ฅ์„œ ์ €์žฅ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ ฅ์„œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ด๋ฅผ ์ €์žฅ ์ด๋ ฅ์„œ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์š”์ฒญ๋˜๋ฉด ์ด๋ฅผ ์ด๋ ฅ์„œ Entity๋กœ ๋งŒ๋“ค์–ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž์˜ ์ด๋ ฅ์„œ ๋ฐ˜ํ™˜ ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์ด๋ ฅ์„œ ์ƒ์„ธ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ ํ•ด๋‹น ์‚ฌ์šฉ์ž๋กœ ์ด๋ ฅ์„œ๋ฅผ ์กฐํšŒํ•˜์—ฌ ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ณ ์šฉ์ฃผ๊ฐ€ ์ด๋ ฅ์„œ ์—ด๋žŒ ๊ณ ์šฉ์ฃผ๊ฐ€ ์ง€์›์ž์˜ ์ด๋ ฅ์„œ๋ฅผ ์—ด๋žŒํ•œ๋‹ค. ์ด ๋•Œ ํ•ด๋‹น ์ง€์›์ž์˜ ์ง€์›์„œ ๋‚ด์˜ ์ง€์›๋™๊ธฐ๋„ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ ์ด๋ ฅ์„œ์— ๋Œ€ํ•œ id์™€ ์ง€์›์— ๋Œ€ํ•œ id๋ฅผ ๋ฐ›๊ณ , ๊ฐ ํ•„๋“œ์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ถ”์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ํŠน์ • ์œ ์ €์˜ ์ด๋ ฅ์„œ ์กด์žฌ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜ ์‚ฌ์šฉ์ž์˜ ์ด๋ ฅ์„œ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์—๋Ÿฌ๋ฐ˜ํ™˜ ํ•ด๋‹น ์œ ์ €์˜ ์ด๋ ฅ์„œ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•œ ํ›„ ์กด์žฌํ•˜๋ฉด ResumeAlreadyExistException์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.




๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ๋ฐฐ๋ฏผ์ˆ˜_BE

๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์„ค๋ช…
ํ† ํฐ ๊ฒ€์ฆ Interceptor ์š”์ฒญ ํ—ค๋”์— ์žˆ๋Š” ์•ก์„ธ์Šค ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ์ธํ„ฐ์…‰ํ„ฐ ๊ตฌํ˜„ ์š”์ฒญ ํ—ค๋”์— ๋‹ด๊ฒจ์ ธ ์˜ค๋Š” ์•ก์„ธ์Šค ํ† ํฐ์— ๋Œ€ํ•ด, ๋งŒ๋ฃŒ ์—ฌ๋ถ€์™€ ์œ ์ € ์ •๋ณด ์กด์žฌ ์—ฌ๋ถ€, JWT ํ˜•์‹ ๊ฒ€์ฆ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์œ ํšจํ•  ์‹œ Argument Resolver๋กœ ์œ ์ € ID๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.
์œ ์ € ID DTO ๋งคํ•‘ Argument Resolver ์•ก์„ธ์Šค ํ† ํฐ ํŒŒ์‹ฑ ํ›„ ์–ป์€ ์œ ์ € ID๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜ DTO์— ๋งคํ•‘ํ•˜๋Š” Argument Resolver ๊ตฌํ˜„ ์ธํ„ฐ์…‰ํ„ฐ์—์„œ ๋„˜์–ด์˜จ ์œ ์ € ID๋ฅผ DTO ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” Argument Resolver๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊ตฌ๊ธ€ OAuth ๋กœ๊ทธ์ธ ๊ตฌ๊ธ€ OAuth ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ๋ฐ ์„œ๋น„์Šค ์ž์ฒด ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ตฌ๊ธ€ OAuth ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์‹ ๊ทœ ์‚ฌ์šฉ์ž์ธ ๊ฒฝ์šฐ ๊ตฌ๊ธ€ ๊ณ„์ • ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์œ ์ € ์—”ํ‹ฐํ‹ฐ๋กœ ์˜์†ํ™”ํ•˜์—ฌ ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ , ์œ ์ €์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‘๋‹ตํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์œ ํ˜• ๋“ฑ๋ก API ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๊ณ ์šฉ์ฃผ or ๊ทผ๋กœ์ž ์œ ํ˜• ๋“ฑ๋ก API ํ˜„ ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์œ ํ˜•์„ ์š”์ฒญ๋ฐ›์€(๊ณ ์šฉ์ฃผ or ๊ทผ๋กœ์ž) ์œ ํ˜•์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์Šฌ๋ผ์ด๋” API ๋ฉ”์ธ ํŽ˜์ด์ง€ ์Šฌ๋ผ์ด๋” ๋ฐฐ๋„ˆ ์ด๋ฏธ์ง€ API ๊ตฌํ˜„ ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ ์Šฌ๋ผ์ด๋” ๋ฐฐ๋„ˆ ์˜์—ญ์— ์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€๋ฅผ ์‘๋‹ตํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค๋Š” GCS์—์„œ ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
CORS ์„ค์ • ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ CORS ๊ด€๋ จ ์„ค์ • ํ”„๋ก ํŠธ๋‹จ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์˜ค๋Š” preflight ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š” ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ํŒจ์‹ฑํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€๊ณ , ํ—ˆ์šฉ ๋ฉ”์†Œ๋“œ์™€ ํ—ˆ์šฉ ํ—ค๋”์˜ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์ถ•์†Œํ•˜์—ฌ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
GCP ๋ฐฐํฌ Nginx ์›น ์„œ๋ฒ„, API ์„œ๋ฒ„, MySQL DB ๋ฐฐํฌ GCP๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ API VM์— Jar ํŒŒ์ผ์„ ๋ฐฐํฌํ•˜์˜€๊ณ , ์•ž๋‹จ์— Nginx๋ฅผ Docker container๋กœ ๋„์›Œ์„œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹ฑ์„ ์ˆ˜ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. DB๋Š” ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์™€์˜ ๋ถ„๋ฆฌ ์šด์˜์„ ์œ„ํ•ด GCP Cloud SQL์„ ํ™œ์šฉํ•˜์—ฌ MySQL DB ์ธ์Šคํ„ด์Šค๋ฅผ ๋„์› ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ VPC ๋ฐฉํ™”๋ฒฝ๊ณผ ๋„คํŠธ์›Œํฌ ์„ค์ • ๋“ฑ์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜๊ณ , API ์„œ๋ฒ„ VM์— ๋Œ€ํ•œ SSH ์ ‘์†์šฉ ํ‚ค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ํŒ€์›์—๊ฒŒ ๊ณต์œ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
CI/CD ํ”„๋กœํผํ‹ฐ, SSH ํ‚ค ์ฃผ์ž… ๋ฐ SCP๋กœ Jar ํŒŒ์ผ VM์— ์ „์†ก ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ github์— ์˜ฌ๋ฆฌ์ง€ ์•Š๊ณ  action secret์— ๋“ฑ๋กํ•˜์—ฌ CI/CD ๊ณผ์ •์— ์ฃผ์ž…ํ•˜์˜€๊ณ , Jar ํŒŒ์ผ ๋นŒ๋“œ ํ›„ SCP๋กœ GCP VM์— ์ „์†กํ•˜์˜€์Šต๋‹ˆ๋‹ค.




๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ด์€๊ฒฝ_BE

๊ธฐ๋Šฅ ์ƒ์„ธ ๋‚ด์šฉ ์„ค๋ช…
๊ณ ์šฉ์ฃผ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ž‘์„ฑ ๊ณ ์šฉ์ฃผ๊ฐ€ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ž‘์„ฑ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋™์ž‘๋˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. request body์˜ ๋‚ด์šฉ์ด ๊ทผ๋กœ๊ณ„์•ฝ์„œ์— ์ž‘์„ฑ๋  ๋ฟ ์•„๋‹ˆ๋ผ ๊ณ ์šฉ์ฃผ ์„œ๋ช…์ด ํ•จ๊ป˜ ์ž‘์„ฑ๋˜์–ด gcs์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ทผ๋กœ๊ณ„์•ฝ์„œ์— ๋Œ€ํ•ด์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทผ๋กœ์ž ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ž‘์„ฑ ๊ทผ๋กœ์ž๊ฐ€ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์„œ๋ช… ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋™์ž‘๋˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ณ ์šฉ์ฃผ๊ฐ€ ์ž‘์„ฑํ•œ ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทผ๋กœ์ž ์„œ๋ช…์„ ๋„ฃ์€ ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ gcs์— pdf ํŒŒ์ผ๊ณผ image ํŒŒ์ผ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
๊ทผ๋กœ๊ณ„์•ฝ์„œ ๋‹ค์šด๋กœ๋“œ ๊ทผ๋กœ๊ณ„์•ฝ์„œ url์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” api์™€ pdf๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” api๊ฐ€ ์žˆ์œผ๋ฉฐ response๋Š” url๊ณผ urlV๋กœ url์˜ ๊ฒฝ์šฐ ํ•œ๊ตญ์–ดํŒ ๊ทผ๋กœ๊ณ„์•ฝ์„œ urlV๋Š” ๋ฒ ํŠธ๋‚จ์–ดํŒ ๊ทผ๋กœ๊ณ„์•ฝ์„œ์ž…๋‹ˆ๋‹ค.
๊ทผ๋กœ๊ณ„์•ฝ์„œ ์กฐํšŒ ์ง€์› id๋กœ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ๋‚ด์šฉ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. query param์— ์žˆ๋Š” applyId๋ฅผ ํ†ตํ•ด ๊ทผ๋กœ๊ณ„์•ฝ์„œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.




๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์ดํƒ_BE

๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์„ค๋ช…
๊ทผ๋กœ์ž ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ, ๋น„์ž ๋“ฑ๋ก DB์— ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ ๋ฐ ๋น„์ž ์ •๋ณด ์ €์žฅ ๊ทผ๋กœ์ž๊ฐ€ ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ์™€ ๋น„์ž ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด DB์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
๊ทผ๋กœ์ž ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ, ๋น„์ž ํ™•์ธ DB์—์„œ ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ ๋ฐ ๋น„์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ ๊ณ ์šฉ์ฃผ๊ฐ€ ๊ทผ๋กœ์ž์˜ ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ ๋ฐ ๋น„์ž ์ •๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์ธ ๋“ฑ๋ก Goole Cloud Storage์— ์‚ฌ์ธ ์ด๋ฏธ์ง€ ์ €์žฅ ๋ฐ DB์— ์‚ฌ์ธ ์ด๋ฏธ์ง€ URL ์ €์žฅ ๊ณ ์šฉ์ฃผ์™€ ๊ทผ๋กœ์ž๊ฐ€ ์ž์‹ ์˜ ์‚ฌ์ธ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์ธ ๊ฐ€์ ธ์˜ค๊ธฐ ์‚ฌ์ธ ์ด๋ฏธ์ง€ URL ๊ฐ€์ ธ์˜ค๊ธฐ ๊ณ ์šฉ์ฃผ์™€ ๊ทผ๋กœ์ž๊ฐ€ ์ž์‹ ์˜ ์‚ฌ์ธ ์ด๋ฏธ์ง€ URL์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
ํšŒ์‚ฌ ๋“ฑ๋ก DB์— ๊ณ ์šฉ์ฃผ์˜ ํšŒ์‚ฌ ์ •๋ณด ์ €์žฅ ๊ณ ์šฉ์ฃผ๊ฐ€ ์ž์‹ ์˜ ํšŒ์‚ฌ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
ํšŒ์‚ฌ ์ •๋ณด ํ™•์ธ DB์—์„œ ๊ณ ์šฉ์ฃผ์˜ ํšŒ์‚ฌ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ ๊ณ ์šฉ์ฃผ ์ž์‹ ์˜ ํšŒ์‚ฌ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
์ง€์›์„œ ๋“ฑ๋ก ๊ทผ๋กœ์ž์˜ ์ง€์›์„œ ์ €์žฅ ๋ฐ ์ง€์› ์ƒํƒœ ์ €์žฅ. ๊ทผ๋กœ์ž๊ฐ€ ์ง€์›์„œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํŠน์ • ๊ตฌ์ธ๊ธ€์— ์ง€์›์„œ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
์ง€์›์„œ ์กฐํšŒ DB์—์„œ ์ง€์›์„œ ์ •๋ณด ๋ฐ˜ํ™˜ ๊ณ ์šฉ์ฃผ๊ฐ€ ์ง€์›์ž์˜ ์ง€์›์„œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
(๊ณ ์šฉ์ฃผ ์ž…์žฅ)๊ตฌ์ธ๊ธ€์— ์ง€์›ํ•œ ์ง€์›์ž ํ™•์ธ ์—ฐ๊ด€๊ด€๊ณ„์™€ ๊ตฌ์ธ๊ธ€ id๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋“ค ๋ฐ˜ํ™˜ ๊ณ ์šฉ์ฃผ๊ฐ€ ์ž์‹ ์˜ ๊ตฌ์ธ๊ธ€์— ์ง€์›ํ•œ ์ง€์›์ž ๋ชฉ๋ก์„ ํ™•์ธํ•˜๊ณ , ์ง€์›์„œ ํ™•์ธ ๋ฐ ๊ณ„์•ฝ๊ณผ ๊ฐ™์€ ๋‹ค์Œ ํ–‰๋™์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
(๊ทผ๋กœ์ž ์ž…์žฅ)์ž์‹ ์ด ์ง€์›ํ•œ ๊ตฌ์ธ๊ธ€ ํ™•์ธ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ์ •๋ณด๋“ค ๋ฐ˜ํ™˜ ์ง€์›์ž๊ฐ€ ์–ด๋–ค ๊ตฌ์ธ๊ธ€์— ์ง€์›ํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋น„์ž, ์™ธ๊ตญ์ธ๋ฒˆํ˜ธ, ์‚ฌ์ธ ๋“ฑ๋ก ์—ฌ๋ถ€ ํ™•์ธ DB์— ์ ‘๊ทผํ•˜์—ฌ ๋น„์ž, ์™ธ๊ตญ์ธ๋ฒˆํ˜ธ, ์‚ฌ์ธ์ด ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ›„ booleanํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ ๊ทผ๋กœ์ž๊ฐ€ ๋น„์ž, ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ, ์‚ฌ์ธ์„ ๋ชจ๋‘ ๋“ฑ๋กํ•œ ํ›„์— ๊ตฌ์ธ๊ธ€์— ์ง€์›์„œ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก 3๊ฐ€์ง€ ๋“ฑ๋ก ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.




๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ๊ฐ•๋ณ‘ํ˜„_FE

๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์„ค๋ช…
๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ Headless UI ํŒจํ„ด ์ ์šฉ ๋ฐ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ ์„ค์ • ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฒ„ํŠผ, ์นด๋“œ, ์ž…๋ ฅ ํ•„๋“œ ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๊ณ  Headless UI ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„ ๊ตฌ๊ธ€ OAuth๋ฅผ ํ†ตํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌ๊ธ€ OAuth ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ธ์ฆ ๋กœ์ง์„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.
๊ณ ์šฉ์ธ/ํ”ผ๊ณ ์šฉ์ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๊ณ ์šฉ์ธ๊ณผ ํ”ผ๊ณ ์šฉ์ธ์—๊ฒŒ ๋งž๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•˜๋˜, ๊ณตํ†ต๋œ UI ๊ตฌ์กฐ์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.
๋ฉ”์ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„ ์—ญํ• ๋ณ„ ์ฝ˜ํ…์ธ  ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ๊ทผ๋กœ์ž์™€ ์‚ฌ์—…์ฃผ๊ฐ€ ๋™์ผํ•œ ๋ฉ”์ธ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์—ญํ• ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ์กฐ๊ฑด๋ถ€๋กœ ๋…ธ์ถœํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
Select ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ๋‹ค์ค‘ ์„ ํƒ ์˜ต์…˜ ์ œ๊ณต, Headless UI ํŒจํ„ด ์ ์šฉ ๋‹ค์–‘ํ•œ ์„ ํƒ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” Select ์ปดํฌ๋„ŒํŠธ๋ฅผ Headless UI๋กœ ๊ตฌํ˜„ํ•ด UX์™€ ์ ‘๊ทผ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.
Modal ์ปดํฌ๋„ŒํŠธ ๋ฆฌํŒฉํ† ๋ง ์ƒํƒœ์™€ ์Šคํƒ€์ผ ์ œ์–ด ๋ฐฉ์‹ ๋ฆฌํŒฉํ† ๋ง ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Modal ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ์ƒํƒœ์™€ ์Šคํƒ€์ผ ์ œ์–ด์˜ ์œ ์—ฐ์„ฑ์„ ๊ฐ•ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฉ”์ธํŽ˜์ด์ง€ API ์—ฐ๋™ ์—ญํ•  ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ ์ฝ˜ํ…์ธ ๋ฅผ API์™€ ์—ฐ๋™ํ•ด ๊ฐ ์‚ฌ์šฉ์ž ์—ญํ• ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ๊ธ€ OAuth ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๊ตฌ๊ธ€ OAuth์™€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ธ์ฆ ๋กœ์ง ๋ชจ๋“ˆํ™” ๊ตฌ๊ธ€ OAuth ์ธ์ฆ์„ ์ ์šฉํ•˜๊ณ , useGoogleOAuth ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ธ์ฆ ์ƒํƒœ์™€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ด ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.
๊ฐ€์ž…์ž ์ •๋ณด ์„ ํƒ API ์—ฐ๋™ ์‚ฌ์šฉ์ž ์„ ํƒ ์ •๋ณด ์„œ๋ฒ„ ์ „๋‹ฌ ๋ฐ ๊ฒ€์ฆ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ๊ฐ€์ž… ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์•ˆ์ •์ ์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ , ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ํ†ตํ•ด ์˜ค๋ฅ˜ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
Pagination ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ ๋ฐ Google OAuth ํ›… ๋ฆฌํŒฉํ† ๋ง ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ ๋ฐ ์ธ์ฆ ํ›… ๊ฐœ์„  ํŽ˜์ด์ง€ ์ „ํ™˜์„ ์œ„ํ•ด Pagination ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , Google OAuth ํ›…์˜ ์ƒํƒœ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฉ”์ธํŽ˜์ด์ง€, ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํ…Œ์ŠคํŠธ์ฝ”๋“œ ๊ตฌํ˜„ Vitest์™€ React Testing Library๋ฅผ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ SignInButton, ConditionalRenderer ์ปดํฌ๋„ŒํŠธ์™€ useRecruitmentData ํ›…์— ๋Œ€ํ•ด ์ฃผ์š” ๋™์ž‘๊ณผ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ๋Šฅ์ด ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•จ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.




๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๊น€์ง€์•ˆ_FE

๊ธฐ๋Šฅ ์„ค๋ช… ๊ตฌํ˜„ ๋ฐฉ๋ฒ•
๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ(Header) ๊ตฌํ˜„ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„, ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์™€ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ๋™์ ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‚ด์šฉ์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ(Table) ๊ตฌํ˜„ ๊ณ ์ •๋œ ์Šคํƒ€์ผ๊ณผ ํ•จ๊ป˜ ์œ ์—ฐํ•œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Table, Th, Td ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์™ธ๊ตญ์ธ ๋“ฑ๋ก ๋ฒˆํ˜ธ ๋ฐ ๋น„์ž ๋ฐœ๊ธ‰ ์ผ์ž ๋“ฑ๋ก ํŽ˜์ด์ง€ ๊ตฌํ˜„ ๊ทผ๋กœ์ž๊ฐ€ ์™ธ๊ตญ์ธ ๋“ฑ๋ก ๋ฒˆํ˜ธ ๋ฐ ๋น„์ž ๋ฐœ๊ธ‰ ์ผ์ž๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํผ ์ž…๋ ฅ๊ณผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ฑ๋ก๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
๊ณ ์šฉ์ฃผ ๋งˆ์ดํŽ˜์ด์ง€ ๊ตฌํ˜„ ๋กœ๊ทธ์ธํ•œ ๊ณ ์šฉ์ฃผ์˜ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ๋“ฑ๋กํ•œ ํšŒ์‚ฌ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์šฉ์ฃผ์˜ ์ด๋ฆ„๊ณผ ํšŒ์‚ฌ ๋“ฑ๋ก, ์‚ฌ์ธ ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ Œ๋”๋ง ํ•˜๊ณ  ๋“ฑ๋กํ•œ ํšŒ์‚ฌ์˜ ์ •๋ณด๋ฅผ ๋ชฉ๋ก์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
๋‚ด ํšŒ์‚ฌ ํŽ˜์ด์ง€ ๊ตฌํ˜„ ํšŒ์‚ฌ ์ •๋ณด ๋ฐ ํ•ด๋‹น ํšŒ์‚ฌ์˜ ๊ตฌ์ธ ๊ณต๊ณ ๊ธ€ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ง€์›์ž ๋ณด๋Ÿฌ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ง€์›์ž ๋ชฉ๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋งˆ๊ฐํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ•ด๋‹น ๊ณต๊ณ ๋ฅผ ๋งˆ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ํšŒ์‚ฌ์˜ ์ฑ„์šฉ๊ณต๊ณ ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฑ„์šฉ ๊ณต๊ณ  ๋ฒ„ํŠผ์„ ๋ Œ๋”๋งํ•˜๊ณ , ํ•ด๋‹น ํšŒ์‚ฌ์˜ ๊ณต๊ณ ๊ธ€์„ ๋ชฉ๋ก์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
์ง€์›์ž ๋ชฉ๋ก ํŽ˜์ด์ง€ ๋ฐ ๊ณ„์•ฝํ•˜๊ธฐ ํŒ์—…์ฐฝ ๊ตฌํ˜„ ๊ณต๊ณ ๊ธ€์˜ ์ •๋ณด ๋ฐ ํ•ด๋‹น ๊ณต๊ณ ๊ธ€์˜ ์ง€์›์ž ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์—์„œ ์ง€์›์„œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์ง€์›์ž์˜ ์ง€์›์„œ๋ฅผ ์—ด๋žŒํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณ„์•ฝํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ฃผ์˜ ์‚ฌํ•ญ๊ณผ ํ•ด๋‹น ์ง€์›์ž์˜ ์ •๋ณด๋ฅผ ์—ด๋žŒํ•œ ํ›„ ํ•ด๋‹น ์ง€์›์ž์™€ ๊ณ„์•ฝ์„œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๊ณต๊ณ ๊ธ€์˜ ์ •๋ณด์™€ ํ•ด๋‹น ๊ณต๊ณ ๊ธ€์˜ ์ƒ์„ธ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ž์„ธํžˆ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ Œ๋”๋งํ•˜๋ฉฐ, ๊ณต๊ณ ๊ธ€์— ๋Œ€ํ•œ ์ง€์›์ž ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Modal ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์•ฝํ•˜๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๊ณ ์šฉ์ฃผ์—๊ฒŒ ์ฃผ์˜ ์‚ฌํ•ญ์„ ์•Œ๋ฆฌ๋Š” ํŒ์—…์ฐฝ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.




๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์ด์šฉ์ง„_FE

์„น์…˜ ์ƒ์„ธ ๋‚ด์šฉ ์„ค๋ช…
๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ(Footer) ๊ตฌํ˜„ Layout์— ํฌํ•จ๋˜๋Š” ๊ณตํ†ต Footer ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ํ™ˆํŽ˜์ด์ง€ ํ•˜๋‹จ์— ๋ Œ๋”๋ง๋˜๋Š” ๊ณตํ†ต Footer ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ ์šด์˜ ์ •๋ณด์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๊ธฐ์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ์ธ๊ธ€ ์ƒ์„ธ ํ™”๋ฉด ํŽ˜์ด์ง€ ๊ตฌํ˜„ ๊ตฌ์ธ๊ธ€์— ๋Œ€ํ•œ ์ƒ์„ธ ์ •๋ณด๊ฐ€ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ๊ทผ๋กœ์ž๋Š” ๊ตฌ์ธ๊ธ€ ์ƒ์„ธ ํ™”๋ฉด์„ ํ†ตํ•ด ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คuseGetRequiredFieldCheck ์„ ํ†ตํ•ด ๊ทผ๋กœ์ž์˜ ํ•„์ˆ˜๊ฐ’(์‚ฌ์ธ, ์ด๋ ฅ์„œ, ๋น„์ž ๋ฐ ์™ธ๊ตญ์ธ ๋ฒˆํ˜ธ)๋“ฑ๋ก ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง€์› ํ”„๋กœ์„ธ์Šค ํŽ˜์ด์ง€ ๊ตฌํ˜„ ์ง€์›์„œ ์•ˆ๋‚ด ๋ฉ˜ํŠธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทผ๋กœ์ž๊ฐ€ ์ง€์›์„œ ์ž‘์„ฑ ์ „ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ๋‚ด ๋ฉ˜ํŠธ๋“ค์ด ๋ Œ๋”๋ง ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
์ง€์›์„œ ์ž‘์„ฑ ํŽ˜์ด์ง€ ๊ตฌํ˜„ ๊ทผ๋กœ์ž๊ฐ€ ๊ตฌ์ธ๊ธ€์„ ํ†ตํ•ด ์ง€์›์„œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. react-hook-form ์„ ํ†ตํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„, ์ฃผ์†Œ, ๋ฒˆํ˜ธ, ์ง€์› ๋™๊ธฐ๋ฅผ ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฒˆํ˜ธ์˜ ๊ฒฝ์šฐ 010-0000-0000 ํ˜•์‹์— ๋งž๊ฒŒ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ฅ์„œ ๋“ฑ๋ก ํŽ˜์ด์ง€ ๊ตฌํ˜„ ๊ทผ๋กœ์ž๊ฐ€ ์ด๋ ฅ์„œ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. react-hook-form ์„ ํ†ตํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„, ์ฃผ์†Œ, ๋ฒˆํ˜ธ, ๊ฒฝ๋ ฅ, ํ•œ๊ตญ์–ด ์‹ค๋ ฅ, ์†Œ๊ฐœ๋ฅผ ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฒˆํ˜ธ์˜ ๊ฒฝ์šฐ 010-0000-0000 ํ˜•์‹์— ๋งž๊ฒŒ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์ธ ๋“ฑ๋ก ํŽ˜์ด์ง€ ๊ตฌํ˜„ ๊ทผ๋กœ์ž ๋ฐ ๊ณ ์šฉ์ฃผ์˜ ์‚ฌ์ธ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค๋‹ค. react-signature-canvas ๋ฅผ ํ†ตํ•ด ์„œ๋ช…์„ ๋ฐ›๊ณ  ์‚ฌ์ง„์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.




๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ž„์„ธ๋นˆ_FE

๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์„ค๋ช…
๊ตฌ์ธ๊ธ€ ๋“ฑ๋ก ๊ตฌ์ธ๊ธ€ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ตฌ์ธ๊ธ€ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ state๋กœ ๊ด€๋ฆฌํ•˜๊ณ , submit ์‹œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
ํšŒ์‚ฌ ๋“ฑ๋ก ํšŒ์‚ฌ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ํšŒ์‚ฌ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ state๋กœ ๊ด€๋ฆฌํ•˜๊ณ , submit ์‹œ JSON์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’๊ณผ, ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ formData์— ์‚ฝ์ž…ํ•˜์—ฌ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํšŒ์‚ฌ ์ด๋ฏธ์ง€๋Š” ๋ฏธ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ formData์— ์ด๋ฏธ์ง€๋ฅผ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๊ณ  ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
๊ทผ๋กœ์ž ๋งˆ์ดํŽ˜์ด์ง€ ์—ด๋žŒ ๊ทผ๋กœ์ž์˜ ํ”„๋กœํ•„๊ณผ ์ด๋ ฅ์„œ/์„œ๋ช…/๋น„์ž ๋“ฑ๋ก ๋ฒ„ํŠผ, ๊ทผ๋กœ์ž๊ฐ€ ์ง€์›ํ•œ ๊ณต๊ณ  ๋‚ด์—ญ ๋ Œ๋”๋ง ๊ทผ๋กœ์ž๊ฐ€ ๋ณธ์ธ์˜ ์ด๋ ฅ์„œ/์„œ๋ช…/๋น„์ž ๋“ฑ๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ , ๋“ฑ๋ก ์‹œ ๋ฒ„ํŠผ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทผ๋กœ์ž๊ฐ€ ์ง€์›ํ•œ ๊ณต๊ณ  ๋‚ด์—ญ์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณด์—ฌ์ฃผ๊ณ , ์ง€์› ์ƒํƒœ type์„ ๋ช…์„ธํ•˜์—ฌ ๊ฐ type์— ํ•ด๋‹นํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค
๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ž‘์„ฑ ๊ณ ์šฉ์ฃผ๊ฐ€ ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์„œ๋ช…ํ•˜์—ฌ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ state๋กœ ๊ด€๋ฆฌํ•˜๊ณ , submit ์‹œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์„œ๋ช…ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์•ผ submit์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
๊ทผ๋กœ๊ณ„์•ฝ์„œ ์—ด๋žŒ ๋ฐ ์„œ๋ช… ๊ณ ์šฉ์ฃผ๊ฐ€ ์ž‘์„ฑํ•œ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ •๋ณด๋ฅผ ๊ทผ๋กœ์ž๊ฐ€ ์—ด๋žŒ ๋ฐ ์„œ๋ช… ์‹œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ •๋ณด๋ฅผ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทผ๋กœ์ž๊ฐ€ ์„œ๋ช…ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  submit ์‹œ ์„œ๋ฒ„๋กœ ์„œ๋ช…ํ–ˆ์Œ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช…ํ•˜์ง€ ์•Š๊ณ  submit ์‹œ ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
๊ทผ๋กœ๊ณ„์•ฝ์„œ ๋‹ค์šด๋กœ๋“œ ๊ณ ์šฉ์ฃผ ๋ฐ ๊ทผ๋กœ์ž์˜ ๊ณ„์•ฝ์„œ ์„œ๋ช… ํ›„ ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ๊ทผ๋กœ๊ณ„์•ฝ์„œ pdf ๋‹ค์šด๋กœ๋“œ. ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ pdf URL์„ ์ „๋‹ฌ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ณด์ด์ง€ ์•Š๋Š” ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋ฅผ ์ƒ์„ฑ ํ›„ ์‹คํ–‰ํ•˜์—ฌ ๋กœ์ปฌPC์— ๋‹ค์šด๋กœ๋“œ ํ›„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
๊ณตํ†ต์ปดํฌ๋„ŒํŠธ Card ๊ณตํ†ต์ปดํฌ๋„ŒํŠธ Card์˜ style ์ง€์ • Card ํ˜•ํƒœ์˜ style์„ ์ž‘์„ฑํ•˜๊ณ , children์„ Props๋กœ ๋ฐ›์•„ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊ณตํ†ต์ปดํฌ๋„ŒํŠธ Button Button์˜ design์„ ํŠน์ •(default, outlined, textbutton, deactive)ํ•˜์—ฌ ๊ฐœ๋ฐœ default, outlined, textbutton, deactive ํ˜•ํƒœ์˜ Button์„ ๋งŒ๋“ค์–ด design Props๋กœ ์ „๋‹ฌ๋ฐ›๊ณ , ๊ฐ design์— ํ•ด๋‹นํ•˜๋Š” ์Šคํƒ€์ผ๊ณผ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.





๐Ÿค” ๊ณ ๋ฏผํ•œ ์  ๋ฐ ์–ด๋ ค์› ๋˜ ์ 

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ์ž ๊นŠ๊ฒŒ ๊ณ ๋ฏผํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋ ค ๋…ธ๋ ฅํ–ˆ๋˜ ์ ์— ๋Œ€ํ•œ ํšŒ๊ณ ์ž…๋‹ˆ๋‹ค.


๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๊น€๋ฏผ์ง€_BE

  • Mapping ๋ฐฉ์‹

    • ๊ณ ๋ฏผ:
      Entity์—์„œ DTO๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, ์ฒ˜์Œ์—๋Š” ์ง์ ‘ Mapper ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด ๋ณด์˜€๊ณ , ํ•„๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์ผ์ผ์ด ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…:
      ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ ์ž MapStruct๋ฅผ ๋„์ž…ํ–ˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ํ•™์Šต์— ์‹œ๊ฐ„์ด ๊ฝค ๊ฑธ๋ ธ์ง€๋งŒ, ์ผ๋‹จ ์ตํžˆ๊ณ  ๋‚˜๋‹ˆ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•ด์กŒ๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ํ›จ์”ฌ ์šฉ์ดํ•ด์กŒ์Šต๋‹ˆ๋‹ค. MapStruct ๋•๋ถ„์— ๋งคํ•‘ ์ž‘์—…์ด ์ž๋™ํ™”๋˜์–ด ๋ณ€ํ™˜ ๋กœ์ง์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ํ•„๋“œ ๋ณ€๊ฒฝ ์‹œ์—๋„ ์‰ฝ๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝํ—˜์€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ์— ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
  • ํŒจํ‚ค์ง•

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

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




๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ๋ฐฐ๋ฏผ์ˆ˜_BE

  • git flow ๊ณ ๋ฏผ

    • ๊ณ ๋ฏผ:
      ์ฒ˜์Œ์— ์›๊ฒฉ ๋ ˆํฌ๋ฅผ ํฌํฌ ๋– ์„œ ํŒ€์›๋“ค๊ณผ ์ž‘์—…ํ•˜๋‹ค๊ฐ€, git flow์— ๋Œ€ํ•œ ์ตœ์ ํ™” ํ•„์š”์„ฑ์„ ๋Š๊ปด์„œ ์ด์— ๋Œ€ํ•œ ๋ฉ˜ํ† ๋ง์„ ๋ฐ›์•˜๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ํฌํฌ ๋ ˆํฌ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๋‹ค๋Š” ์กฐ์–ธ์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…:
      ์ด๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํฌํฌ ๋ ˆํฌ๋Š” ์‚ญ์ œํ•œ ๋’ค ์›๊ฒฉ ๋ ˆํฌ์„œ main โ†’ develop โ†’ Weekly โ†’ feature ๋ธŒ๋žœ์น˜ ์ „๋žต์„ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํŒ€์›๋“ค ๊ฐ์ž ์›๊ฒฉ ๋ ˆํฌ์˜ ๋‹ด๋‹น feature ๋ธŒ๋žœ์น˜์— push ํ›„ Weekly ๋ธŒ๋žœ์น˜์— PR์„ ๋‚ ๋ฆฌ๊ณ , ํ…Œํฌ๋ฆฌ๋”์ธ ์ œ๊ฐ€ ๊ฒ€ํ†  ํ›„ ๋จธ์ง€ํ•˜๋Š” ์‹์œผ๋กœ ์šด์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • CAA ๋ ˆ์ฝ”๋“œ

    • ๊ณ ๋ฏผ:
      ๋ฐฐํฌ ๊ณผ์ •์—์„œ certbot์„ ํ†ตํ•ด nginx์— ์ž๋™ SSL ์ธ์ฆ์„œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์—์„œ ๊ณ„์† ์‹คํŒจํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…:
      ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด๋ด๋„ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋Š”๋ฐ, ์—๋Ÿฌ ๋กœ๊ทธ์—์„œ CAA ๋ ˆ์ฝ”๋“œ์— ๊ด€ํ•œ ๋‚ด์šฉ์ด ๋ณด์—ฌ์„œ ์ด์— ๋Œ€ํ•ด ๋” ์ฐพ์•„๋ณด์•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์˜ ์—ญํ• ์€ ์ธ์ฆ ๊ธฐ๊ด€์ด ์ €ํฌ ์„œ๋น„์Šค์˜ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•ด์ฃผ๋Š” ๊ฒƒ์ž„์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„์— GCP DNS ์„ค์ •์—์„œ CAA ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ letsencrypt์— ๋Œ€ํ•ด ํ—ˆ์šฉํ•ด์ฃผ์—ˆ๊ณ , ์ •์ƒ์ ์œผ๋กœ HTTPS๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • CI/CD

    • ๊ณ ๋ฏผ:
      ๋ณด์•ˆ์„ ์œ„ํ•ด VPC ๋ฐฉํ™”๋ฒฝ ์„ค์ •์—์„œ SSH ํ—ˆ์šฉ ๋ฒ”์œ„๋ฅผ ์ „์—ญ์—์„œ ํŒ€์›๋“ค IP๋กœ ์ถ•์†Œํ•˜๊ณ  ๋‚˜๋‹ˆ, CI/CD ๊ณผ์ •์—์„œ github actions ์„œ๋ฒ„๊ฐ€ SCP๋ฅผ ํ†ตํ•ด API ์„œ๋ฒ„ VM์œผ๋กœ Jar ๋ฐฐํฌ ํŒŒ์ผ์„ ์ „์†กํ•  ๋•Œ, SSH ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    • ํ•ด๊ฒฐ์ฑ…:
      github actions ์„œ๋ฒ„์˜ IP๋ฅผ SSH ํ—ˆ์šฉ ๊ทœ์น™์— ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ, ํ•ด๋‹น IP๊ฐ€ ์œ ๋™์ ์ด๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ถ”๋ ค๋‚ด์—ˆ์Šต๋‹ˆ๋‹ค.

      1. ๊นƒํ—™์—์„œ ์œ ๋ฃŒ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ณ ์ • IP ํ™œ์šฉ

      2. SSH ํ„ฐ๋„๋ง

      3. github actions์—์„œ GCP์— ์ ‘๊ทผํ•ด์„œ ์ง์ ‘ SSH ๊ทœ์น™์— ์œ ๋™ IP ์ถ”๊ฐ€ํ•˜๊ณ , SCP ์ˆ˜ํ–‰ ํ›„ ๊ทœ์น™์—์„œ ํ•ด๋‹น IP ์ œ๊ฑฐํ•˜๋„๋ก yml ์ฝ”๋“œ ๊ตฌ์„ฑํ•˜๊ธฐ

      ๋น„์šฉ๊ณผ ๋‚œ์ด๋„ ์ธก๋ฉด์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ธ 3๋ฒˆ ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ yml ์ฝ”๋“œ๋Š” GPT๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋Š”๋ฐ, ๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์–ด ๋ฌธ๋ฒ•๊ณผ ์ •๊ทœํ‘œํ˜„์‹ ๋ถ€๋ถ„์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ด์ƒํ•œ ๋‹ต์„ ์ œ์‹œํ•ด์„œ ์• ๋ฅผ ๋งŽ์ด ๋จน์—ˆ์Šต๋‹ˆ๋‹ค.

      GPT๊ฐ€ ์ œ์‹œํ•œ ๋‹ต์—์„œ sed ๋ช…๋ น์–ด์™€ ์ •๊ทœํ‘œํ˜„์‹ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ์งˆ์˜ ์‘๋‹ต์„ ์ง„ํ–‰ํ•˜์˜€๊ณ , ์ดํ›„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.




๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์ดํƒ_BE

  • ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
    • ๊ณ ๋ฏผ:
      JSON๊ณผ ์ด๋ฏธ์ง€ ํŒŒ์ผ์€ ์„œ๋กœ ๋‹ค๋ฅธ Content-Type์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—์„œ ๋™์ผํ•œ ์š”์ฒญ์—์„œ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…:
      ์„œ๋กœ ๋‹ค๋ฅธ Content-Type์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด consumes = MediaType.MULTIPART_FORM_DATA_VALUE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. JSON ํŒŒ์ผ์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ›๋˜, Object Mapper๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์˜€๊ณ  ์ด๋ฏธ์ง€ ํŒŒ์ผ์€ MultipartFileํ˜•ํƒœ๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.




๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ด์€๊ฒฝ_BE

  • Service ํŒŒ์ผ ๊ด€๋ฆฌ

    • ๊ณ ๋ฏผ: ๊ทผ๋กœ๊ณ„์•ฝ์„œ ๋„๋ฉ”์ธ์—๋Š” file์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค์™€ pdf๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค์™€, db๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…: ์ฒ˜์Œ์—๋Š” contract ํŒจํ‚ค์ง€ ๋‚ด์˜ service์— ๋ชจ์•„ ๊ด€๋ฆฌํ•˜์˜€์œผ๋‚˜ ๋ฉ˜ํ† ๋‹˜์˜ ์กฐ์–ธ์„ ๋ฐ›์•„ common ํŒจํ‚ค์ง€์— file service์™€ pdf service๋ฅผ ๋ชจ์•„๋‘๊ณ  contract service์—์„œ ์œ„์˜ ์„œ๋น„์Šค๋“ค์„ ๋ถˆ๋Ÿฌ์™€์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • OneToOne ๋งคํ•‘ ์‹œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ

    • ๊ณ ๋ฏผ: ์ง€์›๊ณผ ๊ทผ๋กœ ๊ณ„์•ฝ์„œ๋ฅผ 1๋Œ€1 ๋งคํ•‘ํ•œ ์ƒํ™ฉ์—์„œ ์ง€์›์— ๋Œ€ํ•œ ๊ทผ๋กœ๊ณ„์•ฝ์„œ ์ƒ์„ฑ ๋ฒ„ํŠผ์„ ํ”„๋ก ํŠธ ์ธก์—์„œ ๋‘ ๋ฒˆ ๋ˆ„๋ฅผ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…: ๊ทผ๋กœ๊ณ„์•ฝ์„œ api์—์„œ๋Š” ์ง€์› ๊ฐ์ฒด์— ๊ทผ๋กœ๊ณ„์•ฝ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์œผ๋‚˜ ์ด๋ฏธ ์ง€์›์ž์— ๋Œ€ํ•œ ๊ทผ๋กœ๊ณ„์•ฝ์„œ๋ฅผ ์ž‘์„ฑํ•œ ๊ทผ๋กœ์ž์— ๋Œ€ํ•ด์„œ ๊ณ ์šฉ์ฃผ์—๊ฒŒ ๋ณด์—ฌ์ง€์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋” ์™„์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ง€์› api๋ฅผ ๋‹ด๋‹นํ•œ ๋ถ„๊ป˜ ์š”์ฒญํ•˜์—ฌ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.




๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ๊ฐ•๋ณ‘ํ˜„_FE

  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ๋ฐ ์Šคํƒ€์ผ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ ํ™•๋ณด

    • ๊ณ ๋ฏผ:
      ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ์Šคํƒ€์ผ์„ ํšจ์šธ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ ์—ฐํ•œ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋ฉฐ, ๋””์ž์ธ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š” Select์™€ Modal ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ฆฐํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ํฐ ๋„์ „์ด์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…:
      ๊ธฐ๋Šฅ๊ณผ ์Šคํƒ€์ผ ์ธก๋ฉด์—์„œ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Headless UI ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Select, Modal ์ปดํฌ๋„ŒํŠธ๋Š” ๋กœ์ง๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ์— ์ง‘์ค‘ํ•˜๊ณ , ์Šคํƒ€์ผ์€ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜์—ฌ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

      ๋ฐ˜์‘ํ˜• ๋””์ž์ธ ๊ตฌํ˜„์„ ์œ„ํ•œ responseStyle ํ•จ์ˆ˜ ๊ฐœ๋ฐœ:
      responseStyle ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‹ค ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ , ๋ฐ˜๋ณต๋˜๋Š” ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์„ ์ •์˜ํ•˜์—ฌ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Google OAuth ๊ตฌํ˜„

    • ๊ณ ๋ฏผ:
      Google OAuth๋ฅผ ํ†ตํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ ์ธ์ฆ ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…:
      - ์ปค์Šคํ…€ ํ›… useGoogleOAuth ๋ชจ๋“ˆํ™”:
      ์ธ์ฆ ๋กœ์ง์„ useGoogleOAuth ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์ธ์ฆ ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ํ•จ์ˆ˜๋“ค์„ ํฌํ•จํ•˜๋ฉฐ, ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ๋ถ€ํ„ฐ ํ† ํฐ ๋ฐœ๊ธ‰, ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์บก์Šํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.




๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๊น€์ง€์•ˆ_FE

  • ์‚ฌ์šฉ์ž ์ธ์ฆ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋™์  UI ๋ณ€๊ฒฝ

    • ๊ณ ๋ฏผ: ํ—ค๋” ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ผ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„, ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์™€ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ํ‘œ์‹œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ• ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…: UserProvider๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์Šคํ† ๋ฆฌ์ง€์— ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋” ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useUser ํ›…์„ ํ†ตํ•ด UserContext์˜ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ , ์ด ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ƒํƒœ์— ๋”ฐ๋ผ UI๊ฐ€ ๋™์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ถ„๋ฆฌ

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




๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์ด์šฉ์ง„_FE

  • ํšจ์œจ์ ์ด๋ฉฐ ํ˜‘๋ ฅ์ ์ธ ์ฐธ์—ฌ์ž๊ฐ€ ๋˜๋Š” ๋ฒ•

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




๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ž„์„ธ๋นˆ_FE

  • Input ๋ Œ๋”๋ง

    • ๊ณ ๋ฏผ:
      ๋งŽ์€ Input์ด ์กด์žฌํ•˜๋Š” ๊ตฌ์ธ๊ธ€ ๋“ฑ๋ก ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋ชจ๋“  input์„ useState๋กœ ํ•œ๊บผ๋ฒˆ์— ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ํ•˜๋‚˜์˜ input๋งŒ ์ˆ˜์ •ํ•ด๋„ ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…:
      ํ˜„์žฌ๋Š” ์œ„ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์ถ”ํ›„ ๊ณ ๋„ํ™” ์ž‘์—…์—์„œ useRef๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Input ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ์‚ฌ์šฉ ๊ทœ์น™

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




About

๐Ÿง ์ทจ์—… ๋งค์นญ ์„œ๋น„์Šค hirehigher - ํ•œ๊ตญ์—์„œ์˜ ์‹œ์ž‘์„ ๋” ๋†’์ด

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages