Skip to content

๐Ÿ˜ ํ•ด์ปคํ†ค ํ”„๋กœ์ ํŠธ : ๋…ธ์ธ ๊ตฌ์ง ์ •๋ณด ์•Œ๋ฆผ & ๊ณต๊ณต์„œ๋น„์Šค ์•Œ๋ฆผ ์„œ๋น„์Šค

Notifications You must be signed in to change notification settings

HyunSoo730/likelion-hackaton

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

๋‹ค์˜ค(DAO) ๐ŸŒŸ

๋‹ค์˜ค ์ด๋ฏธ์ง€

๋‹ค์˜ค(DAO) - ์–ด๋ฅด์‹ ๋“ค์„ ์œ„ํ•œ ๋งž์ถคํ˜• ์ผ์ž๋ฆฌ ์ถ”์ฒœ ์„œ๋น„์Šค ๐Ÿ‘ฅ

์„ธ์ข…๋Œ€ํ•™๊ต ๋ฉ‹์Ÿ์ด ์‚ฌ์ž์ฒ˜๋Ÿผ ํ•ด์ปคํ†ค : ๋””์ง€ํ„ธ ๊ฒฉ์ฐจ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค
๊ฐœ๋ฐœ๊ธฐ๊ฐ„: 2023.06 ~ 2023.08 (12์ฃผ)

๐Ÿ’ฅ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

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

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

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

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

๋ฐฑ์—”๋“œ

์กฐํ˜„์ˆ˜ ๊น€๋ฏผ์„ญ
@hyunsoo730 @k-ms1998
์„ธ์ข…๋Œ€ํ•™๊ต ์†Œํ”„ํŠธ์›จ์–ดํ•™๊ณผ 4ํ•™๋…„ ์„ธ์ข…๋Œ€ํ•™๊ต ์†Œํ”„ํŠธ์›จ์–ดํ•™๊ณผ 4ํ•™๋…„

ํ”„๋ก ํŠธ์—”๋“œ

๋ฌธ์„ฑํฌ ๊ณ ํ˜œ๋ฆฐ ์ „๊ฒฝ์›
@seong-hui @hlynnn @jeonkyungwon
์„ธ์ข…๋Œ€ํ•™๊ต ์ง€๋Šฅ๊ธฐ์ „ 4ํ•™๋…„ ์„ธ์ข…๋Œ€ํ•™๊ต ์ง€๋Šฅ๊ธฐ์ „ 4ํ•™๋…„ ์„ธ์ข…๋Œ€ํ•™๊ต ์ง€๋Šฅ๊ธฐ์ „ 4ํ•™๋…„

๐Ÿ™‹โ€โ™‚๏ธ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์—ญํ•  ๋ฐ ๊ธฐ์—ฌ๋„

์ด๋ฆ„ ์—ญํ•  ๋ฐ ๊ธฐ์—ฌ๋„
์กฐํ˜„์ˆ˜ - ๐Ÿš€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ๋ฆฌ๋“œ๋กœ์„œ ๋ฐฑ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐ ๊ฐœ๋ฐœ ์ด๊ด„
- ๐ŸŽจ Spring Boot๋ฅผ ํ™œ์šฉํ•œ REST API ๊ตฌํ˜„ ๋ฐ ๋ฌธ์„œํ™”
- โš™๏ธ Spring Batch๋ฅผ ํ™œ์šฉํ•œ ์ผ์ž๋ฆฌ ์ •๋ณด ์ˆ˜์ง‘ ๋ฐฐ์น˜ ์ž‘์—… ๊ตฌํ˜„
- ๐Ÿ“ž ์นด์นด์˜คํ†ก ์•Œ๋ฆผ API ์—ฐ๋™ ๋ฐ ์•Œ๋ฆผ ๋ฐœ์†ก ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐœ๋ฐœ
- ๐Ÿ’พ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๋ฐ ์ฟผ๋ฆฌ ์ตœ์ ํ™”
๊น€๋ฏผ์„ญ - ๐Ÿค ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐ ๊ฐœ๋ฐœ & ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ฐœ๋ฐœ ๋‹ด๋‹น
- ๐ŸŒฟ ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉํ•œ API ์ปจํŠธ๋กค๋Ÿฌ ๊ฐœ๋ฐœ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
- ๐Ÿ—ƒ๏ธ MyBatis๋ฅผ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๋กœ์ง ๊ฐœ๋ฐœ ๋ฐ ์ฟผ๋ฆฌ ์ž‘์„ฑ
- ๐Ÿ“Š ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„์„ ์œ„ํ•œ ๋กœ๊ทธ ์„ค๊ณ„ ๋ฐ ๋กœ๊น… ์ž‘์—…
- ๐Ÿงช ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ†ตํ•œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ํ™œ๋™

