ํธ๋ฆฌํ ์จ๋ผ์ธ ์ฃผ๋ฌธ, ๊ฐ๊น์ด ๋งค์ฅ์์ ํฝ์ ํ์ธ์!
Moamart๋ ์จ๋ผ์ธ์ผ๋ก ์ฃผ๋ฌธํ๊ณ ์ํ๋ ์๊ฐ์ ๋งค์ฅ์์ ํฝ์ ํ ์ ์๋ ํธ๋ฆฌํ ์ผํ ํ๋ซํผ์ ๋๋ค.
- ๐ช ํฝ์ ์๋น์ค: ์ํ๋ ๋งค์ฅ๊ณผ ์๊ฐ์ ์ ํํ์ฌ ํธ๋ฆฌํ๊ฒ ํฝ์
- ๐ ์ค์๊ฐ ์ฅ๋ฐ๊ตฌ๋: ์ฌ๊ณ ํ์ธ ๋ฐ ์๋ ์กฐ์
- ๐ฆ ์ํ ๊ด๋ฆฌ: ์นดํ ๊ณ ๋ฆฌ๋ณ ์ํ ๋ถ๋ฅ ๋ฐ ๊ฒ์
- ๐ณ ๊ฐํธ ์ฃผ๋ฌธ: ๋นํ์๋ ์ด์ฉ ๊ฐ๋ฅํ ๊ฐ๋จํ ์ฃผ๋ฌธ ํ๋ก์ธ์ค
- ๐ ์ ์ฐํ ์ฃผ๋ฌธ ๊ด๋ฆฌ: ๋ถ๋ถ ๋ฐํ/๊ตํ ์ง์
- โป๏ธ ์ข ๋์ ๋ดํฌ: ํ๊ฒฝ์ ์๊ฐํ๋ ๋ดํฌ ์ ํ ์ต์
- โ Java 17 - ์ต์ LTS ๋ฒ์
- ๐ Spring Boot 3.x - ํต์ฌ ํ๋ ์์ํฌ
- ๐ Spring Security - ์ธ์ฆ/์ธ๊ฐ ๊ด๋ฆฌ
- ๐พ Spring Data JPA - ORM ๋ฐ ๋ฐ์ดํฐ ์ ๊ทผ
- ๐ QueryDSL - ๋์ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ
- ๐๏ธ Gradle 9.2.1 - ๋น๋ ๋๊ตฌ
- ๐จ Thymeleaf - ์๋ฒ ์ฌ์ด๋ ํ ํ๋ฆฟ ์์ง
- ๐ Markdown - ์ํ ์์ธ ์ค๋ช ์ง์ (marked.js, SimpleMDE)
- ๐ Vanilla CSS - ์ปค์คํ ์คํ์ผ๋ง
- ๐๏ธ H2 - ๊ฐ๋ฐ ํ๊ฒฝ
- ๐ฌ MySQL - ์ด์ ํ๊ฒฝ
- โ๏ธ AWS S3 - ์ด๋ฏธ์ง ์คํ ๋ฆฌ์ง
- ๐ AWS Secrets Manager - ๋ฏผ๊ฐ ์ ๋ณด ๊ด๋ฆฌ
- ๐ AWS EC2 - ์๋ฒ ํธ์คํ
- ๐ผ๏ธ Thumbnailator - ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง ๋ฐ ์ต์ ํ
moamart/
โโโ ๐ src/main/java/com/kobe/moamart/
โ โโโ ๐ฎ controller/ # ์ปจํธ๋กค๋ฌ ๊ณ์ธต
โ โ โโโ admin/ # ๊ด๋ฆฌ์ ์ปจํธ๋กค๋ฌ
โ โ โโโ api/ # REST API
โ โ โโโ view/ # ๋ทฐ ์ปจํธ๋กค๋ฌ
โ โโโ ๐ผ service/ # ๋น์ฆ๋์ค ๋ก์ง
โ โโโ ๐๏ธ domain/ # ์ํฐํฐ ๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ
โ โ โโโ product/ # ์ํ ๋๋ฉ์ธ
โ โ โโโ order/ # ์ฃผ๋ฌธ ๋๋ฉ์ธ
โ โ โโโ member/ # ํ์ ๋๋ฉ์ธ
โ โ โโโ store/ # ๋งค์ฅ ๋๋ฉ์ธ
โ โ โโโ category/ # ์นดํ
๊ณ ๋ฆฌ ๋๋ฉ์ธ
โ โโโ ๐ฆ dto/ # ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด
โ โโโ โ๏ธ global/ # ์ ์ญ ์ค์
โ โ โโโ config/ # ์ค์ ํด๋์ค
โ โ โโโ security/ # ๋ณด์ ์ค์
โ โ โโโ util/ # ์ ํธ๋ฆฌํฐ
โ โ โโโ exception/ # ์์ธ ์ฒ๋ฆฌ
โ โโโ ๐ MoamartApplication.java
โโโ ๐ src/main/resources/
โ โโโ ๐ application.yml # ๊ธฐ๋ณธ ์ค์
โ โโโ ๐ application-dev.yml # ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
โ โโโ ๐ application-prod.yml # ์ด์ ํ๊ฒฝ ์ค์
โ โโโ ๐ templates/ # Thymeleaf ํ
ํ๋ฆฟ
โโโ ๐จ build.gradle
- โ Java 17 ์ด์
- ๐๏ธ Gradle 9.2.1 ์ด์
- ๐ฌ MySQL 8.0 ์ด์ (์ด์ ํ๊ฒฝ)
git clone https://github.com/your-username/moamart.git
cd moamart./gradlew bootRun --args='--spring.profiles.active=dev'./gradlew bootRun --args='--spring.profiles.active=prod'๋๋ JAR ํ์ผ ๋น๋ ํ ์คํ:
./gradlew build
java -jar -Dspring.profiles.active=prod build/libs/moamart-0.0.1-SNAPSHOT.jar- ๐ ๋ฉ์ธ ํ์ด์ง: http://localhost:8080
- ๐ง ๊ด๋ฆฌ์ ํ์ด์ง: http://localhost:8080/admin/login
- ๐พ H2 ์ฝ์ (๊ฐ๋ฐ ํ๊ฒฝ): http://localhost:8080/h2-console
- ๐ ์ด์ ํ์ด์ง: https://www.moa-mart.com
- โ ์นดํ ๊ณ ๋ฆฌ๋ณ ์ํ ์กฐํ
- โ ์ํ ์์ธ ์ ๋ณด ํ์ธ
- โ ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ/์์ /์ญ์
- โ ์ค์๊ฐ ์ฌ๊ณ ํ์ธ
- โ ํฝ์ ๋งค์ฅ ์ ํ
- โ ํฝ์ ์๊ฐ ์ง์
- โ ์ข ๋์ ๋ดํฌ ์ ํ (10L/20L)
- โ ์ฃผ๋ฌธ ๋ด์ญ ์กฐํ
- โ ์ฃผ๋ฌธ ์ํ ์ค์๊ฐ ํ์ธ
- โ ํ์๊ฐ์ /๋ก๊ทธ์ธ
- โ ๋นํ์ ์ฃผ๋ฌธ ๊ฐ๋ฅ
- โ ์ํ ๋ฑ๋ก/์์ /์ญ์
- โ ์นดํ ๊ณ ๋ฆฌ ๊ด๋ฆฌ
- โ ์ฌ๊ณ ๊ด๋ฆฌ
- โ ์ด๋ฏธ์ง ์ ๋ก๋ (์ธ๋ค์ผ ์๋ ๋ฆฌ์ฌ์ด์ง)
- โ Markdown ์ง์ ์์ธ ์ค๋ช
- โ ์ํ ์ํ ๊ด๋ฆฌ (ํ๋งค์ค/ํ์ /์จ๊น)
- โ ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํ ๋ฐ ํํฐ๋ง
- โ ์ฃผ๋ฌธ ์ํ ๋ณ๊ฒฝ
- โ ๊ฐ๋ณ ์ํ ์ํ ๊ด๋ฆฌ
- โ ๋ถ๋ถ ๋ฐํ/๊ตํ ์ฒ๋ฆฌ
- โ ์ํ ๋ถ๋ฆฌ ๊ธฐ๋ฅ
- โ ์ฐจ์ก/ํ๋ถ ๊ธ์ก ์๋ ๊ณ์ฐ
- โ ๋งค์ฅ ๋ฑ๋ก/์์
- โ ์ด์ ์ํ ๊ด๋ฆฌ
- id: ์ํ ID
- name: ์ํ๋ช
- price: ๊ฐ๊ฒฉ
- stockQuantity: ์ฌ๊ณ ์๋
- status: ์ํ (SELL/SOLD_OUT/STOP)
- isDisplayed: ๋
ธ์ถ ์ฌ๋ถ
- isNew: ์ต์ ์ํ ์ฌ๋ถ
- thumbnailUrl: ์ธ๋ค์ผ ์ด๋ฏธ์ง
- category: ์นดํ
๊ณ ๋ฆฌ (N:1)
- images: ์์ธ ์ด๋ฏธ์ง (1:N)- id: ์ฃผ๋ฌธ ID
- recipientName: ๋ฐ๋ ์ฌ๋
- phoneNumber: ์ฐ๋ฝ์ฒ
- status: ์ฃผ๋ฌธ ์ํ
- orderDate: ์ฃผ๋ฌธ ์ผ์
- pickupDateTime: ํฝ์
์์ ์ผ์
- bagType: ๋ดํฌ ํ์
- originalTotalPrice: ์ฌ์ ๊ฒฐ์ ๊ธ์ก
- store: ํฝ์
๋งค์ฅ (N:1)
- orderItems: ์ฃผ๋ฌธ ์ํ (1:N)- id: ์ฃผ๋ฌธ ์ํ ID
- orderPrice: ์ฃผ๋ฌธ ๋น์ ๊ฐ๊ฒฉ
- count: ์๋
- status: ์ํ ์ํ (๊ฐ๋ณ ๊ด๋ฆฌ)
- product: ์ํ (N:1)
- order: ์ฃผ๋ฌธ (N:1)index.html- ๋ฉ์ธ ํ์ด์ง (์ํ ๋ชฉ๋ก)product/detail.html- ์ํ ์์ธcart.html- ์ฅ๋ฐ๊ตฌ๋orders/review.html- ์ฃผ๋ฌธ ๊ฒํ (๋งค์ฅ ์ ํ)order/checkout.html- ์ฃผ๋ฌธ/๊ฒฐ์ order/complete.html- ์ฃผ๋ฌธ ์๋ฃorders/list.html- ์ฃผ๋ฌธ ๋ด์ญorders/detail.html- ์ฃผ๋ฌธ ์์ธmember/join.html- ํ์๊ฐ์member/login.html- ๋ก๊ทธ์ธ
admin/login.html- ๊ด๋ฆฌ์ ๋ก๊ทธ์ธadmin/product/list.html- ์ํ ๋ชฉ๋กadmin/product/form.html- ์ํ ๋ฑ๋ก/์์ admin/order/list.html- ์ฃผ๋ฌธ ๋ชฉ๋กadmin/order/detail.html- ์ฃผ๋ฌธ ์์ธadmin/store/list.html- ๋งค์ฅ ๋ชฉ๋กadmin/store/form.html- ๋งค์ฅ ๋ฑ๋ก/์์
- โ Spring Security ๊ธฐ๋ฐ ์ธ์ฆ/์ธ๊ฐ
- โ ๋น๋ฐ๋ฒํธ ์ํธํ (BCrypt)
- โ AWS Secrets Manager ์ฐ๋ (์ด์ ํ๊ฒฝ)
- โ CSRF ๋ณดํธ
- โ ๊ถํ๋ณ ์ ๊ทผ ์ ์ด (ADMIN/USER)
- ์
๋ก๋ ๋๋ ํ ๋ฆฌ:
./uploads/ - ์๋ ๋ฆฌ์ฌ์ด์ง: ์ธ๋ค์ผ(800x800), ์๋ณธ(1920x1920)
- ์์ถ: JPEG ํ์ง 85%
- ๋ฒํท:
moamart-product-images-bucket - ๊ฒฝ๋ก:
images/๋๋ ํ ๋ฆฌ - CloudFront ์ฐ๋ ์ง์
./gradlew test./gradlew clean build# ์ถํ ์ถ๊ฐ ์์ - Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'feat: Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
feat: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
fix: ๋ฒ๊ทธ ์์
docs: ๋ฌธ์ ์์
style: ์ฝ๋ ํฌ๋งทํ
refactor: ์ฝ๋ ๋ฆฌํฉํ ๋ง
test: ํ
์คํธ ์ฝ๋
chore: ๋น๋ ์
๋ฌด ์์
This project is licensed under the MIT License.
Bing_9 (kobe)
- GitHub: @devKobe24
- Email: dev.skyachieve91@gmail.com
์ด ํ๋ก์ ํธ๋ ๋ค์ ๊ธฐ์ ๋ค์ ์ฌ์ฉํ์ฌ ๋ง๋ค์ด์ก์ต๋๋ค:
- Spring Boot
- Thymeleaf
- AWS Services
- Thumbnailator
- marked.js / SimpleMDE
- ๊ทธ ์ธ ๋ชจ๋ ์คํ์์ค ๊ธฐ์ฌ์๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ๐
ํ๋ก์ ํธ์ ๋ํ ์ง๋ฌธ์ด๋ ์ ์์ฌํญ์ด ์์ผ์๋ฉด ์ด์๋ฅผ ๋ฑ๋กํด ์ฃผ์ธ์!