diff --git a/.coderabbit.yaml b/.coderabbit.yaml
new file mode 100644
index 00000000..85d62c3b
--- /dev/null
+++ b/.coderabbit.yaml
@@ -0,0 +1,93 @@
+language: ko-KR # 언어 설정
+
+early_access: true # 미리보기 기능 활성화
+enable_free_tier: true # 프리 티어 활성화
+auto_resolve_threads: false # 자동 해결 비활성화
+
+reviews:
+ profile: chill
+ request_changes_workflow: true
+ high_level_summary: true # 리뷰에 대해 요약(high-level summary)를 자동 작성
+ high_level_summary_placeholder: '@coderabbitai 요약'
+ auto_title_placeholder: '@coderabbitai'
+ poem: true
+ review_status: true # PR 리뷰 상태를 리뷰 요약란에 표시
+ collapse_walkthrough: false # 리뷰 단계 설명을 기본적으로 접지 않음
+
+ abort_on_close: true # PR이 닫히면 리뷰 수행을 중단(abort)
+
+
+ auto_review:
+ enabled: true # 자동 리뷰 기능을 활성화
+ auto_incremental_review: true # 커밋이 추가될 때마다 변경 사항에 대해서만 자동 수행
+ ignore_title_keywords: [] # PR 제목에 포함되면 리뷰를 건너뛰는 키워드 목록
+ labels: [] # 특정 라벨이 붙은 PR만 자동 리뷰 대상
+ drafts: false # Draft 상태인 PR은 자동 리뷰 대상에서 제외(false면 제외)
+ base_branches: [] # 특정 브랜치만 리뷰하도록
+
+ tools:
+ shellcheck: # 셸 스크립트 문법 및 보안 검사
+ enabled: true
+ ruff: # Python 코드 스타일 검사기
+ enabled: true
+ markdownlint: # 마크다운 문법 검사
+ enabled: true
+ github-checks: # GitHub 체크 연동 + 타임아웃(ms 단위)
+ enabled: true
+ timeout_ms: 90000
+ languagetool: # 맞춤법, 문법 검사
+ enabled: true
+ disabled_rules:
+ - EN_UNPAIRED_BRACKETS
+ - EN_UNPAIRED_QUOTES
+ disabled_categories:
+ - TYPOS
+ - TYPOGRAPHY
+ - CASING
+ enabled_only: false
+ level: default
+ enabled_rules: []
+ enabled_categories: []
+ biome: # JavaScript/TypeScript 정적 분석
+ enabled: true
+ hadolint: # Dockerfile 코드 스타일 검사
+ enabled: true
+ swiftlint: # Swift 코드 스타일 검사
+ enabled: true
+ phpstan: # PHP 정적 분석
+ enabled: true
+ level: default
+ golangci-lint: # Go 코드 스타일 검사
+ enabled: true
+ yamllint: # YAML 형식 검사
+ enabled: true
+ gitleaks: # Git 시크릿 노출 탐지
+ enabled: true
+ checkov: # 인프라 보안 검사
+ enabled: true
+ ast-grep: # AST 기반 코드 패턴 검사
+ packages: []
+ rule_dirs: []
+ util_dirs: []
+ essential_rules: true
+
+# CodeRabbit AI 챗 기능을 사용 가능하게 하고,
+# 한 번에 처리 가능한 토큰 수를 최대 4096으로 제한
+chat:
+ enabled: true
+ max_token_length: 4096
+
+
+# 지식 기반에 사용할 학습 범위를 지정하십시오.
+# 'Local' - Repository
+# 'Global'- Organization
+# 'Auto' - Repository(users public) + Organization(private)
+knowledge_base:
+ web_search: # AI 웹 검색 허용
+ enabled: true
+ learnings: # 학습 범위 설정 (local, global, auto)
+ scope: local
+ issues: # 이슈 자동 참조 범위 설정 (local, global, auto)
+ scope: auto
+ jira:
+ project_keys: []
diff --git "a/.github/ISSUE_TEMPLATE/\354\235\264\354\212\210-\354\235\264\353\246\204.md" "b/.github/ISSUE_TEMPLATE/\354\235\264\354\212\210-\354\235\264\353\246\204.md"
new file mode 100644
index 00000000..b685dd47
--- /dev/null
+++ "b/.github/ISSUE_TEMPLATE/\354\235\264\354\212\210-\354\235\264\353\246\204.md"
@@ -0,0 +1,20 @@
+---
+name: 이슈 이름
+about: 팝풀 기본 템플릿
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+## 🤔 작업 배경
+
+작업 배경을 적어주세요
+
+## 📝 작업 내용
+
+- 작업 내용을 적어주세요
+
+## 👀 ETC (추후 개발해야 할 것, 참고자료 등)
+
+
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000..321522df
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,15 @@
+## 📌 이슈
+
+- #이슈번호
+
+## ✅ 작업 사항
+
+- [ ] 작업 사항을 정리해주세요
+
+## 🚀 테스트 방식
+
+
+
+## 👀 ETC (추후 개발해야 할 것, 참고자료 등) ->
+
+
\ No newline at end of file
diff --git a/.github/secrets/ExportOptions.plist b/.github/secrets/ExportOptions.plist
new file mode 100644
index 00000000..940c9086
--- /dev/null
+++ b/.github/secrets/ExportOptions.plist
@@ -0,0 +1,29 @@
+
+
+
+
+ destination
+ export
+ manageAppVersionAndBuildNumber
+
+ method
+ app-store-connect
+ provisioningProfiles
+
+ com.poppoolIOS.poppool
+ PoppoolGitHubAction
+
+ signingCertificate
+ 82F980617C0479150A4BCB89DC90498DCB319F8F
+ signingStyle
+ manual
+ stripSwiftSymbols
+
+ teamID
+ W5QTRMS954
+ testFlightInternalTestingOnly
+
+ uploadSymbols
+
+
+
diff --git a/.github/secrets/PoppoolGitHubAction.mobileprovision.gpg b/.github/secrets/PoppoolGitHubAction.mobileprovision.gpg
new file mode 100644
index 00000000..71dce081
Binary files /dev/null and b/.github/secrets/PoppoolGitHubAction.mobileprovision.gpg differ
diff --git a/.github/secrets/certification.p12.gpg b/.github/secrets/certification.p12.gpg
new file mode 100644
index 00000000..05c0e8d5
Binary files /dev/null and b/.github/secrets/certification.p12.gpg differ
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..04668907
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,100 @@
+name: CI
+
+on:
+ pull_request:
+ branches: [main, develop, 'release/*']
+
+jobs:
+ autocorrect:
+ name: 🤖 Autocorrect Workflow
+ runs-on: macos-15 # 최신 macOS 15 환경에서 실행
+ if: github.actor != 'github-actions[bot]'&& github.base_ref == 'develop' # Actions 봇 커밋은 무시 && develop에서만 자동 수정 진행
+
+ steps:
+ - name: Checkout Repository # 저장소 코드 체크아웃
+ uses: actions/checkout@v4
+
+ - name: 🛠️ Set up Xcode # Xcode 16.2 선택
+ run: sudo xcode-select -s /Applications/Xcode_16.2.app
+
+ - name: ⬇️ Install SwiftLint # SwiftLint 설치
+ run: brew install swiftlint
+
+ - name: 🎨 Run SwiftLint Autocorrect # SwiftLint 자동 수정 실행
+ run: swiftlint --fix
+
+ - name: 🚀 Commit and Push Changes # 변경 사항 자동 커밋 및 푸시
+ run: |
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+
+ git fetch origin "${GITHUB_HEAD_REF}:${GITHUB_HEAD_REF}"
+ git checkout "${GITHUB_HEAD_REF}"
+
+ BRANCH_NAME="${GITHUB_HEAD_REF}"
+ if [[ "$BRANCH_NAME" =~ \#([0-9]+) ]]; then
+ ISSUE_NUMBER="${BASH_REMATCH[1]}"
+ else
+ ISSUE_NUMBER=""
+ fi
+
+ if [ -n "$(git status --porcelain)" ]; then
+ git add .
+ git commit -m "style/#${ISSUE_NUMBER}: Apply SwiftLint autocorrect"
+ git push --set-upstream origin "${GITHUB_HEAD_REF}"
+ else
+ echo "No changes to commit"
+ fi
+
+ build:
+ name: 🏗️ Build Workflow
+ runs-on: macos-15 # 최신 macOS 15 환경에서 실행
+ if: github.actor != 'github-actions[bot]' # Actions 봇 커밋은 무시
+
+ steps:
+ - name: Checkout Repository # 저장소 코드 체크아웃
+ uses: actions/checkout@v4
+
+ - name: ⚙️ Generate xcconfig
+ run: |
+ cat < Poppool/Poppool/Resource/Debug.xcconfig
+ KAKAO_AUTH_APP_KEY=${{ secrets.KAKAO_AUTH_APP_KEY }}
+ NAVER_MAP_CLIENT_ID=${{ secrets.NAVER_MAP_CLIENT_ID }}
+ POPPOOL_BASE_URL=${{ secrets.POPPOOL_BASE_URL }}
+ POPPOOL_S3_BASE_URL=${{ secrets.POPPOOL_S3_BASE_URL }}
+ POPPOOL_API_KEY=${{ secrets.POPPOOL_API_KEY }}
+ EOF
+
+ - name: 🛠️ Select Xcode 16.2 # Xcode 16.2 버전 사용 설정
+ run: sudo xcode-select -s /Applications/Xcode_16.2.app
+
+ - name: ⬇️ Install SwiftLint # SwiftLint 설치
+ run: brew install swiftlint
+
+ - name: 🎨 Run SwiftLint # SwiftLint 코드 스타일 검사 실행
+ run: swiftlint
+
+ - name: 🔍 Detect Default Scheme # 기본 scheme 자동 검지
+ id: detect_scheme
+ run: |
+ SCHEME=$(xcodebuild -list -json | jq -r '.project.schemes[0]')
+ echo "Detected scheme: $SCHEME"
+ echo "scheme=$SCHEME" >> "$GITHUB_OUTPUT"
+
+ - name: 🔍 Detect Latest iPhone Simulator # 최신 사용 가능한 iPhone 시뮬레이터 검지
+ id: detect_latest_simulator
+ run: |
+ DEVICE=$(xcrun simctl list devices available | grep -Eo 'iPhone .* \([0-9A-F\-]+\)' | head -n 1)
+ UDID=$(echo "$DEVICE" | grep -Eo '[0-9A-F\-]{36}')
+ NAME=$(echo "$DEVICE" | cut -d '(' -f1 | xargs)
+ echo "Detected simulator: $NAME ($UDID)"
+ echo "sim_name=$NAME" >> "$GITHUB_OUTPUT"
+ echo "sim_udid=$UDID" >> "$GITHUB_OUTPUT"
+
+ - name: 🏗️ Build the project # 자동 검지된 Scheme과 Simulator로 빌드 수행
+ run: |
+ WORKSPACE=$(find . -name "*.xcworkspace" | head -n 1)
+ xcodebuild -scheme "${{ steps.detect_scheme.outputs.scheme }}" \
+ -workspace "$WORKSPACE" \
+ -destination "platform=iOS Simulator,id=${{ steps.detect_latest_simulator.outputs.sim_udid }}" \
+ clean build | xcpretty
diff --git a/.github/workflows/deploy_on_release.yml b/.github/workflows/deploy_on_release.yml
new file mode 100644
index 00000000..b6d01a45
--- /dev/null
+++ b/.github/workflows/deploy_on_release.yml
@@ -0,0 +1,139 @@
+name: Distribution to TestFlight
+
+on:
+ pull_request:
+ branches: [ release/* ]
+
+jobs:
+ deploy:
+ name: 🚀 Distribution to TestFlight Workflow
+ runs-on: macos-15 # 최신 macOS 15 환경에서 실행
+ env:
+ # app archive 및 export 에 쓰일 환경 변수 설정
+ XC_WORKSPACE: Poppool/Poppool.xcworkspace
+ XC_SCHEME: Poppool
+ XC_ARCHIVE: Poppool.xcarchive
+
+ # certificate
+ ENCRYPTED_CERT_FILE_PATH: ${{ '.github/secrets/certification.p12.gpg' }}
+ DECRYPTED_CERT_FILE_PATH: ${{ '.github/secrets/certification.p12' }}
+ CERT_ENCRYPTION_KEY: ${{ secrets.CERT_ENCRYPTION_PWD }} # gpg로 파일 암호화할 때 사용한 암호
+
+ # provisioning
+ ENCRYPTED_PROVISION_FILE_PATH: '.github/secrets/PoppoolGitHubAction.mobileprovision.gpg'
+ DECRYPTED_PROVISION_FILE_PATH: '.github/secrets/PoppoolGitHubAction.mobileprovision'
+ PROVISIONING_ENCRYPTION_KEY: ${{ secrets.PROVISION_ENCRYPTION_PWD }} # gpg로 파일 암호화할 때 사용한 암호
+
+ # certification export key
+ CERT_EXPORT_KEY: ${{ secrets.CERT_EXPORT_PWD }}
+
+ KEYCHAIN: ${{ 'test.keychain' }}
+
+ steps:
+ - name: Checkout Repository # 저장소 코드 체크아웃
+ uses: actions/checkout@v4
+
+ - name: 🛠️ Set up Xcode # Xcode 16.2 선택
+ run: sudo xcode-select -s /Applications/Xcode_16.2.app
+
+ - name: "#️⃣ Set Build Number" # 자동 빌드 넘버 세팅
+ run: |
+ BUILD_NUMBER=$(TZ=Asia/Seoul date +%y%m%d.%H%M)
+ cd Poppool
+ agvtool new-version -all "$BUILD_NUMBER"
+
+ - name: ⚙️ Generate xcconfig # 빌드에 필요한 xcconfig 생성
+ run: |
+ echo "POPPOOL_BASE_URL=${POPPOOL_BASE_URL}" > Poppool/Poppool/Resource/Debug.xcconfig
+ echo "POPPOOL_S3_BASE_URL=${POPPOOL_S3_BASE_URL}" >> Poppool/Poppool/Resource/Debug.xcconfig
+ echo "POPPOOL_API_KEY=${POPPOOL_API_KEY}" >> Poppool/Poppool/Resource/Debug.xcconfig
+ echo "KAKAO_AUTH_APP_KEY=${KAKAO_AUTH_APP_KEY}" >> Poppool/Poppool/Resource/Debug.xcconfig
+ echo "NAVER_MAP_CLIENT_ID=${NAVER_MAP_CLIENT_ID}" >> Poppool/Poppool/Resource/Debug.xcconfig
+ env:
+ POPPOOL_BASE_URL: ${{ secrets.POPPOOL_BASE_URL }}
+ POPPOOL_S3_BASE_URL: ${{ secrets.POPPOOL_S3_BASE_URL }}
+ POPPOOL_API_KEY: ${{ secrets.POPPOOL_API_KEY }}
+ KAKAO_AUTH_APP_KEY: ${{ secrets.KAKAO_AUTH_APP_KEY }}
+ NAVER_MAP_CLIENT_ID: ${{ secrets.NAVER_MAP_CLIENT_ID }}
+
+ - name: 🔑 Configure Keychain # 키체인 초기화 -> 임시 키체인 생성
+ run: |
+ security create-keychain -p "" "$KEYCHAIN"
+ security list-keychains -s "$KEYCHAIN"
+ security default-keychain -s "$KEYCHAIN"
+ security unlock-keychain -p "" "$KEYCHAIN"
+ security set-keychain-settings
+
+ - name : ©️ Configure Code Signing # 코드 사이닝 추가
+ run: |
+ # certificate 복호화
+ gpg -d -o "$DECRYPTED_CERT_FILE_PATH" --pinentry-mode=loopback --passphrase "$CERT_ENCRYPTION_KEY" "$ENCRYPTED_CERT_FILE_PATH"
+
+ # provisioning 복호화
+ gpg -d -o "$DECRYPTED_PROVISION_FILE_PATH" --pinentry-mode=loopback --passphrase "$PROVISIONING_ENCRYPTION_KEY" "$ENCRYPTED_PROVISION_FILE_PATH"
+
+ # security를 사용하여 인증서와 개인 키를 새로 만든 키 체인으로 가져옴
+ security import "$DECRYPTED_CERT_FILE_PATH" -k "$KEYCHAIN" -P "$CERT_EXPORT_KEY" -A
+ security set-key-partition-list -S apple-tool:,apple: -s -k "" "$KEYCHAIN"
+
+ # Xcode에서 찾을 수 있는 프로비저닝 프로필 설치하기 위해 우선 프로비저닝 디렉토리를 생성
+ mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles"
+
+ # 디버깅 용 echo 명령어
+ echo `ls .github/secrets/*.mobileprovision`
+ # 모든 프로비저닝 프로파일을 rename 하고 위에서 만든 디렉토리로 복사하는 과정
+ for PROVISION in `ls .github/secrets/*.mobileprovision`
+ do
+ UUID=`/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i ./$PROVISION)`
+ cp "./$PROVISION" "$HOME/Library/MobileDevice/Provisioning Profiles/$UUID.mobileprovision"
+ done
+
+ - name: ⬇️ Archive app # 빌드 및 아카이브
+ run: |
+ xcodebuild clean archive -workspace $XC_WORKSPACE -scheme $XC_SCHEME -configuration release -archivePath $XC_ARCHIVE
+
+ - name: ⬆️ Export app # export 를 통해 ipa 파일 만듦
+ run: |
+ xcodebuild -exportArchive -archivePath $XC_ARCHIVE -exportOptionsPlist .github/secrets/ExportOptions.plist -exportPath . -allowProvisioningUpdates
+
+ - name: 🚀 Upload app to TestFlight # TestFlight에 아카이브된 앱 등록
+ uses: apple-actions/upload-testflight-build@v1
+ with:
+ app-path: 'Poppool.ipa'
+ issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
+ api-key-id: ${{ secrets.APPSTORE_API_KEY_ID }}
+ api-private-key: ${{ secrets.APPSTORE_API_PRIVATE_KEY }}
+
+ - name: 📣 Notify to Discord
+ if: success()
+ run: |
+ MARKETING_VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" Poppool.xcarchive/Products/Applications/Poppool.app/Info.plist)
+ BUNDLE_VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" Poppool.xcarchive/Products/Applications/Poppool.app/Info.plist)
+
+ curl -H "Content-Type: application/json" \
+ -X POST \
+ -d "{
+ \"embeds\": [
+ {
+ \"title\": \"🚀 TestFlight 배포 완료\",
+ \"description\": \"Poppool 앱이 성공적으로 TestFlight에 업로드되었습니다!\",
+ \"color\": 3066993,
+ \"fields\": [
+ {
+ \"name\": \"🏷️ 마케팅 버전\",
+ \"value\": \"$MARKETING_VERSION\",
+ \"inline\": true
+ },
+ {
+ \"name\": \"🛠️ 빌드 번호\",
+ \"value\": \"$BUNDLE_VERSION\",
+ \"inline\": true
+ }
+ ],
+ \"footer\": {
+ \"text\": \"TestFlight에서 위 버전을 설치하세요\"
+ }
+ }
+ ]
+ }" \
+ ${{ secrets.TESTFLIGHT_WEBHOOK_URL }}
diff --git a/.gitignore b/.gitignore
index df2cb547..01fa263e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,65 +1,47 @@
-# Xcode
-#
-# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
-
-## User settings
+# Xcode 관련
xcuserdata/
+.DS_Store
+
+# 개인 설정 및 비밀 정보
+*.xcconfig
-## Obj-C/Swift specific
+# Objective-C / Swift 관련
*.hmap
-## App packaging
+# 앱 패키징
*.ipa
*.dSYM.zip
*.dSYM
-## Playgrounds
+# Playgrounds
timeline.xctimeline
playground.xcworkspace
-# Swift Package Manager
-#
-# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
+# Swift Package Manager (SPM)
+.build/
+# 패키지 관련 파일을 무시하고 싶다면 아래 항목을 활성화하세요.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
-#
-# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
-# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm
-.build/
-
# CocoaPods
-#
-# We recommend against adding the Pods directory to your .gitignore. However
-# you should judge for yourself, the pros and cons are mentioned at:
-# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
-#
+# Pods 디렉토리를 무시하고 싶다면 아래 항목을 활성화하세요.
# Pods/
-#
-# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# Carthage
-#
-# Add this line if you want to avoid checking in source code from Carthage dependencies.
-# Carthage/Checkouts
-
Carthage/Build/
+# Carthage 의존성을 무시하고 싶다면 아래 항목을 활성화하세요.
+# Carthage/Checkouts
# fastlane
-#
-# It is recommended to not store the screenshots in the git repo.
-# Instead, use fastlane to re-generate the screenshots whenever they are needed.
-# For more information about the recommended setup visit:
-# https://docs.fastlane.tools/best-practices/source-control/#source-control
-
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
-.DS_Store
-Secrets.swift
+# Cursor
+**/buildServer.json
+.vscode/*
diff --git a/Check/modal/infobox/ico/line.png b/Check/modal/infobox/ico/line.png
deleted file mode 100644
index 421badb4..00000000
Binary files a/Check/modal/infobox/ico/line.png and /dev/null differ
diff --git a/Map/Tmap/modal/ico/logo/logo/square.png b/Map/Tmap/modal/ico/logo/logo/square.png
deleted file mode 100644
index 30cb0be8..00000000
Binary files a/Map/Tmap/modal/ico/logo/logo/square.png and /dev/null differ
diff --git a/Map/Tmap/naver/modal/ico/logo/logo/square.png b/Map/Tmap/naver/modal/ico/logo/logo/square.png
deleted file mode 100644
index 7bfb5658..00000000
Binary files a/Map/Tmap/naver/modal/ico/logo/logo/square.png and /dev/null differ
diff --git a/Map/modal/ico/logo/logo/modal/ico/logo/logo/square.png b/Map/modal/ico/logo/logo/modal/ico/logo/logo/square.png
deleted file mode 100644
index ed269737..00000000
Binary files a/Map/modal/ico/logo/logo/modal/ico/logo/logo/square.png and /dev/null differ
diff --git a/Map/modal/ico/logo/logo/square.png b/Map/modal/ico/logo/logo/square.png
deleted file mode 100644
index 5eb0bfb0..00000000
Binary files a/Map/modal/ico/logo/logo/square.png and /dev/null differ
diff --git a/Map/modal/ico/search/ico/ico/line.png b/Map/modal/ico/search/ico/ico/line.png
deleted file mode 100644
index 10972352..00000000
Binary files a/Map/modal/ico/search/ico/ico/line.png and /dev/null differ
diff --git a/Map/modal/ico/search/ico/ico/line@2x.png b/Map/modal/ico/search/ico/ico/line@2x.png
deleted file mode 100644
index 4d632200..00000000
Binary files a/Map/modal/ico/search/ico/ico/line@2x.png and /dev/null differ
diff --git a/Map/modal/ico/search/ico/ico/line@3x.png b/Map/modal/ico/search/ico/ico/line@3x.png
deleted file mode 100644
index fbea4688..00000000
Binary files a/Map/modal/ico/search/ico/ico/line@3x.png and /dev/null differ
diff --git a/Marker/UnTapMarker/search/ico/solid.png b/Marker/UnTapMarker/search/ico/solid.png
deleted file mode 100644
index 10ce11cd..00000000
Binary files a/Marker/UnTapMarker/search/ico/solid.png and /dev/null differ
diff --git a/Marker/search/ico/solid.png b/Marker/search/ico/solid.png
deleted file mode 100644
index 39f13b31..00000000
Binary files a/Marker/search/ico/solid.png and /dev/null differ
diff --git a/Poppool/.swiftlint.yml b/Poppool/.swiftlint.yml
new file mode 100644
index 00000000..4718cfd2
--- /dev/null
+++ b/Poppool/.swiftlint.yml
@@ -0,0 +1,20 @@
+# 기본 활성화된 룰 중에 비활성화할 룰을 지정
+disabled_rules:
+ - type_body_length
+ - function_body_length
+ - file_length
+ - line_length
+ - force_cast
+ - force_try
+ - duplicate_conditions
+ - identifier_name
+ - cyclomatic_complexity
+ - redundant_optional_initialization
+ - function_parameter_count
+
+# 기본(default) 룰이 아닌 룰들을 활성화
+opt_in_rules:
+ - sorted_imports
+ - direct_return
+ - file_header
+ - weak_delegate
diff --git "a/Poppool/AdminRepository\\.swift" "b/Poppool/AdminRepository\\.swift"
deleted file mode 100644
index b5f7eebc..00000000
--- "a/Poppool/AdminRepository\\.swift"
+++ /dev/null
@@ -1,8 +0,0 @@
-//
-// AdminRepository\.swift
-// Poppool
-//
-// Created by 김기현 on 1/6/25.
-//
-
-import Foundation
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure.xcodeproj/project.pbxproj b/Poppool/CoreLayer/Infrastructure/Infrastructure.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..49b3761e
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure.xcodeproj/project.pbxproj
@@ -0,0 +1,440 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 77;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0522C1D72DB67B4F00B141FF /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C1D62DB67B4F00B141FF /* RxSwift */; };
+ 05EC93D92DB6605100771CB3 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC93D82DB6605100771CB3 /* RxCocoa */; };
+ 05EC93DE2DB6612100771CB3 /* RxGesture in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC93DD2DB6612100771CB3 /* RxGesture */; };
+ 4EBC91D32DB8039800495C3B /* OSLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EBC91D22DB8039800495C3B /* OSLog.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 0512596C2DB5629C001342A2 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 058CC9182DB5383C0084221A /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 4EBC91D22DB8039800495C3B /* OSLog.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OSLog.framework; path = System/Library/Frameworks/OSLog.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFileSystemSynchronizedRootGroup section */
+ 058CC91A2DB5383C0084221A /* Infrastructure */ = {
+ isa = PBXFileSystemSynchronizedRootGroup;
+ path = Infrastructure;
+ sourceTree = "";
+ };
+/* End PBXFileSystemSynchronizedRootGroup section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 058CC9152DB5383C0084221A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 4EBC91D32DB8039800495C3B /* OSLog.framework in Frameworks */,
+ 0522C1D72DB67B4F00B141FF /* RxSwift in Frameworks */,
+ 05EC93D92DB6605100771CB3 /* RxCocoa in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 05125B6A2DB56C32001342A2 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 4EBC91D22DB8039800495C3B /* OSLog.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 058CC90E2DB5383C0084221A = {
+ isa = PBXGroup;
+ children = (
+ 058CC91A2DB5383C0084221A /* Infrastructure */,
+ 05125B6A2DB56C32001342A2 /* Frameworks */,
+ 058CC9192DB5383C0084221A /* Products */,
+ );
+ sourceTree = "";
+ };
+ 058CC9192DB5383C0084221A /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 058CC9182DB5383C0084221A /* Infrastructure.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 058CC9132DB5383C0084221A /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 058CC9172DB5383C0084221A /* Infrastructure */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 058CC91F2DB5383C0084221A /* Build configuration list for PBXNativeTarget "Infrastructure" */;
+ buildPhases = (
+ 058CC9132DB5383C0084221A /* Headers */,
+ 058CC9142DB5383C0084221A /* Sources */,
+ 058CC9152DB5383C0084221A /* Frameworks */,
+ 058CC9162DB5383C0084221A /* Resources */,
+ 0512596C2DB5629C001342A2 /* Embed Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ fileSystemSynchronizedGroups = (
+ 058CC91A2DB5383C0084221A /* Infrastructure */,
+ );
+ name = Infrastructure;
+ packageProductDependencies = (
+ 05EC93D82DB6605100771CB3 /* RxCocoa */,
+ 0522C1D62DB67B4F00B141FF /* RxSwift */,
+ );
+ productName = Infrastructure;
+ productReference = 058CC9182DB5383C0084221A /* Infrastructure.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 058CC90F2DB5383C0084221A /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1630;
+ LastUpgradeCheck = 1630;
+ TargetAttributes = {
+ 058CC9172DB5383C0084221A = {
+ CreatedOnToolsVersion = 16.3;
+ };
+ };
+ };
+ buildConfigurationList = 058CC9122DB5383C0084221A /* Build configuration list for PBXProject "Infrastructure" */;
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 058CC90E2DB5383C0084221A;
+ minimizedProjectReferenceProxies = 1;
+ packageReferences = (
+ 05C1D82E2DB53CE300508FFD /* XCRemoteSwiftPackageReference "RxSwift" */,
+ 05EC93DC2DB6612100771CB3 /* XCRemoteSwiftPackageReference "RxGesture" */,
+ );
+ preferredProjectObjectVersion = 77;
+ productRefGroup = 058CC9192DB5383C0084221A /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 058CC9172DB5383C0084221A /* Infrastructure */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 058CC9162DB5383C0084221A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 058CC9142DB5383C0084221A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 058CC91D2DB5383C0084221A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ 058CC91E2DB5383C0084221A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ 058CC9202DB5383C0084221A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.Infrastructure;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_MODULE = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ 058CC9212DB5383C0084221A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = "";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.Infrastructure;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_MODULE = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 058CC9122DB5383C0084221A /* Build configuration list for PBXProject "Infrastructure" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 058CC91D2DB5383C0084221A /* Debug */,
+ 058CC91E2DB5383C0084221A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 058CC91F2DB5383C0084221A /* Build configuration list for PBXNativeTarget "Infrastructure" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 058CC9202DB5383C0084221A /* Debug */,
+ 058CC9212DB5383C0084221A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+ 05C1D82E2DB53CE300508FFD /* XCRemoteSwiftPackageReference "RxSwift" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/ReactiveX/RxSwift";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 6.9.0;
+ };
+ };
+ 05EC93DC2DB6612100771CB3 /* XCRemoteSwiftPackageReference "RxGesture" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/RxSwiftCommunity/RxGesture";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 4.0.4;
+ };
+ };
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 0522C1D62DB67B4F00B141FF /* RxSwift */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 05C1D82E2DB53CE300508FFD /* XCRemoteSwiftPackageReference "RxSwift" */;
+ productName = RxSwift;
+ };
+ 05EC93D82DB6605100771CB3 /* RxCocoa */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 05C1D82E2DB53CE300508FFD /* XCRemoteSwiftPackageReference "RxSwift" */;
+ productName = RxCocoa;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = 058CC90F2DB5383C0084221A /* Project object */;
+}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/DIContainer/DIContainer.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/DIContainer/DIContainer.swift
new file mode 100644
index 00000000..66b3e1ef
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/DIContainer/DIContainer.swift
@@ -0,0 +1,66 @@
+import Foundation
+
+/// 의존성 주입 컨테이너
+///
+/// 이 컨테이너는 타입 기반으로 의존성을 등록하고 어디서든 안전하게 꺼내 쓸 수 있도록 도와줍니다.
+///
+/// 앱 시작 시점에 필요한 구현체를 `register(_:_: )`를 통해 등록하고,
+/// 이후에는 `resolve(_:)` 메서드를 통해 원하는 타입의 인스턴스를 꺼낼 수 있습니다.
+///
+/// ## 등록 예시
+/// ```swift
+/// DIContainer.register(SampleProtocol.self) {
+/// SampleImpl()
+/// }
+/// ```
+///
+/// ## 사용 예시
+/// ```swift
+/// // DIContainer의 resolve 메서드를 사용하는 방식
+/// let sample: SampleProtocol = DIContainer.resolve(SampleProtocol.self)
+/// ```
+public final class DIContainer {
+ private static let container = DIContainer()
+
+ private var registrations: [ObjectIdentifier: () -> Any] = [:]
+
+ private let resolveQueue = DispatchQueue(label: "resolveQueue")
+
+ private init() {}
+
+ /// 의존성을 등록합니다.
+ /// - Parameters:
+ /// - type: 등록할 프로토콜 또는 클래스 타입
+ /// - implementation: 해당 타입에 대응되는 구현체를 생성하는 클로저
+ public static func register(
+ _ type: T.Type,
+ _ implementation: @escaping () -> T
+ ) {
+ container.register(type, implementation)
+ }
+
+ /// 의존성을 꺼내옵니다.
+ /// - Parameter type: 요청할 타입
+ /// - Returns: 등록된 타입의 인스턴스
+ public static func resolve(_ type: T.Type) -> T {
+ return container.resolve(type)
+ }
+
+ private func register(
+ _ type: T.Type,
+ _ implementation: @escaping () -> T
+ ) {
+ let key = ObjectIdentifier(type)
+ registrations[key] = { implementation() }
+ }
+
+ private func resolve(_ type: T.Type) -> T {
+ let key = ObjectIdentifier(type)
+
+ guard let registration = registrations[key],
+ let instance = registration() as? T
+ else { fatalError("\(type) does not registered") }
+
+ return instance
+ }
+}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/DIContainer/DependencyWrapper.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/DIContainer/DependencyWrapper.swift
new file mode 100644
index 00000000..7096c486
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/DIContainer/DependencyWrapper.swift
@@ -0,0 +1,28 @@
+import Foundation
+
+/// 의존성 자동 주입을 위한 프로퍼티 래퍼
+///
+/// 사용하는 곳에서 `@Dependency`만 붙이면 등록된 구현체가 자동으로 주입됩니다.
+///
+/// Swift의 프로퍼티 래퍼 특성상 `var`로 선언해야 하지만, 실제 인스턴스는 외부에서 변경할 수 없도록 `private(set)`으로 보호되어 불변성을 유지합니다.
+///
+/// 사용 예시:
+/// ```swift
+/// class MyViewModel {
+/// @Dependency var sample: SampleProtocol
+///
+/// func run() {
+/// sample.doSomething()
+/// }
+/// }
+/// ```
+@propertyWrapper
+public final class Dependency {
+ /// DIContainer에서 꺼내온 실제 인스턴스
+ public private(set) var wrappedValue: T
+
+ /// DIContainer로부터 자동으로 인스턴스를 꺼내와 초기화합니다.
+ public init() {
+ self.wrappedValue = DIContainer.resolve(T.self)
+ }
+}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/Collection+.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/Collection+.swift
new file mode 100644
index 00000000..f2c58874
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/Collection+.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+public extension Collection {
+ subscript(safe index: Index) -> Element? {
+ return indices.contains(index) ? self[index] : nil
+ }
+}
diff --git a/Poppool/Poppool/Presentation/Extension/Date?+.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/Date?+.swift
similarity index 89%
rename from Poppool/Poppool/Presentation/Extension/Date?+.swift
rename to Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/Date?+.swift
index f8117e7e..c0a294a2 100644
--- a/Poppool/Poppool/Presentation/Extension/Date?+.swift
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/Date?+.swift
@@ -1,13 +1,6 @@
-//
-// Date+.swift
-// Poppool
-//
-// Created by SeoJunYoung on 11/30/24.
-//
-
import Foundation
-extension Optional where Wrapped == Date {
+public extension Optional where Wrapped == Date {
/// `yyyy. MM. dd` 형식으로 날짜를 문자열로 변환합니다.
/// - Parameter defaultString: 날짜가 nil일 경우 반환할 기본 문자열 (기본값: 빈 문자열 "")
/// - Returns: 형식화된 날짜 문자열 또는 기본 문자열
@@ -19,7 +12,7 @@ extension Optional where Wrapped == Date {
formatter.dateFormat = "yyyy. MM. dd"
return formatter.string(from: date)
}
-
+
func toPPDateMonthString(defaultString: String = "") -> String {
guard let date = self else {
return defaultString
@@ -28,7 +21,7 @@ extension Optional where Wrapped == Date {
formatter.dateFormat = "MM월 dd일"
return formatter.string(from: date)
}
-
+
func toPPTimeeString(defaultString: String = "") -> String {
guard let date = self else {
return defaultString
diff --git a/Poppool/Poppool/Presentation/Extension/Reactive+.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/Reactive+.swift
similarity index 85%
rename from Poppool/Poppool/Presentation/Extension/Reactive+.swift
rename to Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/Reactive+.swift
index b3c44553..68a22b6c 100644
--- a/Poppool/Poppool/Presentation/Extension/Reactive+.swift
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/Reactive+.swift
@@ -1,37 +1,30 @@
-//
-// Reactive+.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 8/26/24.
-//
-
import UIKit
import RxCocoa
import RxSwift
-extension Reactive where Base: UIViewController {
-
+public extension Reactive where Base: UIViewController {
+
var viewDidLoad: ControlEvent {
let source = self.methodInvoked(#selector(Base.viewDidLoad)).map( { _ in })
return ControlEvent(events: source)
}
-
+
var viewWillAppear: ControlEvent {
let source = self.methodInvoked(#selector(Base.viewWillAppear)).map( { _ in })
return ControlEvent(events: source)
}
-
+
var viewDidAppear: ControlEvent {
let source = self.methodInvoked(#selector(Base.viewDidAppear)).map( { _ in })
return ControlEvent(events: source)
}
-
+
var viewWillDisappear: ControlEvent {
let source = self.methodInvoked(#selector(Base.viewWillDisappear)).map( { _ in })
return ControlEvent(events: source)
}
-
+
var viewDidDisappear: ControlEvent {
let source = self.methodInvoked(#selector(Base.viewDidDisappear)).map( { _ in })
return ControlEvent(events: source)
diff --git a/Poppool/Poppool/Presentation/Extension/String?+.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/String?+.swift
similarity index 89%
rename from Poppool/Poppool/Presentation/Extension/String?+.swift
rename to Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/String?+.swift
index c1c5a916..c6bb485a 100644
--- a/Poppool/Poppool/Presentation/Extension/String?+.swift
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/String?+.swift
@@ -1,22 +1,13 @@
-//
-// String?+.swift
-// Poppool
-//
-// Created by SeoJunYoung on 11/30/24.
-//
-
import UIKit
-import Kingfisher
-
-extension Optional where Wrapped == String {
+public extension Optional where Wrapped == String {
/// ISO 8601 형식의 문자열을 `Date`로 변환하는 메서드
func toDate() -> Date? {
guard let self = self else { return nil } // 옵셔널 해제
-
+
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
-
+
if self.contains(".") {
// 밀리초 포함 형식
dateFormatter.dateFormat = "yyyy.MM.dd'T'HH:mm:ss.SSS"
@@ -24,10 +15,10 @@ extension Optional where Wrapped == String {
// 밀리초 없는 형식
dateFormatter.dateFormat = "yyyy.MM.dd'T'HH:mm:ss"
}
-
+
return dateFormatter.date(from: self)
}
-
+
func isBrightImagePath(completion: @escaping (Bool) -> Void) {
if let self = self {
let imageView = UIImageView()
@@ -50,7 +41,7 @@ extension String {
}
extension String {
/// ISO 8601 형식의 문자열을 `Date`로 변환하는 메서드
- func toDate() -> Date? {
+ public func toDate() -> Date? {
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
diff --git a/Poppool/Poppool/Presentation/Extension/UIImage+.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/UIImage+.swift
similarity index 94%
rename from Poppool/Poppool/Presentation/Extension/UIImage+.swift
rename to Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/UIImage+.swift
index be80b2a2..cb0bce59 100644
--- a/Poppool/Poppool/Presentation/Extension/UIImage+.swift
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/UIImage+.swift
@@ -8,7 +8,7 @@
import UIKit
// UIImage를 색상으로 생성하는 Helper Extension
-extension UIImage {
+public extension UIImage {
convenience init(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
UIGraphicsBeginImageContext(size)
UIGraphicsGetCurrentContext()?.setFillColor(color.cgColor)
@@ -19,10 +19,10 @@ extension UIImage {
}
}
-extension UIImage {
+public extension UIImage {
func isBright(threshold: CGFloat = 0.5) -> Bool? {
guard let cgImage = self.cgImage else { return nil }
-
+
let width = 1
let height = 1
let bitsPerComponent = 8
@@ -30,9 +30,9 @@ extension UIImage {
let bytesPerRow = bytesPerPixel * width
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValue
-
+
var pixelData = [UInt8](repeating: 0, count: width * height * bytesPerPixel)
-
+
guard let context = CGContext(
data: &pixelData,
width: width,
@@ -42,16 +42,16 @@ extension UIImage {
space: colorSpace,
bitmapInfo: bitmapInfo
) else { return nil }
-
+
context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))
-
+
let red = CGFloat(pixelData[0]) / 255.0
let green = CGFloat(pixelData[1]) / 255.0
let blue = CGFloat(pixelData[2]) / 255.0
-
+
// Brightness calculation formula
let brightness = (red * 0.299 + green * 0.587 + blue * 0.114)
-
+
return brightness > threshold
}
}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/UIImageView+.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/UIImageView+.swift
new file mode 100644
index 00000000..651ebfde
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Extension/UIImageView+.swift
@@ -0,0 +1,72 @@
+import ObjectiveC
+import UIKit
+
+private var currentURLKey: UInt8 = 0
+private var placeholderImageKey: UInt8 = 0
+
+public extension UIImageView {
+
+ private var currentImageURL: String? {
+ get { objc_getAssociatedObject(self, ¤tURLKey) as? String }
+ set { objc_setAssociatedObject(self, ¤tURLKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
+ }
+
+ private var placeholderImage: UIImage? {
+ get { objc_getAssociatedObject(self, &placeholderImageKey) as? UIImage }
+ set { objc_setAssociatedObject(self, &placeholderImageKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
+ }
+
+ func setPPImage(path: String?) {
+ loadImageFromImageLoader(path: path, completion: nil)
+ }
+
+ func setPPImage(path: String?, completion: @escaping () -> Void) {
+ loadImageFromImageLoader(path: path, completion: completion)
+ }
+
+ func loadImageFromImageLoader(path: String?, completion: (() -> Void)? = nil) {
+ // 기본 이미지 저장
+ if placeholderImage == nil {
+ placeholderImage = UIImage(named: "image_default")
+ completion?()
+ }
+
+ guard let path = path, !path.isEmpty else {
+ image = placeholderImage
+ currentImageURL = nil
+ completion?()
+ return
+ }
+
+ let imageURLString = Secrets.popPoolS3BaseURL + path
+ guard let encodedURL = imageURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
+ image = placeholderImage
+ currentImageURL = nil
+ completion?()
+ return
+ }
+
+ // 이미 같은 URL을 로딩했고 이미지가 있으면 재로딩 방지
+ if currentImageURL == encodedURL && self.image != nil && self.image != placeholderImage {
+ completion?()
+ return
+ }
+
+ // 현재 이미지 URL을 업데이트
+ currentImageURL = encodedURL
+
+ ImageLoader.shared.loadImage(with: encodedURL, defaultImage: placeholderImage, imageQuality: .origin) { [weak self] image in
+ guard let self else { return }
+ defer { completion?() }
+ // 현재 요청 ID와 캡처된 ID가 일치하는지 확인 (다른 이미지로 변경되었으면 무시)
+ if self.currentImageURL == encodedURL {
+ if let image = image {
+ self.image = image
+ } else if self.image == nil {
+ // 이미지 로드 실패 시 기본 이미지 표시
+ self.image = self.placeholderImage
+ }
+ }
+ }
+ }
+}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/ImageLoader/DiskStorage.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/ImageLoader/DiskStorage.swift
new file mode 100644
index 00000000..127639b3
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/ImageLoader/DiskStorage.swift
@@ -0,0 +1,145 @@
+import CryptoKit
+import UIKit
+
+/// 디스크에 이미지를 캐싱하는 클래스
+final class DiskStorage {
+
+ /// 싱글톤 인스턴스
+ static let shared = DiskStorage()
+
+ /// 파일 관리 객체
+ private let fileManager = FileManager.default
+
+ /// 이미지 캐시 디렉터리 경로
+ private let cacheDirectory: URL
+
+ /// 초기화 메서드 (캐시 디렉터리 생성 및 자동 삭제 스케줄 시작)
+ private init() {
+ let urls = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)
+ cacheDirectory = urls[0].appendingPathComponent("ImageCache")
+
+ // 디렉터리가 존재하지 않으면 생성
+ if !fileManager.fileExists(atPath: cacheDirectory.path) {
+ try? fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true, attributes: nil)
+ }
+ startCacheCleanup()
+ }
+
+ /// URL을 안전한 파일명으로 변환하는 메서드
+ /// - Parameter url: 원본 URL 문자열
+ /// - Returns: 파일명으로 변환된 문자열
+ private func cacheFileName(for url: String) -> String {
+ let data = Data(url.utf8)
+ let hashed = SHA256.hash(data: data)
+ return hashed.compactMap { String(format: "%02x", $0) }.joined()
+ }
+
+ /// 이미지를 디스크에 저장하는 메서드
+ /// - Parameters:
+ /// - image: 저장할 UIImage 객체
+ /// - url: 해당 이미지의 원본 URL 문자열
+ func store(image: UIImage, url: String) {
+ let fileName = cacheFileName(for: url)
+ let fileURL = cacheDirectory.appendingPathComponent(fileName)
+ let metadataURL = cacheDirectory.appendingPathComponent("\(fileName).metadata")
+
+ // 이미지 데이터를 JPEG 형식으로 변환하여 저장
+ if let data = image.jpegData(compressionQuality: 0.8) {
+ do {
+ try data.write(to: fileURL)
+ } catch {
+ print("Error writing image data to disk: \(error)")
+ }
+ }
+
+ // 만료 시간 기록
+ let expirationDate = Date().addingTimeInterval(ImageLoader.shared.configure.diskCacheExpiration)
+ let metadata = ["expiration": expirationDate.timeIntervalSince1970]
+
+ // 만료 정보를 JSON 형태로 저장
+ if let metadataData = try? JSONSerialization.data(withJSONObject: metadata) {
+ do {
+ try metadataData.write(to: metadataURL)
+ } catch {
+ print("Error writing metadata: \(error)")
+ }
+ }
+ }
+
+ /// 디스크에서 이미지를 불러오는 메서드 (만료된 경우 자동 삭제)
+ /// - Parameter url: 이미지의 원본 URL 문자열
+ /// - Returns: UIImage 객체 (없거나 만료된 경우 nil)
+ func fetchImage(url: String) -> UIImage? {
+ let fileName = cacheFileName(for: url)
+ let fileURL = cacheDirectory.appendingPathComponent(fileName)
+ let metadataURL = cacheDirectory.appendingPathComponent("\(fileName).metadata")
+
+ // 만료 시간 확인
+ if let metadataData = try? Data(contentsOf: metadataURL),
+ let metadata = try? JSONSerialization.jsonObject(with: metadataData) as? [String: TimeInterval],
+ let expirationTime = metadata["expiration"] {
+
+ // 만료 시간이 현재 시각을 초과하면 삭제 후 nil 반환
+ if Date().timeIntervalSince1970 > expirationTime {
+ removeImage(url: url)
+ return nil
+ }
+ }
+
+ // 이미지 파일이 존재하면 로드하여 반환
+ if let data = try? Data(contentsOf: fileURL) {
+ return UIImage(data: data)
+ }
+
+ return nil
+ }
+
+ /// 특정 URL에 해당하는 이미지를 디스크에서 삭제하는 메서드
+ /// - Parameter url: 삭제할 이미지의 원본 URL 문자열
+ func removeImage(url: String) {
+ let fileName = cacheFileName(for: url)
+ let fileURL = cacheDirectory.appendingPathComponent(fileName)
+ let metadataURL = cacheDirectory.appendingPathComponent("\(fileName).metadata")
+
+ do {
+ try fileManager.removeItem(at: fileURL) // 이미지 파일 삭제
+ try fileManager.removeItem(at: metadataURL) // 메타데이터 파일 삭제
+ } catch {
+ print("Failed to remove image: \(error)")
+ }
+ }
+
+ /// 모든 캐시 데이터를 삭제하는 메서드
+ func clearCache() {
+ do {
+ try fileManager.removeItem(at: cacheDirectory)
+ try fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true, attributes: nil)
+ } catch {
+ print("Failed to clear cache: \(error)")
+ }
+ }
+
+ /// 주기적으로 만료된 캐시를 삭제하는 메서드
+ private func startCacheCleanup() {
+ let files = (try? self.fileManager.contentsOfDirectory(at: self.cacheDirectory, includingPropertiesForKeys: nil)) ?? []
+
+ for file in files {
+ if file.pathExtension == "metadata",
+ let metadataData = try? Data(contentsOf: file),
+ let metadata = try? JSONSerialization.jsonObject(with: metadataData) as? [String: TimeInterval],
+ let expirationTime = metadata["expiration"] {
+
+ // 만료 시간이 지나면 이미지와 메타데이터 삭제
+ if Date().timeIntervalSince1970 > expirationTime {
+ let imageFileURL = file.deletingPathExtension() // 메타데이터와 동일한 이름의 이미지 파일
+ do {
+ try self.fileManager.removeItem(at: imageFileURL)
+ try self.fileManager.removeItem(at: file) // 메타데이터 삭제
+ } catch {
+ print("Failed to delete expired cache: \(error)")
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/ImageLoader/ImageLoader.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/ImageLoader/ImageLoader.swift
new file mode 100644
index 00000000..203d009b
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/ImageLoader/ImageLoader.swift
@@ -0,0 +1,151 @@
+import UIKit
+
+enum ImageLoaderError: Error {
+ case invalidURL
+ case networkError(description: String?)
+ case convertError(description: String?)
+}
+
+enum ImageSizeOption {
+ case low
+ case middle
+ case high
+ case origin
+
+ var size: CGSize {
+ switch self {
+ case .low:
+ return CGSize(width: 100, height: 100)
+ case .middle:
+ return CGSize(width: 200, height: 200)
+ case .high:
+ return CGSize(width: 400, height: 400)
+ case .origin:
+ return CGSize(width: 1000, height: 1000)
+ }
+ }
+}
+
+/// 이미지 로더 설정 클래스
+/// - `memoryCacheExpiration`: 메모리 캐시 만료 시간 (기본값 300초)
+class ImageLoaderConfigure {
+ var memoryCacheExpiration: TimeInterval = 300
+ var diskCacheExpiration: TimeInterval = 86_400
+}
+
+/// URL을 통해 이미지를 비동기적으로 로드하는 클래스
+final class ImageLoader {
+
+ static let shared = ImageLoader()
+
+ /// 이미지 로더 설정 객체
+ let configure = ImageLoaderConfigure()
+
+ private init() {}
+
+ /// URL을 통해 이미지를 로드하고, 실패 시 기본 이미지를 반환하는 메서드
+ /// - Parameters:
+ /// - stringURL: 이미지 URL 문자열
+ /// - defaultImage: 로드 실패 시 반환할 기본 이미지
+ /// - completion: 로드 완료 후 호출되는 클로저
+ func loadImage(
+ with stringURL: String?,
+ defaultImage: UIImage?,
+ imageQuality: ImageSizeOption = .origin,
+ completion: @escaping (UIImage?) -> Void
+ ) {
+ loadImage(with: stringURL) { [weak self] result in
+ switch result {
+ case .success(let image):
+ completion(self?.resizeImage(image, defaultImage: defaultImage, with: imageQuality))
+ case .failure:
+ completion(defaultImage)
+ }
+ }
+ }
+}
+
+private extension ImageLoader {
+
+ /// URL을 통해 이미지를 로드하는 내부 메서드
+ /// - Parameters:
+ /// - stringURL: 이미지 URL 문자열
+ /// - completion: 로드 완료 후 호출되는 클로저
+ func loadImage(with stringURL: String?, completion: @escaping (Result) -> Void) {
+ guard let stringURL = stringURL, let url = URL(string: stringURL) else {
+ completion(.failure(ImageLoaderError.invalidURL))
+ return
+ }
+
+ // 메모리 캐시에서 이미지 조회
+ if let cachedImage = MemoryStorage.shared.fetchImage(url: stringURL) {
+ completion(.success(cachedImage))
+ return
+ }
+
+ // 디스크 캐시 확인
+ if let diskImage = DiskStorage.shared.fetchImage(url: stringURL) {
+ // 메모리 캐시에 저장 후 반환
+ MemoryStorage.shared.store(image: diskImage, url: stringURL)
+ completion(.success(diskImage))
+ return
+ }
+
+ // 네트워크에서 데이터 요청
+ fetchDataFrom(url: url) { result in
+ switch result {
+ case .success(let data):
+ if let data = data, let image = UIImage(data: data) {
+ MemoryStorage.shared.store(image: image, url: stringURL)
+ DiskStorage.shared.store(image: image, url: stringURL)
+ DispatchQueue.main.async { completion(.success(image)) }
+ } else {
+ DispatchQueue.main.async {
+ completion(.failure(ImageLoaderError.convertError(description: "Failed to convert data to UIImage")))
+ }
+ }
+ case .failure(let error):
+ DispatchQueue.main.async { completion(.failure(error)) }
+ }
+ }
+ }
+
+ /// URL을 통해 데이터를 요청하는 메서드
+ /// - Parameters:
+ /// - url: 요청할 URL 객체
+ /// - completion: 요청 완료 후 호출되는 클로저
+ func fetchDataFrom(url: URL, completion: @escaping (Result) -> Void) {
+ let task = URLSession.shared.dataTask(with: url) { data, _, error in
+ if let error = error {
+ completion(.failure(ImageLoaderError.networkError(description: "Network Error: \(error.localizedDescription)")))
+ return
+ }
+ completion(.success(data))
+ }
+ task.resume()
+ }
+
+ func resizeImage(_ image: UIImage?, defaultImage: UIImage?, with sizeOption: ImageSizeOption) -> UIImage? {
+ guard let image else { return defaultImage }
+
+ if sizeOption == .origin { return image }
+
+ let targetSize = sizeOption.size
+
+ // 비율 유지 리사이징
+ let aspectRatio = image.size.width / image.size.height
+ var newSize = targetSize
+
+ if aspectRatio > 1 { // 가로 이미지
+ newSize.height = targetSize.width / aspectRatio
+ } else { // 세로 이미지
+ newSize.width = targetSize.height * aspectRatio
+ }
+
+ let renderer = UIGraphicsImageRenderer(size: newSize)
+
+ return renderer.image { _ in
+ image.draw(in: CGRect(origin: .zero, size: newSize))
+ }
+ }
+}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/ImageLoader/MemoryStorage.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/ImageLoader/MemoryStorage.swift
new file mode 100644
index 00000000..2d4b30dc
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/ImageLoader/MemoryStorage.swift
@@ -0,0 +1,95 @@
+import UIKit
+
+/// 캐시할 이미지와 만료 시간을 저장하는 클래스
+class StorageData: NSObject {
+ let image: UIImage? /// 캐시된 이미지
+ let expirationDate: Date /// 캐시 만료 시간
+
+ /// 초기화 메서드
+ /// - Parameters:
+ /// - image: 저장할 이미지
+ /// - expiration: 만료 시간 (초 단위)
+ init(image: UIImage?, expiration: TimeInterval) {
+ self.image = image
+ self.expirationDate = Date().addingTimeInterval(expiration)
+ }
+
+ /// 캐시가 만료되었는지 확인하는 메서드
+ /// - Returns: 만료 여부 (true: 만료됨, false: 유효함)
+ func isExpired() -> Bool {
+ return Date() > expirationDate
+ }
+}
+
+/// 메모리 캐시를 관리하는 클래스
+final class MemoryStorage {
+
+ /// 싱글톤 인스턴스
+ static let shared = MemoryStorage()
+
+ /// 이미지 캐시 저장소
+ private let cache = NSCache()
+
+ /// 현재 캐시에 저장된 키 목록
+ private var cachedKeys: Set = []
+
+ /// 초기화 (자동 캐시 정리 시작)
+ private init() {
+ startCacheCleanup()
+ }
+
+ /// 이미지를 캐시에 저장하는 메서드
+ /// - Parameters:
+ /// - image: 저장할 이미지
+ /// - url: 이미지 URL 문자열
+ func store(image: UIImage?, url: String) {
+ let cachedData = StorageData(image: image, expiration: ImageLoader.shared.configure.memoryCacheExpiration)
+ cache.setObject(cachedData, forKey: url as NSString)
+ cachedKeys.insert(url)
+ }
+
+ /// 캐시에서 이미지를 가져오는 메서드
+ /// - Parameter url: 이미지 URL 문자열
+ /// - Returns: 캐시된 UIImage (없으면 nil)
+ func fetchImage(url: String) -> UIImage? {
+ if let cachedData = cache.object(forKey: url as NSString), !cachedData.isExpired() {
+ return cachedData.image
+ } else {
+ removeData(url: url)
+ return nil
+ }
+ }
+
+ /// 특정 URL의 캐시 데이터를 제거하는 메서드
+ /// - Parameter url: 제거할 이미지의 URL 문자열
+ func removeData(url: String) {
+ cache.removeObject(forKey: url as NSString)
+ cachedKeys.remove(url)
+ }
+
+ /// 모든 캐시 데이터를 삭제하는 메서드
+ func clearCache() {
+ cache.removeAllObjects()
+ cachedKeys.removeAll()
+ }
+
+ /// 주기적으로 만료된 캐시를 정리하는 메서드
+ private func startCacheCleanup() {
+ DispatchQueue.global(qos: .background).async { [weak self] in
+ guard let self = self else { return }
+
+ let cleanTimer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { _ in
+ for key in self.cachedKeys {
+ let nsKey = key as NSString
+ if let cachedData = self.cache.object(forKey: nsKey), cachedData.isExpired() {
+ self.cache.removeObject(forKey: nsKey)
+ self.cachedKeys.remove(key)
+ }
+ }
+ }
+ // 백그라운드에서 실행되는 타이머를 메인 루프에 추가
+ RunLoop.current.add(cleanTimer, forMode: .common)
+ RunLoop.current.run() // 백그라운드 스레드에서 타이머를 계속 실행하기 위해 RunLoop를 유지
+ }
+ }
+}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/Logger/Logger.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Logger/Logger.swift
new file mode 100644
index 00000000..c636a5e6
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Logger/Logger.swift
@@ -0,0 +1,107 @@
+import Foundation
+import OSLog
+
+public struct Logger {
+ private static let subsystem = Bundle.main.bundleIdentifier ?? "com.poppoolIOS.poppool"
+
+ public enum Level: Hashable {
+ case info
+ case debug
+ case network
+ case error
+ case event
+ case custom(name: String)
+
+ var categoryName: String {
+ switch self {
+ case .info:
+ return "Info"
+ case .debug:
+ return "Debug"
+ case .network:
+ return "Network"
+ case .error:
+ return "Error"
+ case .event:
+ return "Event"
+ case .custom(let name): return name
+ }
+ }
+
+ var categoryIcon: String {
+ switch self {
+ case .info:
+ return "✅"
+ case .debug:
+ return "⚠️"
+ case .network:
+ return "🌎"
+ case .error:
+ return "⛔️"
+ case .event:
+ return "🎉"
+ case .custom:
+ return "🍎"
+ }
+ }
+ }
+
+ public enum LogLevel {
+ case debug
+ case info
+ case error
+ case fault
+
+ var osLogType: OSLogType {
+ switch self {
+ case .debug:
+ return .debug
+ case .info:
+ return .info
+ case .error: return .error
+ case .fault: return .fault
+ }
+ }
+ }
+
+ private static var isShowFileName: Bool = false
+ private static var isShowLine: Bool = true
+ private static var isShowLog: Bool = true
+
+ private static var loggers: [Level: os.Logger] = [:]
+ private static func getLogger(for category: Level) -> os.Logger {
+ let categoryName = category.categoryName
+
+ if let cachedLogger = loggers[category] {
+ return cachedLogger
+ }
+
+ let logger = os.Logger(subsystem: subsystem, category: categoryName)
+ loggers[category] = logger
+ return logger
+ }
+
+ public static func log(
+ _ message: Any,
+ category: Level,
+ level: LogLevel = .info,
+ file: String = #file,
+ line: Int = #line
+ ) {
+ guard isShowLog else { return }
+
+ let logger = getLogger(for: category)
+ var fullMessage = "\(category.categoryIcon) \(message)"
+
+ if isShowFileName {
+ let fileNameOnly = (file as NSString).lastPathComponent
+ fullMessage += " | 📁 \(fileNameOnly)"
+ }
+
+ if isShowLine {
+ fullMessage += " | 📍 \(line)"
+ }
+
+ logger.log(level: level.osLogType, "\(fullMessage, privacy: .public)")
+ }
+}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/Secrets.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Secrets.swift
new file mode 100644
index 00000000..80a48514
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Secrets.swift
@@ -0,0 +1,30 @@
+import Foundation
+
+public enum Secrets {
+ public static var kakaoAuthAppKey: String {
+ return getValue(forKey: "KAKAO_AUTH_APP_KEY")
+ }
+
+ public static var popPoolBaseURL: String {
+ return getValue(forKey: "POPPOOL_BASE_URL")
+ }
+
+ public static var popPoolS3BaseURL: String {
+ return getValue(forKey: "POPPOOL_S3_BASE_URL")
+ }
+
+ public static var popPoolAPIKey: String {
+ return getValue(forKey: "POPPOOL_API_KEY")
+ }
+
+ public static var naverMapClientID: String {
+ return getValue(forKey: "NAVER_MAP_CLIENT_ID")
+ }
+
+ private static func getValue(forKey key: String) -> String {
+ guard let value = Bundle.main.object(forInfoDictionaryKey: key) as? String else {
+ fatalError("Missing key: \(key) in Info.plist")
+ }
+ return value
+ }
+}
diff --git a/Poppool/Poppool/Infrastructure/KeyChainService.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Service/KeyChainService.swift
similarity index 81%
rename from Poppool/Poppool/Infrastructure/KeyChainService.swift
rename to Poppool/CoreLayer/Infrastructure/Infrastructure/Service/KeyChainService.swift
index 7717acea..822263e7 100644
--- a/Poppool/Poppool/Infrastructure/KeyChainService.swift
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Service/KeyChainService.swift
@@ -1,16 +1,9 @@
-//
-// KeyChainService.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 9/2/24.
-//
-
import Foundation
import Security
import RxSwift
-final class KeyChainService {
+public final class KeyChainService {
// KeyChain에서 발생할 수 있는 오류를 정의
enum KeyChainError: Error {
@@ -18,14 +11,16 @@ final class KeyChainService {
case unhandledError(status: OSStatus) // 예상치 못한 OSStatus 오류가 발생했을 때 발생
case dataConversionError(message: String) // 데이터 변환 중 오류가 발생했을 때 발생
}
-
+
// KeyChain 서비스 이름
private let service = "keyChain"
-
+
+ public init() { }
+
/// KeyChain에서 특정 타입의 토큰을 가져오는 메서드
/// - Parameter type: 가져오려는 토큰의 타입 (`accessToken` 또는 `refreshToken`)
/// - Returns: 가져온 토큰을 담은 `Single`
- func fetchToken(type: TokenType) -> Result {
+ public func fetchToken(type: TokenType) -> Result {
// 1. query 작성
let keyChainQuery: NSDictionary = [
kSecClass: kSecClassGenericPassword,
@@ -34,11 +29,11 @@ final class KeyChainService {
kSecReturnData: true, // CFData 타입으로 불러오라는 의미
kSecMatchLimit: kSecMatchLimitOne // 중복되는 경우 하나의 값만 가져오라는 의미
]
-
+
// 2. Read
var dataTypeRef: AnyObject?
let status = SecItemCopyMatching(keyChainQuery, &dataTypeRef)
-
+
// 3. Result
if status == errSecItemNotFound {
return .failure(KeyChainError.noValueFound(message: "No value found for the specified key."))
@@ -48,10 +43,8 @@ final class KeyChainService {
if let data = dataTypeRef as? Data {
if let value = String(data: data, encoding: .utf8) {
Logger.log(
- message: "Successfully fetched \(type.rawValue) from KeyChain: \(value)",
- category: .info,
- fileName: #file,
- line: #line
+ "Successfully fetched \(type.rawValue) from KeyChain",
+ category: .info
)
return .success(value)
} else {
@@ -67,12 +60,12 @@ final class KeyChainService {
/// - Parameter type: 저장하려는 토큰의 타입 (`accessToken` 또는 `refreshToken`)
/// - Parameter value: 저장할 토큰의 값
/// - Returns: 완료 시 `Completable`
- func saveToken(type: TokenType, value: String) -> Result {
+ public func saveToken(type: TokenType, value: String) -> Result {
// allowLossyConversion은 인코딩 과정에서 손실이 되는 것을 허용할 것인지 설정
guard let convertValue = value.data(using: .utf8, allowLossyConversion: false) else {
return .failure(KeyChainError.dataConversionError(message: "Failed to convert value to Data."))
}
-
+
// 1. query 작성
let keyChainQuery: NSDictionary = [
kSecClass: kSecClassGenericPassword,
@@ -80,46 +73,43 @@ final class KeyChainService {
kSecAttrAccount: type.rawValue,
kSecValueData: convertValue
]
-
+
// 2. Delete
// KeyChain은 Key값에 중복이 생기면 저장할 수 없기 때문에 먼저 Delete
SecItemDelete(keyChainQuery)
-
+
// 3. Create
let status = SecItemAdd(keyChainQuery, nil)
if status == errSecSuccess {
Logger.log(
- message: "Successfully saved \(type.rawValue) to KeyChain: \(value)",
- category: .info,
- fileName: #file,
- line: #line
+ "Successfully fetched \(type.rawValue) from KeyChain: \(value)",
+ category: .info
+
)
return .success(())
} else {
return .failure(KeyChainError.unhandledError(status: status))
}
}
-
+
/// KeyChain에서 특정 타입의 토큰을 삭제하는 메서드
/// - Parameter type: 삭제하려는 토큰의 타입 (`accessToken` 또는 `refreshToken`)
/// - Returns: 완료 시 `Completable`
- func deleteToken(type: TokenType) -> Result {
+ public func deleteToken(type: TokenType) -> Result {
// 1. query 작성
let keyChainQuery: NSDictionary = [
kSecClass: kSecClassGenericPassword,
kSecAttrService: self.service,
kSecAttrAccount: type.rawValue
]
-
+
// 2. Delete
let status = SecItemDelete(keyChainQuery)
-
+
if status == errSecSuccess {
Logger.log(
- message: "Successfully deleted \(type.rawValue) from KeyChain",
- category: .info,
- fileName: #file,
- line: #line
+ "Successfully deleted \(type.rawValue) from KeyChain",
+ category: .info
)
return .success(())
} else {
@@ -128,7 +118,7 @@ final class KeyChainService {
}
}
-enum TokenType: String {
+public enum TokenType: String {
case accessToken // 액세스 토큰
case refreshToken // 리프레시 토큰
}
diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/Service/UserDefaultService.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Service/UserDefaultService.swift
new file mode 100644
index 00000000..52211c19
--- /dev/null
+++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Service/UserDefaultService.swift
@@ -0,0 +1,128 @@
+//
+// UserDefaultService.swift
+// MomsVillage
+//
+// Created by SeoJunYoung on 9/2/24.
+//
+
+import Foundation
+
+import RxSwift
+
+public final class UserDefaultService {
+
+ public init() { }
+
+ /// Userdefault 데이터 저장 메서드
+ /// - Parameters:
+ /// - key: 저장하는 데이터의 키 값 i.e) 유저 id 등
+ /// - value: 저장하는 데이터 값 i.e) access token 등
+ /// - to: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 별도 안내 없음
+ public func save(key: String, value: String) {
+ UserDefaults.standard.set(value, forKey: key)
+ }
+
+ /// Userdefault 데이터 저장 메서드
+ /// - Parameters:
+ /// - key: 저장하는 데이터의 키 값 i.e) 유저 id 등
+ /// - value: 저장하는 데이터 값 i.e) access token 등
+ /// - to: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 별도 안내 없음
+ public func save(key: String, value: [String]) {
+ UserDefaults.standard.set(value, forKey: key)
+ }
+
+ /// Userdefault 데이터 발견 메서드
+ /// - Parameters:
+ /// - key: 찾는 데이터의 키 값 i.e) 유저 id 등
+ /// - from: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 찾은 데이터 - String 타입
+ public func fetch(key: String) -> String? {
+ if let token = UserDefaults.standard.string(forKey: key) {
+ return token
+ }
+ return nil
+ }
+
+ /// Userdefault 데이터 발견 메서드
+ /// - Parameters:
+ /// - key: 찾는 데이터의 키 값 i.e) 유저 id 등
+ /// - from: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 찾은 데이터 - String 타입
+ public func fetchArray(key: String) -> [String]? {
+ if let token = UserDefaults.standard.array(forKey: key) as? [String] {
+ return token
+ }
+ return nil
+ }
+
+ /// Userdefault 데이터 삭제 메서드
+ /// - Parameters:
+ /// - key: 삭제하는 데이터의 키 값 i.e) 유저 id 등
+ /// - from: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 별도 안내 없음
+ public func delete(key: String) {
+ UserDefaults.standard.removeObject(forKey: key)
+ }
+}
+
+// MARK: - Key base
+extension UserDefaultService {
+ public enum Key: String {
+ case searchKeyword = "searchList"
+ }
+
+ /// Userdefault 데이터 저장 메서드
+ /// - Parameters:
+ /// - key: 저장하는 데이터의 키 값 i.e) 유저 id 등
+ /// - value: 저장하는 데이터 값 i.e) access token 등
+ /// - to: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 별도 안내 없음
+ public func save(keyType: Key, value: String) {
+ UserDefaults.standard.set(value, forKey: keyType.rawValue)
+ }
+
+ /// Userdefault 데이터 저장 메서드
+ /// - Parameters:
+ /// - key: 저장하는 데이터의 키 값 i.e) 유저 id 등
+ /// - value: 저장하는 데이터 값 i.e) access token 등
+ /// - to: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 별도 안내 없음
+ public func save(keyType: Key, value: [String]) {
+ UserDefaults.standard.set(value, forKey: keyType.rawValue)
+ }
+
+ /// Userdefault 데이터 발견 메서드
+ /// - Parameters:
+ /// - key: 찾는 데이터의 키 값 i.e) 유저 id 등
+ /// - from: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 찾은 데이터 - String 타입
+ public func fetch(keyType: Key) -> String? {
+ if let token = UserDefaults.standard.string(forKey: keyType.rawValue) {
+ return token
+ }
+ return nil
+ }
+
+ /// Userdefault 데이터 발견 메서드
+ /// - Parameters:
+ /// - key: 찾는 데이터의 키 값 i.e) 유저 id 등
+ /// - from: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 찾은 데이터 - String 타입
+ public func fetchArray(keyType: Key) -> [String]? {
+ if let token = UserDefaults.standard.array(forKey: keyType.rawValue) as? [String] {
+ return token
+ }
+ return nil
+ }
+
+ /// Userdefault 데이터 삭제 메서드
+ /// - Parameters:
+ /// - key: 삭제하는 데이터의 키 값 i.e) 유저 id 등
+ /// - from: 로컬 데이터베이스 타입 - DatabaseType
+ /// - Returns: 별도 안내 없음
+ public func delete(keyType: Key) {
+ UserDefaults.standard.removeObject(forKey: keyType.rawValue)
+ }
+}
diff --git a/Poppool/DataLayer/Data/Data.xcodeproj/project.pbxproj b/Poppool/DataLayer/Data/Data.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..66df90ab
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data.xcodeproj/project.pbxproj
@@ -0,0 +1,543 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 77;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0522C1DB2DB67C6100B141FF /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C1DA2DB67C6100B141FF /* RxSwift */; };
+ 05BBA73A2DB75A320047A061 /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 05BBA7392DB75A320047A061 /* KakaoSDKAuth */; };
+ 05BBA73C2DB75A320047A061 /* KakaoSDKUser in Frameworks */ = {isa = PBXBuildFile; productRef = 05BBA73B2DB75A320047A061 /* KakaoSDKUser */; };
+ 05BDD3DC2DB66EB500C1E192 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 05BDD3DB2DB66EB500C1E192 /* Alamofire */; };
+ 05C1D6172DB53A5600508FFD /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6152DB53A5600508FFD /* DomainInterface.framework */; };
+ 05C1D6192DB53A5600508FFD /* Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6162DB53A5600508FFD /* Infrastructure.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 058CC8DC2DB5376A0084221A /* Data.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Data.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 05C1D6152DB53A5600508FFD /* DomainInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DomainInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 05C1D6162DB53A5600508FFD /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
+ 05C1D67A2DB53AB000508FFD /* Exceptions for "Data" folder in "Data" target */ = {
+ isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
+ membershipExceptions = (
+ Network/API/AdminAPI/AdminAPIEndpoint.swift,
+ Network/API/AdminAPI/ResponseDTO/AdminResponseDTO.swift,
+ Network/API/AdminAPI/ResponseDTO/GetAdminPopUpStoreListResponseDTO.swift,
+ Network/API/AuthAPI/AuthAPIEndPoint.swift,
+ Network/API/AuthAPI/ResponseDTO/LoginResponseDTO.swift,
+ Network/API/AuthAPI/ResponseDTO/PostTokenReissueResponseDTO.swift,
+ Network/API/CategoryAPI/CategoryAPIEndpoint.swift,
+ Network/API/CategoryAPI/ResponseDTO/GetCategoryListResponseDTO.swift,
+ Network/API/CommentAPI/CommentAPIEndPoint.swift,
+ Network/API/CommentAPI/RequestDTO/DeleteCommentRequestDTO.swift,
+ Network/API/CommentAPI/RequestDTO/PostCommentRequestDTO.swift,
+ Network/API/CommentAPI/RequestDTO/PutCommentRequestDTO.swift,
+ Network/API/HomeAPI/HomeAPIEndpoint.swift,
+ Network/API/HomeAPI/RequestDTO/HomeSortedRequestDTO.swift,
+ Network/API/HomeAPI/ResponseDTO/BannerPopUpStoreDTO.swift,
+ Network/API/HomeAPI/ResponseDTO/GetHomeInfoResponseDTO.swift,
+ Network/API/HomeAPI/ResponseDTO/PopUpStoreResponseDTO.swift,
+ Network/API/MapAPI/FindDirectionEndPoint.swift,
+ Network/API/MapAPI/MapAPIEndpoint.swift,
+ Network/API/MapAPI/ResponseDTO/GetPopUpDirectionResponseDTO.swift,
+ Network/API/MapAPI/ResponseDTO/MapPopUpStoreDTO.swift,
+ Network/API/PopUpAPI/PopUpAPIEndPoint.swift,
+ Network/API/PopUpAPI/RequestDTO/GetPopUpCommentRequestDTO.swift,
+ Network/API/PopUpAPI/RequestDTO/GetPopUpDetailRequestDTO.swift,
+ Network/API/PopUpAPI/RequestDTO/GetSearchPopUpListRequestDTO.swift,
+ Network/API/PopUpAPI/ResponseDTO/GetClosePopUpListResponseDTO.swift,
+ Network/API/PopUpAPI/ResponseDTO/GetOpenPopUpListResponseDTO.swift,
+ Network/API/PopUpAPI/ResponseDTO/GetPopUpCommentResponseDTO.swift,
+ Network/API/PopUpAPI/ResponseDTO/GetPopUpDetailResponseDTO.swift,
+ Network/API/PopUpAPI/ResponseDTO/GetSearchPopUpListResponseDTO.swift,
+ Network/API/PreSignedAPI/PreSignedAPIEndPoint.swift,
+ Network/API/PreSignedAPI/RequestDTO/PresignedURLRequestDTO.swift,
+ Network/API/PreSignedAPI/ResponseDTO/PreSignedURLDTO.swift,
+ Network/API/PreSignedAPI/ResponseDTO/PreSignedURLResponseDTO.swift,
+ Network/API/SearchAPI/RequestDTO/GetSearchPopupStoreRequestDTO.swift,
+ Network/API/SearchAPI/ResponseDTO/GetSearchPopupStoreResponseDTO.swift,
+ Network/API/SearchAPI/SearchAPIEndPoint.swift,
+ Network/API/SignUpAPI/RequestDTO/CheckNickNameRequestDTO.swift,
+ Network/API/SignUpAPI/RequestDTO/SignUpRequestDTO.swift,
+ Network/API/SignUpAPI/SignUpAPIEndpoint.swift,
+ Network/API/UserAPI/RequesetDTO/CommentLikeRequestDTO.swift,
+ Network/API/UserAPI/RequesetDTO/GetMyCommentRequestDTO.swift,
+ Network/API/UserAPI/RequesetDTO/GetOtherUserCommentListRequestDTO.swift,
+ Network/API/UserAPI/RequesetDTO/PostBookmarkPopUpRequestDTO.swift,
+ Network/API/UserAPI/RequesetDTO/PostUserBlockRequestDTO.swift,
+ Network/API/UserAPI/RequesetDTO/PutUserCategoryRequestDTO.swift,
+ Network/API/UserAPI/RequesetDTO/PutUserProfileRequestDTO.swift,
+ Network/API/UserAPI/RequesetDTO/PutUserTailoredInfoRequestDTO.swift,
+ Network/API/UserAPI/RequesetDTO/UserSortedRequestDTO.swift,
+ Network/API/UserAPI/ResponseDTO/GetBlockUserListResponseDTO.swift,
+ Network/API/UserAPI/ResponseDTO/GetMyCommentedPopUpResponseDTO.swift,
+ Network/API/UserAPI/ResponseDTO/GetMyPageResponseDTO.swift,
+ Network/API/UserAPI/ResponseDTO/GetMyProfileResponseDTO.swift,
+ Network/API/UserAPI/ResponseDTO/GetNoticeDetailResponseDTO.swift,
+ Network/API/UserAPI/ResponseDTO/GetNoticeListResponseDTO.swift,
+ Network/API/UserAPI/ResponseDTO/GetOtherUserCommentedPopUpListResponseDTO.swift,
+ Network/API/UserAPI/ResponseDTO/GetRecentPopUpResponseDTO.swift,
+ Network/API/UserAPI/ResponseDTO/GetWithdrawlListResponseDTO.swift,
+ Network/API/UserAPI/UserAPIEndPoint.swift,
+ Network/Common/NetworkError.swift,
+ Network/Common/Requestable.swift,
+ Network/Common/Responsable.swift,
+ Network/EndPoint/Endpoint.swift,
+ Network/EndPoint/MultipartEndPoint.swift,
+ Network/EndPoint/RequestEndpoint.swift,
+ Network/Interceptor/TokenInterceptor.swift,
+ Network/Provider/Provider.swift,
+ Network/Provider/ProviderImpl.swift,
+ Network/Service/AppleLoginService.swift,
+ Network/Service/AuthServiceable.swift,
+ Network/Service/KakaoLoginService.swift,
+ Network/Service/PreSignedService.swift,
+ RepositoryImpl/AdminRepositoryImpl.swift,
+ RepositoryImpl/AppleLoginRepositoryImpl.swift,
+ RepositoryImpl/AuthAPIRepositoryImpl.swift,
+ RepositoryImpl/CategoryRepositoryImpl.swift,
+ RepositoryImpl/CommentAPIRepositoryImpl.swift,
+ RepositoryImpl/HomeAPIRepositoryImpl.swift,
+ RepositoryImpl/KakaoLoginRepositoryImpl.swift,
+ RepositoryImpl/MapDirectionRepositoryImpl.swift,
+ RepositoryImpl/MapRepositoryImpl.swift,
+ RepositoryImpl/PopUpAPIRepositoryImpl.swift,
+ RepositoryImpl/PreSignedRepositoryImpl.swift,
+ RepositoryImpl/Search/SearchAPIRepositoryImpl.swift,
+ RepositoryImpl/SignUpRepositoryImpl.swift,
+ RepositoryImpl/UserAPIRepositoryImpl.swift,
+ );
+ target = 058CC8DB2DB5376A0084221A /* Data */;
+ };
+/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
+
+/* Begin PBXFileSystemSynchronizedRootGroup section */
+ 05C1D05C2DB5387500508FFD /* Data */ = {
+ isa = PBXFileSystemSynchronizedRootGroup;
+ exceptions = (
+ 05C1D67A2DB53AB000508FFD /* Exceptions for "Data" folder in "Data" target */,
+ );
+ path = Data;
+ sourceTree = "";
+ };
+/* End PBXFileSystemSynchronizedRootGroup section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 058CC8D92DB5376A0084221A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 05BDD3DC2DB66EB500C1E192 /* Alamofire in Frameworks */,
+ 05C1D6172DB53A5600508FFD /* DomainInterface.framework in Frameworks */,
+ 05BBA73C2DB75A320047A061 /* KakaoSDKUser in Frameworks */,
+ 0522C1DB2DB67C6100B141FF /* RxSwift in Frameworks */,
+ 05C1D6192DB53A5600508FFD /* Infrastructure.framework in Frameworks */,
+ 05BBA73A2DB75A320047A061 /* KakaoSDKAuth in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 058CC8D22DB5376A0084221A = {
+ isa = PBXGroup;
+ children = (
+ 05C1D05C2DB5387500508FFD /* Data */,
+ 05C1D6142DB53A5600508FFD /* Frameworks */,
+ 058CC8DD2DB5376A0084221A /* Products */,
+ );
+ sourceTree = "";
+ };
+ 058CC8DD2DB5376A0084221A /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 058CC8DC2DB5376A0084221A /* Data.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 05C1D6142DB53A5600508FFD /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 05C1D6152DB53A5600508FFD /* DomainInterface.framework */,
+ 05C1D6162DB53A5600508FFD /* Infrastructure.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 058CC8D72DB5376A0084221A /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 058CC8DB2DB5376A0084221A /* Data */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 058CC8E32DB5376A0084221A /* Build configuration list for PBXNativeTarget "Data" */;
+ buildPhases = (
+ 058CC8D72DB5376A0084221A /* Headers */,
+ 058CC8D82DB5376A0084221A /* Sources */,
+ 058CC8D92DB5376A0084221A /* Frameworks */,
+ 058CC8DA2DB5376A0084221A /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Data;
+ packageProductDependencies = (
+ 05BDD3DB2DB66EB500C1E192 /* Alamofire */,
+ 0522C1DA2DB67C6100B141FF /* RxSwift */,
+ 05BBA7392DB75A320047A061 /* KakaoSDKAuth */,
+ 05BBA73B2DB75A320047A061 /* KakaoSDKUser */,
+ );
+ productName = Data;
+ productReference = 058CC8DC2DB5376A0084221A /* Data.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 058CC8D32DB5376A0084221A /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1630;
+ LastUpgradeCheck = 1630;
+ TargetAttributes = {
+ 058CC8DB2DB5376A0084221A = {
+ CreatedOnToolsVersion = 16.3;
+ };
+ };
+ };
+ buildConfigurationList = 058CC8D62DB5376A0084221A /* Build configuration list for PBXProject "Data" */;
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 058CC8D22DB5376A0084221A;
+ minimizedProjectReferenceProxies = 1;
+ packageReferences = (
+ 08B2A3532DB66B1D00E57EFA /* XCRemoteSwiftPackageReference "Alamofire" */,
+ 05BDD5DA2DB6786900C1E192 /* XCRemoteSwiftPackageReference "RxSwift" */,
+ 05BBA7382DB75A320047A061 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */,
+ );
+ preferredProjectObjectVersion = 77;
+ productRefGroup = 058CC8DD2DB5376A0084221A /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 058CC8DB2DB5376A0084221A /* Data */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 058CC8DA2DB5376A0084221A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 058CC8D82DB5376A0084221A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 058CC8E12DB5376A0084221A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ 058CC8E22DB5376A0084221A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ 058CC8E42DB5376A0084221A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.Data;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_MODULE = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ 058CC8E52DB5376A0084221A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.Data;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_MODULE = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 058CC8D62DB5376A0084221A /* Build configuration list for PBXProject "Data" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 058CC8E12DB5376A0084221A /* Debug */,
+ 058CC8E22DB5376A0084221A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 058CC8E32DB5376A0084221A /* Build configuration list for PBXNativeTarget "Data" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 058CC8E42DB5376A0084221A /* Debug */,
+ 058CC8E52DB5376A0084221A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+ 05BBA7382DB75A320047A061 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/kakao/kakao-ios-sdk";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 2.24.1;
+ };
+ };
+ 05BDD5DA2DB6786900C1E192 /* XCRemoteSwiftPackageReference "RxSwift" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/ReactiveX/RxSwift";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 6.9.0;
+ };
+ };
+ 08B2A3532DB66B1D00E57EFA /* XCRemoteSwiftPackageReference "Alamofire" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/Alamofire/Alamofire.git";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 5.10.2;
+ };
+ };
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 0522C1DA2DB67C6100B141FF /* RxSwift */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 05BDD5DA2DB6786900C1E192 /* XCRemoteSwiftPackageReference "RxSwift" */;
+ productName = RxSwift;
+ };
+ 05BBA7392DB75A320047A061 /* KakaoSDKAuth */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 05BBA7382DB75A320047A061 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */;
+ productName = KakaoSDKAuth;
+ };
+ 05BBA73B2DB75A320047A061 /* KakaoSDKUser */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 05BBA7382DB75A320047A061 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */;
+ productName = KakaoSDKUser;
+ };
+ 05BDD3DB2DB66EB500C1E192 /* Alamofire */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 08B2A3532DB66B1D00E57EFA /* XCRemoteSwiftPackageReference "Alamofire" */;
+ productName = Alamofire;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = 058CC8D32DB5376A0084221A /* Project object */;
+}
diff --git a/Poppool/Poppool/Presentation/Admin/Data/Remote/AdminAPIEndpoint.swift b/Poppool/DataLayer/Data/Data/Network/API/AdminAPI/AdminAPIEndpoint.swift
similarity index 84%
rename from Poppool/Poppool/Presentation/Admin/Data/Remote/AdminAPIEndpoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/AdminAPI/AdminAPIEndpoint.swift
index cfb9baf3..1b7175d1 100644
--- a/Poppool/Poppool/Presentation/Admin/Data/Remote/AdminAPIEndpoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/AdminAPI/AdminAPIEndpoint.swift
@@ -1,5 +1,9 @@
import Foundation
+import Infrastructure
+
+struct EmptyResponse: Decodable {}
+
struct AdminAPIEndpoint {
// MARK: - Store List
@@ -14,7 +18,7 @@ struct AdminAPIEndpoint {
size: size
)
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/admin/popup-stores/list",
method: .get,
queryParameters: params
@@ -26,7 +30,7 @@ struct AdminAPIEndpoint {
id: Int64
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/admin/popup-stores",
method: .get,
queryParameters: ["popUpStoreId": id]
@@ -38,7 +42,7 @@ struct AdminAPIEndpoint {
request: CreatePopUpStoreRequestDTO
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/admin/popup-stores",
method: .post,
bodyParameters: request
@@ -50,7 +54,7 @@ struct AdminAPIEndpoint {
request: UpdatePopUpStoreRequestDTO
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/admin/popup-stores",
method: .put,
bodyParameters: request
@@ -62,7 +66,7 @@ struct AdminAPIEndpoint {
id: Int64
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/admin/popup-stores",
method: .delete,
queryParameters: ["popUpStoreId": id]
@@ -74,7 +78,7 @@ struct AdminAPIEndpoint {
request: CreateNoticeRequestDTO
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/admin/notice",
method: .post,
bodyParameters: request
@@ -86,7 +90,7 @@ struct AdminAPIEndpoint {
request: UpdateNoticeRequestDTO
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/admin/notice/\(id)",
method: .put,
bodyParameters: request
@@ -97,7 +101,7 @@ struct AdminAPIEndpoint {
id: Int64
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/admin/notice/\(id)",
method: .delete
)
diff --git a/Poppool/Poppool/Presentation/Admin/Data/DTO/AdminResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/AdminAPI/ResponseDTO/AdminResponseDTO.swift
similarity index 93%
rename from Poppool/Poppool/Presentation/Admin/Data/DTO/AdminResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/AdminAPI/ResponseDTO/AdminResponseDTO.swift
index 5924f809..338ec553 100644
--- a/Poppool/Poppool/Presentation/Admin/Data/DTO/AdminResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/AdminAPI/ResponseDTO/AdminResponseDTO.swift
@@ -13,7 +13,6 @@ struct GetAdminPopUpStoreListResponseDTO: Decodable {
let mainImageUrl: String
}
-
}
// MARK: - Store Detail Response
@@ -41,6 +40,3 @@ struct GetAdminPopUpStoreDetailResponseDTO: Decodable {
let imageUrl: String
}
}
-
-// MARK: - Empty Response
-struct EmptyResponse: Decodable {}
diff --git a/Poppool/Poppool/Presentation/Admin/Data/DTO/GetAdminPopUpStoreListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/AdminAPI/ResponseDTO/GetAdminPopUpStoreListResponseDTO.swift
similarity index 99%
rename from Poppool/Poppool/Presentation/Admin/Data/DTO/GetAdminPopUpStoreListResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/AdminAPI/ResponseDTO/GetAdminPopUpStoreListResponseDTO.swift
index 8be73a2b..6d14302a 100644
--- a/Poppool/Poppool/Presentation/Admin/Data/DTO/GetAdminPopUpStoreListResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/AdminAPI/ResponseDTO/GetAdminPopUpStoreListResponseDTO.swift
@@ -1,4 +1,3 @@
-
import Foundation
// MARK: - Store List Request
@@ -10,7 +9,7 @@ struct StoreListRequestDTO: Encodable {
enum CodingKeys: String, CodingKey {
case query
case page
- case size
+ case size
}
}
@@ -62,7 +61,6 @@ struct CreatePopUpStoreRequestDTO: Encodable {
}
}
-
// MARK: - Update Store Request
struct UpdatePopUpStoreRequestDTO: Encodable {
let popUpStore: PopUpStore
@@ -123,7 +121,6 @@ struct UpdatePopUpStoreRequestDTO: Encodable {
}
}
-
// MARK: - Notice Request
struct CreateNoticeRequestDTO: Encodable {
let title: String
diff --git a/Poppool/Poppool/Data/Network/AuthAPI/AuthAPIEndPoint.swift b/Poppool/DataLayer/Data/Data/Network/API/AuthAPI/AuthAPIEndPoint.swift
similarity index 78%
rename from Poppool/Poppool/Data/Network/AuthAPI/AuthAPIEndPoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/AuthAPI/AuthAPIEndPoint.swift
index ead5cbee..5d52d9b6 100644
--- a/Poppool/Poppool/Data/Network/AuthAPI/AuthAPIEndPoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/AuthAPI/AuthAPIEndPoint.swift
@@ -1,16 +1,11 @@
-//
-// AuthAPIEndPoint.swift
-// Poppool
-//
-// Created by Porori on 11/25/24.
-//
-
import Foundation
+import Infrastructure
+
struct AuthAPIEndPoint {
-
+
// MARK: - Auth API
-
+
/// 로그인을 시도합니다.
/// - Parameters:
/// - userCredential: 사용자 자격 증명
@@ -18,17 +13,17 @@ struct AuthAPIEndPoint {
/// - Returns: Endpoint
static func auth_tryLogin(with userCredential: Encodable, path: String) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/auth/\(path)",
method: .post,
bodyParameters: userCredential,
headers: ["Content-Type": "application/json"]
)
}
-
+
static func postTokenReissue() -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/auth/token/reissue",
method: .post
)
diff --git a/Poppool/Poppool/Data/Network/AuthAPI/ResponseDTO/LoginResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/AuthAPI/ResponseDTO/LoginResponseDTO.swift
similarity index 89%
rename from Poppool/Poppool/Data/Network/AuthAPI/ResponseDTO/LoginResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/AuthAPI/ResponseDTO/LoginResponseDTO.swift
index 198eccd0..d88322d6 100644
--- a/Poppool/Poppool/Data/Network/AuthAPI/ResponseDTO/LoginResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/AuthAPI/ResponseDTO/LoginResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// LoginResponseDTO.swift
-// Poppool
-//
-// Created by Porori on 11/25/24.
-//
-
import Foundation
+import DomainInterface
+
struct LoginResponseDTO: Decodable {
var userId: String
var grantType: String
diff --git a/Poppool/Poppool/Data/Network/AuthAPI/ResponseDTO/PostTokenReissueResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/AuthAPI/ResponseDTO/PostTokenReissueResponseDTO.swift
similarity index 84%
rename from Poppool/Poppool/Data/Network/AuthAPI/ResponseDTO/PostTokenReissueResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/AuthAPI/ResponseDTO/PostTokenReissueResponseDTO.swift
index 3640caf4..73ccf5ea 100644
--- a/Poppool/Poppool/Data/Network/AuthAPI/ResponseDTO/PostTokenReissueResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/AuthAPI/ResponseDTO/PostTokenReissueResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// PostTokenReissueResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 1/16/25.
-//
-
import Foundation
+import DomainInterface
+
struct PostTokenReissueResponseDTO: Decodable {
var accessToken: String?
var refreshToken: String?
diff --git a/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/CategoryAPIEndpoint.swift b/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/CategoryAPIEndpoint.swift
new file mode 100644
index 00000000..5ad42b7d
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/CategoryAPIEndpoint.swift
@@ -0,0 +1,16 @@
+import Foundation
+
+import Infrastructure
+
+struct CategoryAPIEndpoint {
+
+ /// 관심사 목록을 가져옵니다.
+ /// - Returns: Endpoint
+ static func getCategoryList() -> Endpoint {
+ return Endpoint(
+ baseURL: Secrets.popPoolBaseURL,
+ path: "/categories",
+ method: .get
+ )
+ }
+}
diff --git a/Poppool/Poppool/Data/Network/SignUpAPI/GetCategoryListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/ResponseDTO/GetCategoryListResponseDTO.swift
similarity index 56%
rename from Poppool/Poppool/Data/Network/SignUpAPI/GetCategoryListResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/ResponseDTO/GetCategoryListResponseDTO.swift
index b437e186..63e0520b 100644
--- a/Poppool/Poppool/Data/Network/SignUpAPI/GetCategoryListResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/ResponseDTO/GetCategoryListResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetCategoryListResponseDTO.swift
-// Poppool
-//
-// Created by Porori on 11/25/24.
-//
-
import Foundation
+import DomainInterface
+
// MARK: - GetCategoryListResponseDTO
struct GetCategoryListResponseDTO: Codable {
let categoryResponseList: [CategoryResponseDTO]
@@ -14,12 +9,12 @@ struct GetCategoryListResponseDTO: Codable {
// MARK: - InterestResponse
struct CategoryResponseDTO: Codable {
- let categoryId: Int64
+ let categoryId: Int32
let categoryName: String
}
extension CategoryResponseDTO {
- func toDomain() -> Category {
- return Category(categoryId: categoryId, category: categoryName)
+ func toDomain() -> CategoryResponse {
+ return CategoryResponse(categoryId: Int(categoryId), category: categoryName)
}
}
diff --git a/Poppool/Poppool/Data/Network/CommentAPI/CommentAPIEndPoint.swift b/Poppool/DataLayer/Data/Data/Network/API/CommentAPI/CommentAPIEndPoint.swift
similarity index 73%
rename from Poppool/Poppool/Data/Network/CommentAPI/CommentAPIEndPoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/CommentAPI/CommentAPIEndPoint.swift
index fda16452..558686aa 100644
--- a/Poppool/Poppool/Data/Network/CommentAPI/CommentAPIEndPoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/CommentAPI/CommentAPIEndPoint.swift
@@ -1,37 +1,32 @@
-//
-// CommentAPIEndPoint.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/15/24.
-//
-
import Foundation
+import Infrastructure
+
import RxSwift
struct CommentAPIEndPoint {
-
+
static func postCommentAdd(request: PostCommentRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/comments",
method: .post,
bodyParameters: request
)
}
-
+
static func deleteComment(request: DeleteCommentRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/comments",
method: .delete,
queryParameters: request
)
}
-
+
static func editComment(request: PutCommentRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/comments",
method: .put,
bodyParameters: request
diff --git a/Poppool/Poppool/Data/Network/CommentAPI/RequestDTO/DeleteCommentRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/CommentAPI/RequestDTO/DeleteCommentRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/CommentAPI/RequestDTO/DeleteCommentRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/CommentAPI/RequestDTO/DeleteCommentRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/CommentAPI/RequestDTO/PostCommentRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/CommentAPI/RequestDTO/PostCommentRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/CommentAPI/RequestDTO/PostCommentRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/CommentAPI/RequestDTO/PostCommentRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/CommentAPI/RequestDTO/PutCommentRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/CommentAPI/RequestDTO/PutCommentRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/CommentAPI/RequestDTO/PutCommentRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/CommentAPI/RequestDTO/PutCommentRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/HomeAPI/HomeAPIEndpoint.swift b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/HomeAPIEndpoint.swift
similarity index 67%
rename from Poppool/Poppool/Data/Network/HomeAPI/HomeAPIEndpoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/HomeAPI/HomeAPIEndpoint.swift
index 94a63b0c..82dd7985 100644
--- a/Poppool/Poppool/Data/Network/HomeAPI/HomeAPIEndpoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/HomeAPIEndpoint.swift
@@ -1,52 +1,47 @@
-//
-// HomeRepositoryImpl.swift
-// Poppool
-//
-// Created by Porori on 11/26/24.
-//
-
import Foundation
+import Infrastructure
+
struct HomeAPIEndpoint {
-
+
static func fetchHome(
- request: SortedRequestDTO
+ request: HomeSortedRequestDTO
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/home",
method: .get,
queryParameters: request
)
}
-
+
static func fetchPopularPopUp(
- request: SortedRequestDTO
+ request: HomeSortedRequestDTO
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/home/popular/popup-stores",
method: .get,
queryParameters: request
)
}
-
+
static func fetchNewPopUp(
- request: SortedRequestDTO
+ request: HomeSortedRequestDTO
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/home/new/popup-stores",
method: .get,
queryParameters: request
)
}
-
+
static func fetchCustomPopUp(
- request: SortedRequestDTO
+ request: HomeSortedRequestDTO
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/home/custom/popup-stores",
method: .get,
queryParameters: request
diff --git a/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/RequestDTO/HomeSortedRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/RequestDTO/HomeSortedRequestDTO.swift
new file mode 100644
index 00000000..1f7b5f72
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/RequestDTO/HomeSortedRequestDTO.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+struct HomeSortedRequestDTO: Encodable {
+ var page: Int32?
+ var size: Int32?
+ var sort: String?
+}
diff --git a/Poppool/Poppool/Data/Network/HomeAPI/ResponseDTO/BannerPopUpStoreDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/ResponseDTO/BannerPopUpStoreDTO.swift
similarity index 78%
rename from Poppool/Poppool/Data/Network/HomeAPI/ResponseDTO/BannerPopUpStoreDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/HomeAPI/ResponseDTO/BannerPopUpStoreDTO.swift
index f1eacb95..6f2841ac 100644
--- a/Poppool/Poppool/Data/Network/HomeAPI/ResponseDTO/BannerPopUpStoreDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/ResponseDTO/BannerPopUpStoreDTO.swift
@@ -1,12 +1,7 @@
-//
-// BannerPopUpStoreDTO.swift
-// Poppool
-//
-// Created by Porori on 11/26/24.
-//
-
import Foundation
+import DomainInterface
+
struct BannerPopUpStoreDTO: Decodable {
var id: Int64
var name: String
diff --git a/Poppool/Poppool/Data/Network/HomeAPI/ResponseDTO/GetHomeInfoResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/ResponseDTO/GetHomeInfoResponseDTO.swift
similarity index 94%
rename from Poppool/Poppool/Data/Network/HomeAPI/ResponseDTO/GetHomeInfoResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/HomeAPI/ResponseDTO/GetHomeInfoResponseDTO.swift
index 01660653..351faf9f 100644
--- a/Poppool/Poppool/Data/Network/HomeAPI/ResponseDTO/GetHomeInfoResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/ResponseDTO/GetHomeInfoResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetHomeInfoResponseDTO.swift
-// Poppool
-//
-// Created by Porori on 11/26/24.
-//
-
import Foundation
+import DomainInterface
+
struct GetHomeInfoResponseDTO: Decodable {
var bannerPopUpStoreList: [BannerPopUpStoreDTO]
var nickname: String?
@@ -40,4 +35,3 @@ extension GetHomeInfoResponseDTO {
)
}
}
-
diff --git a/Poppool/Poppool/Data/Network/HomeAPI/ResponseDTO/PopUpStoreResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/ResponseDTO/PopUpStoreResponseDTO.swift
similarity index 87%
rename from Poppool/Poppool/Data/Network/HomeAPI/ResponseDTO/PopUpStoreResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/HomeAPI/ResponseDTO/PopUpStoreResponseDTO.swift
index 830f3423..4cfb0832 100644
--- a/Poppool/Poppool/Data/Network/HomeAPI/ResponseDTO/PopUpStoreResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/HomeAPI/ResponseDTO/PopUpStoreResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetHomeInfoDataResponseDTO.swift
-// Poppool
-//
-// Created by Porori on 11/26/24.
-//
-
import Foundation
+import DomainInterface
+
struct PopUpStoreResponseDTO: Decodable {
let id: Int64
let categoryName: String?
diff --git a/Poppool/Poppool/Presentation/Map/FindMap/MapGuideView/FindDirectionEndPoint.swift b/Poppool/DataLayer/Data/Data/Network/API/MapAPI/FindDirectionEndPoint.swift
similarity index 67%
rename from Poppool/Poppool/Presentation/Map/FindMap/MapGuideView/FindDirectionEndPoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/MapAPI/FindDirectionEndPoint.swift
index 973a81e5..e9680478 100644
--- a/Poppool/Poppool/Presentation/Map/FindMap/MapGuideView/FindDirectionEndPoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/MapAPI/FindDirectionEndPoint.swift
@@ -1,22 +1,16 @@
-//
-// FindDirectionEndPoint.swift
-// Poppool
-//
-// Created by 김기현 on 1/23/25.
-//
-
import Foundation
+import Infrastructure
+
struct FindDirectionEndPoint {
// MARK: - Direction
static func fetchDirection(
popUpStoreId: Int64
) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/popup/\(popUpStoreId)/directions",
method: .get
)
}
}
-
diff --git a/Poppool/Poppool/Presentation/Admin/Data/MapDomain/MapAPIEndpoint.swift b/Poppool/DataLayer/Data/Data/Network/API/MapAPI/MapAPIEndpoint.swift
similarity index 91%
rename from Poppool/Poppool/Presentation/Admin/Data/MapDomain/MapAPIEndpoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/MapAPI/MapAPIEndpoint.swift
index e9da01f6..2d3f2f7b 100644
--- a/Poppool/Poppool/Presentation/Admin/Data/MapDomain/MapAPIEndpoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/MapAPI/MapAPIEndpoint.swift
@@ -1,11 +1,7 @@
-//
-// MapAPIEndpoint.swift
-// Poppool
-//
-// Created by 김기현 on 12/4/24.
-//
-
import Foundation
+
+import Infrastructure
+
import Alamofire
struct MapAPIEndpoint {
@@ -26,7 +22,7 @@ struct MapAPIEndpoint {
)
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/locations/popup-stores",
method: .get,
queryParameters: params
@@ -44,7 +40,7 @@ struct MapAPIEndpoint {
)
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/locations/search",
method: .get,
queryParameters: params
@@ -52,7 +48,6 @@ struct MapAPIEndpoint {
}
}
-// MARK: - Query DTOs
struct BoundQueryDTO: Encodable {
let northEastLat: Double
let northEastLon: Double
@@ -84,4 +79,3 @@ struct SearchQueryDTO: Encodable {
let query: String
let categories: [Int64]?
}
-
diff --git a/Poppool/Poppool/Presentation/Map/FindMap/MapGuideView/GetPopUpDirectionResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/MapAPI/ResponseDTO/GetPopUpDirectionResponseDTO.swift
similarity index 65%
rename from Poppool/Poppool/Presentation/Map/FindMap/MapGuideView/GetPopUpDirectionResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/MapAPI/ResponseDTO/GetPopUpDirectionResponseDTO.swift
index fa31b5d8..15c4c206 100644
--- a/Poppool/Poppool/Presentation/Map/FindMap/MapGuideView/GetPopUpDirectionResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/MapAPI/ResponseDTO/GetPopUpDirectionResponseDTO.swift
@@ -1,12 +1,6 @@
-//
-// GetPopUpDirectionResponseDTO.swift
-// Poppool
-//
-// Created by 김기현 on 1/23/25.
-//
-
import Foundation
+import DomainInterface
struct GetPopUpDirectionResponseDTO: Decodable {
let id: Int64
@@ -37,17 +31,3 @@ struct GetPopUpDirectionResponseDTO: Decodable {
)
}
}
-
-struct GetPopUpDirectionResponse {
- let id: Int64
- let categoryName: String
- let name: String
- let address: String
- let startDate: String
- let endDate: String
- let latitude: Double
- let longitude: Double
- let markerId: Int64
- let markerTitle: String
- let markerSnippet: String
-}
diff --git a/Poppool/Poppool/Presentation/Admin/Data/MapDomain/MapPopUpStoreDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/MapAPI/ResponseDTO/MapPopUpStoreDTO.swift
similarity index 96%
rename from Poppool/Poppool/Presentation/Admin/Data/MapDomain/MapPopUpStoreDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/MapAPI/ResponseDTO/MapPopUpStoreDTO.swift
index 1db431dd..c5d4a7c7 100644
--- a/Poppool/Poppool/Presentation/Admin/Data/MapDomain/MapPopUpStoreDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/MapAPI/ResponseDTO/MapPopUpStoreDTO.swift
@@ -1,5 +1,7 @@
import Foundation
+import DomainInterface
+
struct MapPopUpStoreDTO: Codable {
let id: Int64
let categoryName: String
@@ -15,7 +17,6 @@ struct MapPopUpStoreDTO: Codable {
let mainImageUrl: String?
let bookmarkYn: Bool?
- // toDomain() 메서드 추가
func toDomain() -> MapPopUpStore {
return MapPopUpStore(
id: id,
@@ -30,11 +31,9 @@ struct MapPopUpStoreDTO: Codable {
markerTitle: markerTitle,
markerSnippet: markerSnippet,
mainImageUrl: mainImageUrl
-
)
}
}
-
struct GetViewBoundPopUpStoreListResponse: Decodable {
let popUpStoreList: [MapPopUpStoreDTO]
}
diff --git a/Poppool/Poppool/Data/Network/PopUpAPI/PopUpAPIEndPoint.swift b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/PopUpAPIEndPoint.swift
similarity index 78%
rename from Poppool/Poppool/Data/Network/PopUpAPI/PopUpAPIEndPoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/PopUpAPIEndPoint.swift
index e163f336..70a968f6 100644
--- a/Poppool/Poppool/Data/Network/PopUpAPI/PopUpAPIEndPoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/PopUpAPIEndPoint.swift
@@ -1,55 +1,50 @@
-//
-// PopUpAPIEndPoint.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/6/24.
-//
-
import Foundation
+import Infrastructure
+
import RxSwift
struct PopUpAPIEndPoint {
-
+
static func getClosePopUpList(request: GetSearchPopUpListRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/popup/closed",
method: .get,
queryParameters: request
)
}
-
+
static func getOpenPopUpList(request: GetSearchPopUpListRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/popup/open",
method: .get,
queryParameters: request
)
}
-
+
static func getSearchPopUpList(request: GetSearchPopUpListRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/search/popup-stores",
method: .get,
queryParameters: request
)
}
-
+
static func getPopUpDetail(request: GetPopUpDetailRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/popup/\(request.popUpStoreId)/detail",
method: .get,
queryParameters: request
)
}
-
+
static func getPopUpComment(request: GetPopUpCommentRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/popup/\(request.popUpStoreId)/comments",
method: .get,
queryParameters: request
diff --git a/Poppool/Poppool/Data/Network/PopUpAPI/RequestDTO/GetPopUpCommentRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/RequestDTO/GetPopUpCommentRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/PopUpAPI/RequestDTO/GetPopUpCommentRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/RequestDTO/GetPopUpCommentRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/PopUpAPI/RequestDTO/GetPopUpDetailRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/RequestDTO/GetPopUpDetailRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/PopUpAPI/RequestDTO/GetPopUpDetailRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/RequestDTO/GetPopUpDetailRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/PopUpAPI/RequestDTO/GetSearchPopUpListRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/RequestDTO/GetSearchPopUpListRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/PopUpAPI/RequestDTO/GetSearchPopUpListRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/RequestDTO/GetSearchPopUpListRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetClosePopUpListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetClosePopUpListResponseDTO.swift
similarity index 82%
rename from Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetClosePopUpListResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetClosePopUpListResponseDTO.swift
index eab1fac5..a57fee94 100644
--- a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetClosePopUpListResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetClosePopUpListResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetClosePopUpListResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/6/24.
-//
-
import Foundation
+import DomainInterface
+
struct GetClosePopUpListResponseDTO: Decodable {
var closedPopUpStoreList: [PopUpStoreResponseDTO]
var loginYn: Bool
diff --git a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetOpenPopUpListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetOpenPopUpListResponseDTO.swift
similarity index 82%
rename from Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetOpenPopUpListResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetOpenPopUpListResponseDTO.swift
index a7194b4b..40d983fc 100644
--- a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetOpenPopUpListResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetOpenPopUpListResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetOpenPopUpListResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/6/24.
-//
-
import Foundation
+import DomainInterface
+
struct GetOpenPopUpListResponseDTO: Decodable {
var openPopUpStoreList: [PopUpStoreResponseDTO]
var loginYn: Bool
diff --git a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetPopUpCommentResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetPopUpCommentResponseDTO.swift
similarity index 74%
rename from Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetPopUpCommentResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetPopUpCommentResponseDTO.swift
index fef0aa36..3461f17d 100644
--- a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetPopUpCommentResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetPopUpCommentResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetPopUpCommentResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/25/24.
-//
-
import Foundation
+import DomainInterface
+
struct GetPopUpCommentResponseDTO: Decodable {
let commentList: [GetPopUpDetailCommentResponseDTO]
}
diff --git a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetPopUpDetailResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetPopUpDetailResponseDTO.swift
similarity index 96%
rename from Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetPopUpDetailResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetPopUpDetailResponseDTO.swift
index e08b6338..53ea4dee 100644
--- a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetPopUpDetailResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetPopUpDetailResponseDTO.swift
@@ -1,11 +1,8 @@
-//
-// GetPopUpDetailResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/10/24.
-//
-
import Foundation
+
+import DomainInterface
+import Infrastructure
+
// MARK: - Main Model
struct GetPopUpDetailResponseDTO: Decodable {
let name: String?
diff --git a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetSearchPopUpListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetSearchPopUpListResponseDTO.swift
similarity index 76%
rename from Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetSearchPopUpListResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetSearchPopUpListResponseDTO.swift
index b3deaf5f..841ca801 100644
--- a/Poppool/Poppool/Data/Network/PopUpAPI/ResponseDTO/GetSearchPopUpListResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/PopUpAPI/ResponseDTO/GetSearchPopUpListResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetSearchPopUpListResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/7/24.
-//
-
import Foundation
+import DomainInterface
+
struct GetSearchPopUpListResponseDTO: Decodable {
var popUpStoreList: [PopUpStoreResponseDTO]
var loginYn: Bool
@@ -17,5 +12,3 @@ extension GetSearchPopUpListResponseDTO {
return .init(popUpStoreList: popUpStoreList.map { $0.toDomain() }, loginYn: loginYn)
}
}
-
-
diff --git a/Poppool/Poppool/Infrastructure/PreSignedService/PreSignedAPIEndPoint.swift b/Poppool/DataLayer/Data/Data/Network/API/PreSignedAPI/PreSignedAPIEndPoint.swift
similarity index 61%
rename from Poppool/Poppool/Infrastructure/PreSignedService/PreSignedAPIEndPoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PreSignedAPI/PreSignedAPIEndPoint.swift
index a1bba549..47bd16a8 100644
--- a/Poppool/Poppool/Infrastructure/PreSignedService/PreSignedAPIEndPoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/PreSignedAPI/PreSignedAPIEndPoint.swift
@@ -1,17 +1,12 @@
-//
-// PreSignedAPIEndPoint.swift
-// Poppool
-//
-// Created by SeoJunYoung on 11/29/24.
-//
-
import Foundation
+import Infrastructure
+
struct PreSignedAPIEndPoint {
static func presigned_upload(request: PresignedURLRequestDTO) -> Endpoint {
- Logger.log(message: "Presigned URL 생성 - Request: \(request)", category: .debug)
+ Logger.log("Presigned URL 생성 - Request: \(request)", category: .debug)
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/files/upload-preSignedUrl",
method: .post,
bodyParameters: request
@@ -19,9 +14,9 @@ struct PreSignedAPIEndPoint {
}
static func presigned_download(request: PresignedURLRequestDTO) -> Endpoint {
- Logger.log(message: "Presigned Download URL 생성 - Request: \(request)", category: .debug)
+ Logger.log("Presigned Download URL 생성 - Request: \(request)", category: .debug)
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/files/download-preSignedUrl",
method: .post,
bodyParameters: request
@@ -29,9 +24,9 @@ struct PreSignedAPIEndPoint {
}
static func presigned_delete(request: PresignedURLRequestDTO) -> RequestEndpoint {
- Logger.log(message: "Presigned Delete 생성 - Request: \(request)", category: .debug)
+ Logger.log("Presigned Delete 생성 - Request: \(request)", category: .debug)
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/files/delete",
method: .post,
bodyParameters: request
diff --git a/Poppool/Poppool/Infrastructure/PreSignedService/PresignedURLRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PreSignedAPI/RequestDTO/PresignedURLRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Infrastructure/PreSignedService/PresignedURLRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PreSignedAPI/RequestDTO/PresignedURLRequestDTO.swift
diff --git a/Poppool/Poppool/Infrastructure/PreSignedService/PreSignedURLDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PreSignedAPI/ResponseDTO/PreSignedURLDTO.swift
similarity index 100%
rename from Poppool/Poppool/Infrastructure/PreSignedService/PreSignedURLDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PreSignedAPI/ResponseDTO/PreSignedURLDTO.swift
diff --git a/Poppool/Poppool/Infrastructure/PreSignedService/PreSignedURLResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/PreSignedAPI/ResponseDTO/PreSignedURLResponseDTO.swift
similarity index 100%
rename from Poppool/Poppool/Infrastructure/PreSignedService/PreSignedURLResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/PreSignedAPI/ResponseDTO/PreSignedURLResponseDTO.swift
diff --git a/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/RequestDTO/GetSearchPopupStoreRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/RequestDTO/GetSearchPopupStoreRequestDTO.swift
new file mode 100644
index 00000000..679b1e63
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/RequestDTO/GetSearchPopupStoreRequestDTO.swift
@@ -0,0 +1,5 @@
+import Foundation
+
+struct GetSearchPopupStoreRequestDTO: Encodable {
+ let query: String
+}
diff --git a/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/ResponseDTO/GetSearchPopupStoreResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/ResponseDTO/GetSearchPopupStoreResponseDTO.swift
new file mode 100644
index 00000000..2872bf8a
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/ResponseDTO/GetSearchPopupStoreResponseDTO.swift
@@ -0,0 +1,17 @@
+import Foundation
+
+import DomainInterface
+
+struct GetSearchPopupStoreResponseDTO: Decodable {
+ var popUpStoreList: [PopUpStoreResponseDTO]
+ var loginYn: Bool
+}
+
+extension GetSearchPopupStoreResponseDTO {
+ func toDomain() -> KeywordBasePopupStoreListResponse {
+ return KeywordBasePopupStoreListResponse(
+ popupStoreList: popUpStoreList.map { $0.toDomain() },
+ loginYn: loginYn
+ )
+ }
+}
diff --git a/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/SearchAPIEndPoint.swift b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/SearchAPIEndPoint.swift
new file mode 100644
index 00000000..9235420d
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/SearchAPIEndPoint.swift
@@ -0,0 +1,17 @@
+import Foundation
+
+import Infrastructure
+
+import RxSwift
+
+struct SearchAPIEndPoint {
+
+ static func getSearchPopUpList(request: GetSearchPopupStoreRequestDTO) -> Endpoint {
+ return Endpoint(
+ baseURL: Secrets.popPoolBaseURL,
+ path: "/search/popup-stores",
+ method: .get,
+ queryParameters: request
+ )
+ }
+}
diff --git a/Poppool/Poppool/Data/Network/SignUpAPI/CheckNickNameRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/RequestDTO/CheckNickNameRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/SignUpAPI/CheckNickNameRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/RequestDTO/CheckNickNameRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/SignUpAPI/SignUpRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/RequestDTO/SignUpRequestDTO.swift
similarity index 89%
rename from Poppool/Poppool/Data/Network/SignUpAPI/SignUpRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/RequestDTO/SignUpRequestDTO.swift
index 74cd1019..044c86ff 100644
--- a/Poppool/Poppool/Data/Network/SignUpAPI/SignUpRequestDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/RequestDTO/SignUpRequestDTO.swift
@@ -13,6 +13,6 @@ struct SignUpRequestDTO: Encodable {
var age: Int32
var socialEmail: String
var socialType: String
- var interestCategories: [Int64]
+ var interestCategories: [Int]
var appleAuthorizationCode: String?
}
diff --git a/Poppool/Poppool/Data/Network/SignUpAPI/SignUpAPIEndpoint.swift b/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/SignUpAPIEndpoint.swift
similarity index 80%
rename from Poppool/Poppool/Data/Network/SignUpAPI/SignUpAPIEndpoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/SignUpAPIEndpoint.swift
index dc29870e..36527751 100644
--- a/Poppool/Poppool/Data/Network/SignUpAPI/SignUpAPIEndpoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/SignUpAPIEndpoint.swift
@@ -1,42 +1,37 @@
-//
-// SignUpAPIEndpoint.swift
-// Poppool
-//
-// Created by Porori on 11/25/24.
-//
-
import Foundation
+import Infrastructure
+
struct SignUpAPIEndpoint {
-
+
/// 닉네임 중복을 확인합니다.
/// - Parameter request: 닉네임 체크 요청 DTO
/// - Returns: Endpoint
static func signUp_checkNickName(with request: CheckNickNameRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/signup/check-nickname",
method: .get,
queryParameters: request
)
}
-
+
/// 관심사 목록을 가져옵니다.
/// - Returns: Endpoint
static func signUp_getCategoryList() -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/signup/categories",
method: .get
)
}
-
+
/// 회원가입을 시도합니다.
/// - Parameter request: 회원가입 요청 DTO
/// - Returns: RequestEndpoint
static func signUp_trySignUp(with request: SignUpRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/signup",
method: .post,
bodyParameters: request
diff --git a/Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/CommentLikeRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/CommentLikeRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/CommentLikeRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/CommentLikeRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/GetMyCommentRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/GetMyCommentRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/GetMyCommentRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/GetMyCommentRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/GetOtherUserCommentListRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/GetOtherUserCommentListRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/GetOtherUserCommentListRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/GetOtherUserCommentListRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PostBookmarkPopUpRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PostBookmarkPopUpRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PostBookmarkPopUpRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PostBookmarkPopUpRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PostUserBlockRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PostUserBlockRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PostUserBlockRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PostUserBlockRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PutUserCategoryRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PutUserCategoryRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PutUserCategoryRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PutUserCategoryRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PutUserProfileRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PutUserProfileRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PutUserProfileRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PutUserProfileRequestDTO.swift
diff --git a/Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PutUserTailoredInfoRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PutUserTailoredInfoRequestDTO.swift
similarity index 100%
rename from Poppool/Poppool/Data/Network/UserAPI/RequesetDTO/PutUserTailoredInfoRequestDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/PutUserTailoredInfoRequestDTO.swift
diff --git a/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/UserSortedRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/UserSortedRequestDTO.swift
new file mode 100644
index 00000000..aee72ce5
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/RequesetDTO/UserSortedRequestDTO.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+struct UserSortedRequestDTO: Encodable {
+ var page: Int32?
+ var size: Int32?
+ var sort: String?
+}
diff --git a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetBlockUserListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetBlockUserListResponseDTO.swift
similarity index 89%
rename from Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetBlockUserListResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetBlockUserListResponseDTO.swift
index 7d862c5d..a375ca41 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetBlockUserListResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetBlockUserListResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetBlockUserListResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 1/12/25.
-//
-
import Foundation
+import DomainInterface
+
struct GetBlockUserListResponseDTO: Decodable {
var blockedUserInfoList: [GetBlockUserListDataResponseDTO]
var totalPages: Int32
diff --git a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetMyCommentedPopUpResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetMyCommentedPopUpResponseDTO.swift
similarity index 91%
rename from Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetMyCommentedPopUpResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetMyCommentedPopUpResponseDTO.swift
index 26323fbd..5d6591e4 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetMyCommentedPopUpResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetMyCommentedPopUpResponseDTO.swift
@@ -1,13 +1,7 @@
-//
-// GetMyCommentedPopUpResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 1/12/25.
-//
-
-
import Foundation
+import DomainInterface
+
struct GetMyCommentedPopUpResponseDTO: Decodable {
var popUpInfoList: [GetMyCommentedPopUpDataResponseDTO]
}
diff --git a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetMyPageResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetMyPageResponseDTO.swift
similarity index 91%
rename from Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetMyPageResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetMyPageResponseDTO.swift
index 11f511c0..64a1f071 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetMyPageResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetMyPageResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetMyPageResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/30/24.
-//
-
import Foundation
+import DomainInterface
+
struct GetMyPageResponseDTO: Decodable {
var nickname: String?
var profileImageUrl: String?
diff --git a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetMyProfileResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetMyProfileResponseDTO.swift
similarity index 52%
rename from Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetMyProfileResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetMyProfileResponseDTO.swift
index 02b18df9..1ffb4133 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetMyProfileResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetMyProfileResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetMyProfileResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 1/10/25.
-//
-
import Foundation
+import DomainInterface
+
struct GetMyProfileResponseDTO: Decodable {
var profileImageUrl: String?
var nickname: String?
@@ -20,6 +15,15 @@ struct GetMyProfileResponseDTO: Decodable {
extension GetMyProfileResponseDTO {
func toDomain() -> GetMyProfileResponse {
- return .init(profileImageUrl: profileImageUrl, nickname: nickname, email: email, instagramId: instagramId, intro: intro, gender: gender, age: age, interestCategoryList: interestCategoryList.map { $0.toDomain() })
+ return .init(
+ profileImageUrl: profileImageUrl,
+ nickname: nickname,
+ email: email,
+ instagramId: instagramId,
+ intro: intro,
+ gender: gender,
+ age: age,
+ interestCategoryList: interestCategoryList.map { $0.toDomain() }
+ )
}
}
diff --git a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetNoticeDetailResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetNoticeDetailResponseDTO.swift
similarity index 79%
rename from Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetNoticeDetailResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetNoticeDetailResponseDTO.swift
index d8e9baba..f50ff39b 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetNoticeDetailResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetNoticeDetailResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetNoticeDetailResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 1/13/25.
-//
-
import Foundation
+import DomainInterface
+
struct GetNoticeDetailResponseDTO: Decodable {
var id: Int64
var title: String?
diff --git a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetNoticeListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetNoticeListResponseDTO.swift
similarity index 86%
rename from Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetNoticeListResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetNoticeListResponseDTO.swift
index f2314de9..c280a0a7 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetNoticeListResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetNoticeListResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetNoticeListResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 1/13/25.
-//
-
import Foundation
+import DomainInterface
+
struct GetNoticeListResponseDTO: Decodable {
var noticeInfoList: [GetNoticeListDataResponseDTO]
}
diff --git a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetOtherUserCommentedPopUpListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetOtherUserCommentedPopUpListResponseDTO.swift
similarity index 90%
rename from Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetOtherUserCommentedPopUpListResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetOtherUserCommentedPopUpListResponseDTO.swift
index 45948742..382485bc 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetOtherUserCommentedPopUpListResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetOtherUserCommentedPopUpListResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetOtherUserCommentedPopUpListResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/27/24.
-//
-
import Foundation
+import DomainInterface
+
struct GetOtherUserCommentedPopUpListResponseDTO: Decodable {
var popUpInfoList: [GetOtherUserCommentedPopUpResponseDTO]
}
@@ -42,6 +37,3 @@ extension GetOtherUserCommentedPopUpResponseDTO {
)
}
}
-
-
-
diff --git a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetRecentPopUpResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetRecentPopUpResponseDTO.swift
similarity index 92%
rename from Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetRecentPopUpResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetRecentPopUpResponseDTO.swift
index 20b4f454..8d02dc95 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetRecentPopUpResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetRecentPopUpResponseDTO.swift
@@ -1,12 +1,8 @@
-//
-// GetRecentPopUpResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 1/14/25.
-//
-
import Foundation
+import DomainInterface
+import Infrastructure
+
struct GetRecentPopUpResponseDTO: Decodable {
var popUpInfoList: [GetRecentPopUpDataResponseDTO]
var totalPages: Int32
diff --git a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetWithdrawlListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetWithdrawlListResponseDTO.swift
similarity index 87%
rename from Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetWithdrawlListResponseDTO.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetWithdrawlListResponseDTO.swift
index f50372d7..d1c01819 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/ResponseDTO/GetWithdrawlListResponseDTO.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/ResponseDTO/GetWithdrawlListResponseDTO.swift
@@ -1,12 +1,7 @@
-//
-// GetWithdrawlListResponseDTO.swift
-// Poppool
-//
-// Created by SeoJunYoung on 1/7/25.
-//
-
import Foundation
+import DomainInterface
+
struct GetWithdrawlListResponseDTO: Decodable {
var withDrawlSurveyList: [GetWithdrawlListDataResponseDTO]
}
@@ -26,8 +21,6 @@ extension GetWithdrawlListDataResponseDTO {
}
}
-
-
struct PostWithdrawlListRequestDTO: Encodable {
var checkedSurveyList: [GetWithdrawlListDataResponseDTO]
}
diff --git a/Poppool/Poppool/Data/Network/UserAPI/UserAPIEndPoint.swift b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/UserAPIEndPoint.swift
similarity index 71%
rename from Poppool/Poppool/Data/Network/UserAPI/UserAPIEndPoint.swift
rename to Poppool/DataLayer/Data/Data/Network/API/UserAPI/UserAPIEndPoint.swift
index fce30a7d..d063d383 100644
--- a/Poppool/Poppool/Data/Network/UserAPI/UserAPIEndPoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/API/UserAPI/UserAPIEndPoint.swift
@@ -1,193 +1,188 @@
-//
-// UserAPIEndPoint.swift
-// Poppool
-//
-// Created by SeoJunYoung on 12/3/24.
-//
-
import Foundation
+import Infrastructure
+
import RxSwift
struct UserAPIEndPoint {
-
+
static func postBookmarkPopUp(request: PostBookmarkPopUpRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/bookmark-popupstores",
method: .post,
queryParameters: request
)
}
-
+
static func deleteBookmarkPopUp(request: PostBookmarkPopUpRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/bookmark-popupstores",
method: .delete,
queryParameters: request
)
}
-
+
static func postCommentLike(request: CommentLikeRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/likes",
method: .post,
queryParameters: request
)
}
-
+
static func deleteCommentLike(request: CommentLikeRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/likes",
method: .delete,
queryParameters: request
)
}
-
+
static func postUserBlock(request: PostUserBlockRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/block",
method: .post,
queryParameters: request
)
}
-
+
static func deleteUserBlock(request: PostUserBlockRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/unblock",
method: .delete,
queryParameters: request
)
}
-
+
static func getOtherUserCommentPopUpList(request: GetOtherUserCommentListRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/\(request.commenterId ?? "")/comments",
method: .get,
queryParameters: request
)
}
-
+
static func getMyPage() -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/my-page",
method: .get
)
}
-
+
static func postLogout() -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/logout",
method: .post
)
}
-
+
static func getWithdrawlList() -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/withdrawl/surveys",
method: .get
)
}
-
+
static func postWithdrawl(request: PostWithdrawlListRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/delete",
method: .post,
bodyParameters: request
)
}
-
+
static func getMyProfile() -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/profiles",
method: .get
)
}
-
+
static func putUserTailoredInfo(request: PutUserTailoredInfoRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/tailored-info",
method: .put,
bodyParameters: request
)
- }
-
+ }
+
static func putUserCategory(request: PutUserCategoryRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/interests",
method: .put,
bodyParameters: request
)
- }
-
+ }
+
static func putUserProfile(request: PutUserProfileRequestDTO) -> RequestEndpoint {
return RequestEndpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/profiles",
method: .put,
bodyParameters: request
)
}
-
- static func getMyCommentedPopUp(request: SortedRequestDTO) -> Endpoint {
+
+ static func getMyCommentedPopUp(request: UserSortedRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/commented/popup",
method: .get,
queryParameters: request
)
}
-
- static func getBlockUserList(request: GetBlockUserListRequestDTO) -> Endpoint {
+
+ static func getBlockUserList(request: UserSortedRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/blocked",
method: .get,
queryParameters: request
)
}
-
+
static func getNoticeList() -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/notice/list",
method: .get
)
}
-
+
static func getNoticeDetail(noticeID: Int64) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/notice/\(noticeID)",
method: .get
)
- }
-
- static func getRecentPopUp(request: SortedRequestDTO) -> Endpoint {
+ }
+
+ static func getRecentPopUp(request: UserSortedRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/recent-popupstores",
method: .get,
queryParameters: request
)
}
-
- static func getBookmarkPopUp(request: SortedRequestDTO) -> Endpoint {
+
+ static func getBookmarkPopUp(request: UserSortedRequestDTO) -> Endpoint {
return Endpoint(
- baseURL: Secrets.popPoolBaseUrl.rawValue,
+ baseURL: Secrets.popPoolBaseURL,
path: "/users/bookmark-popupstores",
method: .get,
queryParameters: request
diff --git a/Poppool/Poppool/Infrastructure/NetworkLayer/Common/NetworkError.swift b/Poppool/DataLayer/Data/Data/Network/Common/NetworkError.swift
similarity index 100%
rename from Poppool/Poppool/Infrastructure/NetworkLayer/Common/NetworkError.swift
rename to Poppool/DataLayer/Data/Data/Network/Common/NetworkError.swift
diff --git a/Poppool/Poppool/Infrastructure/NetworkLayer/Common/Requestable.swift b/Poppool/DataLayer/Data/Data/Network/Common/Requestable.swift
similarity index 91%
rename from Poppool/Poppool/Infrastructure/NetworkLayer/Common/Requestable.swift
rename to Poppool/DataLayer/Data/Data/Network/Common/Requestable.swift
index cd902b29..2172c43b 100644
--- a/Poppool/Poppool/Infrastructure/NetworkLayer/Common/Requestable.swift
+++ b/Poppool/DataLayer/Data/Data/Network/Common/Requestable.swift
@@ -1,15 +1,10 @@
-//
-// Requestable.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 8/16/24.
-//
-
import Foundation
+import Infrastructure
+
import Alamofire
-protocol Requestable {
+public protocol Requestable {
var baseURL: String { get }
var path: String { get }
var method: HTTPMethod { get }
@@ -24,14 +19,12 @@ extension Requestable {
/// - Returns: URLRequest 반환
func getUrlRequest() throws -> URLRequest {
let url = try url()
-
+
Logger.log(
- message: "\(url) URL 생성",
- category: .network,
- fileName: #file,
- line: #line
+ "\(url) URL 생성",
+ category: .network
)
-
+
var urlRequest = URLRequest(url: url)
// httpBody
if let bodyParameters = try bodyParameters?.toDictionary() {
@@ -46,7 +39,7 @@ extension Requestable {
headers?.forEach { urlRequest.setValue($1, forHTTPHeaderField: $0) }
return urlRequest
}
-
+
/// APIEndpoint에서 전달받은 DTO를 URL로 변환하는 메서드
/// - Returns: URL 반환
func url() throws -> URL {
@@ -80,7 +73,7 @@ extension Requestable {
}
extension Encodable {
-
+
/// URL에 요청할 쿼리 데이터를 JSON 형식에 맞게 딕셔너리 구조로 변환하는 메서드
/// - Returns: jsonData
func toDictionary() throws -> [String: Any]? {
diff --git a/Poppool/DataLayer/Data/Data/Network/Common/Responsable.swift b/Poppool/DataLayer/Data/Data/Network/Common/Responsable.swift
new file mode 100644
index 00000000..9f7c310c
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/Network/Common/Responsable.swift
@@ -0,0 +1,5 @@
+import Foundation
+
+public protocol Responsable {
+ associatedtype Response
+}
diff --git a/Poppool/Poppool/Infrastructure/NetworkLayer/EndPoint/Endpoint.swift b/Poppool/DataLayer/Data/Data/Network/EndPoint/Endpoint.swift
similarity index 82%
rename from Poppool/Poppool/Infrastructure/NetworkLayer/EndPoint/Endpoint.swift
rename to Poppool/DataLayer/Data/Data/Network/EndPoint/Endpoint.swift
index cdbe56d6..4e835db9 100644
--- a/Poppool/Poppool/Infrastructure/NetworkLayer/EndPoint/Endpoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/EndPoint/Endpoint.swift
@@ -1,19 +1,12 @@
-//
-// Endpoint.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 8/16/24.
-//
-
import Foundation
import Alamofire
-protocol RequesteResponsable: Requestable, Responsable where Response: Decodable {}
+public protocol RequesteResponsable: Requestable, Responsable where Response: Decodable {}
class Endpoint: RequesteResponsable {
typealias Response = R
-
+
var baseURL: String
var path: String
var method: HTTPMethod
diff --git a/Poppool/Poppool/Infrastructure/NetworkLayer/EndPoint/MultipartEndPoint.swift b/Poppool/DataLayer/Data/Data/Network/EndPoint/MultipartEndPoint.swift
similarity index 83%
rename from Poppool/Poppool/Infrastructure/NetworkLayer/EndPoint/MultipartEndPoint.swift
rename to Poppool/DataLayer/Data/Data/Network/EndPoint/MultipartEndPoint.swift
index 42d83dd0..4c9e7011 100644
--- a/Poppool/Poppool/Infrastructure/NetworkLayer/EndPoint/MultipartEndPoint.swift
+++ b/Poppool/DataLayer/Data/Data/Network/EndPoint/MultipartEndPoint.swift
@@ -1,15 +1,10 @@
-//
-// MultipartEndPoint.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 10/25/24.
-//
-
import UIKit
+import Infrastructure
+
import Alamofire
-class MultipartEndPoint: URLRequestConvertible {
+public class MultipartEndPoint: URLRequestConvertible {
var baseURL: String
var path: String
var method: HTTPMethod
@@ -17,7 +12,7 @@ class MultipartEndPoint: URLRequestConvertible {
var jsonData: [String: Any]?
var images: [UIImage]
var headers: [String: String]?
-
+
init(
baseURL: String,
path: String,
@@ -35,22 +30,22 @@ class MultipartEndPoint: URLRequestConvertible {
self.images = images
self.headers = headers
}
-
- func asURLRequest() throws -> URLRequest {
+
+ public func asURLRequest() throws -> URLRequest {
let url = try baseURL.asURL().appendingPathComponent(path)
var request = URLRequest(url: url)
- Logger.log(message: "\(request) URL 생성", category: .network)
+ Logger.log("\(request) URL 생성", category: .network)
request.method = method
-
+
if let headers = headers {
for (key, value) in headers {
request.setValue(value, forHTTPHeaderField: key)
}
}
-
+
return request
}
-
+
func asMultipartFormData(multipartFormData: MultipartFormData) {
// JSON 데이터를 data 필드로 추가
if let jsonData = jsonData {
@@ -62,10 +57,10 @@ class MultipartEndPoint: URLRequestConvertible {
multipartFormData.append(jsonString.data(using: .utf8)!, withName: "data")
}
} catch {
- Logger.log(message: "JSON 변환 오류: \(error)", category: .network)
+ Logger.log("JSON 변환 오류: \(error)", category: .network)
}
}
-
+
// 이미지 파일 추가
for (index, image) in images.enumerated() {
if let imageData = image.jpegData(compressionQuality: 0.8) {
diff --git a/Poppool/Poppool/Infrastructure/NetworkLayer/EndPoint/RequestEndpoint.swift b/Poppool/DataLayer/Data/Data/Network/EndPoint/RequestEndpoint.swift
similarity index 100%
rename from Poppool/Poppool/Infrastructure/NetworkLayer/EndPoint/RequestEndpoint.swift
rename to Poppool/DataLayer/Data/Data/Network/EndPoint/RequestEndpoint.swift
diff --git a/Poppool/Poppool/Infrastructure/NetworkLayer/Interceptor/TokenInterceptor.swift b/Poppool/DataLayer/Data/Data/Network/Interceptor/TokenInterceptor.swift
similarity index 77%
rename from Poppool/Poppool/Infrastructure/NetworkLayer/Interceptor/TokenInterceptor.swift
rename to Poppool/DataLayer/Data/Data/Network/Interceptor/TokenInterceptor.swift
index 9b4d8c55..2f1c68dc 100644
--- a/Poppool/Poppool/Infrastructure/NetworkLayer/Interceptor/TokenInterceptor.swift
+++ b/Poppool/DataLayer/Data/Data/Network/Interceptor/TokenInterceptor.swift
@@ -1,22 +1,18 @@
-//
-// TokenInterceptor.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 10/14/24.
-//
-
import Foundation
+
+import Infrastructure
+
import Alamofire
import RxSwift
final class TokenInterceptor: RequestInterceptor {
-
+
func adapt(
_ urlRequest: URLRequest,
for session: Session,
completion: @escaping (Result) -> Void) {
- Logger.log(message: "TokenInterceptor Adapt Token", category: .network)
- let keyChainService = KeyChainService()
+ Logger.log("TokenInterceptor Adapt Token", category: .network)
+ @Dependency var keyChainService: KeyChainService
var urlRequest = urlRequest
let accessTokenResult = keyChainService.fetchToken(type: .accessToken)
switch accessTokenResult {
@@ -29,14 +25,14 @@ final class TokenInterceptor: RequestInterceptor {
completion(.success(urlRequest))
}
}
-
+
func retry(
_ request: Request,
for session: Session,
dueTo error: any Error,
completion: @escaping (RetryResult) -> Void
) {
- Logger.log(message: "TokenInterceptor Retry Start", category: .network)
+ Logger.log("TokenInterceptor Retry Start", category: .network)
completion(.doNotRetry)
}
}
diff --git a/Poppool/Poppool/Infrastructure/NetworkLayer/Provider/Provider.swift b/Poppool/DataLayer/Data/Data/Network/Provider/Provider.swift
similarity index 91%
rename from Poppool/Poppool/Infrastructure/NetworkLayer/Provider/Provider.swift
rename to Poppool/DataLayer/Data/Data/Network/Provider/Provider.swift
index edc12bfd..5567cb93 100644
--- a/Poppool/Poppool/Infrastructure/NetworkLayer/Provider/Provider.swift
+++ b/Poppool/DataLayer/Data/Data/Network/Provider/Provider.swift
@@ -1,17 +1,10 @@
-//
-// Provider.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 8/16/24.
-//
-
import Foundation
-import RxSwift
import Alamofire
+import RxSwift
+
+public protocol Provider {
-protocol Provider {
-
/// 네트워크 요청을 수행하고 결과를 반환하는 메서드
/// - Parameters:
/// - endpoint: 요청할 엔드포인트
@@ -22,7 +15,7 @@ protocol Provider {
with endpoint: E,
interceptor: RequestInterceptor?
) -> Observable where R == E.Response
-
+
/// 네트워크 요청을 수행하고 결과를 반환하는 메서드
/// - Parameters:
/// - request: 요청할 Requestable 객체
@@ -33,7 +26,7 @@ protocol Provider {
with request: E,
interceptor: RequestInterceptor?
) -> Completable
-
+
/// 이미지와 데이터를 `multipart/form-data`로 업로드하는 메서드
func uploadImages(
with request: MultipartEndPoint,
diff --git a/Poppool/Poppool/Infrastructure/NetworkLayer/Provider/ProviderImpl.swift b/Poppool/DataLayer/Data/Data/Network/Provider/ProviderImpl.swift
similarity index 67%
rename from Poppool/Poppool/Infrastructure/NetworkLayer/Provider/ProviderImpl.swift
rename to Poppool/DataLayer/Data/Data/Network/Provider/ProviderImpl.swift
index efa81ca6..e46126b9 100644
--- a/Poppool/Poppool/Infrastructure/NetworkLayer/Provider/ProviderImpl.swift
+++ b/Poppool/DataLayer/Data/Data/Network/Provider/ProviderImpl.swift
@@ -1,20 +1,18 @@
-//
-// ProviderImpl.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 8/16/24.
-//
-
import Foundation
-import RxSwift
+
+import Infrastructure
+
import Alamofire
+import RxSwift
-final class ProviderImpl: Provider {
+public final class ProviderImpl: Provider {
private let disposeBag = DisposeBag()
var timeoutTimer: Timer?
- func requestData(
+ public init(timeoutTimer: Timer? = nil) { self.timeoutTimer = timeoutTimer }
+
+ public func requestData(
with endpoint: E,
interceptor: RequestInterceptor? = nil
) -> Observable where R == E.Response {
@@ -24,22 +22,11 @@ final class ProviderImpl: Provider {
/// 1) endpoint -> urlRequest 생성
let urlRequest = try endpoint.getUrlRequest()
- Logger.log(
- message: """
- [Provider] 최종 요청 URL:
- - URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
- - Method: \(urlRequest.httpMethod ?? "알 수 없음")
- - Headers: \(urlRequest.allHTTPHeaderFields ?? [:])
- 요청 시각: \(Date())
- """,
- category: .debug
- )
-
let request = AF.request(urlRequest, interceptor: interceptor)
.validate()
.responseData { [weak self] response in
Logger.log(
- message: """
+ """
[Provider] 응답 수신:
- URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
- 응답 시각: \(Date())
@@ -50,9 +37,13 @@ final class ProviderImpl: Provider {
case .success(let data):
// 빈 응답 처리
if R.self == EmptyResponse.self && data.isEmpty {
- observer.onNext(EmptyResponse() as! R)
- observer.onCompleted()
- return
+ if let response = EmptyResponse() as? R {
+ observer.onNext(response)
+ observer.onCompleted()
+ return
+ } else {
+ observer.onError(NetworkError.decodeError)
+ }
}
do {
// JSON 디코딩
@@ -61,14 +52,14 @@ final class ProviderImpl: Provider {
observer.onCompleted()
} catch {
Logger.log(
- message: "디코딩 실패: \(error.localizedDescription)",
+ "디코딩 실패: \(error.localizedDescription)",
category: .error
)
observer.onError(NetworkError.decodeError)
}
case .failure(let error):
- Logger.log(message: "요청 실패 Error:\(error)", category: .error)
+ Logger.log("요청 실패 Error:\(error)", category: .error)
observer.onError(error)
}
}
@@ -78,14 +69,14 @@ final class ProviderImpl: Provider {
}
} catch {
- Logger.log(message: "[Provider] URLRequest 생성 실패: \(error.localizedDescription)", category: .error)
+ Logger.log("[Provider] URLRequest 생성 실패: \(error.localizedDescription)", category: .error)
observer.onError(NetworkError.urlRequest(error))
return Disposables.create()
}
}
}
- func request(
+ public func request(
with request: E,
interceptor: RequestInterceptor? = nil
) -> Completable {
@@ -99,19 +90,9 @@ final class ProviderImpl: Provider {
do {
let urlRequest = try request.getUrlRequest()
- Logger.log(
- message: """
- [Provider] 최종 요청 URL(Completable):
- - URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
- - Method: \(urlRequest.httpMethod ?? "알 수 없음")
- 요청 시각: \(Date())
- """,
- category: .debug
- )
-
self.executeRequest(urlRequest, interceptor: interceptor) { response in
Logger.log(
- message: "응답 시각 :\(Date())",
+ "응답 시각 :\(Date())",
category: .network
)
@@ -121,7 +102,7 @@ final class ProviderImpl: Provider {
accessToken = accessToken.replacingOccurrences(of: "Bearer ", with: "")
refreshToken = refreshToken.replacingOccurrences(of: "Bearer ", with: "")
- let keyChainService = KeyChainService()
+ @Dependency var keyChainService: KeyChainService
keyChainService.saveToken(type: .accessToken, value: accessToken)
keyChainService.saveToken(type: .refreshToken, value: refreshToken)
}
@@ -130,12 +111,12 @@ final class ProviderImpl: Provider {
case .success:
observer(.completed)
case .failure(let error):
- Logger.log(message: "요청 실패 Error:\(error)", category: .error)
+ Logger.log("요청 실패 Error:\(error)", category: .error)
observer(.error(self.handleRequestError(response: response, error: error)))
}
}
} catch {
- Logger.log(message: "[Provider] URLRequest 생성 실패 (Completable): \(error.localizedDescription)", category: .error)
+ Logger.log("[Provider] URLRequest 생성 실패 (Completable): \(error.localizedDescription)", category: .error)
observer(.error(NetworkError.urlRequest(error)))
}
@@ -144,7 +125,7 @@ final class ProviderImpl: Provider {
}
// multipart 업로드는 기존 코드와 동일
- func uploadImages(
+ public func uploadImages(
with request: MultipartEndPoint,
interceptor: RequestInterceptor? = nil
) -> Completable {
@@ -156,23 +137,15 @@ final class ProviderImpl: Provider {
do {
let urlRequest = try request.asURLRequest()
- Logger.log(
- message: """
- [Provider] 이미지 업로드 요청:
- - URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
- - Method: \(urlRequest.httpMethod ?? "알 수 없음")
- """,
- category: .network
- )
AF.upload(multipartFormData: { multipartFormData in
request.asMultipartFormData(multipartFormData: multipartFormData)
- Logger.log(message: "업로드 시각 :\(Date())", category: .network)
+ Logger.log("업로드 시각 :\(Date())", category: .network)
}, with: urlRequest, interceptor: interceptor)
.validate()
.response { response in
Logger.log(
- message: "이미지 업로드 응답 시각 :\(Date())",
+ "이미지 업로드 응답 시각 :\(Date())",
category: .network
)
switch response.result {
@@ -198,15 +171,6 @@ private extension ProviderImpl {
interceptor: RequestInterceptor?,
completion: @escaping (AFDataResponse) -> Void
) {
- // 여기서도 최종 URL 찍을 수 있음
- Logger.log(
- message: """
- [Provider] executeRequest:
- - URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
- 요청 시각: \(Date())
- """,
- category: .debug
- )
AF.request(urlRequest, interceptor: interceptor)
.validate()
diff --git a/Poppool/Poppool/Infrastructure/AppleLoginService.swift b/Poppool/DataLayer/Data/Data/Network/Service/AppleLoginService.swift
similarity index 68%
rename from Poppool/Poppool/Infrastructure/AppleLoginService.swift
rename to Poppool/DataLayer/Data/Data/Network/Service/AppleLoginService.swift
index e58e20b5..a119d861 100644
--- a/Poppool/Poppool/Infrastructure/AppleLoginService.swift
+++ b/Poppool/DataLayer/Data/Data/Network/Service/AppleLoginService.swift
@@ -1,29 +1,27 @@
-//
-// AppleLoginService.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 8/20/24.
-//
+import DomainInterface
+import Infrastructure
-import RxSwift
import AuthenticationServices
+import RxSwift
+
+public final class AppleLoginService: NSObject, AuthServiceable {
+
+ public override init() { }
-final class AppleLoginService: NSObject, AuthServiceable {
-
// 사용자 자격 증명 정보를 방출할 subject
private var authServiceResponse: PublishSubject = .init()
-
+
func fetchUserCredential() -> Observable {
performRequest()
return authServiceResponse
}
-
+
// Apple 인증 요청을 수행하는 함수
private func performRequest() {
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.fullName, .email]
-
+
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
@@ -34,23 +32,21 @@ final class AppleLoginService: NSObject, AuthServiceable {
extension AppleLoginService: ASAuthorizationControllerPresentationContextProviding,
ASAuthorizationControllerDelegate {
// 인증 컨트롤러의 프레젠테이션 앵커를 반환하는 함수
- func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
+ public func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
let scenes = UIApplication.shared.connectedScenes
let windowSecne = scenes.first as? UIWindowScene
guard let window = windowSecne?.windows.first else {
Logger.log(
- message: "\(#function) UIWindow fetch Fail",
- category: .error,
- fileName: #file,
- line: #line
+ "\(#function) UIWindow fetch Fail",
+ category: .error
)
return UIWindow()
}
return window
}
-
+
// 인증 성공 시 호출되는 함수
- func authorizationController(
+ public func authorizationController(
controller: ASAuthorizationController,
didCompleteWithAuthorization authorization: ASAuthorization
) {
@@ -58,49 +54,36 @@ extension AppleLoginService: ASAuthorizationControllerPresentationContextProvidi
case let appleIDCredential as ASAuthorizationAppleIDCredential:
guard let idToken = appleIDCredential.identityToken else {
// 토큰이 없는 경우 오류 방출
- Logger.log(
- message: "AppleLogin Token is Not Found",
- category: .error,
- fileName: #file,
- line: #line
- )
- authServiceResponse.onError(AuthError.unknownError)
+ authServiceResponse.onError(AuthError.unknownError(description: "AppleLogin Token is Not Found"))
return
}
guard let idToken = String(data: idToken, encoding: .utf8) else {
- Logger.log(
- message: "AppleLogin Token Convert Fail",
- category: .error,
- fileName: #file,
- line: #line
- )
- authServiceResponse.onError(AuthError.unknownError)
+ // 토큰 convert가 실패할 경우 오류 방출
+ authServiceResponse.onError(AuthError.unknownError(description: "AppleLogin Token Convert Fail"))
return
}
guard let authorizationCode = appleIDCredential.authorizationCode else {
return
}
-
+
guard let convertAuthorizationCode = String(data: authorizationCode, encoding: .utf8) else {
return
}
- Logger.log(message: "IDToken: \(idToken)", category: .info)
- Logger.log(message: "Auth Code: \(convertAuthorizationCode)", category: .info)
+ Logger.log("IDToken: \(idToken)", category: .info)
+ Logger.log("Auth Code: \(convertAuthorizationCode)", category: .info)
authServiceResponse.onNext(.init(idToken: idToken, authorizationCode: convertAuthorizationCode))
default:
break
}
}
// 인증 실패 시 호출되는 함수
- func authorizationController(
+ public func authorizationController(
controller: ASAuthorizationController,
didCompleteWithError error: Error
) {
Logger.log(
- message: "AppleLogin Fail",
- category: .error,
- fileName: #file,
- line: #line
+ "AppleLogin Fail",
+ category: .error
)
authServiceResponse.onError(error)
}
diff --git a/Poppool/Poppool/Infrastructure/AuthServiceable.swift b/Poppool/DataLayer/Data/Data/Network/Service/AuthServiceable.swift
similarity index 50%
rename from Poppool/Poppool/Infrastructure/AuthServiceable.swift
rename to Poppool/DataLayer/Data/Data/Network/Service/AuthServiceable.swift
index 79c2330e..ca1cc728 100644
--- a/Poppool/Poppool/Infrastructure/AuthServiceable.swift
+++ b/Poppool/DataLayer/Data/Data/Network/Service/AuthServiceable.swift
@@ -1,11 +1,6 @@
-//
-// AuthService.swift
-// MomsVillage
-//
-// Created by SeoJunYoung on 8/22/24.
-//
+import Foundation
-import UIKit
+import DomainInterface
import RxSwift
@@ -15,14 +10,7 @@ protocol AuthServiceable: AnyObject {
func fetchUserCredential() -> Observable
}
-struct AuthServiceResponse: Encodable {
- var idToken: String?
- var authorizationCode: String?
- var kakaoUserId: Int64?
- var kakaoAccessToken: String?
-}
-
enum AuthError: Error {
case notInstalled
- case unknownError
+ case unknownError(description: String?)
}
diff --git a/Poppool/DataLayer/Data/Data/Network/Service/KakaoLoginService.swift b/Poppool/DataLayer/Data/Data/Network/Service/KakaoLoginService.swift
new file mode 100644
index 00000000..4427a467
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/Network/Service/KakaoLoginService.swift
@@ -0,0 +1,104 @@
+import DomainInterface
+import Infrastructure
+
+import KakaoSDKAuth
+import KakaoSDKUser
+import RxSwift
+
+public final class KakaoLoginService: AuthServiceable {
+
+ public init() { }
+
+ var disposeBag = DisposeBag()
+
+ func unlink() -> Observable {
+ return Observable.create { observer in
+ UserApi.shared.unlink { error in
+ if let error = error {
+ observer.onNext(())
+ Logger.log(error.localizedDescription, category: .error)
+ } else {
+ observer.onNext(())
+ observer.onCompleted()
+ }
+ }
+
+ return Disposables.create()
+ }
+ }
+
+ public func fetchUserCredential() -> Observable {
+ return Observable.create { [weak self] observer in
+ guard let self else {
+ Logger.log(
+ "KakaoTalk login Error",
+ category: .error
+ )
+ return Disposables.create()
+ }
+
+ // 카카오톡 설치 유무 확인
+ guard UserApi.isKakaoTalkLoginAvailable() else {
+ Logger.log(
+ "KakaoTalk is not install",
+ category: .error
+ )
+
+ // 카카오톡 미설치시 웹으로 인증 시도
+ loginWithKakaoTalkWeb(observer: observer)
+ return Disposables.create()
+ }
+
+ // 카카오톡 설치시 앱으로 인증 시도
+ loginWithKakaoTalkApp(observer: observer)
+
+ return Disposables.create()
+ }
+ }
+}
+
+private extension KakaoLoginService {
+
+ /// 제공된 액세스 토큰을 사용하여 사용자의 카카오 ID를 가져옵니다.
+ /// - Parameters:
+ /// - observer: 인증 응답을 처리할 옵저버.
+ /// - accessToken: 카카오 로그인 과정에서 얻은 액세스 토큰.
+ func fetchUserId(observer: AnyObserver, accessToken: String) {
+ UserApi.shared.me { user, error in
+ if let error = error {
+ observer.onError(AuthError.unknownError(description: error.localizedDescription))
+ } else {
+ observer.onNext(.init(kakaoUserId: user?.id, kakaoAccessToken: accessToken))
+ observer.onCompleted()
+ }
+ }
+ }
+
+ /// 카카오톡 앱을 사용하여 로그인하고 액세스 토큰을 가져옵니다.
+ /// - Parameter observer: 인증 응답을 처리할 옵저버.
+ func loginWithKakaoTalkApp(observer: AnyObserver) {
+ UserApi.shared.loginWithKakaoTalk { [weak self] oauthToken, error in
+ if let error = error {
+ observer.onError(AuthError.unknownError(description: error.localizedDescription))
+ } else {
+ if let accessToken = oauthToken?.accessToken {
+ self?.fetchUserId(observer: observer, accessToken: accessToken)
+ }
+ }
+ }
+ }
+
+ /// 카카오톡 웹을 사용하여 로그인하고 액세스 토큰을 가져옵니다.
+ /// - Parameter observer: 인증 응답을 처리할 옵저버.
+ func loginWithKakaoTalkWeb(observer: AnyObserver) {
+ UserApi.shared.loginWithKakaoAccount { [weak self] (oauthToken, error) in
+ if let error = error {
+ observer.onError(AuthError.unknownError(description: error.localizedDescription))
+ } else {
+ if let accessToken = oauthToken?.accessToken {
+ self?.fetchUserId(observer: observer, accessToken: accessToken)
+ }
+ }
+ }
+ }
+}
diff --git a/Poppool/Poppool/Infrastructure/PreSignedService/PreSignedService.swift b/Poppool/DataLayer/Data/Data/Network/Service/PreSignedService.swift
similarity index 77%
rename from Poppool/Poppool/Infrastructure/PreSignedService/PreSignedService.swift
rename to Poppool/DataLayer/Data/Data/Network/Service/PreSignedService.swift
index 73343587..017c76c4 100644
--- a/Poppool/Poppool/Infrastructure/PreSignedService/PreSignedService.swift
+++ b/Poppool/DataLayer/Data/Data/Network/Service/PreSignedService.swift
@@ -1,16 +1,10 @@
-//
-// PreSignedService.swift
-// PopPool
-//
-// Created by SeoJunYoung on 9/5/24.
-//
-
-import Foundation
import UIKit
-import RxSwift
-import RxCocoa
+import Infrastructure
+
import Alamofire
+import RxCocoa
+import RxSwift
class ImageCache {
static let shared = NSCache()
@@ -24,9 +18,9 @@ class PreSignedService {
}
let tokenInterceptor = TokenInterceptor()
-
- let provider = ProviderImpl()
-
+
+ @Dependency private var provider: Provider
+
let disposeBag = DisposeBag()
func tryDelete(targetPaths: PresignedURLRequestDTO) -> Completable {
@@ -35,20 +29,20 @@ class PreSignedService {
}
func tryUpload(datas: [PresignedURLRequest]) -> Single {
- Logger.log(message: "tryUpload 호출됨 - 요청 데이터 수: \(datas.count)", category: .debug)
+ Logger.log("tryUpload 호출됨 - 요청 데이터 수: \(datas.count)", category: .debug)
return Single.create { [weak self] observer in
- Logger.log(message: "tryUpload 내부 흐름 시작", category: .debug)
+ Logger.log("tryUpload 내부 흐름 시작", category: .debug)
guard let self = self else {
- Logger.log(message: "self가 nil입니다. 작업을 중단합니다.", category: .error)
+ Logger.log("self가 nil입니다. 작업을 중단합니다.", category: .error)
return Disposables.create()
}
// 1. 업로드 링크 요청
self.getUploadLinks(request: .init(objectKeyList: datas.map { $0.filePath }))
.subscribe { response in
- Logger.log(message: "getUploadLinks 성공: \(response.preSignedUrlList)", category: .debug)
+ Logger.log("getUploadLinks 성공: \(response.preSignedUrlList)", category: .debug)
let responseList = response.preSignedUrlList
let inputList = datas
@@ -57,23 +51,23 @@ class PreSignedService {
let requestList = zip(responseList, inputList).compactMap { zipResponse in
let urlResponse = zipResponse.0
let inputResponse = zipResponse.1
- Logger.log(message: "업로드 준비 - URL: \(urlResponse.preSignedUrl)", category: .debug)
+ Logger.log("업로드 준비 - URL: \(urlResponse.preSignedUrl)", category: .debug)
return self.uploadFromS3(url: urlResponse.preSignedUrl, image: inputResponse.image)
}
// 3. 병렬 업로드 실행
Single.zip(requestList)
.subscribe(onSuccess: { _ in
- Logger.log(message: "모든 이미지 업로드 성공", category: .info)
+ Logger.log("모든 이미지 업로드 성공", category: .info)
observer(.success(()))
}, onFailure: { error in
- Logger.log(message: "이미지 업로드 실패: \(error.localizedDescription)", category: .error)
+ Logger.log("이미지 업로드 실패: \(error.localizedDescription)", category: .error)
observer(.failure(error))
})
.disposed(by: self.disposeBag)
} onError: { error in
- Logger.log(message: "getUploadLinks 실패: \(error.localizedDescription)", category: .error)
+ Logger.log("getUploadLinks 실패: \(error.localizedDescription)", category: .error)
observer(.failure(error))
}
.disposed(by: self.disposeBag)
@@ -82,7 +76,6 @@ class PreSignedService {
}
}
-
func tryDownload(filePaths: [String]) -> Single<[UIImage]> {
return Single.create { [weak self] observer in
@@ -130,16 +123,16 @@ class PreSignedService {
return filePaths.compactMap { imageMap[$0] }
}
.subscribe(onSuccess: { sortedImages in
- Logger.log(message: "All images downloaded successfully", category: .info)
+ Logger.log("All images downloaded successfully", category: .info)
observer(.success(sortedImages))
}, onFailure: { error in
- Logger.log(message: "Image download failed: \(error.localizedDescription)", category: .error)
+ Logger.log("Image download failed: \(error.localizedDescription)", category: .error)
observer(.failure(error))
})
.disposed(by: self.disposeBag)
} onError: { error in
- Logger.log(message: "getDownloadLinks Fail: \(error.localizedDescription)", category: .error)
+ Logger.log("getDownloadLinks Fail: \(error.localizedDescription)", category: .error)
observer(.failure(error))
}
.disposed(by: disposeBag)
@@ -149,14 +142,13 @@ class PreSignedService {
}
}
-
private extension PreSignedService {
func uploadFromS3(url: String, image: UIImage) -> Single {
return Single.create { single in
if let imageData = image.jpegData(compressionQuality: 0),
let url = URL(string: url) {
- Logger.log(message: "S3 업로드 요청 URL: \(url.absoluteString)", category: .debug)
+ Logger.log("S3 업로드 요청 URL: \(url.absoluteString)", category: .debug)
let headers: HTTPHeaders = [
"Content-Type": "image/jpeg"
@@ -164,19 +156,19 @@ private extension PreSignedService {
AF.upload(imageData, to: url, method: .put, headers: headers)
.response { response in
- Logger.log(message: "S3 업로드 응답 상태: \(response.response?.statusCode ?? -1)", category: .debug)
+ Logger.log("S3 업로드 응답 상태: \(response.response?.statusCode ?? -1)", category: .debug)
switch response.result {
case .success:
- Logger.log(message: "S3 업로드 성공 - URL: \(url.absoluteString)", category: .info)
+ Logger.log("S3 업로드 성공 - URL: \(url.absoluteString)", category: .info)
single(.success(()))
case .failure(let error):
- Logger.log(message: "S3 업로드 실패: \(error.localizedDescription)", category: .error)
+ Logger.log("S3 업로드 실패: \(error.localizedDescription)", category: .error)
single(.failure(error))
}
}
return Disposables.create()
} else {
- Logger.log(message: "S3 업로드 실패 - 잘못된 URL 또는 데이터", category: .error)
+ Logger.log("S3 업로드 실패 - 잘못된 URL 또는 데이터", category: .error)
single(.failure(NSError(domain: "InvalidDataOrURL", code: -1, userInfo: nil)))
return Disposables.create()
}
@@ -204,40 +196,36 @@ private extension PreSignedService {
}
}
-
-
func getUploadLinks(request: PresignedURLRequestDTO) -> Observable {
- Logger.log(message: "Presigned URL 생성 요청 데이터: \(request)", category: .debug)
- let provider = ProviderImpl()
+ Logger.log("Presigned URL 생성 요청 데이터: \(request)", category: .debug)
let endPoint = PreSignedAPIEndPoint.presigned_upload(request: request)
return provider.requestData(with: endPoint, interceptor: tokenInterceptor)
.do(onNext: { response in
- Logger.log(message: "Presigned URL 응답 데이터: \(response.preSignedUrlList)", category: .debug)
+ Logger.log("Presigned URL 응답 데이터: \(response.preSignedUrlList)", category: .debug)
}, onError: { error in
- Logger.log(message: "Presigned URL 요청 실패: \(error.localizedDescription)", category: .error)
+ Logger.log("Presigned URL 요청 실패: \(error.localizedDescription)", category: .error)
})
}
func getDownloadLinks(request: PresignedURLRequestDTO) -> Observable {
- let provider = ProviderImpl()
let endPoint = PreSignedAPIEndPoint.presigned_download(request: request)
return provider.requestData(with: endPoint, interceptor: tokenInterceptor)
}
}
extension PreSignedService {
func deleteImage(filePath: String, completion: @escaping (Result) -> Void) {
- Logger.log(message: "이미지 삭제 시작 - 경로: \(filePath)", category: .debug)
+ Logger.log("이미지 삭제 시작 - 경로: \(filePath)", category: .debug)
let request = PresignedURLRequestDTO(objectKeyList: [filePath])
tryDelete(targetPaths: request)
.subscribe(
onCompleted: {
- Logger.log(message: "이미지 삭제 성공: \(filePath)", category: .debug)
+ Logger.log("이미지 삭제 성공: \(filePath)", category: .debug)
completion(.success(()))
},
onError: { error in
- Logger.log(message: "이미지 삭제 실패: \(error.localizedDescription)", category: .error)
+ Logger.log("이미지 삭제 실패: \(error.localizedDescription)", category: .error)
completion(.failure(error))
}
)
@@ -291,21 +279,20 @@ extension PreSignedService {
}
}
func fullImageURL(from filePath: String) -> URL? {
- let baseURL = Secrets.popPoolS3BaseURL.rawValue
+ let baseURL = Secrets.popPoolS3BaseURL
// URL 인코딩 처리를 더 엄격하게
guard let encodedPath = filePath
.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)?
.replacingOccurrences(of: "+", with: "%2B") else {
- Logger.log(message: "URL 인코딩 실패: \(filePath)", category: .error)
+ Logger.log("URL 인코딩 실패: \(filePath)", category: .error)
return nil
}
let fullString = baseURL + encodedPath
- Logger.log(message: "생성된 URL: \(fullString)", category: .debug)
+ Logger.log("생성된 URL: \(fullString)", category: .debug)
return URL(string: fullString)
}
}
-
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/AdminRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/AdminRepositoryImpl.swift
new file mode 100644
index 00000000..838ddbad
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/AdminRepositoryImpl.swift
@@ -0,0 +1,181 @@
+import Foundation
+
+import DomainInterface
+
+import Alamofire
+import RxSwift
+
+public final class AdminRepositoryImpl: AdminRepository {
+
+ // MARK: - Properties
+ private let provider: Provider
+ private let tokenInterceptor = TokenInterceptor()
+
+ // MARK: - Init
+ public init(provider: Provider) {
+ self.provider = provider
+ }
+
+ // MARK: - Store Methods
+ public func fetchStoreList(query: String?, page: Int, size: Int) -> Observable<[AdminStore]> {
+ let endpoint = AdminAPIEndpoint.fetchStoreList(
+ query: query,
+ page: page,
+ size: size
+ )
+ return provider.requestData(
+ with: endpoint,
+ interceptor: tokenInterceptor
+ )
+ .map { response in
+ response.popUpStoreList?.map {
+ AdminStore(id: $0.id, name: $0.name, categoryName: $0.categoryName, mainImageUrl: $0.mainImageUrl)
+ } ?? []
+ }
+ }
+
+ public func fetchStoreDetail(id: Int64) -> Observable {
+ let endpoint = AdminAPIEndpoint.fetchStoreDetail(id: id)
+ return provider.requestData(
+ with: endpoint,
+ interceptor: tokenInterceptor
+ )
+ .map { dto in
+ AdminStoreDetail(
+ id: dto.id,
+ name: dto.name,
+ categoryId: Int(dto.categoryId),
+ categoryName: dto.categoryName,
+ description: dto.desc,
+ address: dto.address,
+ startDate: dto.startDate,
+ endDate: dto.endDate,
+ createUserId: dto.createUserId,
+ createDateTime: dto.createDateTime,
+ mainImageUrl: dto.mainImageUrl,
+ bannerYn: dto.bannerYn,
+ images: dto.imageList.map {
+ AdminStoreDetail.StoreImage(
+ id: $0.id,
+ imageUrl: $0.imageUrl
+ )
+ },
+ latitude: dto.latitude,
+ longitude: dto.longitude,
+ markerTitle: dto.markerTitle,
+ markerSnippet: dto.markerSnippet
+ )
+ }
+ .catch { error in
+ if case .responseSerializationFailed = error as? AFError {
+ return Observable.empty()
+ }
+ throw error
+ }
+ }
+
+ public func createStore(params: CreateStoreParams) -> Completable {
+ let dto = CreatePopUpStoreRequestDTO(
+ name: params.name,
+ categoryId: Int64(params.categoryId),
+ desc: params.desc,
+ address: params.address,
+ startDate: params.startDate,
+ endDate: params.endDate,
+ mainImageUrl: params.mainImageUrl,
+ imageUrlList: params.imageUrlList,
+ latitude: params.latitude,
+ longitude: params.longitude,
+ markerTitle: params.markerTitle,
+ markerSnippet: params.markerSnippet,
+ startDateBeforeEndDate: params.startDateBeforeEndDate
+ )
+ let endpoint = AdminAPIEndpoint.createStore(request: dto)
+ return provider.request(with: endpoint, interceptor: tokenInterceptor)
+ }
+
+ public func updateStore(params: UpdateStoreParams) -> Completable {
+ let dto = UpdatePopUpStoreRequestDTO(
+ popUpStore: UpdatePopUpStoreRequestDTO.PopUpStore(
+ id: params.id,
+ name: params.name,
+ categoryId: Int64(params.categoryId),
+ desc: params.desc,
+ address: params.address,
+ startDate: params.startDate,
+ endDate: params.endDate,
+ mainImageUrl: params.mainImageUrl,
+ bannerYn: !params.mainImageUrl.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty,
+ imageUrl: params.imageUrlList.compactMap { $0 },
+ startDateBeforeEndDate: params.startDateBeforeEndDate
+ ),
+ location: UpdatePopUpStoreRequestDTO.Location(
+ latitude: params.latitude,
+ longitude: params.longitude,
+ markerTitle: params.markerTitle,
+ markerSnippet: params.markerSnippet
+ ),
+ imagesToAdd: params.imageUrlList.compactMap { $0 },
+ imagesToDelete: params.imagesToDelete
+ )
+ let endpoint = AdminAPIEndpoint.updateStore(request: dto)
+ return provider.request(with: endpoint, interceptor: tokenInterceptor)
+ }
+
+ public func deleteStore(id: Int64) -> Completable {
+ let endpoint = AdminAPIEndpoint.deleteStore(id: id)
+ return provider.request(with: endpoint, interceptor: tokenInterceptor)
+ }
+
+ // MARK: - Notice Methods
+ public func createNotice(params: CreateNoticeParams) -> Completable {
+ let dto = CreateNoticeRequestDTO(
+ title: params.title,
+ content: params.content,
+ imageUrlList: params.imageUrlList
+ )
+ let endpoint = AdminAPIEndpoint.createNotice(request: dto)
+ return provider.request(with: endpoint, interceptor: tokenInterceptor)
+ }
+
+ public func updateNotice(params: UpdateNoticeParams) -> Completable {
+ let dto = UpdateNoticeRequestDTO(
+ title: params.title,
+ content: params.content,
+ imageUrlList: params.imageUrlList,
+ imagesToDelete: params.imagesToDelete
+ )
+ let endpoint = AdminAPIEndpoint.updateNotice(id: params.id, request: dto)
+ return provider.request(with: endpoint, interceptor: tokenInterceptor)
+ }
+
+ public func deleteNotice(id: Int64) -> Completable {
+ let endpoint = AdminAPIEndpoint.deleteNotice(id: id)
+ return provider.request(with: endpoint, interceptor: tokenInterceptor)
+ }
+}
+
+// Helper extension - keeping this for utility purposes
+extension GetAdminPopUpStoreDetailResponseDTO {
+ static var empty: GetAdminPopUpStoreDetailResponseDTO {
+ return GetAdminPopUpStoreDetailResponseDTO(
+ id: 0,
+ name: "",
+ categoryId: 0,
+ categoryName: "",
+ desc: "",
+ address: "",
+ startDate: "",
+ endDate: "",
+ createUserId: "",
+ createDateTime: "",
+ mainImageUrl: "",
+ bannerYn: false,
+ imageList: [],
+ latitude: 0.0,
+ longitude: 0.0,
+ markerTitle: "",
+ markerSnippet: ""
+ )
+ }
+}
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/AppleLoginRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/AppleLoginRepositoryImpl.swift
new file mode 100644
index 00000000..8e306c22
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/AppleLoginRepositoryImpl.swift
@@ -0,0 +1,15 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public class AppleLoginRepositoryImpl: AppleLoginRepository {
+ private let service = AppleLoginService()
+
+ public init() { }
+
+ public func fetchUserCredential() -> Observable {
+ return service.fetchUserCredential()
+ }
+}
diff --git a/Poppool/Poppool/Data/Repository/AuthAPIRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/AuthAPIRepositoryImpl.swift
similarity index 50%
rename from Poppool/Poppool/Data/Repository/AuthAPIRepositoryImpl.swift
rename to Poppool/DataLayer/Data/Data/RepositoryImpl/AuthAPIRepositoryImpl.swift
index 7c9e2628..0449cdf0 100644
--- a/Poppool/Poppool/Data/Repository/AuthAPIRepositoryImpl.swift
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/AuthAPIRepositoryImpl.swift
@@ -1,24 +1,19 @@
-//
-// AuthRepository.swift
-// Poppool
-//
-// Created by Porori on 11/25/24.
-//
-
import Foundation
+
+import DomainInterface
+
import RxSwift
-final class AuthAPIRepositoryImpl {
-
- var provider: Provider
-
- var tokenInterceptor = TokenInterceptor()
-
- init(provider: Provider) {
+public final class AuthAPIRepositoryImpl: AuthAPIRepository {
+
+ private let provider: Provider
+ private let tokenInterceptor = TokenInterceptor()
+
+ public init(provider: Provider) {
self.provider = provider
}
-
- func tryLogIn(userCredential: Encodable, socialType: String) -> Observable {
+
+ public func tryLogIn(userCredential: Encodable, socialType: String) -> Observable {
let endPoint = AuthAPIEndPoint.auth_tryLogin(with: userCredential, path: socialType)
return provider
.requestData(with: endPoint, interceptor: nil)
@@ -26,9 +21,12 @@ final class AuthAPIRepositoryImpl {
return responseDTO.toDomain()
}
}
-
- func postTokenReissue() -> Observable {
+
+ public func postTokenReissue() -> Observable {
let endPoint = AuthAPIEndPoint.postTokenReissue()
return provider.requestData(with: endPoint, interceptor: tokenInterceptor)
+ .map { responseDTO in
+ return responseDTO.toDomain()
+ }
}
}
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/CategoryRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/CategoryRepositoryImpl.swift
new file mode 100644
index 00000000..5616be38
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/CategoryRepositoryImpl.swift
@@ -0,0 +1,21 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class CategoryRepositoryImpl: CategoryRepository {
+
+ private let provider: Provider
+
+ public init(provider: Provider) {
+ self.provider = provider
+ }
+
+ public func fetchCategoryList() -> Observable<[CategoryResponse]> {
+ let endPoint = CategoryAPIEndpoint.getCategoryList()
+ return provider.requestData(with: endPoint, interceptor: TokenInterceptor()).map { responseDTO in
+ return responseDTO.categoryResponseList.map({ $0.toDomain() })
+ }
+ }
+}
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/CommentAPIRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/CommentAPIRepositoryImpl.swift
new file mode 100644
index 00000000..142b61c0
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/CommentAPIRepositoryImpl.swift
@@ -0,0 +1,40 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class CommentAPIRepositoryImpl: CommentAPIRepository {
+
+ private let provider: Provider
+ private let tokenInterceptor = TokenInterceptor()
+
+ public init(provider: Provider) {
+ self.provider = provider
+ }
+
+ public func postCommentAdd(popUpStoreId: Int64, content: String?, commentType: String?, imageUrlList: [String?]) -> Completable {
+ let requestDTO = PostCommentRequestDTO(popUpStoreId: popUpStoreId, content: content, commentType: commentType, imageUrlList: imageUrlList)
+ let endPoint = CommentAPIEndPoint.postCommentAdd(request: requestDTO)
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func deleteComment(popUpStoreId: Int64, commentId: Int64) -> Completable {
+ let requestDTO = DeleteCommentRequestDTO(popUpStoreId: popUpStoreId, commentId: commentId)
+ let endPoint = CommentAPIEndPoint.deleteComment(request: requestDTO)
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func editComment(popUpStoreId: Int64, commentId: Int64, content: String?, imageUrlList: [String?]?) -> Completable {
+ let dtoList: [PutCommentImageDataRequestDTO]? = imageUrlList?.compactMap { $0 }.map { PutCommentImageDataRequestDTO(imageUrl: $0) }
+
+ let requestDTO = PutCommentRequestDTO(
+ popUpStoreId: popUpStoreId,
+ commentId: commentId,
+ content: content,
+ imageUrlList: dtoList
+ )
+ let endPoint = CommentAPIEndPoint.editComment(request: requestDTO)
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+}
diff --git a/Poppool/Poppool/Data/Repository/HomeAPIRepository.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/HomeAPIRepositoryImpl.swift
similarity index 50%
rename from Poppool/Poppool/Data/Repository/HomeAPIRepository.swift
rename to Poppool/DataLayer/Data/Data/RepositoryImpl/HomeAPIRepositoryImpl.swift
index 17c9a453..c9020451 100644
--- a/Poppool/Poppool/Data/Repository/HomeAPIRepository.swift
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/HomeAPIRepositoryImpl.swift
@@ -1,38 +1,38 @@
-//
-// HomeAPIRepository.swift
-// Poppool
-//
-// Created by Porori on 11/26/24.
-//
-
import Foundation
+
+import DomainInterface
+
import RxSwift
-final class HomeAPIRepository {
-
+public final class HomeAPIRepositoryImpl: HomeAPIRepository {
+
private let provider: Provider
private let tokenInterceptor = TokenInterceptor()
-
- init(provider: Provider) {
+
+ public init(provider: Provider) {
self.provider = provider
}
-
- func fetchHome(request: SortedRequestDTO) -> Observable {
+
+ public func fetchHome(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ let request = HomeSortedRequestDTO(page: page, size: size, sort: sort)
let endPoint = HomeAPIEndpoint.fetchHome(request: request)
return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map({ $0.toDomain() })
}
-
- func fetchCustomPopUp(request: SortedRequestDTO) -> Observable {
+
+ public func fetchCustomPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ let request = HomeSortedRequestDTO(page: page, size: size, sort: sort)
let endPoint = HomeAPIEndpoint.fetchCustomPopUp(request: request)
return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map({ $0.toDomain() })
}
-
- func fetchNewPopUp(request: SortedRequestDTO) -> Observable {
+
+ public func fetchNewPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ let request = HomeSortedRequestDTO(page: page, size: size, sort: sort)
let endPoint = HomeAPIEndpoint.fetchNewPopUp(request: request)
return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map({ $0.toDomain() })
}
-
- func fetchPopularPopUp(request: SortedRequestDTO) -> Observable {
+
+ public func fetchPopularPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ let request = HomeSortedRequestDTO(page: page, size: size, sort: sort)
let endPoint = HomeAPIEndpoint.fetchPopularPopUp(request: request)
return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map({ $0.toDomain() })
}
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/KakaoLoginRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/KakaoLoginRepositoryImpl.swift
new file mode 100644
index 00000000..86145f69
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/KakaoLoginRepositoryImpl.swift
@@ -0,0 +1,15 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public class KakaoLoginRepositoryImpl: KakaoLoginRepository {
+ let service = KakaoLoginService()
+
+ public init() { }
+
+ public func fetchUserCredential() -> Observable {
+ return service.fetchUserCredential()
+ }
+}
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/MapDirectionRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/MapDirectionRepositoryImpl.swift
new file mode 100644
index 00000000..cccd8f73
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/MapDirectionRepositoryImpl.swift
@@ -0,0 +1,20 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class MapDirectionRepositoryImpl: MapDirectionRepository {
+
+ private let provider: Provider
+ private let tokenInterceptor = TokenInterceptor()
+
+ public init(provider: Provider) {
+ self.provider = provider
+ }
+
+ public func getPopUpDirection(popUpStoreId: Int64) -> Observable {
+ let endpoint = FindDirectionEndPoint.fetchDirection(popUpStoreId: popUpStoreId)
+ return provider.requestData(with: endpoint, interceptor: tokenInterceptor).map({ $0.toDomain() })
+ }
+}
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/MapRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/MapRepositoryImpl.swift
new file mode 100644
index 00000000..c6a9ba90
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/MapRepositoryImpl.swift
@@ -0,0 +1,74 @@
+import Foundation
+
+import DomainInterface
+import Infrastructure
+
+import RxSwift
+
+public final class MapRepositoryImpl: MapRepository {
+
+ private let provider: Provider
+
+ public init(provider: Provider) {
+ self.provider = provider
+ }
+
+ public func fetchStoresInBounds(
+ northEastLat: Double,
+ northEastLon: Double,
+ southWestLat: Double,
+ southWestLon: Double,
+ categories: [Int]
+ ) -> Observable<[MapPopUpStore]> {
+ return provider.requestData(
+ with: MapAPIEndpoint.locations_fetchStoresInBounds(
+ northEastLat: northEastLat,
+ northEastLon: northEastLon,
+ southWestLat: southWestLat,
+ southWestLon: southWestLon,
+ categories: categories.map { Int64($0 ) }
+ ),
+ interceptor: TokenInterceptor()
+ )
+ .map { $0.popUpStoreList.map { $0.toDomain() } }
+ }
+
+ public func searchStores(
+ query: String,
+ categories: [Int]
+ ) -> Observable<[MapPopUpStore]> {
+ return provider.requestData(
+ with: MapAPIEndpoint.locations_searchStores(
+ query: query,
+ categories: categories.map { Int64($0 ) }
+ ),
+ interceptor: TokenInterceptor()
+ )
+ .map { $0.popUpStoreList.map { $0.toDomain() } }
+ }
+
+ public func fetchCategories() -> Observable<[CategoryResponse]> {
+ Logger.log("카테고리 목록 요청을 시작합니다.", category: .network)
+
+ return provider.requestData(
+ with: SignUpAPIEndpoint.signUp_getCategoryList(),
+ interceptor: TokenInterceptor()
+ )
+ .do(onNext: { _ in
+ Logger.log(
+ "카테고리 목록 응답 성공",
+ category: .debug
+ )
+ })
+ .map { responseDTO in
+ responseDTO.categoryResponseList.map { $0.toDomain() }
+ }
+ .catch { error in
+ Logger.log(
+ "카테고리 목록 요청 실패: \(error.localizedDescription)",
+ category: .error
+ )
+ throw error
+ }
+ }
+}
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/PopUpAPIRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/PopUpAPIRepositoryImpl.swift
new file mode 100644
index 00000000..782c7880
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/PopUpAPIRepositoryImpl.swift
@@ -0,0 +1,72 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class PopUpAPIRepositoryImpl: PopUpAPIRepository {
+
+ private let provider: Provider
+ private let tokenInterceptor = TokenInterceptor()
+
+ public init(provider: Provider) {
+ self.provider = provider
+ }
+
+ public func postBookmarkPopUp(popUpStoreId: Int64) -> Completable {
+ let request = PostBookmarkPopUpRequestDTO(popUpStoreId: popUpStoreId)
+ let endPoint = UserAPIEndPoint.postBookmarkPopUp(request: request)
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func getClosePopUpList(
+ categories: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?,
+ query: String?,
+ sortCode: String?
+ ) -> Observable {
+ let request = GetSearchPopUpListRequestDTO(categories: categories, page: page, size: size, sort: sort, query: query, sortCode: sortCode)
+ let endPoint = PopUpAPIEndPoint.getClosePopUpList(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getOpenPopUpList(
+ categories: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?,
+ query: String?,
+ sortCode: String?
+ ) -> Observable {
+ let request = GetSearchPopUpListRequestDTO(categories: categories, page: page, size: size, sort: sort, query: query, sortCode: sortCode)
+ let endPoint = PopUpAPIEndPoint.getOpenPopUpList(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getSearchPopUpList(
+ categories: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?,
+ query: String?,
+ sortCode: String?
+ ) -> Observable {
+ let request = GetSearchPopUpListRequestDTO(categories: categories, page: page, size: size, sort: sort, query: query, sortCode: sortCode)
+ let endPoint = PopUpAPIEndPoint.getSearchPopUpList(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getPopUpDetail(commentType: String?, popUpStoreId: Int64, viewCountYn: Bool?) -> Observable {
+ let request = GetPopUpDetailRequestDTO(commentType: commentType, popUpStoreId: popUpStoreId, viewCountYn: viewCountYn)
+ let endPoint = PopUpAPIEndPoint.getPopUpDetail(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getPopUpComment(commentType: String?, page: Int32?, size: Int32?, sort: String?, popUpStoreId: Int64) -> Observable {
+ let request = GetPopUpCommentRequestDTO(commentType: commentType, page: page, size: size, sort: sort, popUpStoreId: popUpStoreId)
+ let endPoint = PopUpAPIEndPoint.getPopUpComment(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+}
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/PreSignedRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/PreSignedRepositoryImpl.swift
new file mode 100644
index 00000000..3c08b22b
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/PreSignedRepositoryImpl.swift
@@ -0,0 +1,31 @@
+import UIKit
+
+import DomainInterface
+
+import RxSwift
+
+public final class PreSignedRepositoryImpl: PreSignedRepository {
+
+ private let service = PreSignedService()
+
+ public init() { }
+
+ public func tryUpload(presignedURLRequest: [(filePath: String, image: UIImage)]) -> Single {
+ return service.tryUpload(datas: presignedURLRequest.map {
+ PreSignedService.PresignedURLRequest(
+ filePath: $0.filePath,
+ image: $0.image
+ )
+ })
+ }
+
+ public func tryDelete(objectKeyList: [String]) -> Completable {
+ return service.tryDelete(
+ targetPaths: PresignedURLRequestDTO(objectKeyList: objectKeyList)
+ )
+ }
+
+ public func fullImageURL(from filePath: String) -> URL? {
+ return service.fullImageURL(from: filePath)
+ }
+}
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/Search/SearchAPIRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/Search/SearchAPIRepositoryImpl.swift
new file mode 100644
index 00000000..1e190673
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/Search/SearchAPIRepositoryImpl.swift
@@ -0,0 +1,41 @@
+import Foundation
+
+import DomainInterface
+import Infrastructure
+
+import RxSwift
+
+public final class SearchAPIRepositoryImpl: SearchAPIRepository {
+
+ private let provider: Provider
+ private let tokenInterceptor = TokenInterceptor()
+ private let userDefaultService: UserDefaultService
+
+ public init(
+ provider: Provider,
+ userDefaultService: UserDefaultService
+ ) {
+ self.provider = provider
+ self.userDefaultService = userDefaultService
+ }
+
+ public func fetchSearchResult(by query: String) -> Observable {
+
+ let request = GetSearchPopupStoreRequestDTO(query: query)
+ let endPoint = SearchAPIEndPoint.getSearchPopUpList(request: request)
+ return provider.requestData(
+ with: endPoint,
+ interceptor: tokenInterceptor
+ )
+ .map { $0.toDomain() }
+ .do { _ in self.saveSearchKeyword(keyword: query) }
+ }
+}
+
+private extension SearchAPIRepositoryImpl {
+ func saveSearchKeyword(keyword: String) {
+ let existingList = userDefaultService.fetchArray(keyType: .searchKeyword) ?? []
+ let updatedList = [keyword] + existingList.filter { $0 != keyword }
+ userDefaultService.save(keyType: .searchKeyword, value: updatedList)
+ }
+}
diff --git a/Poppool/Poppool/Data/Repository/SignUpRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/SignUpRepositoryImpl.swift
similarity index 75%
rename from Poppool/Poppool/Data/Repository/SignUpRepositoryImpl.swift
rename to Poppool/DataLayer/Data/Data/RepositoryImpl/SignUpRepositoryImpl.swift
index 87455fbd..8b769303 100644
--- a/Poppool/Poppool/Data/Repository/SignUpRepositoryImpl.swift
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/SignUpRepositoryImpl.swift
@@ -1,40 +1,36 @@
-//
-// SignUpRepositoryImpl.swift
-// Poppool
-//
-// Created by Porori on 11/25/24.
-//
-
import Foundation
+
+import DomainInterface
+
import RxSwift
-final class SignUpRepositoryImpl {
-
- var provider: Provider
-
- init(provider: Provider) {
+public final class SignUpRepositoryImpl: SignUpRepository {
+
+ private let provider: Provider
+
+ public init(provider: Provider) {
self.provider = provider
}
-
- func checkNickName(nickName: String) -> Observable {
+
+ public func checkNickName(nickName: String) -> Observable {
let endPoint = SignUpAPIEndpoint.signUp_checkNickName(with: .init(nickName: nickName))
return provider.requestData(with: endPoint, interceptor: TokenInterceptor())
}
-
- func fetchCategoryList() -> Observable<[Category]> {
+
+ public func fetchCategoryList() -> Observable<[CategoryResponse]> {
let endPoint = SignUpAPIEndpoint.signUp_getCategoryList()
return provider.requestData(with: endPoint, interceptor: TokenInterceptor()).map { responseDTO in
return responseDTO.categoryResponseList.map({ $0.toDomain() })
}
}
-
- func trySignUp(
+
+ public func trySignUp(
nickName: String,
gender: String,
age: Int32,
socialEmail: String,
socialType: String,
- interests: [Int64],
+ interests: [Int],
appleAuthorizationCode: String?
) -> Completable {
let endPoint = SignUpAPIEndpoint.signUp_trySignUp(with: .init(
diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/UserAPIRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/UserAPIRepositoryImpl.swift
new file mode 100644
index 00000000..ae4713ae
--- /dev/null
+++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/UserAPIRepositoryImpl.swift
@@ -0,0 +1,151 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class UserAPIRepositoryImpl: UserAPIRepository {
+
+ private let provider: Provider
+ private let tokenInterceptor = TokenInterceptor()
+
+ public init(provider: Provider) {
+ self.provider = provider
+ }
+
+ public func postBookmarkPopUp(popUpStoreId: Int64) -> Completable {
+ let endPoint = UserAPIEndPoint.postBookmarkPopUp(request: .init(popUpStoreId: popUpStoreId))
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func deleteBookmarkPopUp(popUpStoreId: Int64) -> Completable {
+ let endPoint = UserAPIEndPoint.deleteBookmarkPopUp(request: .init(popUpStoreId: popUpStoreId))
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func postCommentLike(commentId: Int64) -> Completable {
+ let endPoint = UserAPIEndPoint.postCommentLike(request: .init(commentId: commentId))
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func deleteCommentLike(commentId: Int64) -> Completable {
+ let endPoint = UserAPIEndPoint.deleteCommentLike(request: .init(commentId: commentId))
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func postUserBlock(blockedUserId: String?) -> Completable {
+ let endPoint = UserAPIEndPoint.postUserBlock(request: .init(blockedUserId: blockedUserId))
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func deleteUserBlock(blockedUserId: String?) -> Completable {
+ let endPoint = UserAPIEndPoint.deleteUserBlock(request: .init(blockedUserId: blockedUserId))
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func getOtherUserCommentList(
+ commenterId: String?,
+ commentType: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?
+ ) -> Observable {
+ let request = GetOtherUserCommentListRequestDTO(commenterId: commenterId, commentType: commentType, page: page, size: size, sort: sort)
+ let endPoint = UserAPIEndPoint.getOtherUserCommentPopUpList(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getMyPage() -> Observable {
+ let endPoint = UserAPIEndPoint.getMyPage()
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func postLogout() -> Completable {
+ let endPoint = UserAPIEndPoint.postLogout()
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func getWithdrawlList() -> Observable {
+ let endPoint = UserAPIEndPoint.getWithdrawlList()
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func postWithdrawl(list: [(Int64, String?)]) -> Completable {
+ let endPoint = UserAPIEndPoint.postWithdrawl(request: .init(checkedSurveyList: list.map { .init(id: $0.0, survey: $0.1)}))
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func getMyProfile() -> Observable {
+ let endPoint = UserAPIEndPoint.getMyProfile()
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func putUserTailoredInfo(gender: String?, age: Int32) -> Completable {
+ let endPoint = UserAPIEndPoint.putUserTailoredInfo(request: .init(gender: gender, age: age))
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func putUserCategory(
+ interestCategoriesToAdd: [Int],
+ interestCategoriesToDelete: [Int],
+ interestCategoriesToKeep: [Int]
+ ) -> Completable {
+ let request = PutUserCategoryRequestDTO(
+ interestCategoriesToAdd: interestCategoriesToAdd.map { Int64($0 ) },
+ interestCategoriesToDelete: interestCategoriesToDelete.map { Int64($0 ) },
+ interestCategoriesToKeep: interestCategoriesToKeep.map { Int64($0 ) }
+ )
+ let endPoint = UserAPIEndPoint.putUserCategory(request: request)
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func putUserProfile(
+ profileImageUrl: String?,
+ nickname: String?,
+ email: String?,
+ instagramId: String?,
+ intro: String?
+ ) -> Completable {
+ let request = PutUserProfileRequestDTO(profileImageUrl: profileImageUrl, nickname: nickname, email: email, instagramId: instagramId, intro: intro)
+ let endPoint = UserAPIEndPoint.putUserProfile(request: request)
+ return provider.request(with: endPoint, interceptor: tokenInterceptor)
+ }
+
+ public func getMyCommentedPopUp(
+ page: Int32?,
+ size: Int32?,
+ sort: String?
+ ) -> Observable {
+ let request = UserSortedRequestDTO(page: page, size: size, sort: sort)
+ let endPoint = UserAPIEndPoint.getMyCommentedPopUp(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getBlockUserList(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ let request = UserSortedRequestDTO(page: page, size: size, sort: sort)
+ let endPoint = UserAPIEndPoint.getBlockUserList(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getNoticeList() -> Observable {
+ let endPoint = UserAPIEndPoint.getNoticeList()
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getNoticeDetail(noticeID: Int64) -> Observable {
+ let endPoint = UserAPIEndPoint.getNoticeDetail(noticeID: noticeID)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getRecentPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ let request = UserSortedRequestDTO(page: page, size: size, sort: sort)
+ let endPoint = UserAPIEndPoint.getRecentPopUp(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+
+ public func getBookmarkPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ let request = UserSortedRequestDTO(page: page, size: size, sort: sort)
+ let endPoint = UserAPIEndPoint.getBookmarkPopUp(request: request)
+ return provider.requestData(with: endPoint, interceptor: tokenInterceptor).map { $0.toDomain() }
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain.xcodeproj/project.pbxproj b/Poppool/DomainLayer/Domain/Domain.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..21286382
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain.xcodeproj/project.pbxproj
@@ -0,0 +1,610 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 77;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0522C1DD2DB67C6E00B141FF /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C1DC2DB67C6E00B141FF /* RxSwift */; };
+ 0522C1DF2DB67C7700B141FF /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C1DE2DB67C7700B141FF /* RxSwift */; };
+ 05C1D61E2DB53A6700508FFD /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D0DB2DB538A600508FFD /* DomainInterface.framework */; };
+ 05C1D6222DB53A6700508FFD /* Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D61D2DB53A6700508FFD /* Infrastructure.framework */; };
+ 05C1D6262DB53A6E00508FFD /* Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6252DB53A6E00508FFD /* Infrastructure.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 05C1D6202DB53A6700508FFD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 058CC8E72DB5377F0084221A /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 05C1D0DA2DB538A600508FFD;
+ remoteInfo = DomainInterface;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 05BDD5E02DB678D100C1E192 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 05BDD5E42DB678DC00C1E192 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 058CC8F02DB5377F0084221A /* Domain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Domain.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 05C1D0DB2DB538A600508FFD /* DomainInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DomainInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 05C1D61D2DB53A6700508FFD /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 05C1D6252DB53A6E00508FFD /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFileSystemSynchronizedRootGroup section */
+ 058CC8F22DB5377F0084221A /* Domain */ = {
+ isa = PBXFileSystemSynchronizedRootGroup;
+ path = Domain;
+ sourceTree = "";
+ };
+ 05C1D0DC2DB538A600508FFD /* DomainInterface */ = {
+ isa = PBXFileSystemSynchronizedRootGroup;
+ path = DomainInterface;
+ sourceTree = "";
+ };
+/* End PBXFileSystemSynchronizedRootGroup section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 058CC8ED2DB5377F0084221A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0522C1DD2DB67C6E00B141FF /* RxSwift in Frameworks */,
+ 05C1D61E2DB53A6700508FFD /* DomainInterface.framework in Frameworks */,
+ 05C1D6222DB53A6700508FFD /* Infrastructure.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 05C1D0D82DB538A600508FFD /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0522C1DF2DB67C7700B141FF /* RxSwift in Frameworks */,
+ 05C1D6262DB53A6E00508FFD /* Infrastructure.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 058CC8E62DB5377F0084221A = {
+ isa = PBXGroup;
+ children = (
+ 058CC8F22DB5377F0084221A /* Domain */,
+ 05C1D0DC2DB538A600508FFD /* DomainInterface */,
+ 05C1D61C2DB53A6700508FFD /* Frameworks */,
+ 058CC8F12DB5377F0084221A /* Products */,
+ );
+ sourceTree = "";
+ };
+ 058CC8F12DB5377F0084221A /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 058CC8F02DB5377F0084221A /* Domain.framework */,
+ 05C1D0DB2DB538A600508FFD /* DomainInterface.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 05C1D61C2DB53A6700508FFD /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 05C1D6252DB53A6E00508FFD /* Infrastructure.framework */,
+ 05C1D61D2DB53A6700508FFD /* Infrastructure.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 058CC8EB2DB5377F0084221A /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 05C1D0D62DB538A600508FFD /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 058CC8EF2DB5377F0084221A /* Domain */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 058CC8F72DB5377F0084221A /* Build configuration list for PBXNativeTarget "Domain" */;
+ buildPhases = (
+ 058CC8EB2DB5377F0084221A /* Headers */,
+ 058CC8EC2DB5377F0084221A /* Sources */,
+ 058CC8ED2DB5377F0084221A /* Frameworks */,
+ 058CC8EE2DB5377F0084221A /* Resources */,
+ 05BDD5E42DB678DC00C1E192 /* Embed Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 05C1D6212DB53A6700508FFD /* PBXTargetDependency */,
+ );
+ fileSystemSynchronizedGroups = (
+ 058CC8F22DB5377F0084221A /* Domain */,
+ );
+ name = Domain;
+ packageProductDependencies = (
+ 0522C1DC2DB67C6E00B141FF /* RxSwift */,
+ );
+ productName = Domain;
+ productReference = 058CC8F02DB5377F0084221A /* Domain.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ 05C1D0DA2DB538A600508FFD /* DomainInterface */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 05C1D0DF2DB538A600508FFD /* Build configuration list for PBXNativeTarget "DomainInterface" */;
+ buildPhases = (
+ 05C1D0D62DB538A600508FFD /* Headers */,
+ 05C1D0D72DB538A600508FFD /* Sources */,
+ 05C1D0D82DB538A600508FFD /* Frameworks */,
+ 05C1D0D92DB538A600508FFD /* Resources */,
+ 05BDD5E02DB678D100C1E192 /* Embed Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ fileSystemSynchronizedGroups = (
+ 05C1D0DC2DB538A600508FFD /* DomainInterface */,
+ );
+ name = DomainInterface;
+ packageProductDependencies = (
+ 0522C1DE2DB67C7700B141FF /* RxSwift */,
+ );
+ productName = DomainInterface;
+ productReference = 05C1D0DB2DB538A600508FFD /* DomainInterface.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 058CC8E72DB5377F0084221A /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1630;
+ LastUpgradeCheck = 1630;
+ TargetAttributes = {
+ 058CC8EF2DB5377F0084221A = {
+ CreatedOnToolsVersion = 16.3;
+ };
+ 05C1D0DA2DB538A600508FFD = {
+ CreatedOnToolsVersion = 16.3;
+ };
+ };
+ };
+ buildConfigurationList = 058CC8EA2DB5377F0084221A /* Build configuration list for PBXProject "Domain" */;
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 058CC8E62DB5377F0084221A;
+ minimizedProjectReferenceProxies = 1;
+ packageReferences = (
+ 05C1D8282DB53CC100508FFD /* XCRemoteSwiftPackageReference "RxSwift" */,
+ );
+ preferredProjectObjectVersion = 77;
+ productRefGroup = 058CC8F12DB5377F0084221A /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 058CC8EF2DB5377F0084221A /* Domain */,
+ 05C1D0DA2DB538A600508FFD /* DomainInterface */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 058CC8EE2DB5377F0084221A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 05C1D0D92DB538A600508FFD /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 058CC8EC2DB5377F0084221A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 05C1D0D72DB538A600508FFD /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 05C1D6212DB53A6700508FFD /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 05C1D0DA2DB538A600508FFD /* DomainInterface */;
+ targetProxy = 05C1D6202DB53A6700508FFD /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 058CC8F52DB5377F0084221A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ 058CC8F62DB5377F0084221A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 18.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ 058CC8F82DB5377F0084221A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.Domain;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_MODULE = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ 058CC8F92DB5377F0084221A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.Domain;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_MODULE = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+ 05C1D0E02DB538A600508FFD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.DomainInterface;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_MODULE = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ 05C1D0E12DB538A600508FFD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CODE_SIGN_IDENTITY = "";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.DomainInterface;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_MODULE = YES;
+ SWIFT_INSTALL_OBJC_HEADER = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 058CC8EA2DB5377F0084221A /* Build configuration list for PBXProject "Domain" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 058CC8F52DB5377F0084221A /* Debug */,
+ 058CC8F62DB5377F0084221A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 058CC8F72DB5377F0084221A /* Build configuration list for PBXNativeTarget "Domain" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 058CC8F82DB5377F0084221A /* Debug */,
+ 058CC8F92DB5377F0084221A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 05C1D0DF2DB538A600508FFD /* Build configuration list for PBXNativeTarget "DomainInterface" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 05C1D0E02DB538A600508FFD /* Debug */,
+ 05C1D0E12DB538A600508FFD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+ 05C1D8282DB53CC100508FFD /* XCRemoteSwiftPackageReference "RxSwift" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/ReactiveX/RxSwift";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 6.9.0;
+ };
+ };
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 0522C1DC2DB67C6E00B141FF /* RxSwift */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 05C1D8282DB53CC100508FFD /* XCRemoteSwiftPackageReference "RxSwift" */;
+ productName = RxSwift;
+ };
+ 0522C1DE2DB67C7700B141FF /* RxSwift */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 05C1D8282DB53CC100508FFD /* XCRemoteSwiftPackageReference "RxSwift" */;
+ productName = RxSwift;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = 058CC8E72DB5377F0084221A /* Project object */;
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/AdminUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/AdminUseCaseImpl.swift
new file mode 100644
index 00000000..c2482298
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/AdminUseCaseImpl.swift
@@ -0,0 +1,64 @@
+import Foundation
+
+import DomainInterface
+import Infrastructure
+
+import RxSwift
+
+public final class AdminUseCaseImpl: AdminUseCase {
+
+ private let repository: AdminRepository
+
+ public init(repository: AdminRepository) {
+ self.repository = repository
+ }
+
+ public func fetchStoreList(query: String?, page: Int, size: Int) -> Observable<[AdminStore]> {
+ return repository.fetchStoreList(query: query, page: page, size: size)
+ }
+
+ public func fetchStoreDetail(id: Int64) -> Observable {
+ return repository.fetchStoreDetail(id: id)
+ }
+
+ public func createStore(params: CreateStoreParams) -> Completable {
+ Logger.log("createStore 호출 - 스토어명: \(params.name)", category: .debug)
+ return repository.createStore(params: params)
+ .do(onError: { error in
+ Logger.log("createStore 실패 - Error: \(error)", category: .error)
+ }, onCompleted: {
+ Logger.log("createStore 성공", category: .info)
+ })
+ }
+
+ public func updateStore(params: UpdateStoreParams) -> Completable {
+ Logger.log("""
+ Updating store with location:
+ Latitude: \(params.latitude)
+ Longitude: \(params.longitude)
+ """, category: .debug)
+ return repository.updateStore(params: params)
+ .do(onError: { error in
+ Logger.log("Store update failed: \(error)", category: .error)
+ }, onCompleted: {
+ Logger.log("Store update successful", category: .debug)
+ })
+ }
+
+ public func deleteStore(id: Int64) -> Completable {
+ return repository.deleteStore(id: id)
+ }
+
+ // Notice
+ public func createNotice(params: CreateNoticeParams) -> Completable {
+ return repository.createNotice(params: params)
+ }
+
+ public func updateNotice(params: UpdateNoticeParams) -> Completable {
+ return repository.updateNotice(params: params)
+ }
+
+ public func deleteNotice(id: Int64) -> Completable {
+ return repository.deleteNotice(id: id)
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/AppleLoginUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/AppleLoginUseCaseImpl.swift
new file mode 100644
index 00000000..2f0e4f9f
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/AppleLoginUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public class AppleLoginUseCaseImpl: AppleLoginUseCase {
+ private let repository: AppleLoginRepository
+
+ public init(repository: AppleLoginRepository) {
+ self.repository = repository
+ }
+
+ public func fetchUserCredential() -> Observable {
+ return repository.fetchUserCredential()
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/AuthAPIUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/AuthAPIUseCaseImpl.swift
new file mode 100644
index 00000000..6ec0781d
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/AuthAPIUseCaseImpl.swift
@@ -0,0 +1,22 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class AuthAPIUseCaseImpl: AuthAPIUseCase {
+
+ private let repository: AuthAPIRepository
+
+ public init(repository: AuthAPIRepository) {
+ self.repository = repository
+ }
+
+ public func postTryLogin(userCredential: Encodable, socialType: String) -> Observable {
+ return repository.tryLogIn(userCredential: userCredential, socialType: socialType)
+ }
+
+ public func postTokenReissue() -> Observable {
+ return repository.postTokenReissue()
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/CommentAPIUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/CommentAPIUseCaseImpl.swift
new file mode 100644
index 00000000..479fbdd0
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/CommentAPIUseCaseImpl.swift
@@ -0,0 +1,26 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class CommentAPIUseCaseImpl: CommentAPIUseCase {
+
+ private let repository: CommentAPIRepository
+
+ public init(repository: CommentAPIRepository) {
+ self.repository = repository
+ }
+
+ public func postCommentAdd(popUpStoreId: Int64, content: String?, commentType: String?, imageUrlList: [String?]) -> Completable {
+ return repository.postCommentAdd(popUpStoreId: popUpStoreId, content: content, commentType: commentType, imageUrlList: imageUrlList)
+ }
+
+ public func deleteComment(popUpStoreId: Int64, commentId: Int64) -> Completable {
+ return repository.deleteComment(popUpStoreId: popUpStoreId, commentId: commentId)
+ }
+
+ public func editComment(popUpStoreId: Int64, commentId: Int64, content: String?, imageUrlList: [String?]?) -> Completable {
+ return repository.editComment(popUpStoreId: popUpStoreId, commentId: commentId, content: content, imageUrlList: imageUrlList)
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/FetchCategoryListUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/FetchCategoryListUseCaseImpl.swift
new file mode 100644
index 00000000..aab8b580
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/FetchCategoryListUseCaseImpl.swift
@@ -0,0 +1,18 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class FetchCategoryListUseCaseImpl: FetchCategoryListUseCase {
+
+ private let repository: CategoryRepository
+
+ public init(repository: CategoryRepository) {
+ self.repository = repository
+ }
+
+ public func execute() -> Observable<[CategoryResponse]> {
+ return repository.fetchCategoryList()
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/HomeAPIUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/HomeAPIUseCaseImpl.swift
new file mode 100644
index 00000000..be56469f
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/HomeAPIUseCaseImpl.swift
@@ -0,0 +1,46 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class HomeAPIUseCaseImpl: HomeAPIUseCase {
+
+ private let repository: HomeAPIRepository
+
+ public init(repository: HomeAPIRepository) {
+ self.repository = repository
+ }
+
+ public func fetchHome(
+ page: Int32?,
+ size: Int32?,
+ sort: String?
+ ) -> Observable {
+ return repository.fetchHome(page: page, size: size, sort: sort)
+ }
+
+ public func fetchCustomPopUp(
+ page: Int32?,
+ size: Int32?,
+ sort: String?
+ ) -> Observable {
+ return repository.fetchCustomPopUp(page: page, size: size, sort: sort)
+ }
+
+ public func fetchNewPopUp(
+ page: Int32?,
+ size: Int32?,
+ sort: String?
+ ) -> Observable {
+ return repository.fetchNewPopUp(page: page, size: size, sort: sort)
+ }
+
+ public func fetchPopularPopUp(
+ page: Int32?,
+ size: Int32?,
+ sort: String?
+ ) -> Observable {
+ return repository.fetchPopularPopUp(page: page, size: size, sort: sort)
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/KakaoLoginUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/KakaoLoginUseCaseImpl.swift
new file mode 100644
index 00000000..261dc3a9
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/KakaoLoginUseCaseImpl.swift
@@ -0,0 +1,17 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public class KakaoLoginUseCaseImpl: KakaoLoginUseCase {
+ private let repository: KakaoLoginRepository
+
+ public init(repository: KakaoLoginRepository) {
+ self.repository = repository
+ }
+
+ public func fetchUserCredential() -> Observable {
+ return repository.fetchUserCredential()
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/MapUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/MapUseCaseImpl.swift
new file mode 100644
index 00000000..ac9a4998
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/MapUseCaseImpl.swift
@@ -0,0 +1,71 @@
+import Foundation
+
+import DomainInterface
+import Infrastructure
+
+import RxSwift
+
+public final class MapUseCaseImpl: MapUseCase {
+
+ private let repository: MapRepository
+
+ public init(repository: MapRepository) {
+ self.repository = repository
+ }
+
+ public func fetchCategories() -> Observable<[CategoryResponse]> {
+ return repository.fetchCategories()
+ }
+
+ public func fetchStoresInBounds(
+ northEastLat: Double,
+ northEastLon: Double,
+ southWestLat: Double,
+ southWestLon: Double,
+ categories: [Int]
+ ) -> Observable<[MapPopUpStore]> {
+ return repository.fetchStoresInBounds(
+ northEastLat: northEastLat,
+ northEastLon: northEastLon,
+ southWestLat: southWestLat,
+ southWestLon: southWestLon,
+ categories: categories
+ )
+ .do(onNext: { stores in
+ Logger.log("맵 범위 내 스토어 \(stores.count)개 로드됨", category: .debug)
+ }, onError: { error in
+ Logger.log("맵 범위 내 스토어 로드 실패: \(error)", category: .error)
+ })
+ }
+
+ public func searchStores(
+ query: String,
+ categories: [Int]
+ ) -> Observable<[MapPopUpStore]> {
+ return repository.searchStores(
+ query: query,
+ categories: categories
+ )
+ .do(onNext: { stores in
+ Logger.log("'\(query)' 검색 결과 \(stores.count)개 로드됨", category: .debug)
+ }, onError: { error in
+ Logger.log("스토어 검색 실패: \(error)", category: .error)
+ })
+ }
+
+ public func filterStoresByLocation(_ stores: [MapPopUpStore], selectedRegions: [String]) -> [MapPopUpStore] {
+ guard !selectedRegions.isEmpty else { return stores }
+
+ return stores.filter { store in
+ let components = store.address.components(separatedBy: " ")
+ guard components.count >= 2 else { return false }
+
+ let mainRegion = components[0].replacingOccurrences(of: "특별시", with: "")
+ .replacingOccurrences(of: "광역시", with: "")
+ let subRegion = components[1]
+
+ return selectedRegions.contains("\(mainRegion)전체") ||
+ selectedRegions.contains(subRegion)
+ }
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PopUpAPIUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PopUpAPIUseCaseImpl.swift
new file mode 100644
index 00000000..ee20c061
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PopUpAPIUseCaseImpl.swift
@@ -0,0 +1,38 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class PopUpAPIUseCaseImpl: PopUpAPIUseCase {
+
+ private let repository: PopUpAPIRepository
+
+ public init(repository: PopUpAPIRepository) {
+ self.repository = repository
+ }
+
+ public func getSearchBottomPopUpList(isOpen: Bool, categories: [Int], page: Int32?, size: Int32, sort: String?) -> Observable {
+ var categoryString: String?
+ if !categories.isEmpty {
+ categoryString = categories.map { String($0) + "," }.reduce("", +)
+ }
+ if isOpen {
+ return repository.getOpenPopUpList(categories: categoryString, page: page, size: size, sort: nil, query: nil, sortCode: sort)
+ } else {
+ return repository.getClosePopUpList(categories: categoryString, page: page, size: size, sort: nil, query: nil, sortCode: sort)
+ }
+ }
+
+ public func getSearchPopUpList(query: String?) -> Observable {
+ return repository.getSearchPopUpList(categories: nil, page: nil, size: nil, sort: nil, query: query, sortCode: nil)
+ }
+
+ public func getPopUpDetail(commentType: String?, popUpStoredId: Int64, isViewCount: Bool? = true) -> Observable {
+ return repository.getPopUpDetail(commentType: commentType, popUpStoreId: popUpStoredId, viewCountYn: isViewCount)
+ }
+
+ public func getPopUpComment(commentType: String?, page: Int32?, size: Int32?, sort: String?, popUpStoreId: Int64) -> Observable {
+ return repository.getPopUpComment(commentType: commentType, page: page, size: size, sort: sort, popUpStoreId: popUpStoreId)
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PreSignedUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PreSignedUseCaseImpl.swift
new file mode 100644
index 00000000..c84a23bf
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PreSignedUseCaseImpl.swift
@@ -0,0 +1,23 @@
+import UIKit
+
+import DomainInterface
+
+import RxSwift
+
+public final class PreSignedUseCaseImpl: PreSignedUseCase {
+ private let repository: PreSignedRepository
+
+ public init(repository: PreSignedRepository) {
+ self.repository = repository
+ }
+
+ public func tryUpload(presignedURLRequest: [(filePath: String, image: UIImage)]) -> Single {
+ return repository.tryUpload(presignedURLRequest: presignedURLRequest)
+ }
+ public func tryDelete(objectKeyList: [String]) -> Completable {
+ return repository.tryDelete(objectKeyList: objectKeyList)
+ }
+ public func fullImageURL(from filePath: String) -> URL? {
+ repository.fullImageURL(from: filePath)
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/Search/FetchKeywordBasePopupStoreListImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/Search/FetchKeywordBasePopupStoreListImpl.swift
new file mode 100644
index 00000000..4b723585
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/Search/FetchKeywordBasePopupStoreListImpl.swift
@@ -0,0 +1,18 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class FetchKeywordBasePopupListUseCaseImpl: FetchKeywordBasePopupListUseCase {
+
+ private let repository: SearchAPIRepository
+
+ public init(repository: SearchAPIRepository) {
+ self.repository = repository
+ }
+
+ public func execute(keyword: String) -> Observable {
+ return repository.fetchSearchResult(by: keyword)
+ }
+}
diff --git a/Poppool/Poppool/Domain/UseCase/SignUpAPIUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/SignUpAPIUseCaseImpl.swift
similarity index 64%
rename from Poppool/Poppool/Domain/UseCase/SignUpAPIUseCaseImpl.swift
rename to Poppool/DomainLayer/Domain/Domain/UseCaseImpl/SignUpAPIUseCaseImpl.swift
index e67b1868..f1b3497e 100644
--- a/Poppool/Poppool/Domain/UseCase/SignUpAPIUseCaseImpl.swift
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/SignUpAPIUseCaseImpl.swift
@@ -1,26 +1,23 @@
-//
-// SignUpAPIUseCaseImpl.swift
-// Poppool
-//
-// Created by Porori on 11/25/24.
-//
-
import Foundation
+
+import DomainInterface
+
import RxSwift
-final class SignUpAPIUseCaseImpl {
- var repository: SignUpRepositoryImpl
-
- init(repository: SignUpRepositoryImpl) {
+public final class SignUpAPIUseCaseImpl: SignUpAPIUseCase {
+ private let repository: SignUpRepository
+
+ public init(repository: SignUpRepository) {
self.repository = repository
}
- func trySignUp(
+
+ public func trySignUp(
nickName: String,
gender: String,
age: Int32,
socialEmail: String,
socialType: String,
- interests: [Int64],
+ interests: [Int],
appleAuthorizationCode: String?
) -> Completable {
return repository.trySignUp(
@@ -33,11 +30,12 @@ final class SignUpAPIUseCaseImpl {
appleAuthorizationCode: appleAuthorizationCode
)
}
- func checkNickName(nickName: String) -> Observable {
+
+ public func checkNickName(nickName: String) -> Observable {
return repository.checkNickName(nickName: nickName)
}
-
- func fetchCategoryList() -> Observable<[Category]> {
+
+ public func fetchCategoryList() -> Observable<[CategoryResponse]> {
return repository.fetchCategoryList()
}
}
diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/UserAPIUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/UserAPIUseCaseImpl.swift
new file mode 100644
index 00000000..b42fed78
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/UserAPIUseCaseImpl.swift
@@ -0,0 +1,117 @@
+import Foundation
+
+import DomainInterface
+
+import RxSwift
+
+public final class UserAPIUseCaseImpl: UserAPIUseCase {
+ private let repository: UserAPIRepository
+
+ public init(repository: UserAPIRepository) {
+ self.repository = repository
+ }
+
+ public func postBookmarkPopUp(popUpID: Int64) -> Completable {
+ return repository.postBookmarkPopUp(popUpStoreId: popUpID)
+ }
+
+ public func deleteBookmarkPopUp(popUpID: Int64) -> Completable {
+ return repository.deleteBookmarkPopUp(popUpStoreId: popUpID)
+ }
+
+ public func postCommentLike(commentId: Int64) -> Completable {
+ return repository.postCommentLike(commentId: commentId)
+ }
+
+ public func deleteCommentLike(commentId: Int64) -> Completable {
+ return repository.deleteCommentLike(commentId: commentId)
+ }
+
+ public func postUserBlock(blockedUserId: String?) -> Completable {
+ return repository.postUserBlock(blockedUserId: blockedUserId)
+ }
+
+ public func deleteUserBlock(blockedUserId: String?) -> Completable {
+ return repository.deleteUserBlock(blockedUserId: blockedUserId)
+ }
+
+ public func getOtherUserCommentedPopUpList(
+ commenterId: String?,
+ commentType: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?
+ ) -> Observable {
+ return repository.getOtherUserCommentList(
+ commenterId: commenterId,
+ commentType: commentType,
+ page: page,
+ size: size,
+ sort: sort
+ )
+ }
+
+ public func getMyPage() -> Observable {
+ return repository.getMyPage()
+ }
+
+ public func postLogout() -> Completable {
+ return repository.postLogout()
+ }
+
+ public func getWithdrawlList() -> Observable {
+ return repository.getWithdrawlList()
+ }
+
+ public func postWithdrawl(surveyList: [GetWithdrawlListDataResponse]) -> Completable {
+ return repository.postWithdrawl(list: surveyList.map { ($0.id, $0.survey)})
+ }
+
+ public func getMyProfile() -> Observable {
+ return repository.getMyProfile()
+ }
+
+ public func putUserTailoredInfo(gender: String?, age: Int32) -> Completable {
+ return repository.putUserTailoredInfo(gender: gender, age: age)
+ }
+
+ public func putUserCategory(
+ interestCategoriesToAdd: [Int],
+ interestCategoriesToDelete: [Int],
+ interestCategoriesToKeep: [Int]
+ ) -> Completable {
+ return repository.putUserCategory(
+ interestCategoriesToAdd: interestCategoriesToAdd,
+ interestCategoriesToDelete: interestCategoriesToDelete,
+ interestCategoriesToKeep: interestCategoriesToKeep
+ )
+ }
+
+ public func putUserProfile(profileImageUrl: String?, nickname: String?, email: String?, instagramId: String?, intro: String?) -> Completable {
+ return repository.putUserProfile(profileImageUrl: profileImageUrl, nickname: nickname, email: email, instagramId: instagramId, intro: intro)
+ }
+
+ public func getMyCommentedPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ return repository.getMyCommentedPopUp(page: page, size: size, sort: sort)
+ }
+
+ public func getBlockUserList(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ return repository.getBlockUserList(page: page, size: size, sort: sort)
+ }
+
+ public func getNoticeList() -> Observable {
+ return repository.getNoticeList()
+ }
+
+ public func getNoticeDetail(noticeID: Int64) -> Observable {
+ return repository.getNoticeDetail(noticeID: noticeID)
+ }
+
+ public func getRecentPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ return repository.getRecentPopUp(page: page, size: size, sort: sort)
+ }
+
+ public func getBookmarkPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable {
+ return repository.getBookmarkPopUp(page: page, size: size, sort: sort)
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStore.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStore.swift
new file mode 100644
index 00000000..e57f78fc
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStore.swift
@@ -0,0 +1,15 @@
+import Foundation
+
+public struct AdminStore {
+ public init(id: Int64, name: String, categoryName: String, mainImageUrl: String) {
+ self.id = id
+ self.name = name
+ self.categoryName = categoryName
+ self.mainImageUrl = mainImageUrl
+ }
+
+ public let id: Int64
+ public let name: String
+ public let categoryName: String
+ public let mainImageUrl: String
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStoreDetail.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStoreDetail.swift
new file mode 100644
index 00000000..fe4a5a2e
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStoreDetail.swift
@@ -0,0 +1,51 @@
+import Foundation
+
+public struct AdminStoreDetail {
+ public init(id: Int64, name: String, categoryId: Int, categoryName: String, description: String, address: String, startDate: String, endDate: String, createUserId: String, createDateTime: String, mainImageUrl: String, bannerYn: Bool, images: [StoreImage], latitude: Double, longitude: Double, markerTitle: String, markerSnippet: String) {
+ self.id = id
+ self.name = name
+ self.categoryId = categoryId
+ self.categoryName = categoryName
+ self.description = description
+ self.address = address
+ self.startDate = startDate
+ self.endDate = endDate
+ self.createUserId = createUserId
+ self.createDateTime = createDateTime
+ self.mainImageUrl = mainImageUrl
+ self.bannerYn = bannerYn
+ self.images = images
+ self.latitude = latitude
+ self.longitude = longitude
+ self.markerTitle = markerTitle
+ self.markerSnippet = markerSnippet
+ }
+
+ public let id: Int64
+ public let name: String
+ public let categoryId: Int
+ public let categoryName: String
+ public let description: String
+ public let address: String
+ public let startDate: String
+ public let endDate: String
+ public let createUserId: String
+ public let createDateTime: String
+ public let mainImageUrl: String
+ public let bannerYn: Bool
+ public let images: [StoreImage]
+ public let latitude: Double
+ public let longitude: Double
+ public let markerTitle: String
+ public let markerSnippet: String
+
+ public struct StoreImage {
+ public init(id: Int64, imageUrl: String) {
+ self.id = id
+ self.imageUrl = imageUrl
+ }
+
+ public let id: Int64
+ public let imageUrl: String
+ }
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/Params/AdminParams.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/Params/AdminParams.swift
new file mode 100644
index 00000000..8e5f46fe
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/Params/AdminParams.swift
@@ -0,0 +1,83 @@
+import Foundation
+
+public struct CreateStoreParams {
+ public init(name: String, categoryId: Int, desc: String, address: String, startDate: String, endDate: String, mainImageUrl: String, imageUrlList: [String?], latitude: Double, longitude: Double, markerTitle: String, markerSnippet: String, startDateBeforeEndDate: Bool) {
+ self.name = name
+ self.categoryId = categoryId
+ self.desc = desc
+ self.address = address
+ self.startDate = startDate
+ self.endDate = endDate
+ self.mainImageUrl = mainImageUrl
+ self.imageUrlList = imageUrlList
+ self.latitude = latitude
+ self.longitude = longitude
+ self.markerTitle = markerTitle
+ self.markerSnippet = markerSnippet
+ self.startDateBeforeEndDate = startDateBeforeEndDate
+ }
+
+ public let name: String
+ public let categoryId: Int
+ public let desc: String
+ public let address: String
+ public let startDate: String
+ public let endDate: String
+ public let mainImageUrl: String
+ public let imageUrlList: [String?]
+ public let latitude: Double
+ public let longitude: Double
+ public let markerTitle: String
+ public let markerSnippet: String
+ public let startDateBeforeEndDate: Bool
+}
+
+public struct UpdateStoreParams {
+ public init(id: Int64, name: String, categoryId: Int, desc: String, address: String, startDate: String, endDate: String, mainImageUrl: String, imageUrlList: [String?], imagesToDelete: [Int64], latitude: Double, longitude: Double, markerTitle: String, markerSnippet: String, startDateBeforeEndDate: Bool) {
+ self.id = id
+ self.name = name
+ self.categoryId = categoryId
+ self.desc = desc
+ self.address = address
+ self.startDate = startDate
+ self.endDate = endDate
+ self.mainImageUrl = mainImageUrl
+ self.imageUrlList = imageUrlList
+ self.imagesToDelete = imagesToDelete
+ self.latitude = latitude
+ self.longitude = longitude
+ self.markerTitle = markerTitle
+ self.markerSnippet = markerSnippet
+ self.startDateBeforeEndDate = startDateBeforeEndDate
+ }
+
+ public let id: Int64
+ public let name: String
+ public let categoryId: Int
+ public let desc: String
+ public let address: String
+ public let startDate: String
+ public let endDate: String
+ public let mainImageUrl: String
+ public let imageUrlList: [String?]
+ public let imagesToDelete: [Int64]
+ public let latitude: Double
+ public let longitude: Double
+ public let markerTitle: String
+ public let markerSnippet: String
+ public let startDateBeforeEndDate: Bool
+}
+
+public struct CreateNoticeParams {
+ public let title: String
+ public let content: String
+ public let imageUrlList: [String]
+}
+
+public struct UpdateNoticeParams {
+ public let id: Int64
+ public let title: String
+ public let content: String
+ public let imageUrlList: [String]
+ public let imagesToDelete: [Int64]
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/AuthServiceResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/AuthServiceResponse.swift
new file mode 100644
index 00000000..5150eb84
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/AuthServiceResponse.swift
@@ -0,0 +1,15 @@
+import Foundation
+
+public struct AuthServiceResponse: Encodable {
+ public init(idToken: String? = nil, authorizationCode: String? = nil, kakaoUserId: Int64? = nil, kakaoAccessToken: String? = nil) {
+ self.idToken = idToken
+ self.authorizationCode = authorizationCode
+ self.kakaoUserId = kakaoUserId
+ self.kakaoAccessToken = kakaoAccessToken
+ }
+
+ public var idToken: String?
+ public var authorizationCode: String?
+ public var kakaoUserId: Int64?
+ public var kakaoAccessToken: String?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/CategoryResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/CategoryResponse.swift
new file mode 100644
index 00000000..84810945
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/CategoryResponse.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct CategoryResponse {
+ public init(categoryId: Int, category: String) {
+ self.categoryId = categoryId
+ self.category = category
+ }
+
+ public let categoryId: Int
+ public let category: String
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/LoginResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/LoginResponse.swift
new file mode 100644
index 00000000..94e6f175
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/LoginResponse.swift
@@ -0,0 +1,23 @@
+import Foundation
+
+public struct LoginResponse {
+ public init(userId: String, grantType: String, accessToken: String, refreshToken: String, accessTokenExpiresAt: String, refreshTokenExpiresAt: String, socialType: String, isRegisteredUser: Bool) {
+ self.userId = userId
+ self.grantType = grantType
+ self.accessToken = accessToken
+ self.refreshToken = refreshToken
+ self.accessTokenExpiresAt = accessTokenExpiresAt
+ self.refreshTokenExpiresAt = refreshTokenExpiresAt
+ self.socialType = socialType
+ self.isRegisteredUser = isRegisteredUser
+ }
+
+ public var userId: String
+ var grantType: String
+ public var accessToken: String
+ public var refreshToken: String
+ var accessTokenExpiresAt: String
+ var refreshTokenExpiresAt: String
+ public var socialType: String
+ public var isRegisteredUser: Bool
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/PostTokenReissueResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/PostTokenReissueResponse.swift
new file mode 100644
index 00000000..39c7724d
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/PostTokenReissueResponse.swift
@@ -0,0 +1,15 @@
+import Foundation
+
+public struct PostTokenReissueResponse {
+ public init(accessToken: String? = nil, refreshToken: String? = nil, accessTokenExpiresAt: String? = nil, refreshTokenExpiresAt: String? = nil) {
+ self.accessToken = accessToken
+ self.refreshToken = refreshToken
+ self.accessTokenExpiresAt = accessTokenExpiresAt
+ self.refreshTokenExpiresAt = refreshTokenExpiresAt
+ }
+
+ public var accessToken: String?
+ public var refreshToken: String?
+ public var accessTokenExpiresAt: String?
+ public var refreshTokenExpiresAt: String?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/HomeResponse/BannerPopUpStore.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/HomeResponse/BannerPopUpStore.swift
new file mode 100644
index 00000000..2c5efa15
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/HomeResponse/BannerPopUpStore.swift
@@ -0,0 +1,13 @@
+import Foundation
+
+public struct BannerPopUpStore {
+ public init(id: Int64, name: String, mainImageUrl: String) {
+ self.id = id
+ self.name = name
+ self.mainImageUrl = mainImageUrl
+ }
+
+ public var id: Int64
+ public var name: String
+ public var mainImageUrl: String
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/HomeResponse/GetHomeInfoResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/HomeResponse/GetHomeInfoResponse.swift
new file mode 100644
index 00000000..b3ee4e93
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/HomeResponse/GetHomeInfoResponse.swift
@@ -0,0 +1,31 @@
+import Foundation
+
+public struct GetHomeInfoResponse {
+ public init(bannerPopUpStoreList: [BannerPopUpStore], nickname: String? = nil, customPopUpStoreList: [PopUpStoreResponse], customPopUpStoreTotalPages: Int32, customPopUpStoreTotalElements: Int64, popularPopUpStoreList: [PopUpStoreResponse], popularPopUpStoreTotalPages: Int32, popularPopUpStoreTotalElements: Int64, newPopUpStoreList: [PopUpStoreResponse], newPopUpStoreTotalPages: Int32, newPopUpStoreTotalElements: Int64, loginYn: Bool) {
+ self.bannerPopUpStoreList = bannerPopUpStoreList
+ self.nickname = nickname
+ self.customPopUpStoreList = customPopUpStoreList
+ self.customPopUpStoreTotalPages = customPopUpStoreTotalPages
+ self.customPopUpStoreTotalElements = customPopUpStoreTotalElements
+ self.popularPopUpStoreList = popularPopUpStoreList
+ self.popularPopUpStoreTotalPages = popularPopUpStoreTotalPages
+ self.popularPopUpStoreTotalElements = popularPopUpStoreTotalElements
+ self.newPopUpStoreList = newPopUpStoreList
+ self.newPopUpStoreTotalPages = newPopUpStoreTotalPages
+ self.newPopUpStoreTotalElements = newPopUpStoreTotalElements
+ self.loginYn = loginYn
+ }
+
+ public var bannerPopUpStoreList: [BannerPopUpStore]
+ public var nickname: String?
+ public var customPopUpStoreList: [PopUpStoreResponse]
+ public var customPopUpStoreTotalPages: Int32
+ var customPopUpStoreTotalElements: Int64
+ public var popularPopUpStoreList: [PopUpStoreResponse]
+ public var popularPopUpStoreTotalPages: Int32
+ var popularPopUpStoreTotalElements: Int64
+ public var newPopUpStoreList: [PopUpStoreResponse]
+ public var newPopUpStoreTotalPages: Int32
+ var newPopUpStoreTotalElements: Int64
+ public var loginYn: Bool
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/MapResponse/MapPopUpStore.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/MapResponse/MapPopUpStore.swift
new file mode 100644
index 00000000..16fcecb3
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/MapResponse/MapPopUpStore.swift
@@ -0,0 +1,31 @@
+import Foundation
+
+public struct MapPopUpStore: Equatable {
+ public init(id: Int64, category: String, name: String, address: String, startDate: String, endDate: String, latitude: Double, longitude: Double, markerId: Int64, markerTitle: String, markerSnippet: String, mainImageUrl: String?) {
+ self.id = id
+ self.category = category
+ self.name = name
+ self.address = address
+ self.startDate = startDate
+ self.endDate = endDate
+ self.latitude = latitude
+ self.longitude = longitude
+ self.markerId = markerId
+ self.markerTitle = markerTitle
+ self.markerSnippet = markerSnippet
+ self.mainImageUrl = mainImageUrl
+ }
+
+ public let id: Int64
+ public let category: String
+ public let name: String
+ public let address: String
+ public let startDate: String
+ public let endDate: String
+ public let latitude: Double
+ public let longitude: Double
+ public let markerId: Int64
+ public let markerTitle: String
+ public let markerSnippet: String
+ public let mainImageUrl: String?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetPopUpCommentResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetPopUpCommentResponse.swift
new file mode 100644
index 00000000..ae460a5a
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetPopUpCommentResponse.swift
@@ -0,0 +1,9 @@
+import Foundation
+
+public struct GetPopUpCommentResponse {
+ public init(commentList: [GetPopUpDetailCommentResponse]) {
+ self.commentList = commentList
+ }
+
+ public let commentList: [GetPopUpDetailCommentResponse]
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetPopUpDetailResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetPopUpDetailResponse.swift
new file mode 100644
index 00000000..fcb8137c
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetPopUpDetailResponse.swift
@@ -0,0 +1,89 @@
+import Foundation
+
+public struct GetPopUpDetailResponse {
+ public init(name: String?, desc: String?, startDate: String?, endDate: String?, startTime: String?, endTime: String?, address: String?, commentCount: Int64, bookmarkYn: Bool, loginYn: Bool, hasCommented: Bool, mainImageUrl: String?, imageList: [GetPopUpDetailImageResponse], commentList: [GetPopUpDetailCommentResponse], similarPopUpStoreList: [GetPopUpDetailSimilarResponse]) {
+ self.name = name
+ self.desc = desc
+ self.startDate = startDate
+ self.endDate = endDate
+ self.startTime = startTime
+ self.endTime = endTime
+ self.address = address
+ self.commentCount = commentCount
+ self.bookmarkYn = bookmarkYn
+ self.loginYn = loginYn
+ self.hasCommented = hasCommented
+ self.mainImageUrl = mainImageUrl
+ self.imageList = imageList
+ self.commentList = commentList
+ self.similarPopUpStoreList = similarPopUpStoreList
+ }
+
+ public let name: String?
+ public let desc: String?
+ public let startDate: String?
+ public let endDate: String?
+ public let startTime: String?
+ public let endTime: String?
+ public let address: String?
+ public let commentCount: Int64
+ public let bookmarkYn: Bool
+ public let loginYn: Bool
+ public let hasCommented: Bool
+ public let mainImageUrl: String?
+ public let imageList: [GetPopUpDetailImageResponse]
+ public let commentList: [GetPopUpDetailCommentResponse]
+ public let similarPopUpStoreList: [GetPopUpDetailSimilarResponse]
+}
+
+public struct GetPopUpDetailImageResponse {
+ public init(id: Int64, imageUrl: String?) {
+ self.id = id
+ self.imageUrl = imageUrl
+ }
+
+ public let id: Int64
+ public let imageUrl: String?
+}
+
+public struct GetPopUpDetailCommentResponse {
+ public init(commentId: Int64, creator: String?, nickname: String?, instagramId: String?, profileImageUrl: String?, content: String?, likeYn: Bool, likeCount: Int64, myCommentYn: Bool, createDateTime: String?, commentImageList: [GetPopUpDetailImageResponse]) {
+ self.commentId = commentId
+ self.creator = creator
+ self.nickname = nickname
+ self.instagramId = instagramId
+ self.profileImageUrl = profileImageUrl
+ self.content = content
+ self.likeYn = likeYn
+ self.likeCount = likeCount
+ self.myCommentYn = myCommentYn
+ self.createDateTime = createDateTime
+ self.commentImageList = commentImageList
+ }
+
+ public let commentId: Int64
+ public let creator: String?
+ public let nickname: String?
+ public let instagramId: String?
+ public let profileImageUrl: String?
+ public let content: String?
+ public let likeYn: Bool
+ public let likeCount: Int64
+ public let myCommentYn: Bool
+ public let createDateTime: String?
+ public let commentImageList: [GetPopUpDetailImageResponse]
+}
+
+public struct GetPopUpDetailSimilarResponse {
+ public init(id: Int64, name: String?, mainImageUrl: String?, endDate: String?) {
+ self.id = id
+ self.name = name
+ self.mainImageUrl = mainImageUrl
+ self.endDate = endDate
+ }
+
+ public let id: Int64
+ public let name: String?
+ public let mainImageUrl: String?
+ public let endDate: String?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetPopUpDirectionResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetPopUpDirectionResponse.swift
new file mode 100644
index 00000000..60157404
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetPopUpDirectionResponse.swift
@@ -0,0 +1,29 @@
+import Foundation
+
+public struct GetPopUpDirectionResponse {
+ public init(id: Int64, categoryName: String, name: String, address: String, startDate: String, endDate: String, latitude: Double, longitude: Double, markerId: Int64, markerTitle: String, markerSnippet: String) {
+ self.id = id
+ self.categoryName = categoryName
+ self.name = name
+ self.address = address
+ self.startDate = startDate
+ self.endDate = endDate
+ self.latitude = latitude
+ self.longitude = longitude
+ self.markerId = markerId
+ self.markerTitle = markerTitle
+ self.markerSnippet = markerSnippet
+ }
+
+ public let id: Int64
+ public let categoryName: String
+ public let name: String
+ public let address: String
+ public let startDate: String
+ public let endDate: String
+ public let latitude: Double
+ public let longitude: Double
+ public let markerId: Int64
+ public let markerTitle: String
+ public let markerSnippet: String
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetSearchBottomPopUpListResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetSearchBottomPopUpListResponse.swift
new file mode 100644
index 00000000..acaab501
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetSearchBottomPopUpListResponse.swift
@@ -0,0 +1,15 @@
+import Foundation
+
+public struct GetSearchBottomPopUpListResponse {
+ public init(popUpStoreList: [PopUpStoreResponse], loginYn: Bool, totalPages: Int32, totalElements: Int64) {
+ self.popUpStoreList = popUpStoreList
+ self.loginYn = loginYn
+ self.totalPages = totalPages
+ self.totalElements = totalElements
+ }
+
+ public var popUpStoreList: [PopUpStoreResponse]
+ public var loginYn: Bool
+ public var totalPages: Int32
+ public var totalElements: Int64
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetSearchPopUpListResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetSearchPopUpListResponse.swift
new file mode 100644
index 00000000..93c13fa5
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/GetSearchPopUpListResponse.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct GetSearchPopUpListResponse {
+ public init(popUpStoreList: [PopUpStoreResponse], loginYn: Bool) {
+ self.popUpStoreList = popUpStoreList
+ self.loginYn = loginYn
+ }
+
+ public var popUpStoreList: [PopUpStoreResponse]
+ public var loginYn: Bool
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/PopUpStoreResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/PopUpStoreResponse.swift
new file mode 100644
index 00000000..5c487da6
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/PopUpResponse/PopUpStoreResponse.swift
@@ -0,0 +1,23 @@
+import Foundation
+
+public struct PopUpStoreResponse {
+ public init(id: Int64, category: String?, name: String?, address: String?, mainImageUrl: String?, startDate: String?, endDate: String?, bookmarkYn: Bool) {
+ self.id = id
+ self.category = category
+ self.name = name
+ self.address = address
+ self.mainImageUrl = mainImageUrl
+ self.startDate = startDate
+ self.endDate = endDate
+ self.bookmarkYn = bookmarkYn
+ }
+
+ public let id: Int64
+ public let category: String?
+ public let name: String?
+ public let address: String?
+ public let mainImageUrl: String?
+ public let startDate: String?
+ public let endDate: String?
+ public let bookmarkYn: Bool
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/SearchResponse/KeywordBasePopupStoreListResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/SearchResponse/KeywordBasePopupStoreListResponse.swift
new file mode 100644
index 00000000..b1c60718
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/SearchResponse/KeywordBasePopupStoreListResponse.swift
@@ -0,0 +1,11 @@
+import Foundation
+
+public struct KeywordBasePopupStoreListResponse {
+ public init(popupStoreList: [PopUpStoreResponse], loginYn: Bool) {
+ self.popupStoreList = popupStoreList
+ self.loginYn = loginYn
+ }
+
+ public var popupStoreList: [PopUpStoreResponse]
+ public var loginYn: Bool
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetBlockUserListResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetBlockUserListResponse.swift
new file mode 100644
index 00000000..a63aaf7f
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetBlockUserListResponse.swift
@@ -0,0 +1,27 @@
+import Foundation
+
+public struct GetBlockUserListResponse {
+ public init(blockedUserInfoList: [GetBlockUserListDataResponse], totalPages: Int32, totalElements: Int32) {
+ self.blockedUserInfoList = blockedUserInfoList
+ self.totalPages = totalPages
+ self.totalElements = totalElements
+ }
+
+ public var blockedUserInfoList: [GetBlockUserListDataResponse]
+ public var totalPages: Int32
+ public var totalElements: Int32
+}
+
+public struct GetBlockUserListDataResponse {
+ public init(userId: String? = nil, profileImageUrl: String? = nil, nickname: String? = nil, instagramId: String? = nil) {
+ self.userId = userId
+ self.profileImageUrl = profileImageUrl
+ self.nickname = nickname
+ self.instagramId = instagramId
+ }
+
+ public var userId: String?
+ public var profileImageUrl: String?
+ public var nickname: String?
+ public var instagramId: String?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetMyCommentResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetMyCommentResponse.swift
new file mode 100644
index 00000000..0f1ecacf
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetMyCommentResponse.swift
@@ -0,0 +1,31 @@
+import Foundation
+
+public struct GetMyCommentedPopUpResponse {
+ public init(popUpInfoList: [GetMyCommentedPopUpDataResponse]) {
+ self.popUpInfoList = popUpInfoList
+ }
+
+ public var popUpInfoList: [GetMyCommentedPopUpDataResponse]
+}
+
+public struct GetMyCommentedPopUpDataResponse {
+ public init(popUpStoreId: Int64, popUpStoreName: String? = nil, desc: String? = nil, mainImageUrl: String? = nil, startDate: String? = nil, endDate: String? = nil, address: String? = nil, closedYn: Bool) {
+ self.popUpStoreId = popUpStoreId
+ self.popUpStoreName = popUpStoreName
+ self.desc = desc
+ self.mainImageUrl = mainImageUrl
+ self.startDate = startDate
+ self.endDate = endDate
+ self.address = address
+ self.closedYn = closedYn
+ }
+
+ public var popUpStoreId: Int64
+ public var popUpStoreName: String?
+ public var desc: String?
+ public var mainImageUrl: String?
+ public var startDate: String?
+ public var endDate: String?
+ public var address: String?
+ public var closedYn: Bool
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetMyPageResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetMyPageResponse.swift
new file mode 100644
index 00000000..47bfb54b
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetMyPageResponse.swift
@@ -0,0 +1,33 @@
+import Foundation
+
+public struct GetMyPageResponse {
+ public init(nickname: String? = nil, profileImageUrl: String? = nil, intro: String? = nil, instagramId: String? = nil, loginYn: Bool, adminYn: Bool, myCommentedPopUpList: [GetMyPagePopUpResponse]) {
+ self.nickname = nickname
+ self.profileImageUrl = profileImageUrl
+ self.intro = intro
+ self.instagramId = instagramId
+ self.loginYn = loginYn
+ self.adminYn = adminYn
+ self.myCommentedPopUpList = myCommentedPopUpList
+ }
+
+ public var nickname: String?
+ public var profileImageUrl: String?
+ public var intro: String?
+ public var instagramId: String?
+ public var loginYn: Bool
+ public var adminYn: Bool
+ public var myCommentedPopUpList: [GetMyPagePopUpResponse]
+}
+
+public struct GetMyPagePopUpResponse {
+ public init(popUpStoreId: Int64, popUpStoreName: String? = nil, mainImageUrl: String? = nil) {
+ self.popUpStoreId = popUpStoreId
+ self.popUpStoreName = popUpStoreName
+ self.mainImageUrl = mainImageUrl
+ }
+
+ public var popUpStoreId: Int64
+ public var popUpStoreName: String?
+ public var mainImageUrl: String?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetMyProfileResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetMyProfileResponse.swift
new file mode 100644
index 00000000..671433c8
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetMyProfileResponse.swift
@@ -0,0 +1,23 @@
+import Foundation
+
+public struct GetMyProfileResponse {
+ public init(profileImageUrl: String? = nil, nickname: String? = nil, email: String? = nil, instagramId: String? = nil, intro: String? = nil, gender: String? = nil, age: Int32, interestCategoryList: [CategoryResponse]) {
+ self.profileImageUrl = profileImageUrl
+ self.nickname = nickname
+ self.email = email
+ self.instagramId = instagramId
+ self.intro = intro
+ self.gender = gender
+ self.age = age
+ self.interestCategoryList = interestCategoryList
+ }
+
+ public var profileImageUrl: String?
+ public var nickname: String?
+ public var email: String?
+ public var instagramId: String?
+ public var intro: String?
+ public var gender: String?
+ public var age: Int32
+ public var interestCategoryList: [CategoryResponse]
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetNoticeDetailResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetNoticeDetailResponse.swift
new file mode 100644
index 00000000..a1e20371
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetNoticeDetailResponse.swift
@@ -0,0 +1,15 @@
+import Foundation
+
+public struct GetNoticeDetailResponse {
+ public init(id: Int64, title: String? = nil, content: String? = nil, createDateTime: String? = nil) {
+ self.id = id
+ self.title = title
+ self.content = content
+ self.createDateTime = createDateTime
+ }
+
+ var id: Int64
+ public var title: String?
+ public var content: String?
+ public var createDateTime: String?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetNoticeListResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetNoticeListResponse.swift
new file mode 100644
index 00000000..fe085bfc
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetNoticeListResponse.swift
@@ -0,0 +1,21 @@
+import Foundation
+
+public struct GetNoticeListResponse {
+ public init(noticeInfoList: [GetNoticeListDataResponse]) {
+ self.noticeInfoList = noticeInfoList
+ }
+
+ public var noticeInfoList: [GetNoticeListDataResponse]
+}
+
+public struct GetNoticeListDataResponse {
+ public init(id: Int64, title: String? = nil, createdDateTime: String? = nil) {
+ self.id = id
+ self.title = title
+ self.createdDateTime = createdDateTime
+ }
+
+ public var id: Int64
+ public var title: String?
+ public var createdDateTime: String?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetOtherUserCommentedPopUpListResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetOtherUserCommentedPopUpListResponse.swift
new file mode 100644
index 00000000..65c2f463
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetOtherUserCommentedPopUpListResponse.swift
@@ -0,0 +1,31 @@
+import Foundation
+
+public struct GetOtherUserCommentedPopUpListResponse {
+ public init(popUpInfoList: [GetOtherUserCommentedPopUpResponse]) {
+ self.popUpInfoList = popUpInfoList
+ }
+
+ public var popUpInfoList: [GetOtherUserCommentedPopUpResponse]
+}
+
+public struct GetOtherUserCommentedPopUpResponse {
+ public init(popUpStoreId: Int64, popUpStoreName: String? = nil, desc: String? = nil, mainImageUrl: String? = nil, startDate: String? = nil, endDate: String? = nil, address: String? = nil, closedYn: Bool) {
+ self.popUpStoreId = popUpStoreId
+ self.popUpStoreName = popUpStoreName
+ self.desc = desc
+ self.mainImageUrl = mainImageUrl
+ self.startDate = startDate
+ self.endDate = endDate
+ self.address = address
+ self.closedYn = closedYn
+ }
+
+ public var popUpStoreId: Int64
+ public var popUpStoreName: String?
+ public var desc: String?
+ public var mainImageUrl: String?
+ public var startDate: String?
+ public var endDate: String?
+ public var address: String?
+ public var closedYn: Bool
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetRecentPopUpResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetRecentPopUpResponse.swift
new file mode 100644
index 00000000..0e84a1f6
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetRecentPopUpResponse.swift
@@ -0,0 +1,35 @@
+import Foundation
+
+public struct GetRecentPopUpResponse {
+ public init(popUpInfoList: [GetRecentPopUpDataResponse], totalPages: Int32, totalElements: Int32) {
+ self.popUpInfoList = popUpInfoList
+ self.totalPages = totalPages
+ self.totalElements = totalElements
+ }
+
+ public var popUpInfoList: [GetRecentPopUpDataResponse]
+ public var totalPages: Int32
+ public var totalElements: Int32
+}
+
+public struct GetRecentPopUpDataResponse {
+ public init(popUpStoreId: Int64, popUpStoreName: String? = nil, desc: String? = nil, mainImageUrl: String? = nil, startDate: String? = nil, endDate: String? = nil, address: String? = nil, closeYn: Bool) {
+ self.popUpStoreId = popUpStoreId
+ self.popUpStoreName = popUpStoreName
+ self.desc = desc
+ self.mainImageUrl = mainImageUrl
+ self.startDate = startDate
+ self.endDate = endDate
+ self.address = address
+ self.closeYn = closeYn
+ }
+
+ public var popUpStoreId: Int64
+ public var popUpStoreName: String?
+ public var desc: String?
+ public var mainImageUrl: String?
+ public var startDate: String?
+ public var endDate: String?
+ public var address: String?
+ public var closeYn: Bool
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetWithdrawlListResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetWithdrawlListResponse.swift
new file mode 100644
index 00000000..830001e0
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/UserResponse/GetWithdrawlListResponse.swift
@@ -0,0 +1,19 @@
+import Foundation
+
+public struct GetWithdrawlListResponse {
+ public init(withDrawlSurveyList: [GetWithdrawlListDataResponse]) {
+ self.withDrawlSurveyList = withDrawlSurveyList
+ }
+
+ public var withDrawlSurveyList: [GetWithdrawlListDataResponse]
+}
+
+public struct GetWithdrawlListDataResponse {
+ public init(id: Int64, survey: String? = nil) {
+ self.id = id
+ self.survey = survey
+ }
+
+ public var id: Int64
+ public var survey: String?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/AdminRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/AdminRepository.swift
new file mode 100644
index 00000000..4a9f2972
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/AdminRepository.swift
@@ -0,0 +1,18 @@
+import Foundation
+
+import RxSwift
+
+public protocol AdminRepository {
+ func fetchStoreList(query: String?, page: Int, size: Int) -> Observable<[AdminStore]>
+ func fetchStoreDetail(id: Int64) -> Observable
+
+ func createStore(params: CreateStoreParams) -> Completable
+
+ func updateStore(params: UpdateStoreParams) -> Completable
+
+ func deleteStore(id: Int64) -> Completable
+
+ func createNotice(params: CreateNoticeParams) -> Completable
+ func updateNotice(params: UpdateNoticeParams) -> Completable
+ func deleteNotice(id: Int64) -> Completable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/AppleLoginRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/AppleLoginRepository.swift
new file mode 100644
index 00000000..6ba5676b
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/AppleLoginRepository.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+import RxSwift
+
+public protocol AppleLoginRepository {
+ func fetchUserCredential() -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/AuthAPIRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/AuthAPIRepository.swift
new file mode 100644
index 00000000..33154753
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/AuthAPIRepository.swift
@@ -0,0 +1,8 @@
+import Foundation
+
+import RxSwift
+
+public protocol AuthAPIRepository {
+ func tryLogIn(userCredential: Encodable, socialType: String) -> Observable
+ func postTokenReissue() -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/CategoryRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/CategoryRepository.swift
new file mode 100644
index 00000000..1df92582
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/CategoryRepository.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+import RxSwift
+
+public protocol CategoryRepository {
+ func fetchCategoryList() -> Observable<[CategoryResponse]>
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/CommentAPIRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/CommentAPIRepository.swift
new file mode 100644
index 00000000..64fc0fbd
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/CommentAPIRepository.swift
@@ -0,0 +1,24 @@
+import Foundation
+
+import RxSwift
+
+public protocol CommentAPIRepository {
+ func postCommentAdd(
+ popUpStoreId: Int64,
+ content: String?,
+ commentType: String?,
+ imageUrlList: [String?]
+ ) -> Completable
+
+ func deleteComment(
+ popUpStoreId: Int64,
+ commentId: Int64
+ ) -> Completable
+
+ func editComment(
+ popUpStoreId: Int64,
+ commentId: Int64,
+ content: String?,
+ imageUrlList: [String?]?
+ ) -> Completable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/HomeAPIRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/HomeAPIRepository.swift
new file mode 100644
index 00000000..d417f03a
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/HomeAPIRepository.swift
@@ -0,0 +1,10 @@
+import Foundation
+
+import RxSwift
+
+public protocol HomeAPIRepository {
+ func fetchHome(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func fetchCustomPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func fetchNewPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func fetchPopularPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/KakaoLoginRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/KakaoLoginRepository.swift
new file mode 100644
index 00000000..4be6e2ca
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/KakaoLoginRepository.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+import RxSwift
+
+public protocol KakaoLoginRepository {
+ func fetchUserCredential() -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapDirectionRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapDirectionRepository.swift
new file mode 100644
index 00000000..ba17d266
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapDirectionRepository.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+import RxSwift
+
+public protocol MapDirectionRepository {
+ func getPopUpDirection(popUpStoreId: Int64) -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapRepository.swift
new file mode 100644
index 00000000..cf86192f
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapRepository.swift
@@ -0,0 +1,20 @@
+import Foundation
+
+import RxSwift
+
+public protocol MapRepository {
+ func fetchStoresInBounds(
+ northEastLat: Double,
+ northEastLon: Double,
+ southWestLat: Double,
+ southWestLon: Double,
+ categories: [Int]
+ ) -> Observable<[MapPopUpStore]>
+
+ func searchStores(
+ query: String,
+ categories: [Int]
+ ) -> Observable<[MapPopUpStore]>
+
+ func fetchCategories() -> Observable<[CategoryResponse]>
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/PopUpAPIRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/PopUpAPIRepository.swift
new file mode 100644
index 00000000..b6c000ec
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/PopUpAPIRepository.swift
@@ -0,0 +1,44 @@
+import Foundation
+
+import RxSwift
+
+public protocol PopUpAPIRepository {
+ func postBookmarkPopUp(popUpStoreId: Int64) -> Completable
+
+ func getClosePopUpList(
+ categories: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?,
+ query: String?,
+ sortCode: String?
+ ) -> Observable
+
+ func getOpenPopUpList(
+ categories: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?,
+ query: String?,
+ sortCode: String?
+ ) -> Observable
+
+ func getSearchPopUpList(
+ categories: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?,
+ query: String?,
+ sortCode: String?
+ ) -> Observable
+
+ func getPopUpDetail(commentType: String?, popUpStoreId: Int64, viewCountYn: Bool?) -> Observable
+
+ func getPopUpComment(
+ commentType: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?,
+ popUpStoreId: Int64
+ ) -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/PreSignedRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/PreSignedRepository.swift
new file mode 100644
index 00000000..483becff
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/PreSignedRepository.swift
@@ -0,0 +1,9 @@
+import UIKit
+
+import RxSwift
+
+public protocol PreSignedRepository {
+ func tryUpload(presignedURLRequest: [(filePath: String, image: UIImage)]) -> Single
+ func tryDelete(objectKeyList: [String]) -> Completable
+ func fullImageURL(from filePath: String) -> URL?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/SearchAPIRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/SearchAPIRepository.swift
new file mode 100644
index 00000000..4d428540
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/SearchAPIRepository.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+import RxSwift
+
+public protocol SearchAPIRepository {
+ func fetchSearchResult(by query: String) -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/SignUpRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/SignUpRepository.swift
new file mode 100644
index 00000000..5aca1507
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/SignUpRepository.swift
@@ -0,0 +1,17 @@
+import Foundation
+
+import RxSwift
+
+public protocol SignUpRepository {
+ func checkNickName(nickName: String) -> Observable
+ func fetchCategoryList() -> Observable<[CategoryResponse]>
+ func trySignUp(
+ nickName: String,
+ gender: String,
+ age: Int32,
+ socialEmail: String,
+ socialType: String,
+ interests: [Int],
+ appleAuthorizationCode: String?
+ ) -> Completable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/UserAPIRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/UserAPIRepository.swift
new file mode 100644
index 00000000..ba4f8e6c
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/UserAPIRepository.swift
@@ -0,0 +1,49 @@
+import Foundation
+
+import RxSwift
+
+public protocol UserAPIRepository {
+ func postBookmarkPopUp(popUpStoreId: Int64) -> Completable
+ func deleteBookmarkPopUp(popUpStoreId: Int64) -> Completable
+ func postCommentLike(commentId: Int64) -> Completable
+ func deleteCommentLike(commentId: Int64) -> Completable
+ func postUserBlock(blockedUserId: String?) -> Completable
+ func deleteUserBlock(blockedUserId: String?) -> Completable
+
+ func getOtherUserCommentList(
+ commenterId: String?,
+ commentType: String?,
+ page: Int32?,
+ size: Int32?,
+ sort: String?
+ ) -> Observable
+
+ func getMyPage() -> Observable
+ func postLogout() -> Completable
+ func getWithdrawlList() -> Observable
+ func postWithdrawl(list: [(Int64, String?)]) -> Completable
+
+ func getMyProfile() -> Observable
+ func putUserTailoredInfo(gender: String?, age: Int32) -> Completable
+
+ func putUserCategory(
+ interestCategoriesToAdd: [Int],
+ interestCategoriesToDelete: [Int],
+ interestCategoriesToKeep: [Int]
+ ) -> Completable
+
+ func putUserProfile(
+ profileImageUrl: String?,
+ nickname: String?,
+ email: String?,
+ instagramId: String?,
+ intro: String?
+ ) -> Completable
+
+ func getMyCommentedPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func getBlockUserList(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func getNoticeList() -> Observable
+ func getNoticeDetail(noticeID: Int64) -> Observable
+ func getRecentPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func getBookmarkPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/AdminUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/AdminUseCase.swift
new file mode 100644
index 00000000..5e083d73
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/AdminUseCase.swift
@@ -0,0 +1,19 @@
+import Foundation
+
+import RxSwift
+
+public protocol AdminUseCase {
+
+ func fetchStoreList(query: String?, page: Int, size: Int) -> Observable<[AdminStore]>
+ func fetchStoreDetail(id: Int64) -> Observable
+
+ func createStore(params: CreateStoreParams) -> Completable
+
+ func updateStore(params: UpdateStoreParams) -> Completable
+
+ func deleteStore(id: Int64) -> Completable
+
+ func createNotice(params: CreateNoticeParams) -> Completable
+ func updateNotice(params: UpdateNoticeParams) -> Completable
+ func deleteNotice(id: Int64) -> Completable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/AppleLoginUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/AppleLoginUseCase.swift
new file mode 100644
index 00000000..8841534c
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/AppleLoginUseCase.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+import RxSwift
+
+public protocol AppleLoginUseCase {
+ func fetchUserCredential() -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/AuthAPIUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/AuthAPIUseCase.swift
new file mode 100644
index 00000000..44ce761c
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/AuthAPIUseCase.swift
@@ -0,0 +1,8 @@
+import Foundation
+
+import RxSwift
+
+public protocol AuthAPIUseCase {
+ func postTryLogin(userCredential: Encodable, socialType: String) -> Observable
+ func postTokenReissue() -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/CommentAPIUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/CommentAPIUseCase.swift
new file mode 100644
index 00000000..5114f0d3
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/CommentAPIUseCase.swift
@@ -0,0 +1,9 @@
+import Foundation
+
+import RxSwift
+
+public protocol CommentAPIUseCase {
+ func postCommentAdd(popUpStoreId: Int64, content: String?, commentType: String?, imageUrlList: [String?]) -> Completable
+ func deleteComment(popUpStoreId: Int64, commentId: Int64) -> Completable
+ func editComment(popUpStoreId: Int64, commentId: Int64, content: String?, imageUrlList: [String?]?) -> Completable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/FetchCategoryListUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/FetchCategoryListUseCase.swift
new file mode 100644
index 00000000..14e35064
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/FetchCategoryListUseCase.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+import RxSwift
+
+public protocol FetchCategoryListUseCase {
+ func execute() -> Observable<[CategoryResponse]>
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/HomeAPIUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/HomeAPIUseCase.swift
new file mode 100644
index 00000000..30f6d2f0
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/HomeAPIUseCase.swift
@@ -0,0 +1,10 @@
+import Foundation
+
+import RxSwift
+
+public protocol HomeAPIUseCase {
+ func fetchHome(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func fetchCustomPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func fetchNewPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func fetchPopularPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/KakaoLoginUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/KakaoLoginUseCase.swift
new file mode 100644
index 00000000..22e4e65a
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/KakaoLoginUseCase.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+import RxSwift
+
+public protocol KakaoLoginUseCase {
+ func fetchUserCredential() -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/MapUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/MapUseCase.swift
new file mode 100644
index 00000000..a56de0c9
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/MapUseCase.swift
@@ -0,0 +1,21 @@
+import Foundation
+
+import RxSwift
+
+public protocol MapUseCase {
+ func fetchCategories() -> Observable<[CategoryResponse]>
+ func fetchStoresInBounds(
+ northEastLat: Double,
+ northEastLon: Double,
+ southWestLat: Double,
+ southWestLon: Double,
+ categories: [Int]
+ ) -> Observable<[MapPopUpStore]>
+
+ func searchStores(
+ query: String,
+ categories: [Int]
+ ) -> Observable<[MapPopUpStore]>
+
+ func filterStoresByLocation(_ stores: [MapPopUpStore], selectedRegions: [String]) -> [MapPopUpStore]
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PopUpAPIUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PopUpAPIUseCase.swift
new file mode 100644
index 00000000..5c34b07b
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PopUpAPIUseCase.swift
@@ -0,0 +1,10 @@
+import Foundation
+
+import RxSwift
+
+public protocol PopUpAPIUseCase {
+ func getSearchBottomPopUpList(isOpen: Bool, categories: [Int], page: Int32?, size: Int32, sort: String?) -> Observable
+ func getSearchPopUpList(query: String?) -> Observable
+ func getPopUpDetail(commentType: String?, popUpStoredId: Int64, isViewCount: Bool?) -> Observable
+ func getPopUpComment(commentType: String?, page: Int32?, size: Int32?, sort: String?, popUpStoreId: Int64) -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PreSignedUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PreSignedUseCase.swift
new file mode 100644
index 00000000..13b92620
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PreSignedUseCase.swift
@@ -0,0 +1,9 @@
+import UIKit
+
+import RxSwift
+
+public protocol PreSignedUseCase {
+ func tryUpload(presignedURLRequest: [(filePath: String, image: UIImage)]) -> Single
+ func tryDelete(objectKeyList: [String]) -> Completable
+ func fullImageURL(from filePath: String) -> URL?
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/Search/FetchKeywordBasePopupStoreList.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/Search/FetchKeywordBasePopupStoreList.swift
new file mode 100644
index 00000000..0ecfceab
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/Search/FetchKeywordBasePopupStoreList.swift
@@ -0,0 +1,7 @@
+import Foundation
+
+import RxSwift
+
+public protocol FetchKeywordBasePopupListUseCase {
+ func execute(keyword: String) -> Observable
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/SignUpAPIUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/SignUpAPIUseCase.swift
new file mode 100644
index 00000000..89883291
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/SignUpAPIUseCase.swift
@@ -0,0 +1,19 @@
+import Foundation
+
+import RxSwift
+
+public protocol SignUpAPIUseCase {
+ func trySignUp(
+ nickName: String,
+ gender: String,
+ age: Int32,
+ socialEmail: String,
+ socialType: String,
+ interests: [Int],
+ appleAuthorizationCode: String?
+ ) -> Completable
+
+ func checkNickName(nickName: String) -> Observable
+
+ func fetchCategoryList() -> Observable<[CategoryResponse]>
+}
diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/UserAPIUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/UserAPIUseCase.swift
new file mode 100644
index 00000000..b488b1a1
--- /dev/null
+++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/UserAPIUseCase.swift
@@ -0,0 +1,27 @@
+import Foundation
+
+import RxSwift
+
+public protocol UserAPIUseCase {
+ func postBookmarkPopUp(popUpID: Int64) -> Completable
+ func deleteBookmarkPopUp(popUpID: Int64) -> Completable
+ func postCommentLike(commentId: Int64) -> Completable
+ func deleteCommentLike(commentId: Int64) -> Completable
+ func postUserBlock(blockedUserId: String?) -> Completable
+ func deleteUserBlock(blockedUserId: String?) -> Completable
+ func getOtherUserCommentedPopUpList(commenterId: String?, commentType: String?, page: Int32?, size: Int32?, sort: String?) -> Observable
+ func getMyPage() -> Observable
+ func postLogout() -> Completable
+ func getWithdrawlList() -> Observable
+ func postWithdrawl(surveyList: [GetWithdrawlListDataResponse]) -> Completable
+ func getMyProfile() -> Observable
+ func putUserTailoredInfo(gender: String?, age: Int32) -> Completable
+ func putUserCategory(interestCategoriesToAdd: [Int], interestCategoriesToDelete: [Int], interestCategoriesToKeep: [Int]) -> Completable
+ func putUserProfile(profileImageUrl: String?, nickname: String?, email: String?, instagramId: String?, intro: String?) -> Completable
+ func getMyCommentedPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func getBlockUserList(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func getNoticeList() -> Observable
+ func getNoticeDetail(noticeID: Int64) -> Observable
+ func getRecentPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+ func getBookmarkPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable
+}
diff --git a/Poppool/Poppool.xcodeproj/project.pbxproj b/Poppool/Poppool.xcodeproj/project.pbxproj
index a38282f7..c4430902 100644
--- a/Poppool/Poppool.xcodeproj/project.pbxproj
+++ b/Poppool/Poppool.xcodeproj/project.pbxproj
@@ -3,3015 +3,158 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 56;
+ objectVersion = 76;
objects = {
/* Begin PBXBuildFile section */
- 0818988E2D295DC30067BF01 /* MyPageLogoutSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818988D2D295DC30067BF01 /* MyPageLogoutSection.swift */; };
- 081898902D295DC80067BF01 /* MyPageLogoutSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818988F2D295DC80067BF01 /* MyPageLogoutSectionCell.swift */; };
- 081898942D2965C20067BF01 /* ProfileEditController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898932D2965C20067BF01 /* ProfileEditController.swift */; };
- 081898962D2965C90067BF01 /* ProfileEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898952D2965C90067BF01 /* ProfileEditView.swift */; };
- 081898982D2965D20067BF01 /* ProfileEditReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898972D2965D20067BF01 /* ProfileEditReactor.swift */; };
- 0818989C2D2BAA570067BF01 /* WithdrawlCheckModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818989B2D2BAA570067BF01 /* WithdrawlCheckModalView.swift */; };
- 0818989E2D2BAA610067BF01 /* WithdrawlCheckModalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818989D2D2BAA610067BF01 /* WithdrawlCheckModalController.swift */; };
- 081898A02D2BAA670067BF01 /* WithdrawlCheckModalReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818989F2D2BAA670067BF01 /* WithdrawlCheckModalReactor.swift */; };
- 081898A32D2CC0110067BF01 /* WithdrawlReasonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898A22D2CC0110067BF01 /* WithdrawlReasonView.swift */; };
- 081898A52D2CC0180067BF01 /* WithdrawlReasonController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898A42D2CC0180067BF01 /* WithdrawlReasonController.swift */; };
- 081898A72D2CC01D0067BF01 /* WithdrawlReasonReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898A62D2CC01D0067BF01 /* WithdrawlReasonReactor.swift */; };
- 081898AA2D2CEA2F0067BF01 /* WithdrawlCheckSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898A92D2CEA2F0067BF01 /* WithdrawlCheckSectionCell.swift */; };
- 081898AC2D2CEA940067BF01 /* WithdrawlCheckSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898AB2D2CEA940067BF01 /* WithdrawlCheckSection.swift */; };
- 081898AE2D2CFC230067BF01 /* GetWithdrawlListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898AD2D2CFC230067BF01 /* GetWithdrawlListResponseDTO.swift */; };
- 081898B02D2CFCA40067BF01 /* GetWithdrawlListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898AF2D2CFCA40067BF01 /* GetWithdrawlListResponse.swift */; };
- 081898B32D2D20D70067BF01 /* WithdrawlCompleteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898B22D2D20D70067BF01 /* WithdrawlCompleteView.swift */; };
- 081898B52D2D20E30067BF01 /* WithdrawlCompleteController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898B42D2D20E30067BF01 /* WithdrawlCompleteController.swift */; };
- 081898B72D2D23A90067BF01 /* UINavigationController+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898B62D2D23A90067BF01 /* UINavigationController+.swift */; };
- 081898BA2D2E5F4C0067BF01 /* MyCommentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898B92D2E5F4C0067BF01 /* MyCommentView.swift */; };
- 081898BC2D2E5F510067BF01 /* MyCommentReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898BB2D2E5F510067BF01 /* MyCommentReactor.swift */; };
- 081898BE2D2E5F590067BF01 /* MyCommentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898BD2D2E5F590067BF01 /* MyCommentController.swift */; };
- 081898C32D30AE2C0067BF01 /* GetMyProfileResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898C22D30AE2C0067BF01 /* GetMyProfileResponseDTO.swift */; };
- 081898C52D30AEF40067BF01 /* GetMyProfileResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898C42D30AEF40067BF01 /* GetMyProfileResponse.swift */; };
- 081898CA2D30D5BA0067BF01 /* InfoEditModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898C92D30D5BA0067BF01 /* InfoEditModalView.swift */; };
- 081898CC2D30D5BF0067BF01 /* InfoEditModalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898CB2D30D5BF0067BF01 /* InfoEditModalController.swift */; };
- 081898CE2D30D5C60067BF01 /* InfoEditModalReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898CD2D30D5C60067BF01 /* InfoEditModalReactor.swift */; };
- 081898D02D30EA900067BF01 /* PutUserTailoredInfoRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898CF2D30EA900067BF01 /* PutUserTailoredInfoRequestDTO.swift */; };
- 081898D22D30F57D0067BF01 /* CategoryEditModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898D12D30F57D0067BF01 /* CategoryEditModalView.swift */; };
- 081898D42D30F5840067BF01 /* CategoryEditModalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898D32D30F5840067BF01 /* CategoryEditModalController.swift */; };
- 081898D62D30F58A0067BF01 /* CategoryEditModalReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898D52D30F58A0067BF01 /* CategoryEditModalReactor.swift */; };
- 081898D82D310C160067BF01 /* PutUserCategoryRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898D72D310C160067BF01 /* PutUserCategoryRequestDTO.swift */; };
- 081898DA2D32559B0067BF01 /* PutUserProfileRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898D92D32559B0067BF01 /* PutUserProfileRequestDTO.swift */; };
- 081898DC2D326DC10067BF01 /* IntroState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898DB2D326DC10067BF01 /* IntroState.swift */; };
- 081898E02D338F9C0067BF01 /* ListCountButtonSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898DF2D338F9C0067BF01 /* ListCountButtonSection.swift */; };
- 081898E22D338FA40067BF01 /* ListCountButtonSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898E12D338FA40067BF01 /* ListCountButtonSectionCell.swift */; };
- 081898E42D3391550067BF01 /* GetMyCommentedPopUpResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898E32D3391550067BF01 /* GetMyCommentedPopUpResponseDTO.swift */; };
- 081898E62D3391CB0067BF01 /* GetMyCommentResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898E52D3391CB0067BF01 /* GetMyCommentResponse.swift */; };
- 081898E82D3392480067BF01 /* GetMyCommentRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898E72D3392480067BF01 /* GetMyCommentRequestDTO.swift */; };
- 081898EC2D33A3960067BF01 /* MyCommentSortedModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898EB2D33A3960067BF01 /* MyCommentSortedModalView.swift */; };
- 081898EE2D33A39D0067BF01 /* MyCommentSortedModalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898ED2D33A39D0067BF01 /* MyCommentSortedModalController.swift */; };
- 081898F02D33A3A30067BF01 /* MyCommentSortedModalReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898EF2D33A3A30067BF01 /* MyCommentSortedModalReactor.swift */; };
- 081898F32D33D6AC0067BF01 /* BlockUserManageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898F22D33D6AC0067BF01 /* BlockUserManageView.swift */; };
- 081898F52D33D6B10067BF01 /* BlockUserManageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898F42D33D6B10067BF01 /* BlockUserManageController.swift */; };
- 081898F72D33D6B70067BF01 /* BlockUserManageReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898F62D33D6B70067BF01 /* BlockUserManageReactor.swift */; };
- 081898FB2D33D9320067BF01 /* GetBlockUserListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898FA2D33D9320067BF01 /* GetBlockUserListResponseDTO.swift */; };
- 081898FD2D33D9ED0067BF01 /* GetBlockUserListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898FC2D33D9ED0067BF01 /* GetBlockUserListResponse.swift */; };
- 081898FF2D33DA440067BF01 /* GetBlockUserListRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898FE2D33DA440067BF01 /* GetBlockUserListRequestDTO.swift */; };
- 081899022D3407F50067BF01 /* BlockUserListSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899012D3407F50067BF01 /* BlockUserListSection.swift */; };
- 081899052D34080B0067BF01 /* BlockUserListSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899042D34080B0067BF01 /* BlockUserListSectionCell.swift */; };
- 081899082D34B35A0067BF01 /* MyPageNoticeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899072D34B35A0067BF01 /* MyPageNoticeView.swift */; };
- 0818990A2D34B3620067BF01 /* MyPageNoticeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899092D34B3620067BF01 /* MyPageNoticeController.swift */; };
- 0818990C2D34B3670067BF01 /* MyPageNoticeReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818990B2D34B3670067BF01 /* MyPageNoticeReactor.swift */; };
- 0818990E2D34B68C0067BF01 /* GetNoticeListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818990D2D34B68C0067BF01 /* GetNoticeListResponseDTO.swift */; };
- 081899102D34B7240067BF01 /* GetNoticeListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818990F2D34B7240067BF01 /* GetNoticeListResponse.swift */; };
- 081899122D34CA9E0067BF01 /* GetNoticeDetailResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899112D34CA9E0067BF01 /* GetNoticeDetailResponseDTO.swift */; };
- 081899142D34CAEA0067BF01 /* GetNoticeDetailResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899132D34CAEA0067BF01 /* GetNoticeDetailResponse.swift */; };
- 081899182D34D63E0067BF01 /* NoticeListSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899172D34D63E0067BF01 /* NoticeListSection.swift */; };
- 0818991A2D34D6430067BF01 /* NoticeListSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899192D34D6430067BF01 /* NoticeListSectionCell.swift */; };
- 0818991E2D34DF7D0067BF01 /* MyPageNoticeDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818991D2D34DF7D0067BF01 /* MyPageNoticeDetailView.swift */; };
- 081899202D34DF880067BF01 /* MyPageNoticeDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818991F2D34DF880067BF01 /* MyPageNoticeDetailController.swift */; };
- 081899222D34DF8E0067BF01 /* MyPageNoticeDetailReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899212D34DF8E0067BF01 /* MyPageNoticeDetailReactor.swift */; };
- 081899252D3500B80067BF01 /* FAQView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899242D3500B80067BF01 /* FAQView.swift */; };
- 081899272D3500BF0067BF01 /* FAQController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899262D3500BF0067BF01 /* FAQController.swift */; };
- 081899292D3500C50067BF01 /* FAQReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899282D3500C50067BF01 /* FAQReactor.swift */; };
- 0818992D2D3506240067BF01 /* FAQDropdownSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818992C2D3506240067BF01 /* FAQDropdownSectionCell.swift */; };
- 0818992F2D3506290067BF01 /* FAQDropdownSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818992E2D3506290067BF01 /* FAQDropdownSection.swift */; };
- 081899332D35F1090067BF01 /* MyPageBookmarkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899322D35F1090067BF01 /* MyPageBookmarkView.swift */; };
- 081899352D35F10F0067BF01 /* MyPageBookmarkController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899342D35F10F0067BF01 /* MyPageBookmarkController.swift */; };
- 081899372D35F1140067BF01 /* MyPageBookmarkReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899362D35F1140067BF01 /* MyPageBookmarkReactor.swift */; };
- 081899392D35F11F0067BF01 /* MyPageRecentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899382D35F11F0067BF01 /* MyPageRecentView.swift */; };
- 0818993B2D35F1250067BF01 /* MyPageRecentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818993A2D35F1250067BF01 /* MyPageRecentController.swift */; };
- 0818993D2D35F12A0067BF01 /* MyPageRecentReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818993C2D35F12A0067BF01 /* MyPageRecentReactor.swift */; };
- 0818993F2D35FBE00067BF01 /* GetRecentPopUpResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818993E2D35FBE00067BF01 /* GetRecentPopUpResponseDTO.swift */; };
- 081899412D35FDA10067BF01 /* GetRecentPopUpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899402D35FDA10067BF01 /* GetRecentPopUpResponse.swift */; };
- 081899452D35FEA10067BF01 /* RecentPopUpSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899442D35FEA10067BF01 /* RecentPopUpSection.swift */; };
- 0818994A2D36322B0067BF01 /* PopUpCardSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899492D36322B0067BF01 /* PopUpCardSection.swift */; };
- 0818994C2D3632320067BF01 /* PopUpCardSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818994B2D3632320067BF01 /* PopUpCardSectionCell.swift */; };
- 081899502D363E5C0067BF01 /* BookMarkPopUpViewTypeModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0818994F2D363E5C0067BF01 /* BookMarkPopUpViewTypeModalView.swift */; };
- 081899522D363E640067BF01 /* BookMarkPopUpViewTypeModalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899512D363E640067BF01 /* BookMarkPopUpViewTypeModalController.swift */; };
- 081899542D363E6A0067BF01 /* BookMarkPopUpViewTypeModalReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081899532D363E6A0067BF01 /* BookMarkPopUpViewTypeModalReactor.swift */; };
- 082197A12D426DCB0054094A /* Then in Frameworks */ = {isa = PBXBuildFile; productRef = 082197A02D426DCB0054094A /* Then */; };
- 082197A72D4E3EE00054094A /* CommentMyMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082197A62D4E3EE00054094A /* CommentMyMenuView.swift */; };
- 082197A92D4E3EE90054094A /* CommentMyMenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082197A82D4E3EE90054094A /* CommentMyMenuController.swift */; };
- 082197AB2D4E3EEF0054094A /* CommentMyMenuReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082197AA2D4E3EEF0054094A /* CommentMyMenuReactor.swift */; };
- 082197AD2D4E49370054094A /* DeleteCommentRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082197AC2D4E49370054094A /* DeleteCommentRequestDTO.swift */; };
- 082197B02D4E4E190054094A /* NormalCommentEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082197AF2D4E4E190054094A /* NormalCommentEditView.swift */; };
- 082197B22D4E4E200054094A /* NormalCommentEditController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082197B12D4E4E200054094A /* NormalCommentEditController.swift */; };
- 082197B42D4E4E280054094A /* NormalCommentEditReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082197B32D4E4E280054094A /* NormalCommentEditReactor.swift */; };
- 083A25822CF361EF0099B58E /* BaseTabmanController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A257F2CF361EF0099B58E /* BaseTabmanController.swift */; };
- 083A25832CF361EF0099B58E /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25802CF361EF0099B58E /* BaseViewController.swift */; };
- 083A258C2CF361F90099B58E /* ControllerConvention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25842CF361F90099B58E /* ControllerConvention.swift */; };
- 083A258D2CF361F90099B58E /* ConventionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25852CF361F90099B58E /* ConventionCollectionViewCell.swift */; };
- 083A258E2CF361F90099B58E /* ConventionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25862CF361F90099B58E /* ConventionTableViewCell.swift */; };
- 083A258F2CF361F90099B58E /* ReactorConvention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25872CF361F90099B58E /* ReactorConvention.swift */; };
- 083A25902CF361F90099B58E /* TestDynamicCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25882CF361F90099B58E /* TestDynamicCell.swift */; };
- 083A25912CF361F90099B58E /* TestDynamicSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25892CF361F90099B58E /* TestDynamicSection.swift */; };
- 083A25922CF361F90099B58E /* ViewConvention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A258A2CF361F90099B58E /* ViewConvention.swift */; };
- 083A25992CF362090099B58E /* Sectionable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25932CF362090099B58E /* Sectionable.swift */; };
- 083A259A2CF362090099B58E /* SectionDecorationItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25942CF362090099B58E /* SectionDecorationItem.swift */; };
- 083A259B2CF362090099B58E /* SectionSupplementaryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25952CF362090099B58E /* SectionSupplementaryItem.swift */; };
- 083A259C2CF362090099B58E /* InOutputable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25972CF362090099B58E /* InOutputable.swift */; };
- 083A25B22CF362670099B58E /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25A12CF362670099B58E /* NetworkError.swift */; };
- 083A25B32CF362670099B58E /* Requestable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25A22CF362670099B58E /* Requestable.swift */; };
- 083A25B42CF362670099B58E /* Responsable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25A32CF362670099B58E /* Responsable.swift */; };
- 083A25B52CF362670099B58E /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25A52CF362670099B58E /* Endpoint.swift */; };
- 083A25B62CF362670099B58E /* MultipartEndPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25A62CF362670099B58E /* MultipartEndPoint.swift */; };
- 083A25B72CF362670099B58E /* RequestEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25A72CF362670099B58E /* RequestEndpoint.swift */; };
- 083A25B82CF362670099B58E /* IndicatorMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25A92CF362670099B58E /* IndicatorMaker.swift */; };
- 083A25B92CF362670099B58E /* FormDataInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25AB2CF362670099B58E /* FormDataInterceptor.swift */; };
- 083A25BA2CF362670099B58E /* TokenInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25AC2CF362670099B58E /* TokenInterceptor.swift */; };
- 083A25BB2CF362670099B58E /* Provider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25AE2CF362670099B58E /* Provider.swift */; };
- 083A25BC2CF362670099B58E /* ProviderImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25AF2CF362670099B58E /* ProviderImpl.swift */; };
- 083A25BF2CF362770099B58E /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25BD2CF362770099B58E /* Logger.swift */; };
- 083A25C82CF363C00099B58E /* LoginController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25C72CF363C00099B58E /* LoginController.swift */; };
- 083A25CA2CF363C60099B58E /* LoginReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25C92CF363C60099B58E /* LoginReactor.swift */; };
- 083A25CC2CF363CB0099B58E /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083A25CB2CF363CB0099B58E /* LoginView.swift */; };
- 083A25D02CF364B70099B58E /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 083A25CF2CF364B70099B58E /* Alamofire */; };
- 083C860B2D073A15003F441C /* DetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C860A2D073A15003F441C /* DetailView.swift */; };
- 083C860D2D073A1C003F441C /* DetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C860C2D073A1C003F441C /* DetailController.swift */; };
- 083C860F2D073A23003F441C /* DetailReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C860E2D073A23003F441C /* DetailReactor.swift */; };
- 083C861C2D087337003F441C /* GetPopUpDetailRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C861B2D087337003F441C /* GetPopUpDetailRequestDTO.swift */; };
- 083C861E2D08737F003F441C /* GetPopUpDetailResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C861D2D08737F003F441C /* GetPopUpDetailResponseDTO.swift */; };
- 083C86202D087445003F441C /* GetPopUpDetailResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C861F2D087445003F441C /* GetPopUpDetailResponse.swift */; };
- 083C86242D087A44003F441C /* DetailTitleSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86232D087A44003F441C /* DetailTitleSection.swift */; };
- 083C86262D087A4E003F441C /* DetailTitleSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86252D087A4E003F441C /* DetailTitleSectionCell.swift */; };
- 083C86292D088080003F441C /* DetailContentSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86282D088080003F441C /* DetailContentSection.swift */; };
- 083C862B2D08808C003F441C /* DetailContentSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C862A2D08808C003F441C /* DetailContentSectionCell.swift */; };
- 083C86362D0C7EF4003F441C /* CommentSelectedController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86352D0C7EF4003F441C /* CommentSelectedController.swift */; };
- 083C86382D0C7EFC003F441C /* CommentSelectedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86372D0C7EFC003F441C /* CommentSelectedView.swift */; };
- 083C863A2D0C7F0A003F441C /* CommentSelectedReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86392D0C7F0A003F441C /* CommentSelectedReactor.swift */; };
- 083C863D2D0C8BC4003F441C /* NormalCommentAddController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C863C2D0C8BC4003F441C /* NormalCommentAddController.swift */; };
- 083C863F2D0C8BCE003F441C /* NormalCommentAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C863E2D0C8BCE003F441C /* NormalCommentAddView.swift */; };
- 083C86412D0C8BD8003F441C /* NormalCommentAddReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86402D0C8BD8003F441C /* NormalCommentAddReactor.swift */; };
- 083C86452D0DCDE9003F441C /* AddCommentTitleSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86442D0DCDE8003F441C /* AddCommentTitleSectionCell.swift */; };
- 083C86472D0DCDFB003F441C /* AddCommentTitleSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86462D0DCDFB003F441C /* AddCommentTitleSection.swift */; };
- 083C864A2D0DCF96003F441C /* AddCommentDescriptionSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86492D0DCF96003F441C /* AddCommentDescriptionSection.swift */; };
- 083C864C2D0DCF9B003F441C /* AddCommentDescriptionSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C864B2D0DCF9B003F441C /* AddCommentDescriptionSectionCell.swift */; };
- 083C864F2D0DD3A6003F441C /* AddCommentImageSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C864E2D0DD3A6003F441C /* AddCommentImageSection.swift */; };
- 083C86512D0DD3AB003F441C /* AddCommentImageSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86502D0DD3AB003F441C /* AddCommentImageSectionCell.swift */; };
- 083C86542D0DD7E9003F441C /* AddCommentSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86532D0DD7E9003F441C /* AddCommentSection.swift */; };
- 083C86562D0DD7EE003F441C /* AddCommentSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86552D0DD7EE003F441C /* AddCommentSectionCell.swift */; };
- 083C86592D0DEFC3003F441C /* CommentCheckView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86582D0DEFC3003F441C /* CommentCheckView.swift */; };
- 083C865B2D0DEFCF003F441C /* CommentCheckController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C865A2D0DEFCF003F441C /* CommentCheckController.swift */; };
- 083C865D2D0DEFD5003F441C /* CommentCheckReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C865C2D0DEFD5003F441C /* CommentCheckReactor.swift */; };
- 083C86602D0EC496003F441C /* InstaCommentAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C865F2D0EC496003F441C /* InstaCommentAddView.swift */; };
- 083C86622D0EC49E003F441C /* InstaCommentAddController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86612D0EC49E003F441C /* InstaCommentAddController.swift */; };
- 083C86642D0EC4A5003F441C /* InstaCommentAddReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86632D0EC4A5003F441C /* InstaCommentAddReactor.swift */; };
- 083C86692D0ECB47003F441C /* InstaGuideSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86682D0ECB47003F441C /* InstaGuideSection.swift */; };
- 083C866B2D0ECB4F003F441C /* InstaGuideSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C866A2D0ECB4F003F441C /* InstaGuideSectionCell.swift */; };
- 083C866E2D0ECB87003F441C /* InstaGuideChildSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C866D2D0ECB87003F441C /* InstaGuideChildSection.swift */; };
- 083C86702D0ECB8E003F441C /* InstaGuideChildSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C866F2D0ECB8E003F441C /* InstaGuideChildSectionCell.swift */; };
- 083C86732D0EE2B1003F441C /* CommentAPIEndPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86722D0EE2B1003F441C /* CommentAPIEndPoint.swift */; };
- 083C86762D0EE2CF003F441C /* PostCommentRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86752D0EE2CF003F441C /* PostCommentRequestDTO.swift */; };
- 083C86782D0EE382003F441C /* CommentAPIRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86772D0EE382003F441C /* CommentAPIRepository.swift */; };
- 083C867A2D0EE3BB003F441C /* CommentAPIUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C86792D0EE3BB003F441C /* CommentAPIUseCaseImpl.swift */; };
- 0841BA802CF9F34100049E31 /* ImageBannerChildSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BA7F2CF9F34100049E31 /* ImageBannerChildSectionCell.swift */; };
- 0841BA822CF9F5DF00049E31 /* PreSignedService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BA812CF9F5DF00049E31 /* PreSignedService.swift */; };
- 0841BA872CF9F62400049E31 /* PreSignedURLDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BA842CF9F62300049E31 /* PreSignedURLDTO.swift */; };
- 0841BA882CF9F62400049E31 /* PresignedURLRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BA852CF9F62300049E31 /* PresignedURLRequestDTO.swift */; };
- 0841BA892CF9F62400049E31 /* PreSignedURLResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BA862CF9F62300049E31 /* PreSignedURLResponseDTO.swift */; };
- 0841BA8C2CF9F67100049E31 /* PreSignedAPIEndPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BA8B2CF9F67100049E31 /* PreSignedAPIEndPoint.swift */; };
- 0841BA8E2CF9F8A100049E31 /* ImageBannerChildSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BA8D2CF9F8A100049E31 /* ImageBannerChildSection.swift */; };
- 0841BAA32CFA31A300049E31 /* SpacingSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAA22CFA31A300049E31 /* SpacingSection.swift */; };
- 0841BAA52CFA31A900049E31 /* SpacingSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAA42CFA31A900049E31 /* SpacingSectionCell.swift */; };
- 0841BAA82CFA354500049E31 /* HomeTitleSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAA72CFA354500049E31 /* HomeTitleSection.swift */; };
- 0841BAAA2CFA354C00049E31 /* HomeTitleSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAA92CFA354C00049E31 /* HomeTitleSectionCell.swift */; };
- 0841BAAC2CFA35F300049E31 /* UILabel+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAAB2CFA35F300049E31 /* UILabel+.swift */; };
- 0841BAAF2CFA38EA00049E31 /* HomeCardSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAAE2CFA38EA00049E31 /* HomeCardSection.swift */; };
- 0841BAB12CFA38F500049E31 /* HomeCardSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAB02CFA38F500049E31 /* HomeCardSectionCell.swift */; };
- 0841BAB42CFABED700049E31 /* HomePopularCardSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAB32CFABED700049E31 /* HomePopularCardSection.swift */; };
- 0841BAB62CFABEDC00049E31 /* HomePopularCardSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAB52CFABEDC00049E31 /* HomePopularCardSectionCell.swift */; };
- 0841BAB82CFAC41300049E31 /* SectionBackGroundDecorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAB72CFAC41300049E31 /* SectionBackGroundDecorationView.swift */; };
- 0841BABA2CFAE5BE00049E31 /* HomeHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAB92CFAE5BE00049E31 /* HomeHeaderView.swift */; };
- 0841BABC2CFB59E200049E31 /* String?+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BABB2CFB59E200049E31 /* String?+.swift */; };
- 0841BABE2CFB5AA600049E31 /* Date?+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BABD2CFB5AA600049E31 /* Date?+.swift */; };
- 0841BAC32CFB600800049E31 /* TabbarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841BAC22CFB600800049E31 /* TabbarController.swift */; };
- 086DD8C82CFDEA9200B97D3B /* UIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8C72CFDEA9200B97D3B /* UIView+.swift */; };
- 086DD8CC2CFDFEA800B97D3B /* HomeListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8CB2CFDFEA800B97D3B /* HomeListController.swift */; };
- 086DD8CE2CFDFEB000B97D3B /* HomeListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8CD2CFDFEB000B97D3B /* HomeListView.swift */; };
- 086DD8D02CFDFEB900B97D3B /* HomeListReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8CF2CFDFEB900B97D3B /* HomeListReactor.swift */; };
- 086DD8D32CFDFF1500B97D3B /* HomePopUpType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8D22CFDFF1500B97D3B /* HomePopUpType.swift */; };
- 086DD8D62CFF182100B97D3B /* UserAPIEndPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8D52CFF182100B97D3B /* UserAPIEndPoint.swift */; };
- 086DD8D82CFF185200B97D3B /* PostBookmarkPopUpRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8D72CFF185200B97D3B /* PostBookmarkPopUpRequestDTO.swift */; };
- 086DD8DA2CFF194700B97D3B /* UserAPIRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8D92CFF194700B97D3B /* UserAPIRepositoryImpl.swift */; };
- 086DD8DE2CFF19C400B97D3B /* UserAPIUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8DD2CFF19C400B97D3B /* UserAPIUseCaseImpl.swift */; };
- 086DD8E02CFF2C3700B97D3B /* UIImageView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8DF2CFF2C3700B97D3B /* UIImageView+.swift */; };
- 086DD8E32CFF356300B97D3B /* HomeCardGridSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD8E22CFF356300B97D3B /* HomeCardGridSection.swift */; };
- 086DD92A2D0086AA00B97D3B /* SearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD9292D0086AA00B97D3B /* SearchController.swift */; };
- 086DD92C2D0086B100B97D3B /* SearchReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD92B2D0086B100B97D3B /* SearchReactor.swift */; };
- 086DD92E2D0086B900B97D3B /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD92D2D0086B900B97D3B /* SearchView.swift */; };
- 086DD9302D0090E900B97D3B /* UITextField+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD92F2D0090E900B97D3B /* UITextField+.swift */; };
- 086DD9342D00962500B97D3B /* SearchTitleSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD9332D00962500B97D3B /* SearchTitleSectionCell.swift */; };
- 086DD9362D00963900B97D3B /* SearchTitleSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD9352D00963900B97D3B /* SearchTitleSection.swift */; };
- 086DD93B2D009A1C00B97D3B /* CancelableTagSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD93A2D009A1C00B97D3B /* CancelableTagSection.swift */; };
- 086DD93D2D009A2600B97D3B /* CancelableTagSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD93C2D009A2600B97D3B /* CancelableTagSectionCell.swift */; };
- 086DD9402D01EEEB00B97D3B /* SearchCountTitleSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD93F2D01EEEB00B97D3B /* SearchCountTitleSection.swift */; };
- 086DD9422D01EEF700B97D3B /* SearchCountTitleSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086DD9412D01EEF700B97D3B /* SearchCountTitleSectionCell.swift */; };
- 086F89C32D1E347700CA4FC9 /* CommentUserInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89C22D1E347700CA4FC9 /* CommentUserInfoView.swift */; };
- 086F89C52D1E347E00CA4FC9 /* CommentUserInfoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89C42D1E347E00CA4FC9 /* CommentUserInfoController.swift */; };
- 086F89C72D1E348400CA4FC9 /* CommentUserInfoReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89C62D1E348400CA4FC9 /* CommentUserInfoReactor.swift */; };
- 086F89CA2D1E42A700CA4FC9 /* CommentUserBlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89C92D1E42A700CA4FC9 /* CommentUserBlockView.swift */; };
- 086F89CC2D1E42B000CA4FC9 /* CommentUserBlockController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89CB2D1E42B000CA4FC9 /* CommentUserBlockController.swift */; };
- 086F89CE2D1E42B500CA4FC9 /* CommentUserBlockReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89CD2D1E42B500CA4FC9 /* CommentUserBlockReactor.swift */; };
- 086F89D02D1E60A100CA4FC9 /* PostUserBlockRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89CF2D1E60A100CA4FC9 /* PostUserBlockRequestDTO.swift */; };
- 086F89D32D1E6DA600CA4FC9 /* OtherUserCommentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89D22D1E6DA600CA4FC9 /* OtherUserCommentView.swift */; };
- 086F89D52D1E6DB100CA4FC9 /* OtherUserCommentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89D42D1E6DB100CA4FC9 /* OtherUserCommentController.swift */; };
- 086F89D72D1E6DB700CA4FC9 /* OtherUserCommentReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89D62D1E6DB700CA4FC9 /* OtherUserCommentReactor.swift */; };
- 086F89D92D1E79E200CA4FC9 /* GetOtherUserCommentListRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89D82D1E79E200CA4FC9 /* GetOtherUserCommentListRequestDTO.swift */; };
- 086F89DB2D1E7A6C00CA4FC9 /* GetOtherUserCommentedPopUpListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89DA2D1E7A6C00CA4FC9 /* GetOtherUserCommentedPopUpListResponseDTO.swift */; };
- 086F89E02D1E7CC700CA4FC9 /* GetOtherUserCommentedPopUpListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89DF2D1E7CC700CA4FC9 /* GetOtherUserCommentedPopUpListResponse.swift */; };
- 086F89E42D1FE91300CA4FC9 /* OtherUserCommentSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89E32D1FE91300CA4FC9 /* OtherUserCommentSection.swift */; };
- 086F89E62D1FE91800CA4FC9 /* OtherUserCommentSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89E52D1FE91800CA4FC9 /* OtherUserCommentSectionCell.swift */; };
- 086F89EA2D2009E300CA4FC9 /* SubLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89E92D2009E300CA4FC9 /* SubLoginView.swift */; };
- 086F89EC2D2009EB00CA4FC9 /* SubLoginController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89EB2D2009EB00CA4FC9 /* SubLoginController.swift */; };
- 086F89EE2D2009F100CA4FC9 /* SubLoginReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89ED2D2009F100CA4FC9 /* SubLoginReactor.swift */; };
- 086F89F12D2269D800CA4FC9 /* MyPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89F02D2269D800CA4FC9 /* MyPageView.swift */; };
- 086F89F32D2269DE00CA4FC9 /* MyPageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89F22D2269DE00CA4FC9 /* MyPageController.swift */; };
- 086F89F52D2269E300CA4FC9 /* MyPageReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89F42D2269E300CA4FC9 /* MyPageReactor.swift */; };
- 086F89F72D226DF600CA4FC9 /* GetMyPageResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89F62D226DF600CA4FC9 /* GetMyPageResponseDTO.swift */; };
- 086F89F92D226EEB00CA4FC9 /* GetMyPageResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F89F82D226EEB00CA4FC9 /* GetMyPageResponse.swift */; };
- 086F8A052D23CB3300CA4FC9 /* MyPageProfileSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F8A042D23CB3300CA4FC9 /* MyPageProfileSection.swift */; };
- 086F8A072D23CB3800CA4FC9 /* MyPageProfileSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F8A062D23CB3800CA4FC9 /* MyPageProfileSectionCell.swift */; };
- 086F8A0A2D2621EE00CA4FC9 /* MyPageMyCommentTitleSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F8A092D2621EE00CA4FC9 /* MyPageMyCommentTitleSection.swift */; };
- 086F8A0C2D2621F400CA4FC9 /* MyPageMyCommentTitleSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F8A0B2D2621F400CA4FC9 /* MyPageMyCommentTitleSectionCell.swift */; };
- 086F8A0F2D26297900CA4FC9 /* MyPageCommentSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F8A0E2D26297900CA4FC9 /* MyPageCommentSection.swift */; };
- 086F8A112D26297D00CA4FC9 /* MyPageCommentSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F8A102D26297D00CA4FC9 /* MyPageCommentSectionCell.swift */; };
- 086F8A182D265C5F00CA4FC9 /* MyPageListSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F8A172D265C5F00CA4FC9 /* MyPageListSection.swift */; };
- 086F8A1A2D265C6300CA4FC9 /* MyPageListSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 086F8A192D265C6300CA4FC9 /* MyPageListSectionCell.swift */; };
- 088DE2442D104EE70030FA9E /* SwiftSoup in Frameworks */ = {isa = PBXBuildFile; productRef = 088DE2432D104EE70030FA9E /* SwiftSoup */; };
- 088DE2472D12DB5C0030FA9E /* GoogleMaps in Frameworks */ = {isa = PBXBuildFile; productRef = 088DE2462D12DB5C0030FA9E /* GoogleMaps */; };
- 088DE24A2D12F3360030FA9E /* DetailInfoSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE2492D12F3360030FA9E /* DetailInfoSection.swift */; };
- 088DE24C2D12F33B0030FA9E /* DetailInfoSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE24B2D12F33B0030FA9E /* DetailInfoSectionCell.swift */; };
- 088DE24F2D13019A0030FA9E /* DetailCommentTitleSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE24E2D13019A0030FA9E /* DetailCommentTitleSection.swift */; };
- 088DE2512D13019E0030FA9E /* DetailCommentTitleSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE2502D13019E0030FA9E /* DetailCommentTitleSectionCell.swift */; };
- 088DE2542D144A7E0030FA9E /* DetailCommentSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE2532D144A7E0030FA9E /* DetailCommentSection.swift */; };
- 088DE2562D144A830030FA9E /* DetailCommentSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE2552D144A830030FA9E /* DetailCommentSectionCell.swift */; };
- 088DE2582D144B0F0030FA9E /* DetailCommentProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE2572D144B0F0030FA9E /* DetailCommentProfileView.swift */; };
- 088DE25A2D1458620030FA9E /* DetailCommentImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE2592D1458620030FA9E /* DetailCommentImageCell.swift */; };
- 088DE25D2D145E3A0030FA9E /* DetailSimilarSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE25C2D145E3A0030FA9E /* DetailSimilarSection.swift */; };
- 088DE25F2D145E3F0030FA9E /* DetailSimilarSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088DE25E2D145E3F0030FA9E /* DetailSimilarSectionCell.swift */; };
- 089952422D031E650022AEF9 /* SearchSortedController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952412D031E650022AEF9 /* SearchSortedController.swift */; };
- 089952442D031E6D0022AEF9 /* SearchSortedReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952432D031E6D0022AEF9 /* SearchSortedReactor.swift */; };
- 089952462D031E740022AEF9 /* SearchSortedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952452D031E740022AEF9 /* SearchSortedView.swift */; };
- 089952492D033A1C0022AEF9 /* PopUpAPIEndPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952482D033A1C0022AEF9 /* PopUpAPIEndPoint.swift */; };
- 0899524B2D033A9C0022AEF9 /* GetClosePopUpListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0899524A2D033A9C0022AEF9 /* GetClosePopUpListResponseDTO.swift */; };
- 0899524D2D033AA70022AEF9 /* GetOpenPopUpListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0899524C2D033AA70022AEF9 /* GetOpenPopUpListResponseDTO.swift */; };
- 0899524F2D033B5A0022AEF9 /* GetSearchPopUpListRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0899524E2D033B5A0022AEF9 /* GetSearchPopUpListRequestDTO.swift */; };
- 089952512D033C410022AEF9 /* GetSearchBottomPopUpListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952502D033C410022AEF9 /* GetSearchBottomPopUpListResponse.swift */; };
- 089952532D033C940022AEF9 /* PopUpAPIRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952522D033C940022AEF9 /* PopUpAPIRepositoryImpl.swift */; };
- 089952552D033D480022AEF9 /* PopUpAPIUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952542D033D480022AEF9 /* PopUpAPIUseCaseImpl.swift */; };
- 089952582D0347AC0022AEF9 /* SearchCategoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952572D0347AC0022AEF9 /* SearchCategoryController.swift */; };
- 0899525A2D0347B40022AEF9 /* SearchCategoryReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952592D0347B40022AEF9 /* SearchCategoryReactor.swift */; };
- 0899525C2D0347BD0022AEF9 /* SearchCategoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0899525B2D0347BD0022AEF9 /* SearchCategoryView.swift */; };
- 089952602D0366C40022AEF9 /* SearchMainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0899525F2D0366C40022AEF9 /* SearchMainController.swift */; };
- 089952622D0366D30022AEF9 /* SearchMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952612D0366D30022AEF9 /* SearchMainView.swift */; };
- 089952642D0366DA0022AEF9 /* SearchMainReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952632D0366DA0022AEF9 /* SearchMainReactor.swift */; };
- 089952662D046CCD0022AEF9 /* SearchResultController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952652D046CCD0022AEF9 /* SearchResultController.swift */; };
- 089952682D046CD80022AEF9 /* SearchResultReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952672D046CD80022AEF9 /* SearchResultReactor.swift */; };
- 0899526A2D046CDE0022AEF9 /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952692D046CDE0022AEF9 /* SearchResultView.swift */; };
- 0899526C2D0473EC0022AEF9 /* GetSearchPopUpListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0899526B2D0473EC0022AEF9 /* GetSearchPopUpListResponseDTO.swift */; };
- 0899526E2D0474340022AEF9 /* GetSearchPopUpListResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0899526D2D0474340022AEF9 /* GetSearchPopUpListResponse.swift */; };
- 089952732D0475E90022AEF9 /* SearchResultCountSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952722D0475E90022AEF9 /* SearchResultCountSection.swift */; };
- 089952752D0475F20022AEF9 /* SearchResultCountSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089952742D0475F20022AEF9 /* SearchResultCountSectionCell.swift */; };
- 08A2E46C2D15BC5000102313 /* CommentLikeRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E46B2D15BC5000102313 /* CommentLikeRequestDTO.swift */; };
- 08A2E4792D1B06A300102313 /* ImageDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4782D1B06A300102313 /* ImageDetailView.swift */; };
- 08A2E47B2D1B06AA00102313 /* ImageDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E47A2D1B06AA00102313 /* ImageDetailController.swift */; };
- 08A2E47D2D1B06B000102313 /* ImageDetailReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E47C2D1B06B000102313 /* ImageDetailReactor.swift */; };
- 08A2E4802D1BCDE300102313 /* CommentDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E47F2D1BCDE300102313 /* CommentDetailView.swift */; };
- 08A2E4822D1BCDEA00102313 /* CommentDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4812D1BCDEA00102313 /* CommentDetailController.swift */; };
- 08A2E4842D1BCDEF00102313 /* CommentDetailReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4832D1BCDEF00102313 /* CommentDetailReactor.swift */; };
- 08A2E4862D1BD85C00102313 /* CommentDetailImageSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4852D1BD85C00102313 /* CommentDetailImageSection.swift */; };
- 08A2E48A2D1BDA8400102313 /* CommentDetailContentSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4892D1BDA8400102313 /* CommentDetailContentSection.swift */; };
- 08A2E48C2D1BDA8A00102313 /* CommentDetailContentSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E48B2D1BDA8A00102313 /* CommentDetailContentSectionCell.swift */; };
- 08A2E48F2D1BF6E500102313 /* CommentListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E48E2D1BF6E500102313 /* CommentListView.swift */; };
- 08A2E4912D1BF6EA00102313 /* CommentListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4902D1BF6EA00102313 /* CommentListController.swift */; };
- 08A2E4932D1BF6EF00102313 /* CommentListReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4922D1BF6EF00102313 /* CommentListReactor.swift */; };
- 08A2E4952D1C078300102313 /* GetPopUpCommentRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4942D1C078300102313 /* GetPopUpCommentRequestDTO.swift */; };
- 08A2E4972D1C07F500102313 /* GetPopUpCommentResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4962D1C07F500102313 /* GetPopUpCommentResponseDTO.swift */; };
- 08A2E4992D1C08D600102313 /* GetPopUpCommentResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E4982D1C08D600102313 /* GetPopUpCommentResponse.swift */; };
- 08A2E49D2D1C416800102313 /* CommentListTitleSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E49C2D1C416800102313 /* CommentListTitleSection.swift */; };
- 08A2E49F2D1C417000102313 /* CommentListTitleSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A2E49E2D1C417000102313 /* CommentListTitleSectionCell.swift */; };
- 08B191372CF366680057BC04 /* UICollectionViewCell+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191342CF366670057BC04 /* UICollectionViewCell+.swift */; };
- 08B191382CF366680057BC04 /* UICollectionReusableView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191352CF366670057BC04 /* UICollectionReusableView+.swift */; };
- 08B191392CF366680057BC04 /* UITableViewCell+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191362CF366670057BC04 /* UITableViewCell+.swift */; };
- 08B1913B2CF366A00057BC04 /* UIApplication+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1913A2CF366A00057BC04 /* UIApplication+.swift */; };
- 08B1913F2CF367FA0057BC04 /* UIColor+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1913E2CF367FA0057BC04 /* UIColor+.swift */; };
- 08B191412CF367FF0057BC04 /* UIFont+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191402CF367FF0057BC04 /* UIFont+.swift */; };
- 08B1914B2CF41D690057BC04 /* GothicA1-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08B191422CF41D680057BC04 /* GothicA1-Bold.ttf */; };
- 08B1914C2CF41D690057BC04 /* GothicA1-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08B191432CF41D680057BC04 /* GothicA1-Light.ttf */; };
- 08B1914D2CF41D690057BC04 /* GothicA1-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08B191442CF41D680057BC04 /* GothicA1-Medium.ttf */; };
- 08B1914E2CF41D690057BC04 /* GothicA1-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08B191452CF41D680057BC04 /* GothicA1-Regular.ttf */; };
- 08B1914F2CF41D690057BC04 /* Poppins-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08B191462CF41D680057BC04 /* Poppins-Bold.ttf */; };
- 08B191502CF41D690057BC04 /* Poppins-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08B191472CF41D680057BC04 /* Poppins-Light.ttf */; };
- 08B191512CF41D690057BC04 /* Poppins-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08B191482CF41D680057BC04 /* Poppins-Medium.ttf */; };
- 08B191522CF41D690057BC04 /* Poppins-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08B191492CF41D680057BC04 /* Poppins-Regular.ttf */; };
- 08B191552CF41D6F0057BC04 /* PP_loading.json in Resources */ = {isa = PBXBuildFile; fileRef = 08B191532CF41D6F0057BC04 /* PP_loading.json */; };
- 08B191562CF41D6F0057BC04 /* PP_splash.json in Resources */ = {isa = PBXBuildFile; fileRef = 08B191542CF41D6F0057BC04 /* PP_splash.json */; };
- 08B191592CF41E610057BC04 /* SignUpMainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191582CF41E610057BC04 /* SignUpMainController.swift */; };
- 08B1915B2CF41E690057BC04 /* SignUpMainReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1915A2CF41E690057BC04 /* SignUpMainReactor.swift */; };
- 08B1915D2CF41E6F0057BC04 /* SignUpMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1915C2CF41E6F0057BC04 /* SignUpMainView.swift */; };
- 08B191612CF430E70057BC04 /* PPProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191602CF430E70057BC04 /* PPProgressView.swift */; };
- 08B191632CF430F30057BC04 /* PPProgressIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191622CF430F30057BC04 /* PPProgressIndicator.swift */; };
- 08B191672CF432220057BC04 /* PPCancelHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191662CF432220057BC04 /* PPCancelHeaderView.swift */; };
- 08B1916A2CF434B80057BC04 /* SignUpStep1Controller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191692CF434B80057BC04 /* SignUpStep1Controller.swift */; };
- 08B1916C2CF434C30057BC04 /* SignUpStep1View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1916B2CF434C30057BC04 /* SignUpStep1View.swift */; };
- 08B1916E2CF434CF0057BC04 /* SignUpStep1Reactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1916D2CF434CF0057BC04 /* SignUpStep1Reactor.swift */; };
- 08B191712CF4398D0057BC04 /* PPLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191702CF4398D0057BC04 /* PPLabel.swift */; };
- 08B191742CF43DF40057BC04 /* SignUpCheckBoxButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191732CF43DF40057BC04 /* SignUpCheckBoxButton.swift */; };
- 08B191762CF440C40057BC04 /* PPButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191752CF440C40057BC04 /* PPButton.swift */; };
- 08B191782CF442230057BC04 /* UIImage+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191772CF442230057BC04 /* UIImage+.swift */; };
- 08B1917A2CF452B30057BC04 /* SignUpTermsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191792CF452B30057BC04 /* SignUpTermsView.swift */; };
- 08B1917D2CF46DE30057BC04 /* TermsDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1917C2CF46DE30057BC04 /* TermsDetailController.swift */; };
- 08B1917F2CF46DF20057BC04 /* TermsDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1917E2CF46DF20057BC04 /* TermsDetailView.swift */; };
- 08B191822CF48A7B0057BC04 /* SignUpStep2Controller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191812CF48A7B0057BC04 /* SignUpStep2Controller.swift */; };
- 08B191842CF48A820057BC04 /* SignUpStep2View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191832CF48A820057BC04 /* SignUpStep2View.swift */; };
- 08B191862CF48A8B0057BC04 /* SignUpStep2Reactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191852CF48A8B0057BC04 /* SignUpStep2Reactor.swift */; };
- 08B191882CF48FAE0057BC04 /* NickNameState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191872CF48FAE0057BC04 /* NickNameState.swift */; };
- 08B1918D2CF49FF70057BC04 /* SignUpStep3View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1918C2CF49FF70057BC04 /* SignUpStep3View.swift */; };
- 08B1918F2CF4A0020057BC04 /* SignUpStep3Controller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1918E2CF4A0020057BC04 /* SignUpStep3Controller.swift */; };
- 08B191912CF4A00E0057BC04 /* SignUpStep3Reactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191902CF4A00E0057BC04 /* SignUpStep3Reactor.swift */; };
- 08B191942CF4A0F00057BC04 /* SignUpStep4View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191932CF4A0F00057BC04 /* SignUpStep4View.swift */; };
- 08B191962CF4A0FA0057BC04 /* SignUpStep4Controller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191952CF4A0FA0057BC04 /* SignUpStep4Controller.swift */; };
- 08B191982CF4A1010057BC04 /* SignUpStep4Reactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191972CF4A1010057BC04 /* SignUpStep4Reactor.swift */; };
- 08B1919C2CF4A77C0057BC04 /* TagSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1919B2CF4A77C0057BC04 /* TagSection.swift */; };
- 08B1919E2CF4A7830057BC04 /* TagSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1919D2CF4A7830057BC04 /* TagSectionCell.swift */; };
- 08B191A02CF4AA0E0057BC04 /* Reactive+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B1919F2CF4AA0E0057BC04 /* Reactive+.swift */; };
- 08B191A22CF4AE890057BC04 /* ToastMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191A12CF4AE890057BC04 /* ToastMaker.swift */; };
- 08B191A42CF5A7030057BC04 /* PPSegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191A32CF5A7030057BC04 /* PPSegmentedControl.swift */; };
- 08B191A72CF5A9430057BC04 /* AgeSelectedButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191A62CF5A9430057BC04 /* AgeSelectedButton.swift */; };
- 08B191AC2CF5BF9D0057BC04 /* AgeSelectedController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191AB2CF5BF9D0057BC04 /* AgeSelectedController.swift */; };
- 08B191AE2CF5BFA60057BC04 /* AgeSelectedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191AD2CF5BFA60057BC04 /* AgeSelectedView.swift */; };
- 08B191B02CF5BFAE0057BC04 /* AgeSelectedReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191AF2CF5BFAE0057BC04 /* AgeSelectedReactor.swift */; };
- 08B191B22CF5C0A60057BC04 /* PPPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191B12CF5C0A60057BC04 /* PPPicker.swift */; };
- 08B191B42CF609260057BC04 /* KakaoLoginService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191B32CF609260057BC04 /* KakaoLoginService.swift */; };
- 08B191B62CF6092B0057BC04 /* AppleLoginService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191B52CF6092B0057BC04 /* AppleLoginService.swift */; };
- 08B191B82CF6092F0057BC04 /* AuthServiceable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191B72CF6092F0057BC04 /* AuthServiceable.swift */; };
- 08B191BA2CF609AE0057BC04 /* RxKakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = 08B191B92CF609AE0057BC04 /* RxKakaoSDK */; };
- 08B191BC2CF609AE0057BC04 /* RxKakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 08B191BB2CF609AE0057BC04 /* RxKakaoSDKAuth */; };
- 08B191BE2CF609AE0057BC04 /* RxKakaoSDKUser in Frameworks */ = {isa = PBXBuildFile; productRef = 08B191BD2CF609AE0057BC04 /* RxKakaoSDKUser */; };
- 08B191C22CF615CA0057BC04 /* Secrets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08B191C12CF615CA0057BC04 /* Secrets.swift */; };
- 08CBEA032D38989E00248007 /* PostTokenReissueResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBEA022D38989E00248007 /* PostTokenReissueResponseDTO.swift */; };
- 08CBEA062D38991600248007 /* PostTokenReissueResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBEA052D38991600248007 /* PostTokenReissueResponse.swift */; };
- 08CBEA0B2D38DBD600248007 /* LastLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBEA0A2D38DBD600248007 /* LastLoginView.swift */; };
- 08CBEA0D2D38ED0D00248007 /* CountButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBEA0C2D38ED0D00248007 /* CountButtonView.swift */; };
- 08CBEA3A2D3FABE100248007 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBEA392D3FABE100248007 /* ToastView.swift */; };
- 08CBEA3C2D3FABED00248007 /* BookMarkToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBEA3B2D3FABED00248007 /* BookMarkToastView.swift */; };
- 08CBEA3E2D3FF6A100248007 /* PopUpCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBEA3D2D3FF6A100248007 /* PopUpCardView.swift */; };
- 08DC61F32CF75037002A2F44 /* KeyChainService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC61F22CF75037002A2F44 /* KeyChainService.swift */; };
- 08DC61F52CF765B5002A2F44 /* UserDefaultService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC61F42CF765B5002A2F44 /* UserDefaultService.swift */; };
- 08DC61F82CF76843002A2F44 /* SignUpCompleteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC61F72CF76843002A2F44 /* SignUpCompleteView.swift */; };
- 08DC61FA2CF7684F002A2F44 /* SignUpCompleteController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC61F92CF7684F002A2F44 /* SignUpCompleteController.swift */; };
- 08DC61FC2CF76862002A2F44 /* SignUpCompleteReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC61FB2CF76862002A2F44 /* SignUpCompleteReactor.swift */; };
- 08DC62032CF8AC06002A2F44 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC62022CF8AC06002A2F44 /* HomeView.swift */; };
- 08DC62052CF8AC0E002A2F44 /* HomeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC62042CF8AC0E002A2F44 /* HomeController.swift */; };
- 08DC62072CF8AC14002A2F44 /* HomeReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC62062CF8AC14002A2F44 /* HomeReactor.swift */; };
- 08DC620B2CF8AE0F002A2F44 /* ImageBannerSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC620A2CF8AE0F002A2F44 /* ImageBannerSection.swift */; };
- 08DC620D2CF8AE16002A2F44 /* ImageBannerSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC620C2CF8AE16002A2F44 /* ImageBannerSectionCell.swift */; };
- 08DC62112CF8B446002A2F44 /* SortedRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC62102CF8B446002A2F44 /* SortedRequestDTO.swift */; };
- 08DC62132CF8B833002A2F44 /* Optional+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DC62122CF8B833002A2F44 /* Optional+.swift */; };
- 08DE8A0D2D5236840049BCAC /* PutCommentRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DE8A0C2D5236840049BCAC /* PutCommentRequestDTO.swift */; };
- 08DE8A102D5255110049BCAC /* DetailEmptyCommetSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DE8A0F2D5255110049BCAC /* DetailEmptyCommetSection.swift */; };
- 08DE8A122D5255180049BCAC /* DetailEmptyCommetSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DE8A112D5255180049BCAC /* DetailEmptyCommetSectionCell.swift */; };
- 08DE8A182D525BA20049BCAC /* Terms.plist in Resources */ = {isa = PBXBuildFile; fileRef = 08DE8A172D525BA20049BCAC /* Terms.plist */; };
- 08DE8A1B2D5261DE0049BCAC /* MyPageTermsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DE8A1A2D5261DE0049BCAC /* MyPageTermsController.swift */; };
- 08DE8A1D2D5261E70049BCAC /* MyPageTermsReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DE8A1C2D5261E70049BCAC /* MyPageTermsReactor.swift */; };
- 08DE8A3F2D54DCC40049BCAC /* MyCommentedPopUpGridSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DE8A3E2D54DCC40049BCAC /* MyCommentedPopUpGridSection.swift */; };
- 08DE8A412D54DCCA0049BCAC /* MyCommentedPopUpGridSectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DE8A402D54DCCA0049BCAC /* MyCommentedPopUpGridSectionCell.swift */; };
- 4E5825672D1951DF00EE83EF /* FloatingPanel in Frameworks */ = {isa = PBXBuildFile; productRef = 4E5825662D1951DF00EE83EF /* FloatingPanel */; };
- 4E643FC12D738D7F0046AF29 /* PopUpStoreRegisterReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E643FC02D738D7F0046AF29 /* PopUpStoreRegisterReactor.swift */; };
- 4E643FC32D738D930046AF29 /* PopUpStoreRegisterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E643FC22D738D930046AF29 /* PopUpStoreRegisterView.swift */; };
- 4E685ECE2D12CEB6001EF91C /* BalloonBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EAA2D12CEB6001EF91C /* BalloonBackgroundView.swift */; };
- 4E685ECF2D12CEB6001EF91C /* BalloonChipCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EAB2D12CEB6001EF91C /* BalloonChipCell.swift */; };
- 4E685ED12D12CEB6001EF91C /* FilterBottomSheetReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EAD2D12CEB6001EF91C /* FilterBottomSheetReactor.swift */; };
- 4E685ED22D12CEB6001EF91C /* FilterBottomSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EAE2D12CEB6001EF91C /* FilterBottomSheetView.swift */; };
- 4E685ED32D12CEB6001EF91C /* FilterBottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EAF2D12CEB6001EF91C /* FilterBottomSheetViewController.swift */; };
- 4E685ED42D12CEB6001EF91C /* FilterCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EB02D12CEB6001EF91C /* FilterCell.swift */; };
- 4E685ED52D12CEB6001EF91C /* FilterChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EB12D12CEB6001EF91C /* FilterChip.swift */; };
- 4E685ED62D12CEB6001EF91C /* FilterChipsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EB22D12CEB6001EF91C /* FilterChipsView.swift */; };
- 4E685ED92D12CEB6001EF91C /* MapRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EB62D12CEB6001EF91C /* MapRepository.swift */; };
- 4E685EDA2D12CEB6001EF91C /* MapUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EB82D12CEB6001EF91C /* MapUseCase.swift */; };
- 4E685EDB2D12CEB6001EF91C /* MapAPIEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EBA2D12CEB6001EF91C /* MapAPIEndpoint.swift */; };
- 4E685EDD2D12CEB6001EF91C /* MapPopUpStoreDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EBC2D12CEB6001EF91C /* MapPopUpStoreDTO.swift */; };
- 4E685EDE2D12CEB6001EF91C /* MapPopupCarouselView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EBE2D12CEB6001EF91C /* MapPopupCarouselView.swift */; };
- 4E685EDF2D12CEB6001EF91C /* PopupCardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EBF2D12CEB6001EF91C /* PopupCardCell.swift */; };
- 4E685EE02D12CEB6001EF91C /* StoreListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EC12D12CEB6001EF91C /* StoreListCell.swift */; };
- 4E685EE12D12CEB6001EF91C /* StoreListReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EC22D12CEB6001EF91C /* StoreListReactor.swift */; };
- 4E685EE22D12CEB6001EF91C /* StoreListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EC32D12CEB6001EF91C /* StoreListView.swift */; };
- 4E685EE32D12CEB6001EF91C /* StoreListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EC42D12CEB6001EF91C /* StoreListViewController.swift */; };
- 4E685EE42D12CEB6001EF91C /* MapFilterChips.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EC62D12CEB6001EF91C /* MapFilterChips.swift */; };
- 4E685EE52D12CEB6001EF91C /* MapMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EC72D12CEB6001EF91C /* MapMarker.swift */; };
- 4E685EE62D12CEB6001EF91C /* MapReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EC82D12CEB6001EF91C /* MapReactor.swift */; };
- 4E685EE72D12CEB6001EF91C /* MapSearchInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EC92D12CEB6001EF91C /* MapSearchInput.swift */; };
- 4E685EE92D12CEB6001EF91C /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685ECB2D12CEB6001EF91C /* MapView.swift */; };
- 4E685EEA2D12CEB6001EF91C /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685ECC2D12CEB6001EF91C /* MapViewController.swift */; };
- 4E6A06702D42A96100B2A658 /* FullScreenMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E6A066F2D42A96100B2A658 /* FullScreenMapViewController.swift */; };
- 4E6C07062D4B6E56008A962A /* RegionDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E6C07052D4B6E56008A962A /* RegionDefinitions.swift */; };
- 4E6C07082D4B6E74008A962A /* ClusteringModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E6C07072D4B6E74008A962A /* ClusteringModels.swift */; };
- 4E6C070A2D4B6E81008A962A /* ClusteringManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E6C07092D4B6E81008A962A /* ClusteringManager.swift */; };
- 4E6CA4852D34D6ED0034D09A /* AdminBottomSheetReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E6CA4842D34D6ED0034D09A /* AdminBottomSheetReactor.swift */; };
- 4E755B1D2D2B9AD300ADFB21 /* GetAdminPopUpStoreListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B1C2D2B9AD300ADFB21 /* GetAdminPopUpStoreListResponseDTO.swift */; };
- 4E755B1F2D2B9AE500ADFB21 /* AdminAPIEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B1E2D2B9AE500ADFB21 /* AdminAPIEndpoint.swift */; };
- 4E755B212D2B9BAB00ADFB21 /* AdminResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B202D2B9BAB00ADFB21 /* AdminResponseDTO.swift */; };
- 4E755B232D2B9C5D00ADFB21 /* AdminViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B222D2B9C5D00ADFB21 /* AdminViewController.swift */; };
- 4E755B252D2B9C6C00ADFB21 /* AdminView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B242D2B9C6C00ADFB21 /* AdminView.swift */; };
- 4E755B292D2BA65A00ADFB21 /* AdminReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B282D2BA65A00ADFB21 /* AdminReactor.swift */; };
- 4E755B2B2D2BA76E00ADFB21 /* AdminUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B2A2D2BA76E00ADFB21 /* AdminUseCase.swift */; };
- 4E7823A82D2E84E800AC5110 /* AdminRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B2E2D2BA7FB00ADFB21 /* AdminRepository.swift */; };
- 4E7823A92D2E84FB00AC5110 /* AdminStoreCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B262D2B9C7C00ADFB21 /* AdminStoreCell.swift */; };
- 4E78706E2D37CB1900465FC9 /* ProfileEditListButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081898BF2D2FBD130067BF01 /* ProfileEditListButton.swift */; };
- 4E78706F2D37CB2200465FC9 /* PopUpStoreRegisterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E9C12802D2BE0A6006744D6 /* PopUpStoreRegisterViewController.swift */; };
- 4E8AA29D2D59A2340029DF75 /* MarkerTooltipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E8AA29C2D59A2340029DF75 /* MarkerTooltipView.swift */; };
- 4E9790C52D40E13500210499 /* MapGuideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E9790C42D40E13500210499 /* MapGuideViewController.swift */; };
- 4E9A465E2D50B2DB0010578A /* AdminStoreCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E755B262D2B9C7C00ADFB21 /* AdminStoreCell.swift */; };
- 4E9A46602D55D1270010578A /* MapUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E9A465F2D55D1270010578A /* MapUtilities.swift */; };
- 4E9C12782D2BC7A0006744D6 /* AdminBottomSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E9C12772D2BC7A0006744D6 /* AdminBottomSheetView.swift */; };
- 4E9C127A2D2BC811006744D6 /* AdminBottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E9C12792D2BC811006744D6 /* AdminBottomSheetViewController.swift */; };
- 4EA2C93D2D424D3300F4D97C /* MapDirectionRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA2C93C2D424D3300F4D97C /* MapDirectionRepository.swift */; };
- 4EA2C93F2D424D7400F4D97C /* MapDirectionUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA2C93E2D424D7400F4D97C /* MapDirectionUseCase.swift */; };
- 4EA2C9412D424D8400F4D97C /* GetPopUpDirectionResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA2C9402D424D8400F4D97C /* GetPopUpDirectionResponseDTO.swift */; };
- 4EA2C9432D424DF900F4D97C /* FindDirectionEndPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA2C9422D424DF900F4D97C /* FindDirectionEndPoint.swift */; };
- 4EA9989A2D21C2FC009DC30B /* StoreListSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA998992D21C2FC009DC30B /* StoreListSection.swift */; };
- 4EA9989D2D21C404009DC30B /* RxDataSources in Frameworks */ = {isa = PBXBuildFile; productRef = 4EA9989C2D21C404009DC30B /* RxDataSources */; };
- 4EAB809D2D3F78AA0041AF30 /* GMSMapViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EAB809C2D3F78AA0041AF30 /* GMSMapViewDelegateProxy.swift */; };
- 4EAB809F2D3F8EF50041AF30 /* ViewportBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EAB809E2D3F8EF50041AF30 /* ViewportBounds.swift */; };
- 4EDDEFB42D2D285900CFAFA5 /* DateTimePickerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EDDEFB32D2D285900CFAFA5 /* DateTimePickerManager.swift */; };
- 4EDE57012D5E6A5F0014D924 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685ECC2D12CEB6001EF91C /* MapViewController.swift */; };
- 4EDE57032D5E70650014D924 /* LocationPermissionBottomSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EDE57022D5E70650014D924 /* LocationPermissionBottomSheet.swift */; };
- 4EE5A3D32D40E4A600A2469A /* MapGuideReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE5A3D22D40E4A600A2469A /* MapGuideReactor.swift */; };
- 4EEA1D8F2D352012003E7DE9 /* ImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EEA1D8E2D352012003E7DE9 /* ImageCell.swift */; };
- 4EEA1D912D352027003E7DE9 /* ExtendedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EEA1D902D352027003E7DE9 /* ExtendedImage.swift */; };
- 4EECA3942D56770B00A07CCA /* MapPopUpStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E685EBB2D12CEB6001EF91C /* MapPopUpStore.swift */; };
- 4EED9BAC2D22730400B288E7 /* FilterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EED9BAB2D22730400B288E7 /* FilterType.swift */; };
- BD226D512CF6DB290038C984 /* PPReturnHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD226D502CF6DB290038C984 /* PPReturnHeaderView.swift */; };
- BD9103612CF6149D00BBCCAE /* AuthAPIEndPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD91034E2CF6149D00BBCCAE /* AuthAPIEndPoint.swift */; };
- BD9103622CF6149D00BBCCAE /* LoginResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD91034F2CF6149D00BBCCAE /* LoginResponseDTO.swift */; };
- BD9103632CF6149D00BBCCAE /* BannerPopUpStoreDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103512CF6149D00BBCCAE /* BannerPopUpStoreDTO.swift */; };
- BD9103642CF6149D00BBCCAE /* GetHomeInfoResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103522CF6149D00BBCCAE /* GetHomeInfoResponseDTO.swift */; };
- BD9103652CF6149D00BBCCAE /* HomeAPIEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103532CF6149D00BBCCAE /* HomeAPIEndpoint.swift */; };
- BD9103662CF6149D00BBCCAE /* PopUpStoreResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103542CF6149D00BBCCAE /* PopUpStoreResponseDTO.swift */; };
- BD9103682CF6149D00BBCCAE /* AuthAPIRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103572CF6149D00BBCCAE /* AuthAPIRepositoryImpl.swift */; };
- BD9103692CF6149D00BBCCAE /* HomeAPIRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103582CF6149D00BBCCAE /* HomeAPIRepository.swift */; };
- BD91036A2CF6149D00BBCCAE /* SignUpRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103592CF6149D00BBCCAE /* SignUpRepositoryImpl.swift */; };
- BD91036B2CF6149D00BBCCAE /* CheckNickNameRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD91035B2CF6149D00BBCCAE /* CheckNickNameRequestDTO.swift */; };
- BD91036C2CF6149D00BBCCAE /* GetCategoryListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD91035C2CF6149D00BBCCAE /* GetCategoryListResponseDTO.swift */; };
- BD91036D2CF6149D00BBCCAE /* SignUpAPIEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD91035D2CF6149D00BBCCAE /* SignUpAPIEndpoint.swift */; };
- BD91036E2CF6149D00BBCCAE /* SignUpRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD91035E2CF6149D00BBCCAE /* SignUpRequestDTO.swift */; };
- BD9103812CF614A900BBCCAE /* HomeAPIUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103702CF614A900BBCCAE /* HomeAPIUseCaseImpl.swift */; };
- BD9103832CF614A900BBCCAE /* SignUpAPIUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103722CF614A900BBCCAE /* SignUpAPIUseCaseImpl.swift */; };
- BD9103852CF614A900BBCCAE /* AuthAPIUseCaseImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103742CF614A900BBCCAE /* AuthAPIUseCaseImpl.swift */; };
- BD9103862CF614A900BBCCAE /* BannerPopUpStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103762CF614A900BBCCAE /* BannerPopUpStore.swift */; };
- BD9103872CF614A900BBCCAE /* Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103772CF614A900BBCCAE /* Category.swift */; };
- BD9103882CF614A900BBCCAE /* GetHomeInfoResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103782CF614A900BBCCAE /* GetHomeInfoResponse.swift */; };
- BD9103892CF614A900BBCCAE /* PopUpStoreResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103792CF614A900BBCCAE /* PopUpStoreResponse.swift */; };
- BD91038A2CF614A900BBCCAE /* LoginResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD91037A2CF614A900BBCCAE /* LoginResponse.swift */; };
- BD91038B2CF614A900BBCCAE /* AuthRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD91037C2CF614A900BBCCAE /* AuthRepository.swift */; };
- BD9103922CF6166800BBCCAE /* SplashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD91038E2CF6166800BBCCAE /* SplashView.swift */; };
- BD9103932CF6166800BBCCAE /* SplashController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD9103902CF6166800BBCCAE /* SplashController.swift */; };
- BDCA41C12CF35AC0005EECF6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCA41C02CF35AC0005EECF6 /* AppDelegate.swift */; };
- BDCA41C32CF35AC0005EECF6 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCA41C22CF35AC0005EECF6 /* SceneDelegate.swift */; };
- BDCA41C52CF35AC0005EECF6 /* TestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCA41C42CF35AC0005EECF6 /* TestViewController.swift */; };
- BDCA41CA2CF35AC1005EECF6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BDCA41C92CF35AC1005EECF6 /* Assets.xcassets */; };
- BDCA41CD2CF35AC1005EECF6 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = BDCA41CC2CF35AC1005EECF6 /* Base */; };
- BDCA41D82CF35AC1005EECF6 /* PoppoolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCA41D72CF35AC1005EECF6 /* PoppoolTests.swift */; };
- BDCA41E22CF35AC1005EECF6 /* PoppoolUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCA41E12CF35AC1005EECF6 /* PoppoolUITests.swift */; };
- BDCA41E42CF35AC1005EECF6 /* PoppoolUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCA41E32CF35AC1005EECF6 /* PoppoolUITestsLaunchTests.swift */; };
- BDCA41F22CF35D0D005EECF6 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA41F12CF35D0D005EECF6 /* SnapKit */; };
- BDCA41F52CF35D33005EECF6 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA41F42CF35D33005EECF6 /* Kingfisher */; };
- BDCA41F82CF35D9A005EECF6 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA41F72CF35D9A005EECF6 /* RxSwift */; };
- BDCA41FE2CF35EE7005EECF6 /* ReactorKit in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA41FD2CF35EE7005EECF6 /* ReactorKit */; };
- BDCA42012CF35EFE005EECF6 /* RxKeyboard in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA42002CF35EFE005EECF6 /* RxKeyboard */; };
- BDCA42042CF35F76005EECF6 /* PanModal in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA42032CF35F76005EECF6 /* PanModal */; };
- BDCA42072CF35FA6005EECF6 /* Tabman in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA42062CF35FA6005EECF6 /* Tabman */; };
- BDCA420A2CF35FB1005EECF6 /* Pageboy in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA42092CF35FB1005EECF6 /* Pageboy */; };
- BDCA420D2CF35FD2005EECF6 /* RxGesture in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA420C2CF35FD2005EECF6 /* RxGesture */; };
- BDCA42102CF35FF5005EECF6 /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = BDCA420F2CF35FF5005EECF6 /* Lottie */; };
+ 0522C1D92DB67C5900B141FF /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C1D82DB67C5900B141FF /* RxSwift */; };
+ 0522C3C62DB67D7800B141FF /* RxGesture in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C3C52DB67D7800B141FF /* RxGesture */; };
+ 0543C5CD2DF86C740070BB93 /* Data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6072DB53A4900508FFD /* Data.framework */; };
+ 0543C5CE2DF86C740070BB93 /* Data.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6072DB53A4900508FFD /* Data.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 0543C5D02DF86C790070BB93 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05CFFC422DCC83290051129F /* DesignSystem.framework */; };
+ 0543C5D12DF86C790070BB93 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05CFFC422DCC83290051129F /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 0543C5D22DF86C7B0070BB93 /* Domain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6082DB53A4900508FFD /* Domain.framework */; };
+ 0543C5D32DF86C7B0070BB93 /* Domain.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6082DB53A4900508FFD /* Domain.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 0543C5D42DF86C7C0070BB93 /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05BDD3D52DB66E1700C1E192 /* DomainInterface.framework */; };
+ 0543C5D52DF86C7C0070BB93 /* DomainInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05BDD3D52DB66E1700C1E192 /* DomainInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 0543C5D62DF86C7E0070BB93 /* Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6092DB53A4900508FFD /* Infrastructure.framework */; };
+ 0543C5D72DF86C7E0070BB93 /* Infrastructure.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6092DB53A4900508FFD /* Infrastructure.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 0543C5D82DF86C7F0070BB93 /* Presentation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D60A2DB53A4900508FFD /* Presentation.framework */; };
+ 0543C5D92DF86C7F0070BB93 /* Presentation.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D60A2DB53A4900508FFD /* Presentation.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 0543C5DA2DF86C800070BB93 /* PresentationInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C5E2DCE04CE0093825D /* PresentationInterface.framework */; };
+ 0543C5DB2DF86C800070BB93 /* PresentationInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C5E2DCE04CE0093825D /* PresentationInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 0543C5DC2DF86C810070BB93 /* SearchFeature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C582DCDFAC20093825D /* SearchFeature.framework */; };
+ 0543C5DD2DF86C810070BB93 /* SearchFeature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C582DCDFAC20093825D /* SearchFeature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 0543C5DE2DF86C830070BB93 /* SearchFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C592DCDFAC20093825D /* SearchFeatureInterface.framework */; };
+ 0543C5DF2DF86C830070BB93 /* SearchFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C592DCDFAC20093825D /* SearchFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 05734C632DCE04FA0093825D /* Pageboy in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C622DCE04FA0093825D /* Pageboy */; };
+ 05734C662DCE05070093825D /* PanModal in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C652DCE05070093825D /* PanModal */; };
+ 05734C682DCE05240093825D /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C672DCE05240093825D /* SnapKit */; };
+ 05734C6B2DCE05550093825D /* ReactorKit in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C6A2DCE05550093825D /* ReactorKit */; };
+ 05734C6E2DCE05680093825D /* Tabman in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C6D2DCE05680093825D /* Tabman */; };
+ 05734C712DCE059D0093825D /* Then in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C702DCE059D0093825D /* Then */; };
+ 05BBA73E2DB75DA60047A061 /* KakaoSDKUser in Frameworks */ = {isa = PBXBuildFile; productRef = 05BBA73D2DB75DA60047A061 /* KakaoSDKUser */; };
+ 4E15142A2D99480200DFD08F /* NMapsMap in Frameworks */ = {isa = PBXBuildFile; productRef = 4E1514292D99480200DFD08F /* NMapsMap */; };
+ 4E15142E2D994A3A00DFD08F /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 4E15142D2D994A3A00DFD08F /* KakaoSDKAuth */; };
+ 4EE360FD2D91876300D2441D /* NMapsMap in Frameworks */ = {isa = PBXBuildFile; productRef = 4EE360FC2D91876300D2441D /* NMapsMap */; };
/* End PBXBuildFile section */
-/* Begin PBXContainerItemProxy section */
- BDCA41D42CF35AC1005EECF6 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BDCA41B52CF35AC0005EECF6 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BDCA41BC2CF35AC0005EECF6;
- remoteInfo = Poppool;
- };
- BDCA41DE2CF35AC1005EECF6 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BDCA41B52CF35AC0005EECF6 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BDCA41BC2CF35AC0005EECF6;
- remoteInfo = Poppool;
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXFileReference section */
- 0818988D2D295DC30067BF01 /* MyPageLogoutSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageLogoutSection.swift; sourceTree = ""; };
- 0818988F2D295DC80067BF01 /* MyPageLogoutSectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageLogoutSectionCell.swift; sourceTree = ""; };
- 081898932D2965C20067BF01 /* ProfileEditController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileEditController.swift; sourceTree = ""; };
- 081898952D2965C90067BF01 /* ProfileEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileEditView.swift; sourceTree = ""; };
- 081898972D2965D20067BF01 /* ProfileEditReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileEditReactor.swift; sourceTree = ""; };
- 0818989B2D2BAA570067BF01 /* WithdrawlCheckModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlCheckModalView.swift; sourceTree = ""; };
- 0818989D2D2BAA610067BF01 /* WithdrawlCheckModalController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlCheckModalController.swift; sourceTree = ""; };
- 0818989F2D2BAA670067BF01 /* WithdrawlCheckModalReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlCheckModalReactor.swift; sourceTree = ""; };
- 081898A22D2CC0110067BF01 /* WithdrawlReasonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlReasonView.swift; sourceTree = ""; };
- 081898A42D2CC0180067BF01 /* WithdrawlReasonController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlReasonController.swift; sourceTree = ""; };
- 081898A62D2CC01D0067BF01 /* WithdrawlReasonReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlReasonReactor.swift; sourceTree = ""; };
- 081898A92D2CEA2F0067BF01 /* WithdrawlCheckSectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlCheckSectionCell.swift; sourceTree = ""; };
- 081898AB2D2CEA940067BF01 /* WithdrawlCheckSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlCheckSection.swift; sourceTree = ""; };
- 081898AD2D2CFC230067BF01 /* GetWithdrawlListResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetWithdrawlListResponseDTO.swift; sourceTree = ""; };
- 081898AF2D2CFCA40067BF01 /* GetWithdrawlListResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetWithdrawlListResponse.swift; sourceTree = ""; };
- 081898B22D2D20D70067BF01 /* WithdrawlCompleteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlCompleteView.swift; sourceTree = ""; };
- 081898B42D2D20E30067BF01 /* WithdrawlCompleteController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawlCompleteController.swift; sourceTree = ""; };
- 081898B62D2D23A90067BF01 /* UINavigationController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationController+.swift"; sourceTree = ""; };
- 081898B92D2E5F4C0067BF01 /* MyCommentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCommentView.swift; sourceTree = ""; };
- 081898BB2D2E5F510067BF01 /* MyCommentReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCommentReactor.swift; sourceTree = ""; };
- 081898BD2D2E5F590067BF01 /* MyCommentController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCommentController.swift; sourceTree = ""; };
- 081898BF2D2FBD130067BF01 /* ProfileEditListButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileEditListButton.swift; sourceTree = ""; };
- 081898C22D30AE2C0067BF01 /* GetMyProfileResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetMyProfileResponseDTO.swift; sourceTree = ""; };
- 081898C42D30AEF40067BF01 /* GetMyProfileResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetMyProfileResponse.swift; sourceTree = ""; };
- 081898C92D30D5BA0067BF01 /* InfoEditModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoEditModalView.swift; sourceTree = ""; };
- 081898CB2D30D5BF0067BF01 /* InfoEditModalController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoEditModalController.swift; sourceTree = ""; };
- 081898CD2D30D5C60067BF01 /* InfoEditModalReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoEditModalReactor.swift; sourceTree = ""; };
- 081898CF2D30EA900067BF01 /* PutUserTailoredInfoRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PutUserTailoredInfoRequestDTO.swift; sourceTree = ""; };
- 081898D12D30F57D0067BF01 /* CategoryEditModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryEditModalView.swift; sourceTree = ""; };
- 081898D32D30F5840067BF01 /* CategoryEditModalController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryEditModalController.swift; sourceTree = ""; };
- 081898D52D30F58A0067BF01 /* CategoryEditModalReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryEditModalReactor.swift; sourceTree = ""; };
- 081898D72D310C160067BF01 /* PutUserCategoryRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PutUserCategoryRequestDTO.swift; sourceTree = ""; };
- 081898D92D32559B0067BF01 /* PutUserProfileRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PutUserProfileRequestDTO.swift; sourceTree = ""; };
- 081898DB2D326DC10067BF01 /* IntroState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroState.swift; sourceTree = ""; };
- 081898DF2D338F9C0067BF01 /* ListCountButtonSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListCountButtonSection.swift; sourceTree = ""; };
- 081898E12D338FA40067BF01 /* ListCountButtonSectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListCountButtonSectionCell.swift; sourceTree = ""; };
- 081898E32D3391550067BF01 /* GetMyCommentedPopUpResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetMyCommentedPopUpResponseDTO.swift; sourceTree = ""; };
- 081898E52D3391CB0067BF01 /* GetMyCommentResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetMyCommentResponse.swift; sourceTree = "