๐ŸŒˆ ์ด์šฉ ๊ฐ€์ด๋“œ

Requirements

ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

Installation

  1. ํ”„๋กœ์ ํŠธ ํด๋ก 
$ git clone https://github.com/HyunSoo730/likelion-hackaton.git
$ cd likelion-hackaton

Back-End
$ ./mvnw clean install
$ java -jar target/[your_project].jar

Front-End
$ nvm use v.14.19.3
$ npm install 
$ npm run dev

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

Environment

Git Github

Config

npm

Development

JavaScript React Bootstrap

Communication

Slack Notion GoogleMeet

๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„

ERD (Entity-Relationship Diagram)

ERD

ํ”„๋กœ์ ํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋Š” ์œ„์™€ ๊ฐ™์€ ERD๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

  • User ํ…Œ์ด๋ธ”: ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ ์ •๋ณด์™€ ํ•จ๊ป˜ ๊ด€์‹ฌ ์ง€์—ญ(Region)๊ณผ ๋งค์นญ๋œ ์ผ์ž๋ฆฌ(Job) ์ •๋ณด๋ฅผ ์™ธ๋ž˜ํ‚ค๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
  • Region ํ…Œ์ด๋ธ”: ์ง€์—ญ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ด€์‹ฌ ์ง€์—ญ๊ณผ ์ผ์ž๋ฆฌ์˜ ๊ทผ๋ฌด ์ง€์—ญ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Job ํ…Œ์ด๋ธ”: ์ผ์ž๋ฆฌ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ์ผ์ž๋ฆฌ์˜ ์ƒ์„ธ ์ •๋ณด์™€ ํ•จ๊ป˜ ๊ทผ๋ฌด ์ง€์—ญ(Region) ์ •๋ณด๋ฅผ ์™ธ๋ž˜ํ‚ค๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
  • Application ํ…Œ์ด๋ธ”: ์‚ฌ์šฉ์ž์˜ ์ผ์ž๋ฆฌ ์ง€์› ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž(User)์™€ ์ผ์ž๋ฆฌ(Job)์˜ ์™ธ๋ž˜ํ‚ค๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ง€์› ๋‚ด์—ญ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Notification ํ…Œ์ด๋ธ”: ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก๋œ ์•Œ๋ฆผ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž(User)์™€ ์ผ์ž๋ฆฌ(Job)์˜ ์™ธ๋ž˜ํ‚ค๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์•Œ๋ฆผ ๋‚ด์—ญ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ERD์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, User์™€ Region, Job ํ…Œ์ด๋ธ”์€ ๋‹ค๋Œ€๋‹ค(Many-to-Many) ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ์ง€์—ญ์— ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ํ•œ ์ง€์—ญ์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•œ ์‚ฌ์šฉ์ž๋Š” ์—ฌ๋Ÿฌ ์ผ์ž๋ฆฌ์— ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ณ , ํ•œ ์ผ์ž๋ฆฌ์—๋Š” ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Application๊ณผ Notification ํ…Œ์ด๋ธ”์€ User์™€ Job ํ…Œ์ด๋ธ”์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”(Join Table)์˜ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ์ผ์ž๋ฆฌ ์ง€์› ๋‚ด์—ญ๊ณผ ์•Œ๋ฆผ ๋‚ด์—ญ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋Š” ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์ง„ํ–‰๋˜์—ˆ์œผ๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ด๋ธ”์ด๋‚˜ ๊ด€๊ณ„๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ—„๏ธ

๐Ÿ“บ ํ™”๋ฉด ๊ตฌ์„ฑ

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

๐Ÿ“ฆ ์ฃผ์š” ๊ธฐ๋Šฅ

โญ๏ธ ๋งž์ถคํ˜• ์ผ์ž๋ฆฌ ์ถ”์ฒœ

์‚ฌ์šฉ์ž์˜ ๊ฑฐ์ฃผ ์ง€์—ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฐœ๊ฐœ์ธ์—๊ฒŒ ํŠนํ™”๋œ ์ผ์ž๋ฆฌ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

