Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/hyunsoo730/likelion-hackaton

๐Ÿ˜ ํ•ด์ปคํ†ค ํ”„๋กœ์ ํŠธ : ๋…ธ์ธ ๊ตฌ์ง ์ •๋ณด ์•Œ๋ฆผ & ๊ณต๊ณต์„œ๋น„์Šค ์•Œ๋ฆผ ์„œ๋น„์Šค
https://github.com/hyunsoo730/likelion-hackaton

Last synced: 4 days ago
JSON representation

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

Awesome Lists containing this project

README

        

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


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

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

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

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

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

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

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

### ๋ฐฑ์—”๋“œ

| ์กฐํ˜„์ˆ˜ | ๊น€๋ฏผ์„ญ |
| :------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------: |
| | |
| [@hyunsoo730](https://github.com/hyunsoo730) | [@k-ms1998](https://github.com/k-ms1998) |
| ์„ธ์ข…๋Œ€ํ•™๊ต ์†Œํ”„ํŠธ์›จ์–ดํ•™๊ณผ 4ํ•™๋…„ | ์„ธ์ข…๋Œ€ํ•™๊ต ์†Œํ”„ํŠธ์›จ์–ดํ•™๊ณผ 4ํ•™๋…„ |

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

| ๋ฌธ์„ฑํฌ | ๊ณ ํ˜œ๋ฆฐ | ์ „๊ฒฝ์› |
| :------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| | | |
| [@seong-hui](https://github.com/seong-hui) | [@hlynnn](https://github.com/hlynnn) | [@jeonkyungwon](https://github.com/jeonkyungwon) |
| ์„ธ์ข…๋Œ€ํ•™๊ต ์ง€๋Šฅ๊ธฐ์ „ 4ํ•™๋…„ | ์„ธ์ข…๋Œ€ํ•™๊ต ์ง€๋Šฅ๊ธฐ์ „ 4ํ•™๋…„ | ์„ธ์ข…๋Œ€ํ•™๊ต ์ง€๋Šฅ๊ธฐ์ „ 4ํ•™๋…„ |

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

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

### Requirements

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

- [Java 11](https://www.oracle.com/java/technologies/javase-jdk11-downloads.html)
- [Maven](https://maven.apache.org/)
- [Node.js 14.19.3](https://nodejs.org/ca/blog/release/v14.19.3/)
- [Npm 9.2.0](https://www.npmjs.com/package/npm/v/9.2.0)

### Installation

1. ํ”„๋กœ์ ํŠธ ํด๋ก 
```bash
$ 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](https://img.shields.io/badge/Git-F05032?style=for-the-badge&logo=Git&logoColor=white)
![Github](https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=GitHub&logoColor=white)

### Config

![npm](https://img.shields.io/badge/npm-CB3837?style=for-the-badge&logo=npm&logoColor=white)

### Development

![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&logo=Javascript&logoColor=white)
![React](https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB)
![Bootstrap](https://img.shields.io/badge/Bootstrap-7952B3?style=for-the-badge&logo=Bootstrap&logoColor=white)

### Communication

![Slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge&logo=Slack&logoColor=white)
![Notion](https://img.shields.io/badge/Notion-000000?style=for-the-badge&logo=Notion&logoColor=white)
![GoogleMeet](https://img.shields.io/badge/GoogleMeet-00897B?style=for-the-badge&logo=Google%20Meet&logoColor=white)

## ๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„
### ERD (Entity-Relationship Diagram)
![ERD](https://i.postimg.cc/tC9B4RhZ/ERD.png)

ํ”„๋กœ์ ํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋Š” ์œ„์™€ ๊ฐ™์€ 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๋ฅผ ํ™œ์šฉํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ์™€ ์ด์Šˆ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

## ๐Ÿ›๏ธ ์•„ํ‚คํ…์ฒ˜
### ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

```plaintext
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