Knitting Girls νλ‘μ νΈ μ€ λ°±μλ(λͺ¨λΈ μλ² API & CRUD API λ° μλ²) λͺ¨λμ μ¬μ©λ²κ³Ό ꡬ쑰λ₯Ό μ 리ν READMEμ λλ€.
Backend μλ²:
http://43.201.186.153:8080
ML μλ²:http://43.201.186.153:8000
- 리ν¬μ§ν 리 κ°μ
- μ£Όμ κΈ°λ₯
- μꡬμ¬ν
- μ€μΉ λ° λΉλ
- ML server μ½λ κ°μ
- BE Java ν΄λμ€ κ°μ
- API μ¬μ© μμ
- DB μ€ν€λ§ λ° λ€ν
-
κΈ°λ₯
- μ΄λ―Έμ§ μ λ‘λ β μ μ₯ β URL λ°ν
- κ²μκΈΒ·λκΈΒ·λΆλ§ν¬ CRUD
- μΉ΄μΉ΄μ€ OAuth2 κΈ°λ° λ‘κ·ΈμΈ β JWT ν ν° λ°κΈ
- ν΄μνκ·Έ κ²μ, μμ±μλ³ μ‘°ν λ±
-
ꡬμ±
backend/: Spring Boot κΈ°λ° REST API μλ²ml_server/: Python FastAPI κΈ°λ° ML μλ² (λ³λ λ°°ν¬)
- μΈμ¦(Authentication & Authorization)
- κ²μκΈ(Post) κ΄λ¦¬
- λκΈ(Comment) κ΄λ¦¬
- λΆλ§ν¬(Bookmark) & μ’μμ(Like) ν κΈ
- ν΄μνκ·Έ κ²μ & μμ±μλ³ κ²μκΈ μ‘°ν
- λͺ¨λΈ μλ² μ°λ β PDF λμ μμ±
- Java β₯ 17
- Spring Boot 2.5.x μ΄μ
- Maven λλ Gradle
- MySQL 8.0 μ΄μ (μ΄λ―Έ μλ²μ λ°°ν¬λμ΄ μμΌλ―λ‘ λ³λ μ€ν λΆνμ)
- Python 3.8 μ΄μ (μ΄λ―Έ μλ²μ λ°°ν¬λμ΄ μμΌλ―λ‘ λ³λ μ€ν λΆνμ)
1) 리ν¬μ§ν 리 ν΄λ‘
git clone https://github.com/KnittingGirls/BackEnd.git
2) νκ²½ μ€μ
src/main/resources/application.properties λ³΅μ¬ λ°
- MySQL μ μ μ 보(JDBC URL, μ¬μ©μ/λΉλ°λ²νΈ)
- JWT μν¬λ¦ΏΒ·ν ν° λ§λ£ μκ°
- CORS νμ© λλ©μΈ λ± μμ
best_model.pth, pascal.pth, lip.pth, atr.pthλ ml_server νμμ μ΄λ
# 3) λ‘컬 μ€ν λ°©λ² (ν
μ€νΈμ©)
**μ£Όμ: EC2 μλ²(43.201.186.153)μ μ΄λ―Έ λ°°ν¬λμ΄ μμΌλ―λ‘, λ‘컬 μ€ν μμ΄ API νΈμΆλ§μΌλ‘ μΆ©λΆν©λλ€.**
1. λ°±μλ μλ² μ€ν
- IDE(IntelliJ λ±)μμ Application.java νμΌ μ’μΈ‘μ βΆοΈ μμ΄μ½ ν΄λ¦
- λλ gradle bootjar ν, ν°λ―Έλμμ java -jar build/libs/knitting-girls-0.0.1-SNAPSHOT.jar
2. λͺ¨λΈ μλ² μ€ν (ν°λ―Έλ)
cd ml_server
source venv/bin/activate
uvicorn final_model_server:app --host 0.0.0.0 --port 8000 --reloadml_server/ λλ ν°λ¦¬μ ν¬ν¨λ μ£Όμ μ€ν¬λ¦½νΈ λ° μλ² μ½λ
- FastAPI κΈ°λ° μλν¬μΈνΈ(/predict, /pdfs/{filename})
- DeepLabV3+ λͺ¨λΈ μμΈ‘ β λ§μ€ν¬ μμ±
- SCHP(extractor) νΈμΆ β ννΈλ³ μμλΌμΈ
- fin_fin.py μ€ν β PDF λμ μμ±
- μ²λ¦¬ μκ° λ‘κΉ λ°ν
- ꡬλ²μ FastAPI μλ²
- patch_single_pdf.pyλ₯Ό μ΄μ©ν΄ segmentation κ²°κ³Όλ₯Ό ν μ€νΈ 그리λ νν PDFλ‘ λ³ν
- SCHP(Self-Correction Human Parsing) λͺ¨λΈ νΈμΆ CLI
- --dataset, --model-restore λ± μ΅μ μΌλ‘ λ€μν λ°μ΄ν°μ μ§μ
- μ λ ₯ ν΄λ λ΄ λͺ¨λ μ΄λ―Έμ§μ λν΄ ννΈλ³ λ§μ€ν¬(.png) μμ±
- DeepLab κ²°κ³Ό μ΄λ―Έμ§ + SCHP κ²°κ³Ό μ΄λ―Έμ§ β dominant symbol μΆμΆ
- μ¬λ³Ό ν¨ν΄(symbol_patterns)μΌλ‘ λ³ν β matplotlib 그리λμ λ λλ§
- κ²°κ³Ό front & sleeve νμ΄μ§λ₯Ό νλμ PDFλ‘ μ μ₯
- RGB λΌλ²¨ μ΄λ―Έμ§λ₯Ό 3Γ3 λ¬Έμ κΈ°νΈ ν¨ν΄(symbol_patterns)μΌλ‘ λ³ν
- matplotlib β PDF μΆλ ₯ (model_server.pyμ μ°λ μ¬μ©)
- λ₯λ© & SCHP κ²°κ³Ό μ΄λ―Έμ§λ₯Ό μΈλ‘λ‘ ν©μ³ λ¨μ PDF μ μ₯
- κ°λ¨ν λΉκ΅μ© μ΄κΈ° ν μ€νΈ μ€ν¬λ¦½νΈ
- MultipartConfig
νμΌ μ λ‘λ(μ΅λ ν¬κΈ°, μμ μ μ₯μ) μ€μ - SecurityConfig
JWT νν°, μΈμ¦Β·μΈκ° μ μ± μ€μ - WebConfig
CORS, λ©μμ§ λ³ν, μΈν°μ ν° μ€μ
- AuthController
/api/auth/login(μΉ΄μΉ΄μ€ OAuth2 β JWT λ°κΈ)
- PostController
/posts(κ²μκΈ CRUD, ν΄μνκ·ΈΒ·μμ±μλ³ μ‘°ν)
- CommentController
/posts/{postId}/comment(λκΈ CRUD)
- ImageController
/images/upload(MultipartFile μ μ₯ β URL λ°ν)
- ModelServerController
/predict(ML μλ² μ°λ β PDF λμ μμ±)
- PostDto :
content,hashtags - CommentDto :
content - ImageDto :
url
- User, Post, Comment, Image, Bookmark
JPA @Entity ν΄λμ€
- UserRepository, PostRepository, CommentRepository, ImageRepository, BookmarkRepository
Spring Data JPA μΈν°νμ΄μ€
- JwtTokenProvider
JWT μμ±Β·νμ±Β·μ ν¨μ± κ²μ¬ λ©μλ
- AuthService : λ‘κ·ΈμΈ λ‘μ§, μ¬μ©μ μ‘°ν λ° JWT μμ±
- PostService : κ²μκΈ CRUD, ν΄μνκ·Έ νμ±Β·κ²μ
- ImageService : νμΌ μ μ₯ κ²½λ‘ κ²°μ , URL μμ±
- MultipartInputStreamFileResource
MultipartFile β InputStreamResource λ³ν μ νΈ
Backend μλ²:
http://43.201.186.153:8080
ML μλ²:http://43.201.186.153:8000
| Method | Path | μ€λͺ | μμ νΈμΆ |
|---|---|---|---|
| GET | /posts |
μ 체 κ²μκΈ μ‘°ν | GET http://43.201.186.153:8080/posts |
| GET | /posts/{postId} |
νΉμ κ²μκΈ μ‘°ν | GET http://43.201.186.153:8080/posts/27 |
| POST | /posts?nickname={λλ€μ} |
κ²μκΈ μμ± | URLPOST http://43.201.186.153:8080/posts?nickname=μ΄νμ°Headers Content-Type: multipart/form-dataBody (form-data) - postDto (Text):json<br> { "content": "κ²μκΈ1", "hashtags": ["#tag"] }- images (File)- nickname (Text) |
| PUT | /posts/{postId}?nickname={λλ€μ} |
κ²μκΈ μμ | URLPUT http://43.201.186.153:8080/posts/13?nickname=μ΄νμ°Body (raw JSON) json<br>{ "content": "κ²μκΈ2", "hashtags": ["#tag2"] } |
| DELETE | /posts/{postId}?nickname={λλ€μ} |
κ²μκΈ μμ | DELETE http://43.201.186.153:8080/posts/15?nickname=μ΄νμ° |
| GET | /posts/search?tag={μΈμ½λ©λν΄μνκ·Έ} |
ν΄μνκ·Έ κ²μ | GET http://43.201.186.153:8080/posts/search?tag=%23JPA (%23= #) |
| GET | /posts/user?nickname={λλ€μ} |
μμ±μλ³ κ²μκΈ μ‘°ν | GET http://43.201.186.153:8080/posts/user?nickname=μ΄νμ° |
| POST | /posts/{postId}/comment?nickname={λλ€μ}&content={λκΈ} |
λκΈ μμ± | POST http://43.201.186.153:8080/posts/1/comment?nickname=μ΄νμ°&content=ν
μ€νΈ |
| POST | /posts/{postId}/bookmark?nickname={λλ€μ} |
λΆλ§ν¬ ν κΈ (λ±λ‘/ν΄μ ) | POST http://43.201.186.153:8080/posts/5/bookmark?nickname=μ΄νμ° |
| GET | /posts/{postId}/like?nickname={λλ€μ} |
μ’μμ ν κΈ (μ‘°ν ν ν κΈ) | GET http://43.201.186.153:8080/posts/5/like?nickname=μ΄νμ° |
| GET | /posts/bookmarks?nickname={λλ€μ} |
μ¬μ©μ λΆλ§ν¬ λͺ©λ‘ μ‘°ν | GET http://43.201.186.153:8080/posts/bookmarks?nickname=μ΄νμ° |
| POST | /predict (ML μλ²) |
μ΄λ―Έμ§ μ λ‘λ β PDF λμ μμ± | URLPOST http://43.201.186.153:8000/predictHeaders Content-Type: multipart/form-dataBody (form-data) - file (File) |
| GET | /pdfs/{filename}.pdf (ML μλ²) |
μμ±λ PDF λ€μ΄λ‘λ / νμΈ | GET http://43.201.186.153:8000/pdfs/'PDFνμΌλͺ
.pdf' |
νμ¬ MySQL μΈμ€ν΄μ€λ μ΄λ―Έ EC2(43.201.186.153)μ λ°°ν¬λμ΄ μμ΄ λ°λ‘ μ€νν νμκ° μμ΅λλ€.
νμ μ, μλ backend/db/ λλ ν°λ¦¬μ ν¬ν¨λ dump νμΌλ€μ μ¬μ©νμΈμ:
knitting_girls_users.sqlμ¬μ©μ μ 보(
usersν μ΄λΈ) λ€νknitting_girls_posts.sqlκ²μκΈ λ©νλ°μ΄ν°(
postsν μ΄λΈ) λ€νknitting_girls_post_hashtags.sqlκ²μκΈβν΄μνκ·Έ λ§€ν(
post_hashtagsν μ΄λΈ) λ€νknitting_girls_post_image.sqlκ²μκΈλ³ μ΄λ―Έμ§ μ°κ²°(
post_imageν μ΄λΈ) λ€νknitting_girls_post_likes.sqlμ’μμ κΈ°λ‘(
post_likesν μ΄λΈ) λ€νknitting_girls_comments.sqlλκΈ μ 보(
commentsν μ΄λΈ) λ€νknitting_girls_images.sqlμ λ‘λλ μ΄λ―Έμ§ λ©νλ°μ΄ν°(
imagesν μ΄λΈ) λ€νknitting_girls_bookmarks.sqlλΆλ§ν¬ κΈ°λ‘(
bookmarksν μ΄λΈ) λ€ν
- μ€ν€λ§ μμ± (
schema.sql)CREATE DATABASE IF NOT EXISTS knitting_girls; USE knitting_girls; -- users, posts, post_hashtags, post_image, post_likes, comments, images, bookmarks ν μ΄λΈ DDLβ¦
- λ€ν Import
mysql -u <user> -p knitting_girls < backend/db/knitting_girls_users.sql mysql -u <user> -p knitting_girls < backend/db/knitting_girls_posts.sql mysql -u <user> -p knitting_girls < backend/db/knitting_girls_post_hashtags.sql mysql -u <user> -p knitting_girls < backend/db/knitting_girls_post_image.sql mysql -u <user> -p knitting_girls < backend/db/knitting_girls_post_likes.sql mysql -u <user> -p knitting_girls < backend/db/knitting_girls_comments.sql mysql -u <user> -p knitting_girls < backend/db/knitting_girls_images.sql mysql -u <user> -p knitting_girls < backend/db/knitting_girls_bookmarks.sql