โญ๏ธ ์‹ค์‹œ๊ฐ„ ์ผ์ž๋ฆฌ ์•Œ๋ฆผ

์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ๊ด€์‹ฌ ์ง€์—ญ์— ์ƒˆ๋กœ์šด ์ผ์ž๋ฆฌ๊ฐ€ ๋“ฑ๋ก๋˜๋ฉด ์นด์นด์˜คํ†ก์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค. ์–ด๋ฅด์‹ ๋“ค์€ ์•Œ๋ฆผ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ธฐํšŒ๋ฅผ ์ฆ‰์‹œ ํ™•์ธํ•˜๊ณ  ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“ฃ

โญ๏ธ ์‚ฌ์šฉ์ž ์นœํ™”์  ์ธํ„ฐํŽ˜์ด์Šค

์ง๊ด€์ ์ด๊ณ  ๋ˆˆ์— ์ž˜ ๋„๋Š” ๋””์ž์ธ์œผ๋กœ ์–ด๋ฅด์‹ ๋“ค๋„ ์‰ฝ๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก UI/UX๋ฅผ ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ํ•œ ๋ˆˆ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๐Ÿ‘€

โญ๏ธ ๊ต์œก ํ”„๋กœ๊ทธ๋žจ ์—ฐ๊ณ„

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

โญ๏ธ ์•ˆ์ •์ ์ธ API ์„œ๋ฒ„

๋ฐฑ์—”๋“œ๋Š” Spring Boot๋กœ ๊ตฌ์ถ•๋œ RESTful API ์„œ๋ฒ„๋กœ, ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ ์›ํ™œํ•œ ํ†ต์‹ ์„ ์œ„ํ•ด ์ง๊ด€์ ์ด๊ณ  ์ผ๊ด€๋œ API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โญ๏ธ ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์กฐํšŒ

๋Œ€๋Ÿ‰์˜ ์ผ์ž๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์‹ฑ๊ณผ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โญ๏ธ ์ž๋™ํ™”๋œ ๋ฐฐ์น˜ ์ž‘์—…

์ผ์ž๋ฆฌ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘, ์•Œ๋ฆผ ๋ฐœ์†ก ๋“ฑ์˜ ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์€ Spring Batch์™€ Quartz๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž๋™ํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ •ํ•ด์ง„ ์Šค์ผ€์ค„์— ๋”ฐ๋ผ ์•ˆ์ •์ ์œผ๋กœ ๋ฐฐ์น˜ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ์‹  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โญ๏ธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

์ฝ”๋“œ์˜ ํ’ˆ์งˆ๊ณผ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด JUnit5๋ฅผ ํ™œ์šฉํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ์™€ ์ด์Šˆ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ›๏ธ ์•„ํ‚คํ…์ฒ˜

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

