Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
225 commits
Select commit Hold shift + click to select a range
bd904b1
:wrench:Settings: password 수정
zmarzmar Aug 4, 2025
7c75f00
:wrench:Settings: docker-compose.yml 수정
zmarzmar Aug 4, 2025
51942ac
:wrench:Settings: cd.yml 수정
zmarzmar Aug 4, 2025
632bfea
:sparkles:feat: 제철 식재료 레시피 API 구현
zmarzmar Aug 5, 2025
a2e9ce1
:sparkles:feat: 제철 식재료 조회 API 구현
zmarzmar Aug 5, 2025
8230891
:heavy_plus_sign:Dependency: webflux 의존성 추가
zmarzmar Aug 6, 2025
f67c1eb
🔧 Settings: S3 초기세팅
zmarzmar Aug 6, 2025
f32b7c3
🔧 Settings: 환경변수 추가
zmarzmar Aug 6, 2025
da3be92
🔧 Settings: S3Config 추가
zmarzmar Aug 7, 2025
7d09d3e
:sparkles:Feat: KAMIS open api 연동 추가
zmarzmar Aug 7, 2025
4550381
:sparkles:Feat: 개별 식재료 가격 조회, 카테고리별 평균 가격 조회 추가
zmarzmar Aug 7, 2025
f80ad0b
✨Feat: 제철 식재료 api 추가
zmarzmar Aug 7, 2025
88b0c71
✨ Feat 개별 식재료, 카테고리별 평균 가격 조회 구현, S3 사진 업로드 추가
zmarzmar Aug 7, 2025
bd29bca
:sparkles: Feat: 전통시장 Open API 연동 및 테스트 컨트롤러 추가
Aug 7, 2025
51a30e7
:wrench: Chore: 테스트 API 접근 허용 위해 Spring Security 설정 추가
Aug 7, 2025
404b86b
:sparkles: add V-World 전통시장 API 연동
Aug 8, 2025
df71740
:sparkles:Feat: 전통시장 bbox 검색 및 필터링 기능 추가
Aug 8, 2025
a753d2e
:wrench:chore: VWorld 2D 데이터 API 연동 설정 수정
Aug 8, 2025
f37dd40
✨Feat: 재래시장 데이터 추가
zmarzmar Aug 8, 2025
ec8f04e
:recycle:Refactor: vwolrd 환경변수 오타 수정
zmarzmar Aug 9, 2025
c9bada5
:wrench:Settings: CORS 처리 추가
zmarzmar Aug 9, 2025
6bf83aa
:wrench:Settings: vworld 도메인 수정
zmarzmar Aug 9, 2025
fbfb87f
:wrench:Settings: vworld key 값 수정
zmarzmar Aug 9, 2025
2c2064a
:wrench:Settings: CORS 수정
zmarzmar Aug 9, 2025
67b94ed
:wrench:Settings: 환경변수 공백 수정
zmarzmar Aug 9, 2025
8fcd3da
:wrench:Settings: CorsConfig 수정
zmarzmar Aug 9, 2025
66ade35
:wrench:Settings: docker-compose.yml 수정
zmarzmar Aug 10, 2025
3c00da9
:sparkles:Feat: BaseTimeEntity 관련 설정 추가
zmarzmar Aug 10, 2025
300925e
:wrench:Settings: chatbot 관련 환경 변수 추가
zmarzmar Aug 10, 2025
4a104c7
:sparkles:Feat: 챗봇 기능 구현
zmarzmar Aug 10, 2025
782624c
:recycle:Refactor: import 문 수정
zmarzmar Aug 10, 2025
52eb630
:recycle:Refactor: import 형식 통일
zmarzmar Aug 10, 2025
b8c342d
✨Feat: 챗봇 기능 구현
zmarzmar Aug 10, 2025
c8d8320
:wrench:Settings: docker-compose.yml langchain 추가
zmarzmar Aug 10, 2025
95b2c1e
:sparkles:Feat: 대형마트 BBOX 검색 API 추가
Aug 10, 2025
7f24a27
:sparkles:feat: 대형마트 조회 API 추가 (Kakao Local 연동)
Aug 10, 2025
0504d69
:memo:docs: Swagger description에 성북구 예시 좌표 추가
Aug 10, 2025
cb032b0
:sparkles:Feat: 대형마트 BBOX 검색 API 추가
2cmin Aug 10, 2025
da427c3
:wrench:Settings:Kakao Local REST API Key
Aug 10, 2025
c0fb889
:bug:429 레이트리밋 완화
Aug 10, 2025
c63cd07
:recycle:WebClient 호출 로깅 필터 추가
Aug 10, 2025
ddc6273
:bug:레이트리밋 완화용 핫픽스
Aug 10, 2025
4f32ccb
:bug:Fix: 레이트리밋 완화용 핫픽스
2cmin Aug 10, 2025
412c34b
:wrench:Settings: mysql url 수정
zmarzmar Aug 10, 2025
de160cb
:sparkles:Feat: 챗봇 대화 내역 조회 구현
zmarzmar Aug 10, 2025
6bfa5a8
:recycle:Refactor: chatdtos 수정
zmarzmar Aug 10, 2025
d630519
:wrench:Settings: local langchain url 수정
zmarzmar Aug 10, 2025
7b1c9cb
:bug:Fix: 429 응답이 RetryExhaustedException로 감싸져 폴백이 동작하지 않던 문제 수정
Aug 11, 2025
b6ec129
:wrench:Settings: 네이티브 DNS 해석을 위해 netty-resolver-dns-native-macos (os…
Aug 11, 2025
7c213ea
:bug:Fix: 429 응답이 RetryExhaustedException로 감싸져 폴백이 동작하지 않던 문제 수정
2cmin Aug 11, 2025
7376dd6
:wrench:Settings: add comment for git workflow check
Aug 11, 2025
f6cdce1
:wrench:Settings: 서브모듈 head 고정
zmarzmar Aug 11, 2025
a37fed1
:sparkles:Feat: 챗봇 대화 제목 자동 생성 구현
zmarzmar Aug 11, 2025
14d7779
:bug:Fix: 서브 모듈 헤더 고정
zmarzmar Aug 11, 2025
62d2533
:wrench:Settings: 캐시 설정을 위한 환경 변수 설정
zmarzmar Aug 11, 2025
52fc6e0
:heavy_plus_sign:Dependency: 캐시 설정을 위한 의존성 추가
zmarzmar Aug 11, 2025
45c255e
:sparkles:Feat: 이미지 자동 생성 구현
zmarzmar Aug 11, 2025
1f4624e
:sparkles:Feat: 캐시 설정
zmarzmar Aug 11, 2025
c75dc63
:sparkles:Feat: unsplash api 연동
zmarzmar Aug 11, 2025
f3ec0ea
:sparkles:Feat: 캐시 설정 구현
zmarzmar Aug 11, 2025
2c1d06b
:recycle:Refactor: 코드 포멧터 적용
zmarzmar Aug 11, 2025
e7576e7
✨Feat: unsplash api를 사용해 이미지 자동 생성 구현
zmarzmar Aug 11, 2025
1860101
:sparkles: Feature: 일일 O/X 퀴즈 및 포인트 적립 기능 추가
Aug 12, 2025
7231a16
:sparkles: Feature: 일일 O/X 퀴즈 및 포인트 적립 기능 추가
Aug 12, 2025
dc12e6b
:sparkles: Feature: 일일 O/X 퀴즈 및 포인트 적립 기능 추가
Aug 12, 2025
396cc7b
:sparkles: Feature: 일일 O/X 퀴즈 및 포인트 적립 기능 추가
Aug 12, 2025
fb17a05
:sparkles: Feature: 일일 O/X 퀴즈 및 포인트 적립 기능 추가
Aug 12, 2025
18ff1ae
:bug: Fix: 일일 O/X 퀴즈 및 포인트 적립 기능 버그 수정
Aug 12, 2025
526a255
:bug: Fix: 일일 O/X 퀴즈 및 포인트 적립 기능 버그 수정
2cmin Aug 12, 2025
703ce66
:wrench:Settings: flyway 환경 변수 수정
zmarzmar Aug 12, 2025
dcc5193
:wrench:Settings: flyway 환경 변수 수정
zmarzmar Aug 12, 2025
20c9f51
:wrench:Settings: flyway 관련 docker-compose.yml 수정
zmarzmar Aug 12, 2025
1135425
:sparkles:Feat: 전통시장, 대형마트 가격 비교 api 구현
zmarzmar Aug 13, 2025
44323b7
:recycle:Refactor: 코드 포멧터
zmarzmar Aug 13, 2025
e103ac5
:wrench:Settings: flyway 환경변수 수정
zmarzmar Aug 13, 2025
efda490
:recycle:Refactor: Spotless import 문 수정
zmarzmar Aug 13, 2025
8a7f324
♻️ Refactor: 메인페이지 시장, 마트 가격 추가
zmarzmar Aug 13, 2025
e3e80bb
:seedling: Seed: 퀴즈 문제, 퀴즈용 필수 ingredient 데이터 추가
Aug 13, 2025
4376aa6
:seedling: Seed: 퀴즈 문제, 퀴즈용 필수 ingredient 데이터 추가
Aug 13, 2025
7f5a3ca
:seedling: Seed: 퀴즈 문제, 퀴즈용 필수 ingredient 데이터 추가
2cmin Aug 13, 2025
ed562d1
:sparkles: Feature: 퀴즈 정답 제출 시 결과·포인트·다음 이동 정보 반환 로직 추가
Aug 13, 2025
a40ca6e
퀴즈 정답 제출 시 결과·포인트·다음 이동 정보 반환 로직 추가
2cmin Aug 13, 2025
4cd9b8f
:recycle:Refactor: S3 사진 저장 경로 수정
zmarzmar Aug 13, 2025
3331086
:sparkles:Feat: 개발자용 래시피 입력 구현
zmarzmar Aug 13, 2025
31acaf8
:sparkles:Feat: 제철 식재료 정보 수정 및 개발자용 데이터 입력 구현
zmarzmar Aug 13, 2025
9dd6235
:wrench:Settings: S3 사진 경로 수정
zmarzmar Aug 13, 2025
1c096d5
:wrench:Settings: S3 사진 경로 수정
zmarzmar Aug 13, 2025
b37714a
♻️ Refactor: 제철식재료 api 수정
zmarzmar Aug 13, 2025
74c6486
:sparkles: Feature: 포인트 지갑 및 적립/내역 조회 기능 구현
Aug 13, 2025
c47d2b8
:sparkles: Feature: 포인트 지갑 및 적립/내역 조회 기능 구현
2cmin Aug 13, 2025
450d55d
🔧Settings: Flyway 마이그레이션 추가 (퀴즈/포인트 스키마 & 시드
Aug 13, 2025
df54fb9
:sparkles:Feat: 마이 페이지 - 피클이와 친해진 지 N일째 표시
Aug 13, 2025
d0bf419
:sparkles:Feat: 마이 페이지 - 피클이와 친해진 지 N일째 표시
2cmin Aug 13, 2025
5c5aad8
:recycle:Refactor: 당일 가격 비교 폴더 이름 수정
zmarzmar Aug 13, 2025
8b6b577
:recycle:Refactor: 당일 가격 비교 폴더 이름 수정
zmarzmar Aug 13, 2025
442e894
:recycle:Refactor: spotless import 문 수정
zmarzmar Aug 13, 2025
f746309
:recycle:Refactor: alter_point_wallet_add_audit.sql 수정
zmarzmar Aug 13, 2025
b385ece
:recycle:Refactor: cache 어노테이션 추가
zmarzmar Aug 15, 2025
85755f7
:sparkles: Feature: 찜 기능 API 구현
Aug 15, 2025
4fdcca4
:sparkles: Feature: 찜 기능 API 구현
Aug 15, 2025
eba92cf
:sparkles: Feature: 찜 기능 API 구현
Aug 15, 2025
1a5bf03
✨ Feat: 찜 기능 API 구현
Aug 15, 2025
7ebdffc
✨ Feat: 찜 기능 API 구현
Aug 15, 2025
529a611
✨ Feat: 찜 기능 API 구현
2cmin Aug 15, 2025
23c7325
💾 PointService 및 DB 초기 포인트 값 30000으로 변경
Aug 15, 2025
9ff4b77
chore: apply spotless formatting
Aug 15, 2025
1a9f718
💾 PointService 및 DB 초기 포인트 값 30000으로 변경
2cmin Aug 15, 2025
4f64a62
💾 PointService 및 DB 초기 포인트 값 30000으로 변경
Aug 15, 2025
7c9260b
💾 PointService 및 DB 초기 포인트 값 30000으로 변경
2cmin Aug 15, 2025
04e0442
💾 PointService 및 DB 초기 포인트 값 30000으로 변경
Aug 15, 2025
b97ab32
✨ feat: 광고 시청 시 당일 퀴즈 추가 시도권 누적 기능 구현
Aug 15, 2025
84cf135
✨ feat: 광고 시청 시 당일 퀴즈 추가 시도권 누적 기능 구현
2cmin Aug 15, 2025
f50f6de
:sparkles:Feat: 광고 시청 보상 추가 시도권 지급 API 추가
Aug 15, 2025
0c21511
:sparkles:Feat: 광고 시청 보상 추가 시도권 지급 API 추가
2cmin Aug 15, 2025
04cf848
:recycle:Refactor: 조리시간, 추천 분류 추가 및 래시피 수정 삭제 구현
zmarzmar Aug 15, 2025
179b406
✨ Feat: initialize user point wallet with default 30000
Aug 16, 2025
5383b54
✨ Feat: initialize user point wallet with default 30000
Aug 16, 2025
59e7fcb
✨ Feat: initialize user point wallet with default 30000
2cmin Aug 16, 2025
1cb0494
✨ Feat: 오늘의 퀴즈 없으면 생성해서 반환
Aug 16, 2025
05b1bf1
:wrench:Settings: dozzle 추가
zmarzmar Aug 16, 2025
e38e1df
✨ Feat: 오늘의 퀴즈 없으면 생성해서 반환
2cmin Aug 16, 2025
47e3ea5
:recycle:Refactor: 챗봇 수정
zmarzmar Aug 16, 2025
9a4288f
🐛 Fix: 퀴즈 없으면 생성
Aug 16, 2025
1f5fd3b
🐛 Fix: 퀴즈 없으면 생성
2cmin Aug 16, 2025
d320b02
:wrench:Settings: www.picklocal.site 추가
zmarzmar Aug 16, 2025
94b1259
:wrench:Settings: 챗봇 mysql 환경변수 추가
zmarzmar Aug 16, 2025
488e64e
:recycle:Refactor: 챗봇 데이터 변환 수정
zmarzmar Aug 16, 2025
ad9626f
:recycle:Refactor: import문 수정
zmarzmar Aug 16, 2025
487d838
✨ Feat: 챗봇 기능 추가
zmarzmar Aug 16, 2025
98962fd
:recycle:Refactor: upstream parsing 수정
zmarzmar Aug 16, 2025
fd52da8
:recycle:Refactor: upstream parsing 수정
zmarzmar Aug 16, 2025
6e8df24
:recycle:Refactor: upstream 수정
zmarzmar Aug 16, 2025
4cb6227
:recycle:Refactor: upstream 수정
zmarzmar Aug 16, 2025
6d9b488
:sparkles:Feat: 제철 식재료 가격, 단위 추가 및 수정, 삭제 구현
zmarzmar Aug 17, 2025
e81d50b
:sparkles:Feat: 전체 식재료 DB 저장, 물품명 검색 기능 추가
zmarzmar Aug 17, 2025
d26df73
:recycle:Refactor: spotless 적용
zmarzmar Aug 17, 2025
5f7759e
♻️ Refactor: 제철 식재료 정보 추가, 전체 식재료 검색 기능 추가
zmarzmar Aug 17, 2025
2a56a12
✨ Feat: 퀴즈 식재료 아이콘 추가
Aug 17, 2025
ca909e7
✨ Feat: 퀴즈 식재료 아이콘 추가
2cmin Aug 17, 2025
d0a4ef3
:sparkles:Feat: 전체 식재료 id로 검색 구현
zmarzmar Aug 17, 2025
17b3657
✨Feat: 전체 식재료 id로 검색 구현
zmarzmar Aug 17, 2025
9eb6579
✨ Feat: 퀴즈 식재료 누락 아이콘 추가
Aug 17, 2025
5eedfbd
✨ Feat: 퀴즈 식재료 누락 아이콘 추가
2cmin Aug 17, 2025
f2423b3
🐛 Fix: 퀴즈 아이콘 null
Aug 17, 2025
1877ce6
:recycle:Refactor: 스웨거 정리
zmarzmar Aug 17, 2025
3db8fa5
🐛 Fix: 퀴즈 아이콘 null
2cmin Aug 17, 2025
204c236
:sparkles:Feat: 전체 식재료 이미지 검색 및 저장 구현
zmarzmar Aug 17, 2025
9c2ecc2
✨Feat: 전체 식재료 이미지 검색 및 저장 구현
zmarzmar Aug 17, 2025
b5e5214
🐛 Fix: 429/504 대형마트 api 오류
Aug 18, 2025
dd8a7ad
🐛 Fix: 429/504 대형마트 api 오류
2cmin Aug 18, 2025
a2663d4
♻️ Refactor: GlobalExceptionHandler 상태코드 보존 & 포장 예외 대비
Aug 19, 2025
e20b3f7
♻️ Refactor: GlobalExceptionHandler 상태코드 보존 & 포장 예외 대비
2cmin Aug 19, 2025
645077f
✨ Feat: 피클이 히스토리
Aug 20, 2025
b1091ba
✨ Feat: 피클이 히스토리
Aug 20, 2025
fb828d3
✨ Feat: 피클이 히스토리
2cmin Aug 20, 2025
d2a62be
:sparkles:Feat: 5년치 식재료 가격 및 카테고리별 가격 구현
zmarzmar Aug 20, 2025
a7cb593
:sparkles:Feat: 12달치, 5년치 가격 구현
zmarzmar Aug 20, 2025
babf22a
:sparkles:Feat: 12달치 식재료 가격 및 카테고리별 가격 구현
zmarzmar Aug 20, 2025
2d24e54
:sparkles:Feat: 12달치, 5년치 가격 구현
zmarzmar Aug 20, 2025
61f70bd
✨Feat: 12달치, 5년치 가격 구현
zmarzmar Aug 20, 2025
487f485
🐛 Fix: 광고 시 같은 문제 반복 & 정답 제출 후 기회 소진 오류
Aug 20, 2025
0f5c36d
🐛 Fix: 광고 시 같은 문제 반복 & 정답 제출 후 기회 소진 오류
2cmin Aug 20, 2025
ae30aac
:sparkles:Feat: 대화내용 삭제 추가
zmarzmar Aug 20, 2025
dd342a0
:sparkles:Feat: 채팅 목록 반환 구현
zmarzmar Aug 20, 2025
5122c3a
:wrench:Settings: S3 경로 추가
zmarzmar Aug 20, 2025
0ab09c3
✨ Feat: 브랜드별 이미지 매핑 기능 추가
Aug 20, 2025
77ef2f0
✨ Feat: 브랜드별 이미지 매핑 기능 추가
2cmin Aug 20, 2025
e7c4531
🔧Style: apply spotless formatting
Aug 20, 2025
7c4263e
🐛 Fix: 퀴즈 포인트 오류
Aug 20, 2025
694011b
🐛 Fix: 퀴즈 포인트 오류
2cmin Aug 20, 2025
3bb747b
:wrench:Settings: dozzle 추가
zmarzmar Aug 20, 2025
2710006
✨ Feat: 찜하기 기능 리팩터링 및 DB 연동
Aug 20, 2025
eae46ae
✨ Feat: 찜하기 기능 리팩터링 및 DB 연동
2cmin Aug 20, 2025
529679e
:recycle:Refactor: 자동 적재 삭제
zmarzmar Aug 20, 2025
c79215f
✨ Feat: 찜 개수 조회
Aug 20, 2025
3874f17
:recycle:Refactor: 자동 적재 삭제
zmarzmar Aug 20, 2025
d12eecf
:recycle:Refactor: DailyPriceStoreController 스웨거 예시 정리
zmarzmar Aug 20, 2025
91b399c
✨ Feat: 찜 개수 조회
Aug 20, 2025
447e8bc
✨ Feat: 찜 개수 조회
2cmin Aug 20, 2025
a23cb57
🔧Style: apply spotless formatting
Aug 20, 2025
ff73d2d
🐛Fix: favorite pageable 입력 제거
Aug 20, 2025
e36e062
:wrench:Settings: 환경변수 줄바꿈
zmarzmar Aug 20, 2025
1b9a722
:wrench:Settings: cors 설정 변경
zmarzmar Aug 20, 2025
0d22454
:fire:Remove: dailypricechange 도메인 삭제
zmarzmar Aug 20, 2025
b2eb97c
:recycle:Refactor: 코드 리팩토링
zmarzmar Aug 20, 2025
1120c83
:recycle:Refactor: 채팅 생성, 수정 시간 구현
zmarzmar Aug 20, 2025
2c82a33
:recycle:Refactor: 시작 이미지 id 추가
zmarzmar Aug 20, 2025
8fc18b3
✨ Feat: 대형마트 전면수정
Aug 21, 2025
12a13ef
✨ Feat: 대형마트 전면수정
2cmin Aug 21, 2025
ca3b365
🗄️데이터: place 데이터 덤프 파일 추가 (data_only.sql)
Aug 21, 2025
25f5f79
🔧Config: CSV Normalizer 설정 수정
Aug 21, 2025
be62fd3
:fire:Remove: resources/data/place_data_only.sql 삭제
Aug 21, 2025
a63fbbf
🐛 Fix: 대형마트 브랜드 이미지 매핑 수정
Aug 21, 2025
7b2c4fb
Merge branch 'develop' into feature/martimage
2cmin Aug 21, 2025
95a3edd
🐛 Fix: 대형마트 브랜드 이미지 매핑 수정
2cmin Aug 21, 2025
37c8b0d
:wrench:chore: run spotlessApply for Brand.java
Aug 21, 2025
acdf9ce
:sparkles:Feat: 다이어트 코치 멘트 수정
zmarzmar Aug 21, 2025
856f7c8
:recycle:Refactor: Daily 카테고리 파라미터 수정
zmarzmar Aug 22, 2025
94e75b2
:recycle:Refactor: productNo로 단일 품목 조회
zmarzmar Aug 22, 2025
3956514
:recycle:Refactor: categoryCode로 소매, 도매 가격 조회 구현
zmarzmar Aug 22, 2025
d88db5d
:wrench:Settings: S3 경로 추가
zmarzmar Aug 23, 2025
b47ac4b
🔥 Remove: Kakao Local API 관련 코드 및 설정 삭제
Aug 23, 2025
ef9025b
🔗 Update submodule: PICKL_BE_Config 최신화
Aug 23, 2025
ea9c3ee
🔧Style: apply spotless formatting
Aug 20, 2025
7d2f5e0
🐛 Fix: 브랜드 이미지 매핑
Aug 23, 2025
37011f6
🐛 Fix: 브랜드 이미지 매핑
2cmin Aug 23, 2025
58dfda0
🔧 Style: apply spotless formatting (feature/brandimage)
Aug 23, 2025
c8bc75b
:art:style: spotless 포메팅
zmarzmar Aug 23, 2025
e9a24c3
🐛 Fix: martimage
Aug 23, 2025
e2b2b71
🐛 Fix: martimage
2cmin Aug 23, 2025
e651136
:wrench:Settings: Access Token 유효기간 수정
zmarzmar Aug 24, 2025
eabfeaf
🐛 Fix: 브랜드 이미지 경로 불일치
Aug 24, 2025
cd216bf
🐛 Fix: 브랜드 이미지 경로 불일치
2cmin Aug 24, 2025
13e7881
:sparkles:Feat: 챗봇 본인 포인트 현황 확인 추가
zmarzmar Aug 24, 2025
58dafe0
:recycle:Refactor: 채팅 형식 변경
zmarzmar Aug 24, 2025
3b84076
:sparkles:Feat: 재철 식재료 자동 추가 구현
zmarzmar Aug 24, 2025
a4dcd4a
:sparkles:Feat: 시장 가격 비교 이미지 추가
zmarzmar Aug 24, 2025
f5b98fe
:heavy_plus_sign:Dependency: s3 경로 추가
zmarzmar Aug 24, 2025
9b3df1c
:recycle:Refactor: 가격 비교 수동 입력 수정
zmarzmar Aug 24, 2025
2ad6cf8
:recycle:Refactor: 제철 식재료 자동 추가 팁 수정
zmarzmar Aug 24, 2025
77c0149
:recycle:Refactor: 주석 처리 삭제
zmarzmar Aug 24, 2025
47a60f8
:recycle:Refactor: 가격 비교 productNo 추가
zmarzmar Aug 24, 2025
e6642cc
:recycle:Refactor: 가격 비교 dto response 수정
zmarzmar Aug 24, 2025
75fb888
:recycle:Refactor: 가격 비교 dto response 수정
zmarzmar Aug 24, 2025
64692ef
:recycle:Refactor: spotless 적용
zmarzmar Aug 24, 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
12 changes: 11 additions & 1 deletion .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,16 @@ jobs:
token: ${{ secrets.GIT_ACTION_TOKEN }}
submodules: true

- name: Copy docker-compose.yml to Server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SSH_HOST }}
port: ${{ secrets.SSH_PORT }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: "docker-compose.yml"
target: "~/app"

- name: Deploy on server
uses: appleboy/ssh-action@master
with:
Expand All @@ -68,6 +78,6 @@ jobs:
docker compose down
docker compose pull
docker compose up -d --build

echo "🧼 사용하지 않는 이미지 정리"
docker image prune -f
1 change: 1 addition & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[submodule "PICKL_BE_Config"]
path = PICKL_BE_Config
url = https://github.com/TEAMPICKL/PICKL_BE_Config.git
branch = main
2 changes: 1 addition & 1 deletion PICKL_BE_Config
49 changes: 49 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,39 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation "org.springframework.boot:spring-boot-starter-cache"
implementation 'org.springframework.boot:spring-boot-starter-actuator'

// ==== Database ====
// MySQL JDBC 드라이버
runtimeOnly 'com.mysql:mysql-connector-j'

// ==== Flyway (DB 마이그레이션) ====
// - flyway-core: 마이그레이션 엔진
// - flyway-mysql: MySQL 전용 기능/방언 분리 모듈 (Flyway 10+)
implementation 'org.flywaydb:flyway-core'
implementation 'org.flywaydb:flyway-mysql'

// 레이트리미트/재시도
implementation "io.github.resilience4j:resilience4j-reactor:2.2.0"
implementation "io.github.resilience4j:resilience4j-ratelimiter:2.2.0"
implementation "io.github.resilience4j:resilience4j-bulkhead:2.2.0"

// Geometry
implementation "org.locationtech.jts:jts-core:1.19.0"
implementation "org.hibernate.orm:hibernate-spatial:6.6.22.Final"

// csv 정제
implementation "org.springframework.boot:spring-boot-starter-webflux" // WebClient
implementation "org.apache.commons:commons-csv:1.11.0"
implementation "org.slf4j:slf4j-api:2.0.13"
implementation "com.jayway.jsonpath:json-path:2.9.0"

// 원본 좌표 코드
implementation "org.locationtech.proj4j:proj4j:1.3.0"
implementation "org.locationtech.proj4j:proj4j-epsg:1.3.0"

// ==== Lombok ====
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
Expand All @@ -46,6 +75,17 @@ dependencies {
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

// ==== s3 ====
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.463'

// ==== Netty native DNS for macOS (Netty가 네이티브 DNS 리졸버를 사용) ====
// Spring Boot의 dependency management가 Netty 버전을 맞춰주므로 버전 표기는 생략
implementation "io.netty:netty-resolver-dns-native-macos::osx-aarch_64"

// ==== Cache ====
implementation "com.github.ben-manes.caffeine:caffeine:3.1.8"

// ==== Test ====
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
Expand Down Expand Up @@ -98,4 +138,13 @@ test {
def profile = project.hasProperty('profile') ? project.property('profile').toString() : 'local'
jvmArgs = ["-Dspring.profiles.active=${profile}"]
}
}

tasks.withType(JavaExec) {
jvmArgs += ["-Dfile.encoding=UTF-8"]
}

tasks.named('bootRun') {
args '--spring.profiles.active=local'
systemProperty 'spring.config.additional-location', "file:${projectDir}/PICKL_BE_Config/"
}
1,471 changes: 1,471 additions & 0 deletions data/marts_normalized.csv

Large diffs are not rendered by default.

37 changes: 32 additions & 5 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
version: "3.8"

services:
app:
image: ${DOCKER_USERNAME}/${DOCKER_REPO}
image: ${DOCKER_USERNAME}/${DOCKER_REPO}:latest
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/pickl
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/pickl?useUnicode=true&characterEncoding=utf8&connectionCollation=utf8mb4_unicode_ci&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&useSSL=false
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
- SPRING_JPA_HIBERNATE_DDL_AUTO=update
- SPRING_FLYWAY_ENABLED=false
command:
- java -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE} -jar app.jar
depends_on:
mysql:
condition: service_healthy
langchain:
condition: service_healthy
networks:
- pickl-network

