Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
193 commits
Select commit Hold shift + click to select a range
68067ac
FEAT: tour api2 클래스 생성 (#114)
YimTaeKeun May 22, 2025
3cd82a5
FIX: import 수정 (#114)
YimTaeKeun May 22, 2025
97d0c8a
FEAT: tour api의 통신 부분과 가공 부분 분리 (#114)
YimTaeKeun May 24, 2025
085444a
MODIFY: 여행 추가 및 여행 리스트 가져오기 api 뷰 추가 (#126)
YimTaeKeun Jul 7, 2025
719a51b
MODIFY: 여행 상세 조회, 여행 삭제 뷰 개발 완료 (#126)
YimTaeKeun Jul 8, 2025
dbfa57b
MODIFY: 여행 정보 수정 API 메소드 및 기능 구현 및 테스트 통과 (#126)
YimTaeKeun Jul 8, 2025
4d6bc51
REFACTOR: 기존 여행 코스 API 테스트 코드 삭제 (#126)
YimTaeKeun Jul 8, 2025
c74a6af
FEAT: 주소 저장 기능 추가 (#126)
YimTaeKeun Jul 8, 2025
8bcb1fe
REFACTOR: 없어진 API url 매핑 제거 및 뷰 코드 제거 (#126)
YimTaeKeun Jul 8, 2025
38b2f57
TEST: 테스트 코드 수정 및 전체 테스트 통과 (#126)
YimTaeKeun Jul 8, 2025
34a94e2
FEAT: 미션 실패시 S3 사진 삭제 기능 추가 (#126)
YimTaeKeun Jul 8, 2025
be2d8a7
REFACTRO: TDP str 함수 수정 (#126)
YimTaeKeun Jul 8, 2025
12a2d8f
MODIFY: 여행 리스트 뷰 수정 (#126)
YimTaeKeun Jul 8, 2025
e61c3e7
TEST: 테스트 코드 일부 수정 (#126)
YimTaeKeun Jul 8, 2025
3c57d7b
MODIFY: 사용자 여행 이미지 모델 수정 (#126)
YimTaeKeun Jul 9, 2025
47e67cd
FEAT: 인생네컷 사진 CRUD API 제작 및 테스트 통과 (#126)
YimTaeKeun Jul 9, 2025
e710660
CHORE: 테스트 로거 추가 (#126)
YimTaeKeun Jul 9, 2025
cbfe90b
MODIFY: 액세스 토큰, 리프레시 토큰 유효기간 각각 5, 30일로 연장 (#126)
YimTaeKeun Jul 9, 2025
52411ad
Merge pull request #129 from 2025AlphaProject/modify/#126-modifyApi
YimTaeKeun Jul 9, 2025
ee9a85b
get_category_list
jimmy914 Jul 10, 2025
e6b096d
delete 25
jimmy914 Jul 10, 2025
12f3f49
modify : connect 함수 수정
jimmy914 Jul 10, 2025
67df67e
modify : receive 함수 수정
jimmy914 Jul 10, 2025
1fc6e70
connect 함수 수정
jimmy914 Jul 10, 2025
c41ff0c
receive 함수 수정
jimmy914 Jul 10, 2025
fc14358
MODIFY: 액세스 토큰 기간 변경, 발급자 정보 추가 (#128)
YimTaeKeun Jul 13, 2025
d4c5797
FEAT: 미션 삭제 API 제작 및 테스트 완료 (#128)
YimTaeKeun Jul 13, 2025
a1f9810
MODIFY: API 매커니즘 수정 (#128)
YimTaeKeun Jul 13, 2025
0f1b50d
MODIFY: 여행 시리얼라이저 tdp id 추가 및 미션 이미지 삭제 매커니즘 원상 복구 (#128)
YimTaeKeun Jul 13, 2025
1dce9ae
Merge pull request #135 from 2025AlphaProject/feature/#128-addMission…
YimTaeKeun Jul 13, 2025
b3a0487
test를 위해서 파일들 수정했음
jimmy914 Jul 14, 2025
7621c05
Merge branch 'develop' into feature/#132-get_category_list
YimTaeKeun Jul 16, 2025
27cfdfc
modify 태근이가 고치라고 한 것들
jimmy914 Jul 19, 2025
b70bc1b
log
jimmy914 Jul 19, 2025
77d20d6
Delete logs/app.log.2025-07-19
YimTaeKeun Jul 21, 2025
78b0078
Delete logs/app.log.2025-07-10
YimTaeKeun Jul 21, 2025
cf3cce5
Delete logs/app.log.2025-07-12
YimTaeKeun Jul 21, 2025
1ed80a0
Merge branch 'develop' into modify/#114-modifyTourApi
YimTaeKeun Jul 22, 2025
09247af
CHORE: gitignore 수정 적용
YimTaeKeun Jul 22, 2025
335f6c5
CHORE: git ignore 추가
YimTaeKeun Jul 22, 2025
acaf4d0
CONFLICT: 코드 충돌 해결
YimTaeKeun Jul 22, 2025
17da377
Merge pull request #133 from 2025AlphaProject/modify/#114-modifyTourApi
YimTaeKeun Jul 23, 2025
2de86f0
HOTFIX: HTTP Request Exception 오류 긴급 수정
YimTaeKeun Jul 23, 2025
4604f8b
FEAT: AI 응답 결과 캐싱 적용 (#137)
YimTaeKeun Jul 27, 2025
cc6cd86
CHORE: dependency 수정 (#137)
YimTaeKeun Jul 27, 2025
31a68d8
Merge pull request #139 from 2025AlphaProject/feature/#137-placeCaching
YimTaeKeun Jul 27, 2025
b777955
REFACTOR: tour 앱 유닛 테스트 수정 (#141)
YimTaeKeun Jul 27, 2025
9e349b0
REFACTOR: usr 앱 테스트 수정 (#141)
YimTaeKeun Jul 27, 2025
19fb366
REFACTOR: CI command 수정 (#141)
YimTaeKeun Jul 27, 2025
7a86c37
Merge pull request #142 from 2025AlphaProject/refactor/#141-unittestR…
YimTaeKeun Jul 27, 2025
12b2ed9
MODIFY: tour 앱의 여행자 추가 테스트 수정 (#140)
YimTaeKeun Jul 30, 2025
84b23c9
TEST: 미션 이미지 업로드 테스트 코드 추가 (#140)
YimTaeKeun Jul 30, 2025
6ef7b66
TEST: 웹소켓 테스트 추가 (#140)
YimTaeKeun Jul 30, 2025
f84a037
MODIFY: 로그인 테스트 수정 (#140)
YimTaeKeun Jul 30, 2025
2bbbdb6
TEST: 로그인 및 refresh token 테스트 수정 (#140)
YimTaeKeun Jul 30, 2025
de00817
MODIFY: 테스트 위한 channel layer 재설정 (#140)
YimTaeKeun Aug 1, 2025
5e688f8
MODIFY: 테스트 위한 캐시 설정 변경 (#140)
YimTaeKeun Aug 1, 2025
8e4ff9a
Merge pull request #143 from 2025AlphaProject/modify/#140-modifyTestCode
YimTaeKeun Aug 1, 2025
e406b51
modify:requirements.txt
jimmy914 Aug 1, 2025
3aef004
Merge branch 'feature/#132-get_category_list' of https://github.com/2…
jimmy914 Aug 1, 2025
5962075
CHORE: requirements 수정 (#132)
YimTaeKeun Aug 2, 2025
852b389
Merge pull request #134 from 2025AlphaProject/feature/#132-get_catego…
YimTaeKeun Aug 2, 2025
84e340f
HOTFIX: CourseView 제거
YimTaeKeun Aug 2, 2025
54da412
CHORE: 디버깅 세팅 제거
YimTaeKeun Aug 2, 2025
f57a59a
REFACTOR: 임포트문 최적화 (#136)
YimTaeKeun Aug 2, 2025
cf59f57
REFACTOR: logstash 설정 제거 (#136)
YimTaeKeun Aug 3, 2025
b400a0c
CHORE: 필요없는 주석 제거 (#136)
YimTaeKeun Aug 3, 2025
f719848
Merge pull request #145 from 2025AlphaProject/refactor/#136-deleteLea…
YimTaeKeun Aug 3, 2025
b402818
FEAT: 유저 모델에 fcm_token 필드 추가 (#147)
YimTaeKeun Aug 4, 2025
9e545c1
MODIFY: 테스트 유저 생성로직 변경 및 주의사항 주석 추가 (#147)
YimTaeKeun Aug 7, 2025
e809b69
FEAT: fcm 토큰 저장 API 제작 (#147)
YimTaeKeun Aug 7, 2025
dfe8ff9
CHORE: requirements 업데이트
YimTaeKeun Aug 7, 2025
a509f3a
CHORE: pywin 의존성 삭제
YimTaeKeun Aug 7, 2025
9f518f1
CHORE: 파이어베이스 의존성 완전 제거 (#147)
YimTaeKeun Aug 7, 2025
864dccb
HOTFIX: change Tour API endpoint (#151)
YimTaeKeun Aug 8, 2025
b11bf19
Merge pull request #150 from 2025AlphaProject/feature/#147-fcmNoti
YimTaeKeun Aug 8, 2025
297a70f
MODIFY: 인생네컷 모델명 변경 (#148)
YimTaeKeun Aug 8, 2025
24d8e22
FEAT: 사진 업로드 API 제작 완료, 인생네컷 API 수정 작업 및 테스트 완료 (#148)
YimTaeKeun Aug 9, 2025
a6c7079
Merge pull request #153 from 2025AlphaProject/modify/#148-deleteMission
YimTaeKeun Aug 9, 2025
3d939fa
MODIFY: Mission 의존성 제거 및 mission 앱 삭제 (#148)
YimTaeKeun Aug 9, 2025
664c58a
MODIFY: mission 앱 삭제에 따른 의존성 최적화 (#148)
YimTaeKeun Aug 9, 2025
e5f45fb
CHORE: ci에 cv 의존성 삭제 (#148)
YimTaeKeun Aug 9, 2025
8c0cdaa
CHORE: 도커 컴포즈 컨테이너 버전 수정
YimTaeKeun Aug 9, 2025
75c6812
Merge pull request #154 from 2025AlphaProject/modify/#148-deleteMission
YimTaeKeun Aug 11, 2025
e3e2b24
MODIFY: 사진 저장 응답 정보 변경 (#156)
YimTaeKeun Aug 11, 2025
a155099
FEAT: django_filter 설정 (#156)
YimTaeKeun Aug 11, 2025
d66605e
FEAT: 이미지 저장, 인생네컷 뷰에 쿼리 파라미터 필터 추가 (#156)
YimTaeKeun Aug 11, 2025
5c1b649
FEAT: 이미지 저장, 인생네컷 뷰에 쿼리 파라미터 필터 추가 (#156)
YimTaeKeun Aug 11, 2025
8f849c3
MODIFY: fcm token을 wirte only로 설정 (#156)
YimTaeKeun Aug 11, 2025
e4428ba
MODIFY: user와 fcm token 관계를 1대다로 수정 (#156)
YimTaeKeun Aug 11, 2025
e440f17
HOTFIX: fcm token 테이블 변경에 따른 뷰 수정 (#156)
YimTaeKeun Aug 11, 2025
b3bede8
CHORE: 테스트를 위한 인터페이스 추가 (#156)
YimTaeKeun Aug 11, 2025
f3f3946
Merge pull request #157 from 2025AlphaProject/modify/#156-modifySaveP…
YimTaeKeun Aug 12, 2025
e19e91a
FEAT: 위치기반 관광정보 조회 서비스 레이어 개발 (#158)
YimTaeKeun Aug 12, 2025
710afe6
FEAT: 여행 저장 시 카테고리 저장토록 수정 (#158)
YimTaeKeun Aug 12, 2025
6d2d772
settings 수정
jimmy914 Aug 12, 2025
c784b7d
FEAT: 장소 추가 데이터 가져오기 (#158)
YimTaeKeun Aug 13, 2025
d6262aa
Merge pull request #159 from 2025AlphaProject/feature/#158-saveMoreIn…
YimTaeKeun Aug 13, 2025
27e0c66
MODIFY: 장소 DB 저장 정보 확장 수정 (#160)
YimTaeKeun Aug 13, 2025
1a428dc
FEAT: 여행 등록 매커니즘 수정 (#160)
YimTaeKeun Aug 13, 2025
57644e6
feat : 카테고리별 포즈 추천 기능
jimmy914 Aug 13, 2025
bfa0e91
MODIFY: 여행 수정 로직 수정 (#160)
YimTaeKeun Aug 13, 2025
243cc7f
TEST: 테스트 진행 및 통과 (#160)
YimTaeKeun Aug 13, 2025
dd1f473
FEAT: 주소 추가 로직 추가 (#160)
YimTaeKeun Aug 13, 2025
d3e4719
Merge pull request #163 from 2025AlphaProject/modify/#160-modifyTour
YimTaeKeun Aug 13, 2025
8234f0e
Merge branch 'develop' of https://github.com/2025AlphaProject/alphaBE…
YimTaeKeun Aug 14, 2025
d26ba11
MODIFY: 포즈 추천 수정 및 예외 처리 (#155)
YimTaeKeun Aug 14, 2025
f2ef194
Merge pull request #161 from 2025AlphaProject/#155_recommned_pose
YimTaeKeun Aug 14, 2025
9abf06f
CHORE: tour 앱의 안쓴느 메서드 삭제 (#164)
YimTaeKeun Aug 14, 2025
d39ede8
CHORE: tour앱의 필요없는 주석 삭제 (#164)
YimTaeKeun Aug 14, 2025
d2a977d
CHORE: tour 앱 내부의 불필요한 임포트 제거 (#164)
YimTaeKeun Aug 14, 2025
5975cb0
CHORE: 로깅 레벨 info로 설정 (#164)
YimTaeKeun Aug 14, 2025
e0a0556
Merge pull request #165 from 2025AlphaProject/chore/#164-delreflegacy
YimTaeKeun Aug 14, 2025
15b52bc
REFACTOR: NewTourAddView 최적화 (#166)
YimTaeKeun Aug 16, 2025
8057ede
FEAT: 여행 시리얼라이저 추가 정보 추가
YimTaeKeun Aug 16, 2025
5a7362d
FEAT: 여행 시리얼라이저 추가 정보 추가
YimTaeKeun Aug 16, 2025
369b213
Merge pull request #167 from 2025AlphaProject/refactor/#166-codeRefactor
YimTaeKeun Aug 17, 2025
421cd3e
MODIFY: 장소 시리얼라저에 사진 정보 추가
YimTaeKeun Aug 17, 2025
09a7b52
MODIFY: 로깅 설정 수정
YimTaeKeun Aug 17, 2025
69e6c08
Merge pull request #169 from 2025AlphaProject/feature/#168-upAccuracy
YimTaeKeun Aug 17, 2025
56c82f7
FEAT: 당일 여행 가져오기 API 개발 완료 (#172)
YimTaeKeun Aug 18, 2025
8d8e986
HOTFIX: 날라가는 정보 contentid에서 contenttypeid로 수정
YimTaeKeun Aug 18, 2025
2060fbf
FEAT: 여행 정보가 여러개 있을 경우 예외 처리 (#172)
YimTaeKeun Aug 18, 2025
0c72afa
Merge pull request #173 from 2025AlphaProject/feature/#172-getTodayTour
YimTaeKeun Aug 18, 2025
09745da
HOTFIX: 여행 동행자에게 이미지 안보이는 현상 해결 (#174)
YimTaeKeun Aug 18, 2025
7878a40
HOTFIX: 테스트 실행 시간을 한국시간으로 설정
YimTaeKeun Aug 18, 2025
20433e8
Merge pull request #175 from 2025AlphaProject/hotfix/#174-noImageBug
YimTaeKeun Aug 18, 2025
c15e376
FEAT: 당일 여행 API 여행 장소 정보 추가 (#176)
YimTaeKeun Aug 19, 2025
40c6129
Merge pull request #177 from 2025AlphaProject/feature/#176-addAreaInfo
YimTaeKeun Aug 19, 2025
fdeb2e0
HOTFIX: 대응되는 지역코드 추가
YimTaeKeun Aug 22, 2025
6ed9c30
FEAT: 연관 관광정보 API 제작 (#170)
YimTaeKeun Aug 22, 2025
9123601
Merge pull request #178 from 2025AlphaProject/feature/#170-makeRelPlaces
YimTaeKeun Aug 22, 2025
fa3b6a9
d
jimmy914 Aug 23, 2025
1b80d29
pull develop branch
jimmy914 Aug 24, 2025
8b0e497
feat : 시리얼라이저 수정
jimmy914 Aug 24, 2025
8244e72
feat : add poses_url.py
jimmy914 Aug 24, 2025
6bbfb5c
feat : pose와 url이 같이 날라오도록 코두작업
jimmy914 Aug 24, 2025
8fa46c8
MODIFY: 당일여행에 아이디 추가 (#180)
YimTaeKeun Aug 24, 2025
f3d5b7c
Merge pull request #181 from 2025AlphaProject/modify/#180-addIdInToda…
YimTaeKeun Aug 24, 2025
6defeb0
MODIFY: 여행 정보 수정 (#182)
YimTaeKeun Aug 24, 2025
a7e6a70
Merge pull request #183 from 2025AlphaProject/modify/#182-modifyTourList
YimTaeKeun Aug 24, 2025
8b00d9d
feat : add_sido_url
jimmy914 Aug 25, 2025
9ed85a0
feat : custom domain을 이용하여 url 변경
jimmy914 Aug 25, 2025
db523d8
feat : custom domain을 이용하여 url 변경
jimmy914 Aug 25, 2025
d5c61f0
Merge pull request #185 from 2025AlphaProject/184-feat-add_photo_on_s…
YimTaeKeun Aug 25, 2025
9dd88f4
Merge branch 'develop' into Feature/#171-add_photo
YimTaeKeun Aug 25, 2025
8dc2ada
Merge pull request #179 from 2025AlphaProject/Feature/#171-add_photo
YimTaeKeun Aug 25, 2025
0704777
modify : modify_name
jimmy914 Aug 25, 2025
2927735
Merge pull request #187 from 2025AlphaProject/186-refactor-modify_sid…
YimTaeKeun Aug 25, 2025
f65af5f
MODIFY: 파일 최대 업로드 설정 100MB로 수정 (#189)
YimTaeKeun Aug 26, 2025
55ce86a
FEAT: 테스터 로그인 기능 추가 (#188)
YimTaeKeun Aug 26, 2025
5404dd6
Merge pull request #190 from 2025AlphaProject/modify/#189-upscaleRequ…
YimTaeKeun Aug 26, 2025
75e66a5
Merge pull request #191 from 2025AlphaProject/feature/#188-serviceReg…
YimTaeKeun Aug 26, 2025
38b836d
MODIFY: 모델에 updated_at 필드 추가 (#192)
YimTaeKeun Aug 27, 2025
2501a60
Merge pull request #193 from 2025AlphaProject/modify/#192-modifyPlace…
YimTaeKeun Aug 27, 2025
3eec35e
MODIFY: 모델에 표출정보 추가 (#194)
YimTaeKeun Aug 28, 2025
a76b1a5
Merge pull request #195 from 2025AlphaProject/modify/#194-addPlaceInfo
YimTaeKeun Aug 28, 2025
fab8e21
CHORE: 객체 not found 예외 처리 추가
YimTaeKeun Aug 29, 2025
47cdac6
MODIFY: 당일 여행 복수 인스턴스 발송 로직 구현 (#196)
YimTaeKeun Sep 2, 2025
c951bfc
MODIFY: API 통신 예외 추가
YimTaeKeun Sep 2, 2025
7bba1c7
Merge pull request #197 from 2025AlphaProject/modify/#196-sendTourIns…
YimTaeKeun Sep 2, 2025
8465383
CHORE: API 한도초과 예외처리
YimTaeKeun Sep 3, 2025
86ae6ce
MODIFY: 장소 추가 버그 수정 (#198)
YimTaeKeun Sep 3, 2025
a03f325
modify : get_area_list
jimmy914 Sep 4, 2025
9d5eaa7
modify : get_area_list
jimmy914 Sep 4, 2025
bd73af7
modify : get_area_list
jimmy914 Sep 4, 2025
554574d
modify : get_area_list
jimmy914 Sep 4, 2025
86aa39b
modify : get_area_list
jimmy914 Sep 4, 2025
ce1351d
modify : get_area_list
jimmy914 Sep 4, 2025
56037b0
modify : get_area_list
jimmy914 Sep 4, 2025
a679085
MODIFY: 장소 추가 로직 수정 (#198)
YimTaeKeun Sep 4, 2025
b674f5a
Merge pull request #201 from 2025AlphaProject/hotfix/#198-addPlaceError
YimTaeKeun Sep 4, 2025
c4d537a
MODIFY: 시군구 리스트 뷰 수정 (#199)
YimTaeKeun Sep 4, 2025
f96bdfd
MODIFY: 당일 여행 API 외부 API 의존성 해제 (#199)
YimTaeKeun Sep 4, 2025
c09532b
MODIFY: 웹소켓 외부 API 참조 해제 (#199)
YimTaeKeun Sep 4, 2025
8bf7567
CHORE: for문 오류 수정 (#199)
YimTaeKeun Sep 4, 2025
e9b6e17
Merge branch 'develop' into 199-modify-cause-api-limit
YimTaeKeun Sep 4, 2025
c6e78df
MODIFY: API 모듈 테스트 제거 (#199)
YimTaeKeun Sep 4, 2025
c836d99
Merge branch '199-modify-cause-api-limit' of https://github.com/2025A…
YimTaeKeun Sep 4, 2025
fd733df
Merge pull request #200 from 2025AlphaProject/199-modify-cause-api-limit
YimTaeKeun Sep 4, 2025
0e1772d
MODIFY: 시군구 시리얼라이저 수정 (#202)
YimTaeKeun Sep 4, 2025
e2431a0
HOTFIX: area_code 필수 파라미터 해제
YimTaeKeun Sep 4, 2025
b2f37cf
CHORE: 시군구 코드 추가
YimTaeKeun Sep 4, 2025
9efe756
FEAT: 개인정보 취급 동의 API 개발 (#203)
YimTaeKeun Sep 4, 2025
614021f
FEAT: 로그인 로직에 개인정보 취급 동의 여부 추가 (#203)
YimTaeKeun Sep 4, 2025
aa37c39
Merge pull request #204 from 2025AlphaProject/feature/#203-userAgree
YimTaeKeun Sep 4, 2025
189d88f
HOTFIX: 주소 정보 저장 로직 변경
YimTaeKeun Sep 5, 2025
3abccae
HOTFIX: 주소 정보 업데이트 로직 수정
YimTaeKeun Sep 5, 2025
8bc4275
FEAT: 여행 리스트 뷰에 필터 적용 (#205)
YimTaeKeun Sep 11, 2025
930b51f
Merge pull request #206 from 2025AlphaProject/feature/#205-filterTour…
YimTaeKeun Sep 11, 2025
077a258
Create README.md
YimTaeKeun Sep 16, 2025
75dbfd8
Create LICENSE
YimTaeKeun Sep 16, 2025
843beef
Update README.md
YimTaeKeun Sep 21, 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
3 changes: 1 addition & 2 deletions .github/workflows/django_CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ jobs:
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libgl1
sudo apt-get install -y dos2unix
dos2unix requirements.txt
- name: Install Dependencies
Expand All @@ -37,4 +36,4 @@ jobs:
echo "${{ secrets.ENV_FILE }}" > .env
- name: Run Tests
run: |
python manage.py test --settings=config.settings_ci
python manage.py test --settings=config.settings_ci -v 2
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ db.sqlite3
# 로그파일 무시
*.log
/logs
nginx.conf
nginx.conf
*.sqlite3
1 change: 0 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
FROM python:3.12

WORKDIR /code
RUN apt-get update && apt-get install -y libgl1
COPY ./requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
Expand Down
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2025 임태근, 조시연

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
161 changes: 161 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
# Conever Backend API

<div align="center">
<h3>AI가 추천하는 맞춤 여행지 · 순간을 기록하고 다시 꺼내보는 리마인드</h3>
<p><strong>Conever 모바일 앱의 API Gateway 백엔드</strong></p>
</div>

---

## 목차
- [프로젝트 개요](#-프로젝트-개요)
- [문제 정의 & 가치 제안](#-문제-정의--가치-제안)
- [핵심 기능](#-핵심-기능)
- [아키텍처 개요](#-아키텍처-개요)
- [기술 스택](#-기술-스택)
- [프로젝트 구조](#-프로젝트-구조)
- [보안 · 프라이버시](#-보안--프라이버시)
- [관측성 · 안정성](#-관측성--안정성)
- [차별점 & 확장성](#-차별점--확장성)
- [커밋 컨벤션](#-커밋-컨벤션)
- [팀-백엔드](#-팀---백엔드)
- [문의](#-문의)
- [라이선스](#-라이선스)

---

## 📌 프로젝트 개요
**Conever**는 사용자의 지역/테마 선호를 바탕으로 **AI가 여행지를 추천**하고, 여행 중 촬영한 사진을 **인생네컷 형태로 재구성**하며, 특정 주기에 **리마인드 알림**으로 추억을 다시 꺼내보게 하는 서비스입니다.
본 저장소는 모바일 클라이언트를 위한 **API Gateway 백엔드**로, 인증/인가, 데이터 집계, 비동기 오케스트레이션을 담당합니다.

---

## 🎯 문제 정의 & 가치 제안
- **문제**: 기존 여행 서비스는 예약·길안내 중심으로, *여정의 감정과 스토리*를 기록하고 *주기적으로 리마인드*하는 경험이 부족합니다.
- **가치**: Conever는 (1) **개인화 추천**, (2) **기록의 구조화(인생네컷)**, (3) **시간이 흐른 뒤의 재경험(리마인드)** 을 결합하여 *여행의 전체 수명 주기*를 지원합니다.

---

## 🎯 핵심 기능
### 🤖 AI 기반 추천
- 17개 시·도, 7개 카테고리 기반 개인화 추천
- 한국관광공사 TourAPI + 생성형 AI(Gemini 2.5 Flash) 후처리 파이프라인

### 📍 연관 관광지 추천
- 실제 이동/방문 데이터 기반 연관 장소 제안
- 인기·연관도 Top-N(예: 최대 50개) 활용, 동선 설계 보조

### 📸 사진 저장 & 인생네컷
- 촬영 사진 업로드/보관
- 4장 자동 레이아웃 인생네컷 생성
- (선택) 감정/스토리 태깅

### 🔔 추억 리마인드
- 3개월/6개월/1년/2년/5년 주기 알림
- 과거 여행 기록/이미지 재노출

### 🤝 동반자 & 포즈 추천
- 관광지별 포즈 추천
- 동반자 초대, 사진/인생네컷 공동 열람

---

## 🏗 아키텍처 개요
- **API Gateway (Django/DRF)**: 인증/인가, 요청 검증, 응답 집계
- **비동기 처리 (Celery + Redis)**: 이미지 처리, 알림 발송, 데이터 동기화
- **데이터 레이어 (MySQL)**: 도메인 데이터 영속화
- **파일 스토리지 (AWS S3)**: 사진/인생네컷 저장
- **실시간/푸시 (Channels/WebSocket & FCM 연계 가능)**: (선택) 실시간 상태/알림
- **모니터링 (Promtail → Loki → Grafana)**: 로그/지표 관제

간단한 흐름(요약):
```
Mobile App → (Auth) → API Gateway ─┬─ MySQL
├─ Redis/Celery (비동기)
├─ S3 (이미지/인생네컷)
└─ 외부 API(TourAPI/Geocoder/Gemini)
```

---

## 🛠 기술 스택
- **Backend**: Django 5.x, Django REST Framework, Django Channels
- **DB/Cache**: MySQL 8.x, Redis 7.2.x
- **Queue/Schedule**: Celery 5.x, Celery Beat
- **Infra**: Docker, Docker Compose, Nginx, AWS S3
- **Monitoring**: Grafana, Loki, Promtail
- **External APIs**: 한국관광공사 TourAPI, Geocoder API 2.0, Google Gemini

> 실제 버전은 `requirements.txt`를 기준으로 관리됩니다.

---

## 📂 프로젝트 구조
```
alphaBE/
├── authenticate/ # 인증/인가
├── config/ # Django 설정
├── middleware/ # 커스텀 미들웨어
├── services/ # 서비스 레이어(외부 API, 도메인 로직)
├── tour/ # 여행 도메인
├── usr/ # 사용자 도메인
├── tests/ # 테스트
├── docker-compose.yml
├── Dockerfile
├── requirements.txt
├── manage.py
└── entrypoint.sh
```

---

## 🔐 보안 · 프라이버시
- **비밀 관리**: 모든 자격증명/키는 저장소에 포함하지 않습니다(.env, 키 파일 등은 커밋 금지).
- **데이터 최소 수집**: 추천 및 리마인드 목적 범위 내 최소 정보만 수집·저장.
- **익명화/가명화**: 로그·분석 단계에서 개인 식별 정보 최소화.
- **권한 분리**: 읽기/쓰기 권한을 역할별로 분리(원칙: 최소 권한).

---

## 📈 관측성 · 안정성
- **로그 파이프라인**: Promtail → Loki 집계, Grafana 대시보드 시각화
- **비동기 오프로딩**: 이미지 처리/AI 후처리/알림 발송은 Celery로 처리 지연 최소화
- **헬스체크/리트라이**: 외부 API 실패 대비 타임아웃·재시도 정책 설계
- **확장성 고려**: 캐시 계층(Redis)·수평 확장 전제, WAF/Rate Limit 구성 용이

---

## 🚀 차별점 & 확장성
- **여정 전·중·후 전체를 아우르는 설계**: 추천 → 기록(인생네컷) → 리마인드의 폐루프(Closed Loop).
- **데이터 네트워크 효과**: 동반자/공유 기능으로 재참여·재방문 유도.
- **모듈화된 AI 파이프라인**: 모델 교체·프롬프트 튜닝·후처리 모듈을 분리하여 실험 비용 절감.
- **운영 친화성**: 로그/지표 표준화로 A/B 실험·성능 튜닝·오류 분석이 용이.

---

## 🧾 커밋 컨벤션
**Conventional Commits** 권장:
- `feat:` 기능 추가
- `fix:` 버그 수정
- `refactor:` 리팩터링(기능 변화 없음)
- `chore:` 빌드/도구/패키지 갱신
- `docs:` 문서 수정
- `test:` 테스트 추가/개선

> 기존 `MODIFY` 라벨은 `feat:` 또는 `refactor:` 등 표준 라벨로 대체를 권장합니다.

---

## 👥 팀 - 백엔드
- **임태근** ([@YimTaeKeun](https://github.com/YimTaeKeun)) — 총괄, 백엔드, 기획
- **조시연** ([@jimmy914](https://github.com/jimmy914)) — 백엔드, 기획

---

## 📫 문의
프로젝트 문의: **[email protected]**

---

## 📄 라이선스
- 라이선스: `LICENSE` 파일 참조
81 changes: 53 additions & 28 deletions authenticate/tests.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
import unittest
from django.test import TestCase
import logging
import unittest

from django.test import override_settings
from django.urls import reverse

from config.settings import (
KAKAO_AUTH_CODE, # 임시 인가 코드를 가져옵니다. 테스트 실행시마다 .env 파일에서 매번 바꿔줘야합니다.
KAKAO_REFRESH_TOKEN, # 리프레시 토큰. 만료시 바꿔 사용
KAKAO_AUTH_CODE, # 임시 인가 코드를 가져옵니다. 테스트 실행시마다 .env 파일에서 매번 바꿔줘야합니다.
# 리프레시 토큰. 만료시 바꿔 사용
APP_LOGGER,
SKIP_TEST,
KAKAO_REST_API_KEY,
SIMPLE_JWT,
REFRESH_TOKEN,
)
import logging
from services.kakao_token_service import KakaoTokenService
from tests.base import BaseTestCase

logger = logging.getLogger(APP_LOGGER)

# Create your tests here.
Expand All @@ -27,58 +31,79 @@ def test_login_callback(self):
print(response.json())
self.assertEqual(response.status_code, 201)

@unittest.skipIf(SKIP_TEST == 'True', "Skip Login Refresh Test")
def test_refresh_token(self):
# python의 unpacking은 같은 값이 있다면 덮어쓰기로 진행이 됨. 따라서 BLACKLIST_AFTER_ROTATION값은 False로 됨
# 아래 설정은 리프레시 토큰은 테스트 중에는 블랙리스트에 넣지 않도록 함
@override_settings(SIMPLE_JWT={**SIMPLE_JWT, "BLACKLIST_AFTER_ROTATION": False})
def test_refresh_token_success(self):
"""
해당 테스트는 카카오 리프레시 토큰이 제대로 날라오는지 확인하기 위한 테스트입니다.
해당 테스트는 토큰이 제대로 refresh가 되는지 테스트합니다.
"""
target_uri = '/auth/refresh/'
# TODO 리프레시 토큰으로서 유효기간이 만료되면 바꿔줘야합니다.
uri = reverse('refresh')
data = {
'refresh_token': KAKAO_REFRESH_TOKEN,
'refresh_token': REFRESH_TOKEN,
}
response = self.client.post(target_uri, data=data, content_type='application/json')
self.assertEqual(response.status_code, 201)
# 리프레시 토큰 정보를 body에서 발견하지 못한 경우를 테스트 합니다.
response = self.client.post(uri, data=data, content_type='application/json')
self.assertEqual(response.status_code, 200)
logger.debug('test_refresh_token_success result:' + str(response.json()))

def test_refresh_token_failure_no_parameter(self):
"""
해당 테스트는 refresh token 뷰에서 파라미터가 제대로 날라오지 않았을 경우를 테스트합니다.
"""
uri = reverse('refresh')
data = {
# 일부러 틀린 정보를 넣습니다.
'ref': '',
'ref': '123sdf1',
}
response = self.client.post(target_uri, data=data, content_type='application/json')
response = self.client.post(uri, data=data, content_type='application/json')
self.assertEqual(response.status_code, 400)
# 토큰 정보 자체를 변환해서 테스트합니다.
logger.debug('refresh no parameter result:' + str(response.json()))

def test_refresh_token_failure_invalid_token(self):
"""
해당 테스트는 refresh token 뷰에서 토큰이 유효하지 않은 경우를 테스트합니다.
"""
uri = reverse('refresh')
data = {
'refresh_token': '1pbZZHeOq9TsJBPQgA-URNdOUoDlhxp__AAAAAgo9cusAAAGUKtVQgeQ1KlcE_6bt',
}
response = self.client.post(target_uri, data=data, content_type='application/json')
response = self.client.post(uri, data=data, content_type='application/json')
self.assertEqual(response.status_code, 400)
logger.debug('refresh invalid token result:' + str(response.json()))


@unittest.skipIf(SKIP_TEST == 'True', "Skip Login Test")
def test_login(self):
def test_login_success(self):
"""
해당 함수는 flutter sdk로 발급받은 액세스 토큰과 아이디 토큰을 활용하여 로그인 혹은 회원가입 진행이 되는지 확인합니다.
"""
end_point = '/auth/login/'
end_point = reverse('login_register')
headers = {
'Authorization': f'Bearer {self.KAKAO_TEST_ACCESS_TOKEN}'
}
data = {
'id_token': self.KAKAO_TEST_ID_TOKEN,
}
# register Test
response = self.client.post(end_point, headers=headers, data=data, content_type='application/json')
response = self.client.post(end_point, data=data, content_type='application/json')
self.assertEqual(response.status_code, 201)
self.assertEqual(response.json()['is_new'], True)

# login Test
response = self.client.post(end_point, headers=headers, data=data, content_type='application/json')
self.assertEqual(response.status_code, 201)
self.assertEqual(response.json()['is_new'], False)
logger.debug('login success result:' + str(response.json()))

def test_login_failure(self):
"""
로그인 실패를 테스트합니다.
"""
end_point = reverse('login')
headers = {
'Authorization': f'Bearer {self.KAKAO_TEST_ACCESS_TOKEN}'
}
# 400 Test
data2 = {
'id_token' : 'hsesefs'
'id_token': 'hsesefs'
}
response = self.client.post(end_point, headers=headers, data=data2, content_type='application/json')
self.assertEqual(response.status_code, 400)

logger.debug('login failure result:' + str(response.json()))
6 changes: 3 additions & 3 deletions authenticate/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.urls import path
from .views import kakao_callback, KakaoRefreshTokens, LoginRegisterView, CustomTokenRefreshView
from rest_framework_simplejwt.views import TokenRefreshView

from .views import kakao_callback, LoginRegisterView, CustomTokenRefreshView

urlpatterns = [
path('login/', LoginRegisterView.as_view({
Expand All @@ -10,5 +10,5 @@
# path('refresh/', KakaoRefreshTokens.as_view({
# 'post': 'create',
# }), name='refresh_tokens'),
path('refresh/', CustomTokenRefreshView.as_view())
path('refresh/', CustomTokenRefreshView.as_view(), name='refresh'),
]
Loading