root
โ”œโ”€โ”€ backend
โ”‚   โ”œโ”€โ”€ Dockerfile
โ”‚   โ”œโ”€โ”€ dao.iml
โ”‚   โ”œโ”€โ”€ mvnw
โ”‚   โ”œโ”€โ”€ mvnw.cmd
โ”‚   โ”œโ”€โ”€ pom.xml
โ”‚   โ””โ”€โ”€ src
โ”‚       โ”œโ”€โ”€ main
โ”‚       โ”‚   โ”œโ”€โ”€ java
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ com
โ”‚       โ”‚   โ”‚       โ””โ”€โ”€ likelion
โ”‚       โ”‚   โ”‚           โ””โ”€โ”€ dao
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ DaoApplication.java
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ config
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ BatchConfig.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ OpenApiConfig.java
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ WebMvcConfig.java
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ controller
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ JobController.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ RegionController.java
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ UserController.java
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ dto
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ JobDto.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ RegionDto.java
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ UserDto.java
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ entity
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ Job.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ Region.java
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ User.java
โ”‚       โ”‚   โ”‚               โ”œโ”€โ”€ repository
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ JobRepository.java
โ”‚       โ”‚   โ”‚               โ”‚   โ”œโ”€โ”€ RegionRepository.java
โ”‚       โ”‚   โ”‚               โ”‚   โ””โ”€โ”€ UserRepository.java
โ”‚       โ”‚   โ”‚               โ””โ”€โ”€ service
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ JobService.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ KakaoAlarmService.java
โ”‚       โ”‚   โ”‚                   โ”œโ”€โ”€ RegionService.java
โ”‚       โ”‚   โ”‚                   โ””โ”€โ”€ UserService.java
โ”‚       โ”‚   โ””โ”€โ”€ resources
โ”‚       โ”‚       โ”œโ”€โ”€ application.properties
โ”‚       โ”‚       โ””โ”€โ”€ application-prod.properties
โ”‚       โ””โ”€โ”€ test
โ”‚           โ””โ”€โ”€ java
โ”‚               โ””โ”€โ”€ com
โ”‚                   โ””โ”€โ”€ likelion
โ”‚                       โ””โ”€โ”€ dao
โ”‚                           โ””โ”€โ”€ DaoApplicationTests.java
โ”œโ”€โ”€ frontend
โ”‚   โ”œโ”€โ”€ README.md
โ”‚   โ”œโ”€โ”€ node_modules
โ”‚   โ”œโ”€โ”€ package-lock.json
โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ”œโ”€โ”€ public
โ”‚   โ”‚   โ”œโ”€โ”€ favicon.ico
โ”‚   โ”‚   โ”œโ”€โ”€ index.html
โ”‚   โ”‚   โ”œโ”€โ”€ logo192.png
โ”‚   โ”‚   โ”œโ”€โ”€ logo512.png
โ”‚   โ”‚   โ”œโ”€โ”€ manifest.json
โ”‚   โ”‚   โ””โ”€โ”€ robots.txt
โ”‚   โ””โ”€โ”€ src
โ”‚       โ”œโ”€โ”€ App.css
โ”‚       โ”œโ”€โ”€ App.js
โ”‚       โ”œโ”€โ”€ App.test.js
โ”‚       โ”œโ”€โ”€ components
โ”‚       โ”‚   โ”œโ”€โ”€ Footer.js
โ”‚       โ”‚   โ”œโ”€โ”€ Header.js
โ”‚       โ”‚   โ”œโ”€โ”€ JobDetail.js
โ”‚       โ”‚   โ”œโ”€โ”€ JobList.js
โ”‚       โ”‚   โ”œโ”€โ”€ KakaoAlarmModal.js
โ”‚       โ”‚   โ”œโ”€โ”€ MyPage.js
โ”‚       โ”‚   โ””โ”€โ”€ RegionSelect.js
โ”‚       โ”œโ”€โ”€ index.css
โ”‚       โ”œโ”€โ”€ index.js
โ”‚       โ”œโ”€โ”€ logo.svg
โ”‚       โ”œโ”€โ”€ pages
โ”‚       โ”‚   โ”œโ”€โ”€ AlarmPage.js
โ”‚       โ”‚   โ”œโ”€โ”€ JobDetailPage.js
โ”‚       โ”‚   โ”œโ”€โ”€ JobListPage.js
โ”‚       โ”‚   โ”œโ”€โ”€ MainPage.js
โ”‚       โ”‚   โ””โ”€โ”€ MyPage.js
โ”‚       โ”œโ”€โ”€ reportWebVitals.js
โ”‚       โ”œโ”€โ”€ services
โ”‚       โ”‚   โ”œโ”€โ”€ JobService.js
โ”‚       โ”‚   โ”œโ”€โ”€ KakaoAlarmService.js
โ”‚       โ”‚   โ”œโ”€โ”€ RegionService.js
โ”‚       โ”‚   โ””โ”€โ”€ UserService.js
โ”‚       โ””โ”€โ”€ setupTests.js
โ””โ”€โ”€ README.md

๐ŸŽ‰ ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ ๋ฐ ์„ฑ๊ณผ

  • ๐Ÿ  ์‚ฌ์šฉ์ž์˜ ๊ฑฐ์ฃผ ์ง€์—ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งž์ถคํ˜• ์ผ์ž๋ฆฌ๋ฅผ ์ถ”์ฒœํ•˜์—ฌ ๊ณ ๋ น์ธต์˜ ์žฌ์ทจ์—… ์ ‘๊ทผ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.
  • ๐Ÿ“ฃ ์นด์นด์˜คํ†ก ์•Œ๋ฆผ API๋ฅผ ํ™œ์šฉํ•ด ์ƒˆ๋กœ์šด ์ผ์ž๋ฆฌ๊ฐ€ ๋“ฑ๋ก๋˜๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ์ „์†กํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๐ŸŒ Spring Boot์™€ MyBatis, JPA, Querydsl์„ ํ™œ์šฉํ•˜์—ฌ ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ RESTful API ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • MyBatis๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๋ฐ ์ฟผ๋ฆฌ ๋งคํ•‘์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • JPA๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘(ORM)์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • Querydsl์„ ํ™œ์šฉํ•˜์—ฌ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•จ์œผ๋กœ์จ ๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๐Ÿ—„๏ธ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์‹ฑ๊ณผ ์ฟผ๋ฆฌ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ๊ฒ€์ƒ‰ ๋ฐ ์กฐํšŒ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • โฐ Spring Batch์™€ Quartz๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ณผ ์•Œ๋ฆผ ๋ฐœ์†ก ๋“ฑ์˜ ๋ฐฐ์น˜ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜์—ฌ ์šด์˜ ํšจ์œจ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.
  • โœ… JUnit5๋ฅผ ํ™œ์šฉํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์ˆ˜ํ–‰ํ•˜์—ฌ ์„œ๋น„์Šค์˜ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ”ง ๊ฐœ์„  ์‚ฌํ•ญ ๋ฐ ์ถ”ํ›„ ๊ณ„ํš

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