langchain:
image: ${DOCKER_USERNAME}/${CHATBOT_REPO}:${CHATBOT_TAG:-latest}
env_file: .env
command: [ "uvicorn","app.main:app","--host","0.0.0.0","--port","8000" ] # ← 추가
healthcheck:
test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" ]
interval: 10s
timeout: 5s
retries: 5
networks:
- pickl-network

Expand All @@ -28,7 +42,7 @@ services:
volumes:
- mysql-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
interval: 10s
timeout: 5s
retries: 5
Expand All @@ -49,6 +63,19 @@ services:
networks:
- pickl-network

dozzle:
image: amir20/dozzle:latest
container_name: dozzle
restart: unless-stopped
environment:
- DOZZLE_BASE=/dozzle
- DOZZLE_AUTH_PROVIDER=simple
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./dozzle/users.yml:/data/users.yml:ro
networks:
- pickl-network

networks:
pickl-network:
driver: bridge
Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.gradle.jvmargs=-Dfile.encoding=UTF-8
6 changes: 6 additions & 0 deletions src/main/java/com/likelion/picklbe/PicklbeApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableCaching
@EnableJpaAuditing
@EnableScheduling
@SpringBootApplication
public class PicklbeApplication {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public LoginResponse login(LoginRequest loginRequest) {
authenticationManager.authenticate(authenticationToken);

// 액세스 토큰 및 리프레시 토큰 발급
String accessToken = jwtProvider.createAccessToken(user.getUsername());
String accessToken = jwtProvider.createAccessToken(user.getUsername(), user.getId());
String refreshToken =
jwtProvider.createRefreshToken(user.getUsername(), UUID.randomUUID().toString());

Expand Down
142 changes: 142 additions & 0 deletions src/main/java/com/likelion/picklbe/domain/brand/Brand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
package com.likelion.picklbe.domain.brand;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Pattern;

public enum Brand {
EMART_EVERYDAY(
"emart-everyday",
"이마트 에브리데이",
"emart_everyday.png",
List.of(
Pattern.compile("이마트\\s*에브리데이"),
Pattern.compile("emart\\s*everyday", Pattern.CASE_INSENSITIVE))),
NO_BRAND(
"no-brand",
"노브랜드",
"no_brand.png",
List.of(
Pattern.compile("노\\s*브랜드"), Pattern.compile("no\\s*brand", Pattern.CASE_INSENSITIVE))),
EMART(
"emart",
"이마트",
"emart.png",
List.of(
Pattern.compile("\\b이마트\\b"), Pattern.compile("\\bemart\\b", Pattern.CASE_INSENSITIVE))),
HOMEPLUS(
"homeplus",
"홈플러스",
"homeplus.png",
List.of(
Pattern.compile("홈\\s*플러스"), Pattern.compile("home\\s*plus", Pattern.CASE_INSENSITIVE))),
COSTCO(
"costco",
"코스트코",
"costco.png",
List.of(Pattern.compile("코스트코"), Pattern.compile("costco", Pattern.CASE_INSENSITIVE))),
LOTTE_MART(
"lotte-mart",
"롯데마트",
"lotte_mart.png",
List.of(
Pattern.compile("롯데\\s*마트"), Pattern.compile("lotte\\s*mart", Pattern.CASE_INSENSITIVE))),
LOTTE_SUPER(
"lotte-super",
"롯데슈퍼",
"lotte_super.png",
List.of(
Pattern.compile("롯데\\s*슈퍼"),
Pattern.compile("lotte\\s*super", Pattern.CASE_INSENSITIVE))),
LOTTE_FRESH(
"lotte-fresh",
"롯데프레시",
"lotte_fresh.png",
List.of(
Pattern.compile("롯데\\s*프레시"),
Pattern.compile("lotte\\s*fresh", Pattern.CASE_INSENSITIVE))),
TRADERS(
"traders",
"트레이더스",
"traders.png",
List.of(Pattern.compile("트레이더스"), Pattern.compile("traders", Pattern.CASE_INSENSITIVE))),
HANARO(
"hanaro",
"하나로마트",
"hanaro.png",
List.of(
Pattern.compile("(농협|하나로)\\s*마트"),
Pattern.compile("하나로클럽"),
Pattern.compile("hanaro", Pattern.CASE_INSENSITIVE))),
GS_SUPER(
"gs-super",
"GS슈퍼",
"gs_super.png",
List.of(
Pattern.compile("지에스리테일"),
Pattern.compile("\\bGS\\b\\s*(THE\\s*FRESH|슈퍼)?", Pattern.CASE_INSENSITIVE))),
DEFAULT("default", "기타", "mart_default.png", List.of());

private final String code;
private final String displayName;
private final String filename;
private final List<Pattern> patterns;

Brand(String code, String displayName, String filename, List<Pattern> patterns) {
this.code = code;
this.displayName = displayName;
this.filename = filename;
this.patterns = patterns;
}

public String code() {
return code;
}

public String filename() {
return filename;
}

public String displayName() {
return displayName;
}

private static final Map<String, Brand> BY_CODE;

static {
Map<String, Brand> m = new HashMap<>();
for (Brand b : values()) {
m.put(b.code().toLowerCase(Locale.ROOT), b);
}
BY_CODE = Collections.unmodifiableMap(m);
}

public static Brand fromCodeSafe(String code) {
if (code == null || code.isBlank()) {
return DEFAULT;
}
Brand b = BY_CODE.get(code.toLowerCase(Locale.ROOT));
return (b != null) ? b : DEFAULT;
}

public static Brand fromStoreName(String name) {
if (name == null || name.isBlank()) {
return DEFAULT;
}
// 우선순위: 에브리데이 → GS → 이마트 등 (선언 순서 유지)
for (Brand b : values()) {
if (b == DEFAULT) {
continue;
}
for (Pattern p : b.patterns) {
if (p.matcher(name).find()) {
return b;
}
}
}
return DEFAULT;
}
}
Loading