Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
4aafce7
chore: FAST API docker 환경 구축및 코드 rollback (#23)
kakusiA Aug 27, 2025
204a343
chore : logger 패키지 변경
rll2641 Aug 27, 2025
726b9bb
feat : PostgreSQL 매니저 동기 / 비동기 방식 추가
rll2641 Aug 27, 2025
dbeff6b
Merge branch 'develop' into feature/db-connector
rll2641 Aug 28, 2025
757f862
feat : PostgreDB 커넥션 매니저 작성 ( 동기 / 비동기 )
rll2641 Aug 28, 2025
ca23335
chore: Spring Batch 의존성 추가
jihukimme Aug 31, 2025
5920887
chore: Batch 작업을 위한 초기 DTO 작성
jihukimme Aug 31, 2025
acd0f33
chore: Batch 작업을 위한 초기 Mapper 작성
jihukimme Aug 31, 2025
cb95104
chore: Batch 작업을 위한 초기 Scheduler 작성
jihukimme Aug 31, 2025
e56e017
chore: 초기 Batch 설정
jihukimme Aug 31, 2025
8a6484f
refactor: 코드 포맷팅
jihukimme Aug 31, 2025
e49bd84
refactor FastApi API코드 리펙토링 (#28)
kakusiA Sep 3, 2025
2e4c96c
feat : Crwaling 관련 비즈니스 에러 작성
rll2641 Sep 3, 2025
efc50ed
기본적 auth 구조 설정 (#29)
can019 Sep 3, 2025
a214129
chore: toml 의존성 추가
Sep 3, 2025
ac7a734
chore: toml 의존성 추가
Sep 3, 2025
2e2cb37
chore: 의존성 추가한거 수정
Sep 3, 2025
ede4216
feat : Service logging Middleware 적용
rll2641 Sep 3, 2025
3a4f673
feat : Service logging Middleware 적용
rll2641 Sep 3, 2025
09868ca
Merge branch 'develop' into feature/business-error
rll2641 Sep 3, 2025
2c660c1
feat : Service logging 미들웨어 적용, CrawlingExcpetion 작성
rll2641 Sep 3, 2025
54bd007
feat: FastAPI 최종 상품 크롤링 기능 추가
thkim7 Sep 3, 2025
e83f84d
feat: FastAPI 최종 상품 크롤링 기능 추가
thkim7 Sep 3, 2025
c2c568c
Merge branch 'develop' of https://github.com/Kernel180-BE12/Final-4te…
thkim7 Sep 3, 2025
4293017
feat: FastAPI 최종 상품 크롤링 테스트 코드 추가
thkim7 Sep 3, 2025
6900570
feat: FastAPI 키워드로 상품 검색 뼈대 구성
thkim7 Sep 3, 2025
7298fb0
feat: FastAPI 키워드로 매칭 로직 뼈대 구성
thkim7 Sep 3, 2025
50da82c
feat: FastAPI 유사도 검사 로직 뼈대 구성
thkim7 Sep 3, 2025
58a4af5
feat: FastAPI 최종 상품 크롤링 테스트 코드 수정
thkim7 Sep 4, 2025
de2f93b
Merge pull request #32 from Kernel180-BE12/feature/crawl_service
thkim7 Sep 4, 2025
b9818c2
feat:FASTAPI 네이버 크롤링 기능 추가 (#34)
kakusiA Sep 4, 2025
9456e00
chore: 라우터 코드 수정
thkim7 Sep 4, 2025
cebd56a
Merge remote-tracking branch 'origin/develop' into feature/search_ser…
thkim7 Sep 4, 2025
b8411f4
feat: FastAPI 검색, 매칭, 유사도 뼈대 수정
thkim7 Sep 4, 2025
8cc1847
Merge pull request #33 from Kernel180-BE12/feature/search_service_bone
thkim7 Sep 4, 2025
d71bfba
feat: FastAPI util 작성
thkim7 Sep 4, 2025
21f441f
feat: FastAPI util 작성
thkim7 Sep 4, 2025
4e81b21
feat: FastAPI service 작성
thkim7 Sep 4, 2025
4a7aeb0
feat: FastAPI schemas 수정
thkim7 Sep 4, 2025
e6c7e4e
User create, insert query (#35)
can019 Sep 4, 2025
5e7f13c
feat: FastAPI crawl 수정
thkim7 Sep 4, 2025
a974b29
Local 환경 postgre에서 mariadb로 변경 (#36)
can019 Sep 4, 2025
0c175c0
feat: FastAPI 기존 파이프라인 service 모듈화 완료
thkim7 Sep 4, 2025
8325c16
feat: FastAPI 기존 파이프라인 service 모듈화 완료
thkim7 Sep 4, 2025
07f6586
feat: FastAPI config 파일 수정
thkim7 Sep 4, 2025
877b18d
chore: ignore에 env 관련 파일 제거
can019 Sep 4, 2025
59a24ab
fix: User create table
can019 Sep 4, 2025
82b07f4
chore : 버전 관리
rll2641 Sep 4, 2025
d086697
fix: create, internel user sql
can019 Sep 4, 2025
f826273
Organization list (#37)
can019 Sep 4, 2025
52ff7b4
feat: FastAPI 형태소 분석 라이브러리 MeCab관련 경로 설정 추가
thkim7 Sep 4, 2025
6d8b3b4
조직 별 position, role, department return api (#39)
can019 Sep 4, 2025
1c10502
Merge pull request #38 from Kernel180-BE12/feature/service_separation
thkim7 Sep 4, 2025
d132c7d
feat : 티스토리 자동 포스팅 추가
rll2641 Sep 4, 2025
7084aa1
랜덤 비밀번호 생성 및 mock email service (#41)
can019 Sep 5, 2025
26b3d13
chore : 블로그 자동화 파일 이름 변경, 추후 디자인 패턴 적용을 위해 틀 작성
rll2641 Sep 5, 2025
0593363
Merge branch 'develop' into feature/naver-crawling
rll2641 Sep 5, 2025
d54f442
chore : 아이디, 비밀번호 가림
rll2641 Sep 5, 2025
87ebc0c
feat : 티스토리 블로그 포스팅 자동화
rll2641 Sep 5, 2025
887efbb
refactor: DynamicSchedule 방식으로 변경
jihukimme Sep 5, 2025
ecf6b04
refactor: DynamicSchedule 방식으로 변경 후 불필요한 파일 삭제
jihukimme Sep 5, 2025
95968cc
refactor: Code Formmating
jihukimme Sep 5, 2025
56721cf
refactor: 디렉토리 구조 리팩토링
jihukimme Sep 5, 2025
2677e1e
refactor: Code Formatting
jihukimme Sep 5, 2025
0613dc7
chore: batch domain 하위로 이동
jihukimme Sep 5, 2025
0b5253e
Merge branch 'develop' into feature/product-crawling-batch
jihukimme Sep 5, 2025
b8914b5
refactor: 불필요한 DTO 삭제
jihukimme Sep 5, 2025
5f868d8
refactor: batch 패키지 위치를 domain 하위로
jihukimme Sep 6, 2025
20094dd
chore : router 단수형 -> 복수형
rll2641 Sep 6, 2025
9d42d89
feat : 네이버, 티스토리 맥 기준 블로그 포스팅 자동화
rll2641 Sep 6, 2025
a318c8c
chore : config 파일에 환경변수 추가
rll2641 Sep 6, 2025
a0d631e
chore : 블로그 배포를 위한 RequestBlogPublish 변수 추가
rll2641 Sep 6, 2025
c839057
chore : 오타 수정
rll2641 Sep 6, 2025
2ae738d
feat : 블로그 포스팅 Exception 추가
rll2641 Sep 6, 2025
bad86c2
feat : 블로그(네이버, 티스토리) 포스팅 자동화
rll2641 Sep 6, 2025
00123fd
feat : 블로그 포스트 자동화 템플릿 메서드 적용
rll2641 Sep 6, 2025
d2931c3
fix: emoji가 보이지 않는 문제 및 개행 변경
can019 Sep 7, 2025
e0c5e98
Email 중복 확인 api (#45)
can019 Sep 7, 2025
b558622
Unit test, e2e test config 및 support class 작성 (#46)
can019 Sep 7, 2025
e72d71d
chore: 동적 워크플로우 기반 배치 시스템 초기 설정
jihukimme Sep 7, 2025
b11889c
chore: E2E profile 변경 (#48)
can019 Sep 8, 2025
78d732d
chore: java ci test 활성화
can019 Sep 8, 2025
3a53d00
chore: Develop환경에서 spring 시작 히 create table 자동 실행
can019 Sep 8, 2025
a8fe27f
chore: draft pr에서 workflow 실행하지 않도록 설정
can019 Sep 8, 2025
f41e1df
배치/워크플로 관련 DB 스키마 초기 설정 (#47)
jihukimme Sep 8, 2025
91ec80e
Merge branch 'develop' into test/blog-post
rll2641 Sep 8, 2025
459cc39
chore : 주석변경
rll2641 Sep 8, 2025
0fab43f
chore: User Entity Deprecated 선언
jihukimme Sep 8, 2025
752deb6
feat : 블로그 자동화
rll2641 Sep 8, 2025
d8597c2
local 환경에서 data 자동 초기화 (#49)
can019 Sep 8, 2025
19c042f
User 가입 api (#52)
can019 Sep 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 20 additions & 7 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!--
<!--
PR 제목 작성 가이드:
형식: <타입>: <간단한 설명>
타입 예시:
Expand All @@ -11,22 +11,35 @@ PR 제목 작성 가이드:
- chore: 빌드, 패키지 등 기타 작업
예시: feat: 사용자 로그인 API 구현
-->
## :메모: 작업 내용

## 📝 작업 내용
<!-- 이번 PR에서 구현한 기능이나 수정한 내용을 구체적으로 작성해주세요 -->
## :링크: 관련 이슈
<!-- 관련된 이슈가 있다면 링크해주세요 -->

---

## 🔗 관련 이슈
<!-- 관련된 이슈가 있다면 아래 형식으로 작성해주세요 -->
- Closes #이슈번호
- Related to #이슈번호
## :말풍선: 추가 요청사항

---

## 💬 추가 요청사항
<!-- 리뷰어에게 특별히 확인받고 싶은 부분이나 질문이 있다면 작성해주세요 -->
## :흰색_확인_표시: 체크리스트

---

## ✅ 체크리스트

### 코드 품질
- [ ] 커밋 컨벤션 준수 (feat/fix/docs/refactor 등)
- [ ] 불필요한 코드/주석 제거

### 테스트
- [ ] 로컬 환경에서 동작 확인 완료
- [ ] 기존 기능에 영향 없음 확인

### 배포 준비
- [ ] 환경변수 추가/변경사항 문서화
- [ ] DB 마이그레이션 필요 여부 확인
- [ ] 배포 시 주의사항 없음
- [ ] 배포 시 주의사항 없음
18 changes: 10 additions & 8 deletions .github/workflows/ci-java.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ permissions:

jobs:
spotless-check:
if: github.event.pull_request.draft == false
name: Lint Check
runs-on: ubuntu-latest

Expand Down Expand Up @@ -73,14 +74,15 @@ jobs:
run: ./gradlew build -x test
working-directory: apps/user-service

# - name: Run Tests
# run: |
# if [ "${{ github.base_ref }}" == "main" ]; then
# ./gradlew test
# else
# ./gradlew prTest
# fi
# working-directory: apps/user-service
- name: Run Tests
run: |
if [ "${{ github.base_ref }}" == "main" ]; then
./gradlew allTests
else
./gradlew test
fi
working-directory: apps/user-service

- name: Upload build artifacts
if: matrix.java-version == '21' && github.ref == 'refs/heads/main' && github.event_name == 'push'
uses: actions/upload-artifact@v4
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.idea
logs
*.log
*.log
*.env*
5 changes: 5 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Spring
## Project root
- IDE에서 Final-4team-icebang를 root로 열어야 합니다
- 현재 docker container가 없다면 docker container create 후 spring이 bootstrap되지 않습니다
- 번거롭겠지만 spring boot restart 부탁드립니다.
18 changes: 18 additions & 0 deletions apps/pre-processing-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
FROM python:3.11-slim AS builder
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends curl \
&& rm -rf /var/lib/apt/lists/*
RUN curl -sSL https://install.python-poetry.org | python3 -
ENV PATH="/root/.local/bin:$PATH"
RUN poetry config virtualenvs.create false
COPY pyproject.toml poetry.lock ./
RUN poetry install --no-root

FROM python:3.11-slim AS final
WORKDIR /app
# site-packages + 콘솔 스크립트(gunicorn/uvicorn) 함께 복사
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY ./app ./app
EXPOSE 8000
CMD ["gunicorn", "-w", "2", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:8000", "app.main:app"]
Empty file.
Empty file.
67 changes: 67 additions & 0 deletions apps/pre-processing-service/app/api/endpoints/blog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from ...errors.CustomException import *
from fastapi import APIRouter

from ...model.schemas import *
from app.service.blog.tistory_blog_post_service import TistoryBlogPostService
from app.service.blog.naver_blog_post_service import NaverBlogPostService

# 이 파일만의 독립적인 라우터를 생성합니다.
router = APIRouter()

@router.get("/")
async def root():
return {"message": "blog API"}

@router.post("/rag/create", response_model=ResponseBlogCreate)
async def rag_create(request: RequestBlogCreate):
"""
RAG 기반 블로그 콘텐츠 생성
"""
return {"message": "blog API"}

@router.post("/publish", response_model=ResponseBlogPublish)
async def publish(request: RequestBlogPublish):
"""
생성된 블로그 콘텐츠 배포
네이버 블로그와 티스토리 블로그를 지원
현재는 생성된 콘텐츠가 아닌, 임의의 제목,내용,태그를 배포
:param request: RequestBlogPublish
:return: ResponseBlogPublish
"""

if request.tag == "naver":
naver_service = NaverBlogPostService()
result = naver_service.post_content(
title=request.title,
content=request.content,
tags=request.tags
)

if not result:
raise CustomException("네이버 블로그 포스팅에 실패했습니다.", status_code=500)
return ResponseBlogPublish(
job_id= 1,
schedule_id= 1,
schedule_his_id= 1,
status="200",
metadata=result
)

else:
tistory_service = TistoryBlogPostService()
result = tistory_service.post_content(
title=request.title,
content=request.content,
tags=request.tags
)

if not result:
raise CustomException("티스토리 블로그 포스팅에 실패했습니다.", status_code=500)

return ResponseBlogPublish(
job_id= 1,
schedule_id= 1,
schedule_his_id= 1,
status="200",
metadata=result
)
12 changes: 0 additions & 12 deletions apps/pre-processing-service/app/api/endpoints/embedding.py

This file was deleted.

35 changes: 35 additions & 0 deletions apps/pre-processing-service/app/api/endpoints/keywords.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# app/api/endpoints/keywords.py
from ...service.keyword_service import keyword_search

from fastapi import APIRouter
from ...errors.CustomException import *
from ...model.schemas import RequestNaverSearch, ResponseNaverSearch

# 이 파일만의 독립적인 라우터를 생성합니다.
router = APIRouter()

@router.get("/")
async def root():
return {"message": "keyword API"}

@router.post("/search",response_model=ResponseNaverSearch)
async def search(request: RequestNaverSearch):
"""
이 엔드포인트는 아래와 같은 JSON 요청을 받습니다.
RequestBase와 RequestNaverSearch의 모든 필드를 포함해야 합니다.
{
"job_id": "job-123",
"schedule_id": "schedule-456",
"schedule_his_id": 789,
"tag": "fastapi",
"category": "tech",
"start_date": "2025-09-01T12:00:00",
"end_date": "2025-09-02T15:00:00"
}
"""
response_data= await keyword_search(request)
return response_data

@router.post("/ssadagu/validate",response_model=ResponseNaverSearch)
async def ssadagu_validate(request: RequestNaverSearch):
return ResponseNaverSearch()
12 changes: 0 additions & 12 deletions apps/pre-processing-service/app/api/endpoints/processing.py

This file was deleted.

50 changes: 50 additions & 0 deletions apps/pre-processing-service/app/api/endpoints/product.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from fastapi import APIRouter, Request, HTTPException
from app.decorators.logging import log_api_call
from ...errors.CustomException import InvalidItemDataException, ItemNotFoundException
from ...service.crawl_service import crawl_product_detail
from ...service.search_service import search_products
from ...service.match_service import match_products
from ...service.similarity_service import select_product_by_similarity
from ...model.schemas import *

router = APIRouter()

@router.get("/")
async def root():
return {"message": "product API"}

@router.post("/search", response_model=ResponseSadaguSearch)
async def search(request: RequestSadaguSearch):
"""
상품 검색 엔드포인트
"""
return await search_products(request)

@router.post("/match", response_model=ResponseSadaguMatch)
async def match(request: RequestSadaguMatch):
"""
상품 매칭 엔드포인트
"""
return match_products(request)

@router.post("/similarity", response_model=ResponseSadaguSimilarity)
async def similarity(request: RequestSadaguSimilarity):
"""
유사도 분석 엔드포인트
"""
return select_product_by_similarity(request)

@router.post("/crawl", response_model=ResponseSadaguCrawl)
async def crawl(request: Request, body: RequestSadaguCrawl):
"""
상품 상세 정보 크롤링 엔드포인트
"""
try:
result = await crawl_product_detail(body)
return result
except InvalidItemDataException as e:
raise HTTPException(status_code=e.status_code, detail=e.detail)
except ItemNotFoundException as e:
raise HTTPException(status_code=e.status_code, detail=e.detail)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
13 changes: 8 additions & 5 deletions apps/pre-processing-service/app/api/router.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
# app/api/router.py
from fastapi import APIRouter
from .endpoints import embedding, processing,test
from .endpoints import keywords, blog, product, test
from ..core.config import settings

api_router = APIRouter()

# embedding API URL
api_router.include_router(embedding.router, prefix="/emb", tags=["Embedding"])
api_router.include_router(keywords.router, prefix="/keywords", tags=["keyword"])

# processing API URL
api_router.include_router(processing.router, prefix="/prc", tags=["Processing"])
api_router.include_router(blog.router, prefix="/blogs", tags=["blog"])

#모듈 테스터를 위한 endpoint
api_router.include_router(test.router, prefix="/test", tags=["Test"])
#상품 API URL
api_router.include_router(product.router, prefix="/products", tags=["product"])

#모듈 테스터를 위한 endpoint -> 추후 삭제 예정
api_router.include_router(test.router, prefix="/tests", tags=["Test"])

@api_router.get("/")
async def root():
Expand Down
Loading
Loading