๐Ÿšจ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ฐ€์ด๋“œ

N+1 ๋ฌธ์ œ ๋ฐœ์ƒ

  • ์ฆ์ƒ: ์ผ์ž๋ฆฌ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ๋•Œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ์ฆ‰์‹œ ๋กœ๋”ฉ(EAGER)ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋‹ค์ˆ˜ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์›์ธ: JPA์˜ ์ฆ‰์‹œ ๋กœ๋”ฉ ์ „๋žต์œผ๋กœ ์ธํ•ด ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: ์ง€์—ฐ ๋กœ๋”ฉ(LAZY) ์ „๋žต์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ํŽ˜์น˜ ์กฐ์ธ(Fetch Join)์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•จ๊ป˜ ์กฐํšŒํ•˜๋„๋ก ์ตœ์ ํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ OOM ๋ฐœ์ƒ

  • ์ฆ์ƒ: ์ผ์ž๋ฆฌ ๋งค์นญ ๋ฐฐ์น˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉํ•˜์—ฌ Out of Memory(OOM) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์›์ธ: ๋ฐฐ์น˜ ์ž‘์—…์—์„œ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: Spring Batch์˜ Chunk ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์นด์นด์˜คํ†ก ์•Œ๋ฆผ API ํ˜ธ์ถœ ์‹คํŒจ

  • ์ฆ์ƒ: ์ผ์ž๋ฆฌ ๋งค์นญ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์นด์นด์˜คํ†ก์œผ๋กœ ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ๋•Œ ๊ฐ„ํ—์ ์œผ๋กœ API ํ˜ธ์ถœ์ด ์‹คํŒจํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์›์ธ: ์นด์นด์˜คํ†ก ์•Œ๋ฆผ API์˜ ์š”์ฒญ ์ œํ•œ(rate limit)์„ ์ดˆ๊ณผํ•˜์—ฌ ์ผ์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ์ด ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒƒ์œผ๋กœ ํŒŒ์•…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ: ์š”์ฒญ ์ œํ•œ์„ ๊ณ ๋ คํ•˜์—ฌ ์•Œ๋ฆผ ๋ฐœ์†ก ๋กœ์ง์„ ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•˜๋„๋ก ์กฐ์ ˆํ•˜๊ณ , ์‹คํŒจํ•œ ํ˜ธ์ถœ์€ ์žฌ์‹œ๋„ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์นด์นด์˜คํ†ก ์•Œ๋ฆผ API์˜ ์ •์ฑ…์„ ๋ฉด๋ฐ€ํžˆ ํ™•์ธํ•˜๊ณ  ์ค€์ˆ˜ํ•˜์—ฌ ์•ˆ์ •์ ์ธ ์•Œ๋ฆผ ๋ฐœ์†ก์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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




์ž๋ฃŒ ์ค€๋น„

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

image

๋ฐฐ๊ฒฝ ๋ฐ ๋ชฉํ‘œ

image image image

์„œ๋น„์Šค ๊ธฐ๋Šฅ

image

์„œ๋น„์Šค ํŠน์žฅ์ 

image image

๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ

image

About

๐Ÿ˜ ํ•ด์ปคํ†ค ํ”„๋กœ์ ํŠธ : ๋…ธ์ธ ๊ตฌ์ง ์ •๋ณด ์•Œ๋ฆผ & ๊ณต๊ณต์„œ๋น„์Šค ์•Œ๋ฆผ ์„œ๋น„์Šค

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published