diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..87c2a995 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +# ๐Ÿš€ Pull Request + +**[์ž‘์—… ๋‚ด์šฉ์„ ๊ฐ„๋žตํžˆ ์ ์–ด์ฃผ์„ธ์š”]** + +## #๏ธโƒฃ ์—ฐ๊ด€๋œ ์ด์Šˆ + +#์ด์Šˆ๋ฒˆํ˜ธ + +## ๐Ÿ“‹ ์ž‘์—… ๋‚ด์šฉ + +์ˆ˜์ •ํ•œ ๋‚ด์šฉ์ด๋‚˜ ์ถ”๊ฐ€ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”. diff --git a/.github/workflows/buildTest.yml b/.github/workflows/buildTest.yml index 45ec2019..c0430b91 100644 --- a/.github/workflows/buildTest.yml +++ b/.github/workflows/buildTest.yml @@ -1,4 +1,4 @@ -name: CI & Deploy Pipeline +name: PR CI and develop push CI # 1. ์ด๋ฒคํŠธ ์„ค์ • on: @@ -19,7 +19,7 @@ on: # 2. ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์žก jobs: - build-and-test: + CI-start: runs-on: ubuntu-latest env: EMAIL_USERNAME: ${{ secrets.EMAIL_USERNAME }} @@ -44,6 +44,11 @@ jobs: steps: + # Node.js ์„ค์น˜ + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' # ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ - name: Check out code uses: actions/checkout@v4 @@ -55,8 +60,15 @@ jobs: java-version: '17' distribution: 'temurin' + # Gradle Wrapper ๊ถŒํ•œ ๋ถ€์—ฌ + - name: Grant execute permission for gradlew + run: chmod +x gradlew - # Gradle ์˜์กด์„ฑ ์บ์‹œ ์„ค์ • + # gradlew ํŒŒ์ผ ์‹คํ–‰๊ถŒํ•œ ์„ค์ • + - name: Grant execute permission for gradlew + run: chmod +x ./gradlew + shell: bash + # Gradle ์˜์กด์„ฑ ์บ์‹œ ์„ค์ • - name: Cache Gradle dependencies uses: actions/cache@v4 with: @@ -65,26 +77,35 @@ jobs: restore-keys: | ${{ runner.os }}-gradle- - # Gradle Wrapper ๊ถŒํ•œ ๋ถ€์—ฌ - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - # gradlew ํŒŒ์ผ ์‹คํ–‰๊ถŒํ•œ ์„ค์ • - - name: Grant execute permission for gradlew - run: chmod +x ./gradlew - shell: bash + # Json ํŒŒ์ผ ์—…๋กœ๋“œ - name: Create JSON Config File env: - TTS_JSON_CONTENT: ${{ secrets.TTS_JSON }} + TTS_JSON_CONTENT: ${{ secrets.TTS_JSON_CONTENT }} run: | - echo "${TTS_JSON_CONTENT}" > src/main/resources/tts.json + echo "${TTS_JSON_CONTENT}" | base64 -d > src/main/resources/tts.json echo $TTS_JSON_CONTENT - - # ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰ + - name: Set Cache Directory Permissions + run: | + if [ -d "~/.sonar/cache" ]; then chmod -R 777 ~/.sonar/cache; fi + if [ -d "~/.gradle/caches" ]; then chmod -R 777 ~/.gradle/caches; fi + + # build and Test - name: Build and Test run: ./gradlew build + # ์†Œ๋‚˜ํ๋ธŒ ์‹คํ–‰ + - name: Sonarqube Scan + run: ./gradlew sonar -Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} -Dsonar.token=${{ secrets.SONAR_TOKEN }} + + # 3-1. ์†Œ๋‚˜ํ๋ธŒ ํŒจํ‚ค์ง€ ์บ์‹ฑ ์„ค์ • + - name: Cache SonarQube packages + uses: actions/cache@v4 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + # Gradle Test๋ฅผ ์‹คํ–‰ํ•œ๋‹ค - name: Test with Gradle run: ./gradlew --info test @@ -97,36 +118,4 @@ jobs: junit_files: '**/build/test-results/test/TEST-*.xml' - name: Lint Checks - run: ./gradlew check - # # 3. develop์—์„œ main์œผ๋กœ ์ž๋™ ๋ฐฐํฌ ์ž‘์—… - # deploy-to-main: - # # develop ๋ธŒ๋žœ์น˜์— push๋  ๋•Œ๋งŒ ์‹คํ–‰ - # if: github.event_name == 'push' && github.ref == 'refs/heads/develop' - - # runs-on: ubuntu-latest - # needs: build-and-test # ๋นŒ๋“œ์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์— ์‹คํ–‰ - - # steps: - # # ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ - # - name: Check out code - # uses: actions/checkout@v3 - - # - name: Configure git - # run: | - # git config --global user.name "${{ github.actor }}" - # git config --global user.email "${{ github.actor }}@users.noreply.github.com" - - # # main ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉ - # - name: Merge develop to main - # run: | - # git remote update - # git checkout main - # git config pull.rebase true - # git pull origin main # ์ตœ์‹  ์ƒํƒœ๋กœ ๋™๊ธฐํ™” - # git pull origin develop --allow-unrelated-histories - # git rebase --skip - - # # ๋ณ‘ํ•ฉ ๊ฒฐ๊ณผ๋ฅผ main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ - # - name: Push to main - # run: | - # git push origin main + run: ./gradlew check \ No newline at end of file diff --git a/.github/workflows/cdscript.yml b/.github/workflows/cdscript.yml deleted file mode 100644 index d9dee9b4..00000000 --- a/.github/workflows/cdscript.yml +++ /dev/null @@ -1,88 +0,0 @@ -#name: CD -# -## 1. ์ด๋ฒคํŠธ ์„ค์ • -#on: -# # PR ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ๋นŒ๋“œ์™€ ํ…Œ์ŠคํŠธ ์‹คํ–‰ -# push: -# branches: -# - main -#jobs: -# deploy: -# runs-on: ubuntu-latest -# env: -# EMAIL_USERNAME: ${{ secrets.EMAIL_USERNAME }} -# EMAIL_PASSWORD: ${{ secrets.EMAIL_PASSWORD }} -# EMAIL_TITLE: ${{ secrets.EMAIL_TITLE }} -# EMAIL_CONTENT_TEMPLATE: ${{ secrets.EMAIL_CONTENT_TEMPLATE }} -# SERVICE_NAME: ${{ secrets.SERVICE_NAME }} -# AWS_S3_ACCESSKEY: ${{ secrets.AWS_S3_ACCESSKEY }} -# AWS_S3_SECRETKEY: ${{ secrets.AWS_S3_SECRETKEY }} -# AWS_S3_BUKET_NAME: ${{ secrets.AWS_S3_BUKET_NAME }} -# AWS_S3_REGION: ${{ secrets.AWS_S3_REGION }} -# VC_URL: ${{ secrets.VC_URL }} -# VC_APIKEY: ${{ secrets.VC_APIKEY }} -# -# -# -# steps: # 1. ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ -# - name: Check out code -# uses: actions/checkout@v4 -# -# # 2. JDK 17 ์„ค์น˜ -# - name: Set up JDK 17 -# uses: actions/setup-java@v4 -# with: -# java-version: '17' -# distribution: 'temurin' -# -# # 3. Gradle ์˜์กด์„ฑ ์บ์‹œ ์„ค์ • -# - name: Cache Gradle dependencies -# uses: actions/cache@v4 -# with: -# path: ~/.gradle/caches -# key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} -# restore-keys: | -# ${{ runner.os }}-gradle- -# -# # 4. Gradle Wrapper ๊ถŒํ•œ ๋ถ€์—ฌ -# - name: Grant execute permission for gradlew -# run: chmod +x ./gradlew -# -# # 5. JSON Config ํŒŒ์ผ ์ƒ์„ฑ -# - name: Create JSON Config File -# env: -# TTS_JSON_CONTENT: ${{ secrets.TTS_JSON }} -# run: | -# echo "${TTS_JSON_CONTENT}" > src/main/resources/tts.json -# -# # 6. ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰ -# - name: Build and Test -# run: ./gradlew build -# -# - name: Configure AWS credentials -# uses: appleboy/ssh-action@master # ssh ์ ‘์† ์˜คํ”ˆ์†Œ์Šค -# with: -# host: ${{ secrets.REMOTE_IP }} # ์ธ์Šคํ„ด์Šค IP -# username: ${{ secrets.REMOTE_USER }} # ์šฐ๋ถ„ํˆฌ ์•„์ด๋”” -# key: ${{ secrets.REMOTE_PRIVATE_KEY }} # ec2 instance pem key -# port: ${{ secrets.REMOTE_SSH_PORT }} # ์ ‘์†ํฌํŠธ -# timeout: 120s -# debug: true # ๋””๋ฒ„๊ทธ ๋ชจ๋“œ ํ™œ์„ฑํ™” -# script: | -# # 8080ํฌํŠธ ์‚ฌ์šฉ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ํ™•์ธ -# PID=$(lsof -t -i:8080) -# -# # ํฌํŠธ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ -# if [ -n "$PID" ]; then -# echo "8080 ํฌํŠธ๋ฅผ ์‚ฌ์šฉ์ค‘์ธ ํ”„๋กœ์„ธ์Šค (PID: $PID)๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค." -# else -# echo "8080 ํฌํŠธ๋Š” ์‚ฌ์šฉ ์ค‘์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค." -# fi -# -# # ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ•  ๊ณณ์œผ๋กœ ์ด๋™ -# cd /home/ubuntu/app -# -# # ์ƒˆ๋กœ์šด ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ -# echo "deploy.sh๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค." -# nohup ./deploy.sh > deploy.log 2>&1 & -# echo "์ƒˆ๋กœ์šด deploy.sh๊ฐ€ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค." \ No newline at end of file diff --git a/.github/workflows/dockerdeploy.yml b/.github/workflows/dockerdeploy.yml index 3614f514..56868442 100644 --- a/.github/workflows/dockerdeploy.yml +++ b/.github/workflows/dockerdeploy.yml @@ -1,4 +1,4 @@ -name: CD +name: MAIN CI&CD # 1. ์ด๋ฒคํŠธ ์„ค์ • on: @@ -26,18 +26,32 @@ jobs: AWS_SQS_QUEUE_URL: ${{ secrets.AWS_SQS_QUEUE_URL }} AWS_SQS_VIRTUAL_QUEUE_NAME: ${{ secrets.AWS_SQS_VIRTUAL_QUEUE_NAME }} - steps: # 1. ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ + steps: + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + - name: Check out code uses: actions/checkout@v4 - # 2. JDK 17 ์„ค์น˜ + # JDK 17 ์„ค์น˜ - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - # 3. Gradle ์˜์กด์„ฑ ์บ์‹œ ์„ค์ • + # Gradle Wrapper ๊ถŒํ•œ ๋ถ€์—ฌ + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + # gradlew ํŒŒ์ผ ์‹คํ–‰๊ถŒํ•œ ์„ค์ • + - name: Grant execute permission for gradlew + run: chmod +x ./gradlew + shell: bash + # Gradle ์˜์กด์„ฑ ์บ์‹œ ์„ค์ • - name: Cache Gradle dependencies uses: actions/cache@v4 with: @@ -46,32 +60,49 @@ jobs: restore-keys: | ${{ runner.os }}-gradle- - # 4. Gradle Wrapper ๊ถŒํ•œ ๋ถ€์—ฌ - - name: Grant execute permission for gradlew - run: chmod +x ./gradlew - - # 5. JSON Config ํŒŒ์ผ ์ƒ์„ฑ + # Json ํŒŒ์ผ ์—…๋กœ๋“œ - name: Create JSON Config File env: - TTS_JSON_CONTENT: ${{ secrets.TTS_JSON }} + TTS_JSON_CONTENT: ${{ secrets.TTS_JSON_CONTENT }} run: | - echo "${TTS_JSON_CONTENT}" > src/main/resources/tts.json + echo "${TTS_JSON_CONTENT}" | base64 -d > src/main/resources/tts.json + echo $TTS_JSON_CONTENT - # 6. ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰ + - name: Set Cache Directory Permissions + run: | + if [ -d "~/.sonar/cache" ]; then chmod -R 777 ~/.sonar/cache; fi + if [ -d "~/.gradle/caches" ]; then chmod -R 777 ~/.gradle/caches; fi + + #build and Test - name: Build and Test - run: ./gradlew build -x test + run: ./gradlew build + + # ์†Œ๋‚˜ํ๋ธŒ ์‹คํ–‰ + - name: Sonarqube Scan + run: ./gradlew sonar -Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} -Dsonar.token=${{ secrets.SONAR_TOKEN }} + # ์†Œ๋‚˜ํ๋ธŒ ํŒจํ‚ค์ง€ ์บ์‹ฑ ์„ค์ • + - name: Cache SonarQube packages + uses: actions/cache@v4 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + + # ๋„์ปค ๋กœ๊ทธ์ธ - name: Docker Login uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - # push ๊นŒ์ง€๋งŒ ํ•˜๊ณ  CD๋Š” ๊ทธ๋ƒฅ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ•ด์„œ docker pull or run์œผ๋กœ ํŒŒ์ผ์„ ๋ฐ›์•„์„œ ์‹คํ–‰ํ• ๊นŒ? ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผํ• ๋“ฏ? + + # ๋„์ปค ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ํ‘ธ์‰ฌ - name: Build and Push Docker Image run: | docker build -t ${{ secrets.DOCKER_ID }}/${{ secrets.DOCKER_IMAGE }}:1.0 . docker push ${{ secrets.DOCKER_ID }}/${{ secrets.DOCKER_IMAGE }}:1.0 +# ์„œ๋ฒ„ ๋ฐฐํฌ CD: needs: CI runs-on: ubuntu-latest @@ -89,7 +120,7 @@ jobs: sudo docker pull ${{ secrets.DOCKER_ID }}/${{ secrets.DOCKER_IMAGE }}:1.0 # ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ•  ๊ณณ์œผ๋กœ ์ด๋™ - cd /home/ubuntu/app + cd ${{ secrets.SSH_PWD }} echo "docker_deploy.sh๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค." chmod +x ./docker_deploy.sh diff --git a/.github/workflows/schedule-pr.yml b/.github/workflows/schedule-pr.yml deleted file mode 100644 index 7e13a881..00000000 --- a/.github/workflows/schedule-pr.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Schedule Pull Request - -on: - # ๋งค์ผ 9์‹œ์— ์‹คํ–‰ ์›”์š”์ผ~๊ธˆ์š”์ผ - schedule: - - cron: '0 0 * * 1-5' - -jobs: - create-pull-request: - name: RP ์š”์ฒญ - runs-on: ubuntu-latest - - steps: - # ๋ž˜ํฌ ์ฒดํฌ - - name: ์ฒดํฌ์•„์›ƒ ๋ž˜ํฌ - uses: actions/checkout@v4 - # ๊นƒ ํ—ˆ๋ธŒ ๋ช…๋ น - - name: ๋ช…๋ น ์…‹ํŒ… - uses: actions/setup-node@v4 - with: - node-version: '16' - - # PR ์ƒ์„ฑ - - name: Create Pull Request - env: - GITHUB_TOKEN: ${{ secrets.TOKEN_SCHEDULE }} - run: | - # Pull latest changes - git fetch origin - - # Ensure develop branch is up to date - git checkout develop - git pull origin develop - - # Create Pull Request using GitHub CLI - gh pr create \ - --base main \ - --head develop \ - --title "Daily PR: develop -> main" \ - --body "10์‹œ PR ์ž…๋‹ˆ๋‹ค." diff --git a/.gitignore b/.gitignore index 02d935e5..4a03e239 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Created by https://www.toptal.com/developers/gitignore/api/intellij,gradle,java,linux,git,macos,windows # Edit at https://www.toptal.com/developers/gitignore?templates=intellij,gradle,java,linux,git,macos,windows +# github actions ์‹œํฌ๋ฆฟ๋ณ€์ˆ˜ ํŒŒ์ผ +5re5.secrets ### dotenv ### .env diff --git a/README.md b/README.md index a92456fc..c7767de0 100644 --- a/README.md +++ b/README.md @@ -1 +1,609 @@ -# README.md +# 5RE5 PARK + +
+ +![img_3.png](images/img_3.png) +![img_4.png](images/img_4.png) + +
+ +## ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ + + +
+ +### ๐Ÿƒ๐Ÿป ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ (54 days) +> **์ „์ฒด ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„: ( 8 Weeks | 45 %)**
+> - ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ธฐ๊ฐ„: ( 5 Weeks | 60 %) +> - ๋ฐœํ‘œ ์ค€๋น„ ๊ธฐ๊ฐ„: 3 days + +
+ +### ๐Ÿ’ป ์ฝ”๋“œ์ˆ˜ +

+Java         : 33,731 
+
+ +
+ +### ๐Ÿ‘ซ ํ”„๋กœ์ ํŠธ ํŒ€์› + +#### ํŒ€๋ช…: 5RE5 + + +#### ํŒ€์› ๊ตฌ์„ฑ + +| Backend
๋ฐ•์ค€ํ™ \| ํŒ€์žฅ | Backend
์ด์ข…ํ—Œ | Backend
์œ ๋ฏผ์šฐ | Backend
์ตœ์œค์„œ | Backend
๊น€๊ทœ์˜ | Backend
๋ฅ˜์€๊ธฐ | +|:--------------------------------------------------:|:--------------------------------------------------:|:--------------------------------------------------:|:------------------------------:|:-------------------------------:|:------------------------------:| +| ![img.png](images/img.png) | ![img_1.png](images/img_1.png) | ![img_2.png](images/img_2.png) | ![img_5.png](images/img_5.png) | ![img_6.png](images/img_6.png) | ![img_7.png](images/img_7.png) | + + +
+ + +## ๊ธฐ์ˆ  ์Šคํƒ + +### ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป Enviroment +|IntelliJ|VS Code|Git|Github|Gradle| +|:---:|:---:|:---:|:---:|:---:| +|IntelliJ|VS Code|Git|GitHub|Gradle| + +
+ +### ๐Ÿ› ๏ธ Tool + +#### Backend +|Java| Spring Framework | Spring Security | JPA | Lombok |jUnit| +|:---:|:------------------------------------------------------:|:------------------------------------------------------------------------------------:|:------------------------------------------------------------------------:|:------------------------------------------------------:|:---:| +|Java| Spring | Spring Security | JPA | Lombok |jUnit| + +#### Database +|MySQL| +|:---:| +|MySQL| + +#### Web Server +|Apache Tomcat| AWS | RDS |Prometheus|Grafana|Docker| Compose |GitHub Action| +|:---:|:--------------------------------------------------------------------------------------------------------------------------:|:---------------------------------------------------------------:|:---:|:---:|:---:|:--------------------------------------------------------:|:---:| +|Apache Tomcat| AWS | RDS |Prometheus|Grafana|Docker| Compose |GitHub Action| + +
+ +### ๐Ÿ‘€ Communication +| Zoom |Notion| Google Sheets | Google Slides | +|:--------------------------------------------------:|:---:|:-------------------------------------------------------------------:|:--------------------------------------------------------------------:| +| Zoom |Notion| Google Sheets | Google Slides | + +
+ + + + + +
+
+ +## Commit Message Convention +### ๐Ÿ“‹ ๊ทœ์น™ +
- ์ œ๋ชฉ ํ–‰ ๋ช…๋ น๋ฌธ ์‚ฌ์šฉ
+- ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ๋นˆ ํ–‰์œผ๋กœ ๋ถ„๋ฆฌ
+- ์ œ๋ชฉ ํ–‰ ๊ธ€์ž ์ˆ˜ 50์ž ์ดํ•˜
+- ์ œ๋ชฉ ํ–‰ ๋์— ๋งˆ์นจํ‘œ ์—†์Œ
+ +### ๐Ÿ“ ์œ ํ˜• + +

+[feat]        :     ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
+[test]        :     ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์™„๋ฃŒ 
+[refactor]    :     ๋ฆฌํŒฉํ† ๋ง, ์ฝ”๋“œ ๊ฐœ์„ 
+[fix]         :     ๋ฒ„๊ทธ ์ˆ˜์ •
+[docs]        :     ๋ฌธ์„œ ์ถ”๊ฐ€ ๋˜๋Š” ์ˆ˜์ • (ex. README ๋ณ€๊ฒฝ)
+[style]       :     ์ฝ”๋“œ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ (ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ ๋“ฑ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ)
+[chore]       :     ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(ex. gitignore ์ˆ˜์ •), ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •
+[comment]     :     ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •
+[rename]      :     ํŒŒ์ผ ๋˜๋Š” ํด๋”๋ช…์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ
+[remove]      :     ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ
+[conflict]    :     ํ•ฉ๋ณ‘ ์‹œ ๋ฐœ์ƒํ•œ ์ถฉ๋Œ ์ˆ˜์ •
+
+ +## ์•„ํ‚คํ…์ณ +![5re5 drawio](https://github.com/user-attachments/assets/dfe47cab-88b2-4d69-a7ad-2b5d334122e8) + +## ๐Ÿญ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ +

+src
+โ”œโ”€โ”€ main
+โ”‚ย ย  โ”œโ”€โ”€ java
+โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ com
+โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ oreo
+โ”‚ย ย  โ”‚ย ย          โ””โ”€โ”€ finalproject_5re5_be
+โ”‚ย ย  โ”‚ย ย              โ”œโ”€โ”€ FinalProject5Re5BeApplication.java
+โ”‚ย ย  โ”‚ย ย              โ”œโ”€โ”€ code
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ controller
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CodeController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ advice
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ CodeExceptionHandler.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ dto
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CodeRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ CodeUpdateRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ CodeResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ CodeResponses.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ entity
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Code.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ exeption
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CodeDuplicatedException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ CodeNotFoundException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ repository
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ CodeRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ service
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ””โ”€โ”€ CodeServiceImpl.java
+โ”‚ย ย  โ”‚ย ย              โ”œโ”€โ”€ concat
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ config
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ controller
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AudioFileController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ BgmFileController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatMaterialController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowTabController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatTabController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ConcatWithBgmController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ dto
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatResponseDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatResultDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowListDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ RowAudioFileDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ RowInfoDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AudioFileDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AudioFileRequestDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AudioFormatRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ BgmFunctionRequestDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatCreateRequestDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatResultRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowRequestDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowSaveRequestDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatTabRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatUpdateRequestDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ OriginAudioRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ SelectedConcatRowRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ TabRowUpdateRequestDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ ConcatResultDetailsResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ ConcatResultResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ ConcatRowTabResponseDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ ConcatTabResponseDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ ConcatUrlResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ TabRowResponseDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ entity
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AudioFile.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ BgmFile.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatResult.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRow.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowLog.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatTab.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatTabLog.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MaterialAudio.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ exception
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ repository
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AudioFileRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ BgmFileRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatResultRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowLogRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatRowRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatTabLogRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ConcatTabRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MaterialAudioRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ service
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ AudioFileService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ AudioMultipartFile.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ AudioStreamService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ BgmFileService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ ConcatResultService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ ConcatRowService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ ConcatRowTabService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ ConcatService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ ConcatTabService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ MaterialAudioService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ bgm
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”‚ย ย  โ””โ”€โ”€ BgmProcessor.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ concatenator
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”‚ย ย  โ”œโ”€โ”€ AudioProperties.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”‚ย ย  โ”œโ”€โ”€ Concatenator.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”‚ย ย  โ”œโ”€โ”€ IntervalConcatenator.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”‚ย ย  โ”œโ”€โ”€ MonoConcatenator.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”‚ย ย  โ”œโ”€โ”€ MonoIntervalConcatenator.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”‚ย ย  โ”œโ”€โ”€ StereoConcatenator.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”‚ย ย  โ””โ”€โ”€ StereoIntervalConcatenator.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ””โ”€โ”€ helper
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย          โ”œโ”€โ”€ AudioFileHelper.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย          โ”œโ”€โ”€ ConcatRowHelper.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย          โ””โ”€โ”€ ConcatTabHelper.java
+โ”‚ย ย  โ”‚ย ย              โ”œโ”€โ”€ global
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ component
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AudioInfo.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ByteArrayMultipartFile.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ S3Service.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ SqsService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ audio
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ AudioChannels.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ AudioExtensionChecker.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ AudioExtensionConverter.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ AudioExtensions.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ AudioFileTypeConverter.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ AudioFormats.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ AudioResample.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ BeepMaker.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ SoundPlayer.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ config
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AuditorAwareImpl.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ JpaAuditingConfig.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MultipartFileAccepter.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ S3Config.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ SqsConfig.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ SwaggerConfig.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ constant
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ BatchProcessType.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MessageType.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ dto
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ SqsRequestDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ AudioFileInfo.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ ErrorResponseDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ ResponseDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ entity
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ BaseEntity.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ error
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ exception
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ BusinessException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ DataNotFoundException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ EntityNotFoundException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ ErrorCode.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ GlobalExceptionHandler.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ InValidValueException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ””โ”€โ”€ RestGlobalExceptionHandler.java
+โ”‚ย ย  โ”‚ย ย              โ”œโ”€โ”€ member
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ config
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ LoginAuthenticationFailureHandler.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ LoginAuthenticationSuccessHandler.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberConfig.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MemberSecurityConfig.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ controller
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermConditionController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermsController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TestController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ advice
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ MemberExceptionHandler.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ dto
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CustomUserDetails.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberChangePasswordRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberRegisterRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberRemoveRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermCheckOrNotRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermConditionRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermConditionUpdateRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermUpdateRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MemberUpdateRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ ErrorResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ MemberReadResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ MemberRegisterResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ MemberResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ MemberTermConditionResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ MemberTermConditionResponses.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ MemberTermResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ MemberTermResponses.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ MemberTermsDetailResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ entity
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Member.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberCategory.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberChangeHistory.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberConnectionHistory.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberDelete.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberRoles.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberRolesCategory.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberState.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTerms.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermsCondition.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MemberTermsHistory.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ exception
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ DeletedMemberException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ HumanMemberException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberDuplicatedEmailException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberDuplicatedIdException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberDuplicatedPasswordException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberInvalidTermConditionException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberMandatoryTermNotAgreedException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberNotFoundEmailException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberNotFoundException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermInvalidException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermsConditionNotFoundException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermsNotFoundException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberWrongCountTermCondition.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ RestrictedMemberException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ RetryFailedException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ repository
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberCategoryRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberChangeHistoryRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberConnectionHistoryRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberDeleteRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberStateRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermConditionRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermsHistoryRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MemberTermsRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ service
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ MemberServiceImpl.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ MemberTermsConditionServiceImpl.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ””โ”€โ”€ MemberTermsServiceImpl.java
+โ”‚ย ย  โ”‚ย ย              โ”œโ”€โ”€ project
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ config
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ controller
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ProjectController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ dto
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ProjectTextRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ ProjectResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ entity
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Project.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ProjectStatus.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ exception
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ InvalidProjectNameException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ProjectExceptionHandler.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ProjectNotFoundException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ projectNotMemberException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ repository
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ProjectRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ service
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ”œโ”€โ”€ ProjectService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ””โ”€โ”€ ProjectServiceImpl.java
+โ”‚ย ย  โ”‚ย ย              โ”œโ”€โ”€ tts
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ client
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ AudioConfigGenerator.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ GoogleTTSConfig.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ GoogleTTSService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ SynthesisInputGenerator.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ VoiceParamsGenerator.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ config
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ controller
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ LanguageController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ StyleController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ VoiceController.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ dto
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ external
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsMakeRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsMakeResponse.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ common
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ AudioOptionDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ TtsSentenceDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ VoiceDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ request
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsAttributeInfo.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsAudioFileInfo.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsSentenceBatchInfo.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsSentenceBatchRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ TtsSentenceRequest.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ response
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ LanguageDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ LanguageListDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ SentenceInfo.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ StyleDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ StyleListDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ TtsProgressStatusDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ TtsSentenceDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ TtsSentenceListDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ VoiceDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ VoiceListDto.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ entity
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Language.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ SampleAudio.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ServerCode.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Style.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsAudioFile.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsProcessHistory.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsProgressStatus.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsProgressStatusCode.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsSentence.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Voice.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ exception
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ DuplicatedSentenceException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ InValidRequestException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ InvalidTTSParamException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ProjectMismatchException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ SaveTtsMakeResultException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsMakeException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsMakeInvalidParamException.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsSentenceInValidInput.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsSentenceNotFound.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ VoiceEntityNotFound.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ repository
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ LanguageRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ SampleAudioRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ StyleRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsAudioFileRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsProcessHistoryRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsProgressStatusRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsSentenceRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ VoiceRepository.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”œโ”€โ”€ service
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ LanguageService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ SaveTtsMakeResultService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ StyleService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsMakeService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsSentenceService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsSentenceServiceImpl.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ VoiceService.java
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย  โ””โ”€โ”€ util
+โ”‚ย ย  โ”‚ย ย              โ”‚ย ย      โ””โ”€โ”€ TtsSentenceComparator.java
+โ”‚ย ย  โ”‚ย ย              โ””โ”€โ”€ vc
+โ”‚ย ย  โ”‚ย ย                  โ”œโ”€โ”€ config
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ README.md
+โ”‚ย ย  โ”‚ย ย                  โ”œโ”€โ”€ controller
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ VcController.java
+โ”‚ย ย  โ”‚ย ย                  โ”œโ”€โ”€ dto
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ request
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VcAudioRequest.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VcRequestHistoryRequest.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VcResultHistoryRequest.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VcResultsRequest.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VcRowRequest.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VcSrcRequest.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VcSrcsRequest.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VcTextRequest.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ VcUrlRequest.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ response
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย      โ”œโ”€โ”€ VcActivateResponse.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย      โ”œโ”€โ”€ VcResponse.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย      โ”œโ”€โ”€ VcRowResponse.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย      โ”œโ”€โ”€ VcTextResponse.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย      โ””โ”€โ”€ VcUrlResponse.java
+โ”‚ย ย  โ”‚ย ย                  โ”œโ”€โ”€ entity
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ Vc.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcRequestHistory.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcResultFile.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcResultHistory.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcSrcFile.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcText.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ VcTrgFile.java
+โ”‚ย ย  โ”‚ย ย                  โ”œโ”€โ”€ exception
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcAPIFilesIsEmptyException.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcExceptionHandler.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ VcNotMemberException.java
+โ”‚ย ย  โ”‚ย ย                  โ”œโ”€โ”€ repository
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcRepository.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcRequestHistoryRepository.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcResultFileRepository.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcResultHistoryRepository.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcSrcFileRepository.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ”œโ”€โ”€ VcTextRepository.java
+โ”‚ย ย  โ”‚ย ย                  โ”‚ย ย  โ””โ”€โ”€ VcTrgFileRepository.java
+โ”‚ย ย  โ”‚ย ย                  โ””โ”€โ”€ service
+โ”‚ย ย  โ”‚ย ย                      โ”œโ”€โ”€ VcApiService.java
+โ”‚ย ย  โ”‚ย ย                      โ”œโ”€โ”€ VcApiServiceImpl.java
+โ”‚ย ย  โ”‚ย ย                      โ”œโ”€โ”€ VcHistoryService.java
+โ”‚ย ย  โ”‚ย ย                      โ”œโ”€โ”€ VcHistoryServiceImpl.java
+โ”‚ย ย  โ”‚ย ย                      โ”œโ”€โ”€ VcService.java
+โ”‚ย ย  โ”‚ย ย                      โ””โ”€โ”€ VcServiceImpl.java
+โ”‚ย ย  โ””โ”€โ”€ resources
+โ”‚ย ย      โ”œโ”€โ”€ application-ndb-test.properties
+โ”‚ย ย      โ”œโ”€โ”€ application-test.properties
+โ”‚ย ย      โ”œโ”€โ”€ application.properties
+โ”‚ย ย      โ””โ”€โ”€ tts.json
+โ””โ”€โ”€ test
+    โ””โ”€โ”€ java
+        โ””โ”€โ”€ com
+            โ””โ”€โ”€ oreo
+                โ””โ”€โ”€ finalproject_5re5_be
+                    โ”œโ”€โ”€ FinalProject5Re5BeApplicationTests.java
+                    โ”œโ”€โ”€ audio
+                    โ”‚ย ย  โ”œโ”€โ”€ AudioExtensionCheckerTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ AudioExtensionConverterTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ AudioExtensionsTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ AudioResampleTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ BeepMakerTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ MonoConcatenatorTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ MonoIntervalConcatenatorTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ SoundPlayerTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ StereoConcatenatorTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ StereoIntervalConcatenatorTest.java
+                    โ”‚ย ย  โ””โ”€โ”€ service
+                    โ”‚ย ย      โ””โ”€โ”€ AudioInfoTest.java
+                    โ”œโ”€โ”€ concat
+                    โ”‚ย ย  โ”œโ”€โ”€ repository
+                    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MaterialAudioRepositoryTest.java
+                    โ”‚ย ย  โ””โ”€โ”€ service
+                    โ”‚ย ย      โ””โ”€โ”€ ConcatTabServiceTest.java
+                    โ”œโ”€โ”€ member
+                    โ”‚ย ย  โ”œโ”€โ”€ config
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ LoginAuthenticationSuccessHandlerTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MemberSecurityConfigTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ controller
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CodeControllerTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberControllerTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermConditionControllerTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MemberTermsControllerTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ repository
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ CodeRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberChangeHistoryRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ MemberTermConditionRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ MemberTermsRepositoryTest.java
+                    โ”‚ย ย  โ””โ”€โ”€ service
+                    โ”‚ย ย      โ”œโ”€โ”€ CodeServiceImplTest.java
+                    โ”‚ย ย      โ”œโ”€โ”€ MemberServiceImplTest.java
+                    โ”‚ย ย      โ”œโ”€โ”€ MemberServiceImplTestByMock.java
+                    โ”‚ย ย      โ”œโ”€โ”€ MemberTermsConditionServiceImplTest.java
+                    โ”‚ย ย      โ””โ”€โ”€ MemberTermsServiceImplTest.java
+                    โ”œโ”€โ”€ project
+                    โ”‚ย ย  โ””โ”€โ”€ service
+                    โ”‚ย ย      โ””โ”€โ”€ ProjectServiceImplTest.java
+                    โ”œโ”€โ”€ tts
+                    โ”‚ย ย  โ”œโ”€โ”€ client
+                    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ GoogleTTSServiceTest.java
+                    โ”‚ย ย  โ”œโ”€โ”€ controller
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ LanguageControllerTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ StyleControllerTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VoiceControllerTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ttsController
+                    โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ TestGetSentence.java
+                    โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ TestGetSentenceList.java
+                    โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ TestMakeTts.java
+                    โ”‚ย ย  โ”‚ย ย      โ”œโ”€โ”€ TestRegisterSentence.java
+                    โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ TestUpdateSentence.java
+                    โ”‚ย ย  โ”œโ”€โ”€ repository
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ LanguageRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ SampleAudioRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ StyleRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsAudioFileRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsProcessHistoryRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsProgressStatusRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ TtsSentenceRepositoryTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ VoiceRepositoryFindTest.java
+                    โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ VoiceRepositoryTest.java
+                    โ”‚ย ย  โ””โ”€โ”€ service
+                    โ”‚ย ย      โ”œโ”€โ”€ LanguageServiceTest.java
+                    โ”‚ย ย      โ”œโ”€โ”€ SaveTtsMakeResultTest.java
+                    โ”‚ย ย      โ”œโ”€โ”€ StyleServiceTest.java
+                    โ”‚ย ย      โ”œโ”€โ”€ TtsMakeServiceTest.java
+                    โ”‚ย ย      โ”œโ”€โ”€ VoiceServiceTest.java
+                    โ”‚ย ย      โ””โ”€โ”€ ttsSentenceService
+                    โ”‚ย ย          โ”œโ”€โ”€ TestAddSentence.java
+                    โ”‚ย ย          โ”œโ”€โ”€ TestBatchSave.java
+                    โ”‚ย ย          โ”œโ”€โ”€ TestGetSentence.java
+                    โ”‚ย ย          โ”œโ”€โ”€ TestGetSentenceList.java
+                    โ”‚ย ย          โ”œโ”€โ”€ TestPatchSentenceOrder.java
+                    โ”‚ย ย          โ””โ”€โ”€ TestUpdateSentence.java
+                    โ””โ”€โ”€ vc
+                        โ”œโ”€โ”€ controller
+                        โ”‚ย ย  โ””โ”€โ”€ VcControllerTest.java
+                        โ”œโ”€โ”€ repository
+                        โ”‚ย ย  โ””โ”€โ”€ VcSrcFileRepositoryTest.java
+                        โ””โ”€โ”€ service
+                            โ”œโ”€โ”€ VcApiServiceImplTest.java
+                            โ””โ”€โ”€ VcServiceImplTest.java
+
+
+ +
+ +## โœจ ์ฃผ์š” ๊ธฐ๋Šฅ + diff --git a/formatTest.wav b/aduio/formatTest.wav similarity index 100% rename from formatTest.wav rename to aduio/formatTest.wav diff --git a/test.mp3 b/aduio/test.mp3 similarity index 100% rename from test.mp3 rename to aduio/test.mp3 diff --git a/test.wav b/aduio/test.wav similarity index 100% rename from test.wav rename to aduio/test.wav diff --git a/ttsoutput.mp3 b/aduio/ttsoutput.mp3 similarity index 100% rename from ttsoutput.mp3 rename to aduio/ttsoutput.mp3 diff --git a/build.gradle b/build.gradle index 40403242..590f9b9b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,9 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.3.5' + id 'org.springframework.boot' version '3.3.6' id 'io.spring.dependency-management' version '1.1.6' + id 'com.diffplug.spotless' version '6.25.0' + id "org.sonarqube" version "6.0.1.5171" } group = 'com.oreo' @@ -19,11 +21,19 @@ configurations { } } +sonar { + properties { + property "sonar.projectKey", "5re5park" + property "sonar.projectName", "5re5park" + } +} + repositories { mavenCentral() } dependencies { + implementation 'org.springframework:spring-context:6.1.15' implementation 'org.springframework.boot:spring-boot-starter-web' // DEVELOP @@ -73,6 +83,8 @@ dependencies { // MONITORING implementation 'org.springframework.boot:spring-boot-starter-actuator' + // Prometheus + implementation 'io.micrometer:micrometer-registry-prometheus' // LOGGER // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic @@ -92,24 +104,53 @@ dependencies { implementation platform('com.amazonaws:aws-java-sdk-bom:1.12.529') implementation 'com.amazonaws:aws-java-sdk-s3' - // https://mvnrepository.com/artifact/software.amazon.awssdk/sqs - implementation group: 'software.amazon.awssdk', name: 'sqs', version: '2.21.46' +// // https://mvnrepository.com/artifact/software.amazon.awssdk/sqs +// implementation group: 'software.amazon.awssdk', name: 'sqs', version: '2.21.46' // https://mvnrepository.com/artifact/software.amazon.awssdk/auth implementation group: 'software.amazon.awssdk', name: 'auth', version: '2.21.46' - // https://mvnrepository.com/artifact/com.amazonaws/amazon-sqs-java-temporary-queues-client - implementation group: 'com.amazonaws', name: 'amazon-sqs-java-temporary-queues-client', version: '2.0.1' +// // https://mvnrepository.com/artifact/com.amazonaws/amazon-sqs-java-temporary-queues-client +// implementation group: 'com.amazonaws', name: 'amazon-sqs-java-temporary-queues-client', version: '2.0.1' //http request // https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 implementation 'org.apache.httpcomponents.client5:httpclient5:5.4.1' implementation 'org.apache.httpcomponents:httpmime:4.5.13' + + } test { useJUnitPlatform() } - +spotless { + java { + // import ์ˆœ์„œ ์ •์˜ + importOrder( + "java", + "javax", + "lombok", + "org.springframework", + "", + "\\#", + "org.junit", + "\\#org.junit", + "com.guide", + "\\#com.guide" + ) + // ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import ์ œ๊ฑฐ + removeUnusedImports() + // ๊ตฌ๊ธ€ ์ž๋ฐ” ํฌ๋งท ์ ์šฉ + googleJavaFormat() + + indentWithTabs(2) + indentWithSpaces(4) + // ๊ณต๋ฐฑ ์ œ๊ฑฐ + trimTrailingWhitespace() + // ๋๋ถ€๋ถ„ New Line ์ฒ˜๋ฆฌ + endWithNewline() + } +} diff --git a/images/Compose.png b/images/Compose.png new file mode 100644 index 00000000..2adee09b Binary files /dev/null and b/images/Compose.png differ diff --git a/images/RDS.png b/images/RDS.png new file mode 100644 index 00000000..f1c34b0e Binary files /dev/null and b/images/RDS.png differ diff --git a/images/google-sheet.png b/images/google-sheet.png new file mode 100644 index 00000000..b6b68b83 Binary files /dev/null and b/images/google-sheet.png differ diff --git a/images/google-slides.png b/images/google-slides.png new file mode 100644 index 00000000..8785fdc4 Binary files /dev/null and b/images/google-slides.png differ diff --git a/images/img.png b/images/img.png new file mode 100644 index 00000000..bf05a647 Binary files /dev/null and b/images/img.png differ diff --git a/images/img_1.png b/images/img_1.png new file mode 100644 index 00000000..70960fb8 Binary files /dev/null and b/images/img_1.png differ diff --git a/images/img_2.png b/images/img_2.png new file mode 100644 index 00000000..3384c3c7 Binary files /dev/null and b/images/img_2.png differ diff --git a/images/img_3.png b/images/img_3.png new file mode 100644 index 00000000..85179eb2 Binary files /dev/null and b/images/img_3.png differ diff --git a/images/img_4.png b/images/img_4.png new file mode 100644 index 00000000..89a1ee7e Binary files /dev/null and b/images/img_4.png differ diff --git a/images/img_5.png b/images/img_5.png new file mode 100644 index 00000000..fed0445e Binary files /dev/null and b/images/img_5.png differ diff --git a/images/img_6.png b/images/img_6.png new file mode 100644 index 00000000..8a140e34 Binary files /dev/null and b/images/img_6.png differ diff --git a/images/img_7.png b/images/img_7.png new file mode 100644 index 00000000..8e58c9b2 Binary files /dev/null and b/images/img_7.png differ diff --git a/images/lombok.png b/images/lombok.png new file mode 100644 index 00000000..9e0a0b7f Binary files /dev/null and b/images/lombok.png differ diff --git a/images/spring-data-jpa.png b/images/spring-data-jpa.png new file mode 100644 index 00000000..e0a4a375 Binary files /dev/null and b/images/spring-data-jpa.png differ diff --git a/images/spring-security.png b/images/spring-security.png new file mode 100644 index 00000000..1c1e8bd3 Binary files /dev/null and b/images/spring-security.png differ diff --git a/images/spring.png b/images/spring.png new file mode 100644 index 00000000..336f5944 Binary files /dev/null and b/images/spring.png differ diff --git a/images/zoom.png b/images/zoom.png new file mode 100644 index 00000000..8934f696 Binary files /dev/null and b/images/zoom.png differ diff --git a/src/main/java/com/oreo/finalproject_5re5_be/FinalProject5Re5BeApplication.java b/src/main/java/com/oreo/finalproject_5re5_be/FinalProject5Re5BeApplication.java index f1109db8..0b56f21e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/FinalProject5Re5BeApplication.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/FinalProject5Re5BeApplication.java @@ -1,7 +1,5 @@ package com.oreo.finalproject_5re5_be; -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.servers.Server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.retry.annotation.EnableRetry; @@ -15,5 +13,4 @@ public class FinalProject5Re5BeApplication { public static void main(String[] args) { SpringApplication.run(FinalProject5Re5BeApplication.class, args); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/controller/CodeController.java b/src/main/java/com/oreo/finalproject_5re5_be/code/controller/CodeController.java index c2f5c0d4..7e280c83 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/controller/CodeController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/controller/CodeController.java @@ -31,84 +31,91 @@ public class CodeController { private final CodeServiceImpl codeService; -// @Operation(summary = "์ฝ”๋“œ ๋“ฑ๋ก") -// @PostMapping("/register") + // @Operation(summary = "์ฝ”๋“œ ๋“ฑ๋ก") + // @PostMapping("/register") public ResponseEntity create(@RequestBody @Valid CodeRequest request) { // ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค CodeResponse response = codeService.create(request); // ๋“ฑ๋ก๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - return ResponseEntity.status(HttpStatus.CREATED) - .body(response); - + return ResponseEntity.status(HttpStatus.CREATED).body(response); } -// @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ์ฝ”๋“œ ์กฐํšŒ") -// @GetMapping("/all") + // @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ์ฝ”๋“œ ์กฐํšŒ") + // @GetMapping("/all") public ResponseEntity readAll() { // ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•œ๋‹ค CodeResponses responses = codeService.readAll(); // ์กฐํšŒ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - return ResponseEntity.status(HttpStatus.OK) - .body(responses); + return ResponseEntity.status(HttpStatus.OK).body(responses); } -// @Operation(summary = "์‹œํ€€์Šค๋กœ ํŠน์ • ์ฝ”๋“œ ์กฐํšŒ") -// @GetMapping("/seq/{codeSeq}") - public ResponseEntity readBySeq(@Parameter(description = "Code ์‹œํ€€์Šค") @Min(value = 1L, message = "์ฝ”๋“œ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @PathVariable("codeSeq") Long codeSeq) { + // @Operation(summary = "์‹œํ€€์Šค๋กœ ํŠน์ • ์ฝ”๋“œ ์กฐํšŒ") + // @GetMapping("/seq/{codeSeq}") + public ResponseEntity readBySeq( + @Parameter(description = "Code ์‹œํ€€์Šค") + @Min(value = 1L, message = "์ฝ”๋“œ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @PathVariable("codeSeq") + Long codeSeq) { // ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹œํ€€์Šค๋กœ ํŠน์ • ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•œ๋‹ค CodeResponse response = codeService.read(codeSeq); // ์กฐํšŒ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "์ฝ”๋“œ ๋ฒˆํ˜ธ๋กœ ํŠน์ • ์ฝ”๋“œ ์กฐํšŒ") -// @GetMapping("/{code}") - public ResponseEntity readByCode(@Parameter(description = "Code์˜ ์ฝ”๋“œ๋ฒˆํ˜ธ") @PathVariable("code") String code) { + // @Operation(summary = "์ฝ”๋“œ ๋ฒˆํ˜ธ๋กœ ํŠน์ • ์ฝ”๋“œ ์กฐํšŒ") + // @GetMapping("/{code}") + public ResponseEntity readByCode( + @Parameter(description = "Code์˜ ์ฝ”๋“œ๋ฒˆํ˜ธ") @PathVariable("code") String code) { // ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฝ”๋“œ ๋ฒˆํ˜ธ๋กœ ํŠน์ • ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•œ๋‹ค CodeResponse response = codeService.read(code); // ์กฐํšŒ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } @Operation(summary = "๊ฐ ํŒŒํŠธ(cateNum)์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์กฐํšŒ - ํšŒ์› ์‚ญ์ œ ์œ ํ˜• ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ์‹œ cateNum์— MD ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”") @GetMapping("/{cateNum}/available") - public ResponseEntity readAvailable(@Parameter(description = "Code์˜ ํŒŒํŠธ๋ณ„ ๋ฒˆํ˜ธ") @PathVariable("cateNum") String cateNum) { + public ResponseEntity readAvailable( + @Parameter(description = "Code์˜ ํŒŒํŠธ๋ณ„ ๋ฒˆํ˜ธ") @PathVariable("cateNum") String cateNum) { // ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ ํŒŒํŠธ๋ณ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•œ๋‹ค CodeResponses responses = codeService.readAvailableCodeByCateNum(cateNum); // ์กฐํšŒ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - return ResponseEntity.status(HttpStatus.OK) - .body(responses); + return ResponseEntity.status(HttpStatus.OK).body(responses); } -// @Operation(summary = "๊ฐ ํŒŒํŠธ(cateNum)์œผ๋กœ ๋ชจ๋“  ์ฝ”๋“œ ์กฐํšŒ") -// @GetMapping("/{cateNum}/all") - public ResponseEntity readAll(@Parameter(description = "Code์˜ ํŒŒํŠธ๋ณ„ ๋ฒˆํ˜ธ") @PathVariable("cateNum") String cateNum) { + // @Operation(summary = "๊ฐ ํŒŒํŠธ(cateNum)์œผ๋กœ ๋ชจ๋“  ์ฝ”๋“œ ์กฐํšŒ") + // @GetMapping("/{cateNum}/all") + public ResponseEntity readAll( + @Parameter(description = "Code์˜ ํŒŒํŠธ๋ณ„ ๋ฒˆํ˜ธ") @PathVariable("cateNum") String cateNum) { // ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ ํŒŒํŠธ๋ณ„ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•œ๋‹ค CodeResponses responses = codeService.readAllByCateNum(cateNum); // ์กฐํšŒ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - return ResponseEntity.status(HttpStatus.OK) - .body(responses); + return ResponseEntity.status(HttpStatus.OK).body(responses); } -// @Operation(summary = "ํŠน์ • ์ฝ”๋“œ ์ˆ˜์ • ์ฒ˜๋ฆฌ") -// @PatchMapping("/{codeSeq}") - public ResponseEntity update(@Parameter(description = "Code ์‹œํ€€์Šค") @Min(value = 1L, message = "์ฝ”๋“œ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @PathVariable("codeSeq") Long codeSeq, @Valid @RequestBody CodeUpdateRequest request) { + // @Operation(summary = "ํŠน์ • ์ฝ”๋“œ ์ˆ˜์ • ์ฒ˜๋ฆฌ") + // @PatchMapping("/{codeSeq}") + public ResponseEntity update( + @Parameter(description = "Code ์‹œํ€€์Šค") + @Min(value = 1L, message = "์ฝ”๋“œ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @PathVariable("codeSeq") + Long codeSeq, + @Valid @RequestBody CodeUpdateRequest request) { // ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค codeService.update(codeSeq, request); // ์ˆ˜์ •๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } -// @Operation(summary = "ํŠน์ • ์ฝ”๋“œ ์‚ญ์ œ ์ฒ˜๋ฆฌ") -// @DeleteMapping("/{codeSeq}") - public ResponseEntity delete(@Parameter(description = "Code ์‹œํ€€์Šค") @Min(value = 1L, message = "์ฝ”๋“œ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @PathVariable("codeSeq") Long codeSeq) { + // @Operation(summary = "ํŠน์ • ์ฝ”๋“œ ์‚ญ์ œ ์ฒ˜๋ฆฌ") + // @DeleteMapping("/{codeSeq}") + public ResponseEntity delete( + @Parameter(description = "Code ์‹œํ€€์Šค") + @Min(value = 1L, message = "์ฝ”๋“œ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @PathVariable("codeSeq") + Long codeSeq) { // ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค codeService.delete(codeSeq); // ์‚ญ์ œ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/controller/advice/CodeExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/code/controller/advice/CodeExceptionHandler.java index a94c1790..04c14aaf 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/controller/advice/CodeExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/controller/advice/CodeExceptionHandler.java @@ -28,16 +28,13 @@ public ResponseEntity handleRuntimeException(RuntimeException log.error("CODE : [RuntimeException] ", e); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ƒ์„ฑ - ErrorResponseDto response = ErrorResponseDto.of(INTERNAL_SERVER_ERROR.getStatus(), - e.getMessage()); + ErrorResponseDto response = + ErrorResponseDto.of(INTERNAL_SERVER_ERROR.getStatus(), e.getMessage()); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(response.getStatus()) - .body(response); - + return ResponseEntity.status(response.getStatus()).body(response); } - // ์ฝ”๋“œ ํŒŒํŠธ์—์„œ BusinessException์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ @ExceptionHandler(BusinessException.class) public ResponseEntity handleBusinessException(BusinessException e) { @@ -45,18 +42,16 @@ public ResponseEntity handleBusinessException(BusinessExceptio log.error("CODE : [BusinessException] ", e); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ƒ์„ฑ - ErrorResponseDto response = ErrorResponseDto.of(e.getErrorCode().getStatus(), - e.getMessage()); + ErrorResponseDto response = ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(response.getStatus()) - .body(response); + return ResponseEntity.status(response.getStatus()).body(response); } - // ์ฝ”๋“œ ํŒŒํŠธ์—์„œ MethodArgumentNotValidException์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ - ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ์‹คํŒจ @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + public ResponseEntity handleMethodArgumentNotValidException( + MethodArgumentNotValidException e) { // ๋กœ๊ทธ๋กœ ์–ด๋–ค ์˜ˆ์™ธ ํด๋ž˜์Šค๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ‘œ์‹œ log.error("CODE : [MethodArgumentNotValidException] ", e); @@ -65,43 +60,48 @@ public ResponseEntity handleMethodArgumentNotValidException(Me BindingResult result = e.getBindingResult(); // ํ•„๋“œ ์—๋Ÿฌ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ - List fieldErrorList = result.getFieldErrors() - .stream() - .map(error -> FieldErrorDetail.of(error.getField(), error.getDefaultMessage())) - .toList(); + List fieldErrorList = + result.getFieldErrors().stream() + .map(error -> FieldErrorDetail.of(error.getField(), error.getDefaultMessage())) + .toList(); // ErrorResponseDto ์ƒ์„ฑ - ErrorResponseDto response = ErrorResponseDto.of(CODE_INVALID_INPUT_VALUE_ERROR.getStatus(), - CODE_INVALID_INPUT_VALUE_ERROR.getMessage(), - fieldErrorList); + ErrorResponseDto response = + ErrorResponseDto.of( + CODE_INVALID_INPUT_VALUE_ERROR.getStatus(), + CODE_INVALID_INPUT_VALUE_ERROR.getMessage(), + fieldErrorList); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(response.getStatus()) - .body(response); + return ResponseEntity.status(response.getStatus()).body(response); } - // ์ฝ”๋“œ ํŒŒํŠธ์—์„œ ConstraintViolationException ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์•ฝ ์กฐ๊ฑด ์œ„๋ฐ˜ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒ(JPA/Hibernate) @ExceptionHandler(ConstraintViolationException.class) - public ResponseEntity handleConstraintViolationException(ConstraintViolationException e) { + public ResponseEntity handleConstraintViolationException( + ConstraintViolationException e) { // ๋กœ๊ทธ๋กœ ์–ด๋–ค ์˜ˆ์™ธ ํด๋ž˜์Šค๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ‘œ์‹œ log.error("CODE : [ConstraintViolationException] ", e); // ๊ฐ violation์— ์ ‘๊ทผํ•˜์—ฌ ์—๋Ÿฌ ๋‚ด์šฉ ์ƒ์„ธํ™”ํ•œ Set ์ƒ์„ฑ Set> constraintViolationSet = e.getConstraintViolations(); - List violationList = constraintViolationSet.stream() - .map(violation -> FieldErrorDetail.of(violation.getPropertyPath().toString(), violation.getMessage())) - .toList(); + List violationList = + constraintViolationSet.stream() + .map( + violation -> + FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .toList(); // ErrorResponseDto ์ƒ์„ฑ - ErrorResponseDto response = ErrorResponseDto.of(CODE_INVALID_INPUT_VALUE_ERROR.getStatus(), - CODE_INVALID_INPUT_VALUE_ERROR.getMessage(), - violationList); - + ErrorResponseDto response = + ErrorResponseDto.of( + CODE_INVALID_INPUT_VALUE_ERROR.getStatus(), + CODE_INVALID_INPUT_VALUE_ERROR.getMessage(), + violationList); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(CODE_INVALID_INPUT_VALUE_ERROR.getStatus()) - .body(response); + return ResponseEntity.status(CODE_INVALID_INPUT_VALUE_ERROR.getStatus()).body(response); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeRequest.java index 5f995b96..8b84190a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeRequest.java @@ -36,7 +36,6 @@ public class CodeRequest { private String comt; - public Code createCodeEntity() { return Code.builder() .cateNum(cateNum) @@ -47,5 +46,4 @@ public Code createCodeEntity() { .comt(comt) .build(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeUpdateRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeUpdateRequest.java index 438f7570..4545661e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeUpdateRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeUpdateRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.code.dto.request; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Builder; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponse.java index a9659870..bda5364c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponse.java @@ -6,7 +6,6 @@ import lombok.Getter; import lombok.ToString; - @Getter @ToString @Builder diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponses.java b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponses.java index 779674b6..88f0ce1b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponses.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponses.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.code.dto.response; - import java.util.List; import lombok.EqualsAndHashCode; import lombok.Getter; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/entity/Code.java b/src/main/java/com/oreo/finalproject_5re5_be/code/entity/Code.java index 48e3a1a0..d45b3d18 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/entity/Code.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/entity/Code.java @@ -1,7 +1,7 @@ package com.oreo.finalproject_5re5_be.code.entity; -import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import com.oreo.finalproject_5re5_be.code.dto.request.CodeUpdateRequest; +import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -56,6 +56,4 @@ public void update(CodeUpdateRequest request) { this.chkUse = request.getChkUse(); this.comt = request.getComt(); } - } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeDuplicatedException.java b/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeDuplicatedException.java index 7755725b..fd30c96f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeDuplicatedException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeDuplicatedException.java @@ -4,7 +4,6 @@ import com.oreo.finalproject_5re5_be.global.exception.BusinessException; - // ์ค‘๋ณต๋œ ์ฝ”๋“œ ๋“ฑ๋ก์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ public class CodeDuplicatedException extends BusinessException { @@ -15,5 +14,4 @@ public CodeDuplicatedException() { public CodeDuplicatedException(String message) { super(message, CODE_DUPLICATED_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeNotFoundException.java index 554940ef..e2314147 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeNotFoundException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeNotFoundException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -; // ์ž…๋ ฅ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ public class CodeNotFoundException extends BusinessException { @@ -15,5 +14,4 @@ public CodeNotFoundException() { public CodeNotFoundException(String message) { super(message, MEMBER_NOT_FOUND_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/repository/CodeRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/code/repository/CodeRepository.java index 60594456..e104e84a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/repository/CodeRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/repository/CodeRepository.java @@ -14,18 +14,16 @@ public interface CodeRepository extends JpaRepository { Code findCodeByCodeSeq(Long codeSeq); // ๊ฐ ํŒŒํŠธ๋ณ„๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์กฐํšŒ. - @Query( "SELECT c " + - "FROM Code c " + - "WHERE c.cateNum = :cateNum " + - "AND c.chkUse = 'Y' " + - "ORDER BY c.ord") + @Query( + "SELECT c " + + "FROM Code c " + + "WHERE c.cateNum = :cateNum " + + "AND c.chkUse = 'Y' " + + "ORDER BY c.ord") List findAvailableCodesByCateNum(String cateNum); // ๊ฐ ํŒŒํŠธ๋ณ„๋กœ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์กฐํšŒ. - @Query( "SELECT c " + - "FROM Code c " + - "WHERE c.cateNum = :cateNum " + - "ORDER BY c.ord") + @Query("SELECT c " + "FROM Code c " + "WHERE c.cateNum = :cateNum " + "ORDER BY c.ord") List findCodesByCateNum(String cateNum); // ์ฝ”๋“œ ๋ฒˆํ˜ธ๋กœ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ. diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/service/CodeServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/code/service/CodeServiceImpl.java index 95440ed2..456bd5b5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/service/CodeServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/service/CodeServiceImpl.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.code.service; - import com.oreo.finalproject_5re5_be.code.dto.request.CodeRequest; import com.oreo.finalproject_5re5_be.code.dto.request.CodeUpdateRequest; import com.oreo.finalproject_5re5_be.code.dto.response.CodeResponse; @@ -45,9 +44,7 @@ public CodeResponses readAll() { // ๋ชจ๋“  ์ฝ”๋“œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒ List foundCodes = codeRepository.findAll(); // ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ - List codeResponseList = foundCodes.stream() - .map(CodeResponse::of) - .toList(); + List codeResponseList = foundCodes.stream().map(CodeResponse::of).toList(); // ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค return CodeResponses.of(codeResponseList); @@ -69,15 +66,12 @@ public CodeResponse read(String code) { return CodeResponse.of(foundCode); } - // ๊ฐ ํŒŒํŠธ๋ณ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์กฐํšŒ public CodeResponses readAvailableCodeByCateNum(String cateNum) { // ์ „๋‹ฌ ๋ฐ›์€ ํŒŒํŠธ์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ฝ”๋“œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค List foundCodes = codeRepository.findAvailableCodesByCateNum(cateNum); // ๋ฆฌ์ŠคํŠธ์— ๋‹ด๋Š”๋‹ค - List codeResponseList = foundCodes.stream() - .map(CodeResponse::of) - .toList(); + List codeResponseList = foundCodes.stream().map(CodeResponse::of).toList(); // ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ responses๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค return CodeResponses.of(codeResponseList); } @@ -87,14 +81,11 @@ public CodeResponses readAllByCateNum(String cateNum) { // ์ „๋‹ฌ ๋ฐ›์€ ํŒŒํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค List foundCodes = codeRepository.findCodesByCateNum(cateNum); // ๋ฆฌ์ŠคํŠธ์— ๋‹ด๋Š”๋‹ค - List codeResponseList = foundCodes.stream() - .map(CodeResponse::of) - .toList(); + List codeResponseList = foundCodes.stream().map(CodeResponse::of).toList(); // ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ responses๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค return CodeResponses.of(codeResponseList); } - // ์ฝ”๋“œ ์ˆ˜์ • public void update(Long codeSeq, CodeUpdateRequest request) { // ์‹œํ€€์Šค๋กœ ํŠน์ • ์ฝ”๋“œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค @@ -124,5 +115,4 @@ public void delete(Long codeSeq) { // ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค codeRepository.delete(foundCode); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java new file mode 100644 index 00000000..4ce37423 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.oreo.finalproject_5re5_be.concat.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/AudioFileController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/AudioFileController.java index faccc50d..500061ea 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/AudioFileController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/AudioFileController.java @@ -11,6 +11,9 @@ import com.oreo.finalproject_5re5_be.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.io.IOException; +import java.util.List; +import javax.sound.sampled.UnsupportedAudioFileException; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -24,10 +27,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.sound.sampled.UnsupportedAudioFileException; -import java.io.IOException; -import java.util.List; - @Tag(name = "Concat", description = "Concat ๊ด€๋ จ API") @RestController @RequiredArgsConstructor @@ -38,12 +37,9 @@ public class AudioFileController { private final ConcatRowService concatRowService; private final MaterialAudioService materialAudioService; - - @Operation( - summary = "์—…๋กœ๋“œ ํ•  ์˜ค๋””์˜ค ํ˜•์‹ ๊ฒ€์‚ฌ", - description = "์—…๋กœ๋“œ ํ•  ์ˆ˜ ์—†๋Š” ์˜ค๋””์˜ค ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." - ) - @PostMapping(value = "extension/check", + @Operation(summary = "์—…๋กœ๋“œ ํ•  ์˜ค๋””์˜ค ํ˜•์‹ ๊ฒ€์‚ฌ", description = "์—…๋กœ๋“œ ํ•  ์ˆ˜ ์—†๋Š” ์˜ค๋””์˜ค ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.") + @PostMapping( + value = "extension/check", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity>> check( @@ -55,64 +51,63 @@ public ResponseEntity>> check( return buildResponse(status, audioFileRequestDtos); } - @Operation( - summary = "์˜ค๋””์˜ค ์—…๋กœ๋“œ", - description = "์—…๋กœ๋“œํ•œ ์˜ค๋””์˜ค์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." - ) - @PostMapping(value = "save", + @Operation(summary = "์˜ค๋””์˜ค ์—…๋กœ๋“œ", description = "์—…๋กœ๋“œํ•œ ์˜ค๋””์˜ค์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.") + @PostMapping( + value = "save", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity>> save( - @RequestParam("audio") List audioFiles) throws IOException, UnsupportedAudioFileException { + @RequestParam("audio") List audioFiles) + throws IOException, UnsupportedAudioFileException { List audioDto = convertToDto(audioFiles); List originAudioRequests = audioFileService.saveAudioFile(audioDto); return buildResponse(HttpStatus.OK, originAudioRequests); } - @Operation( - summary = "ํ–‰์˜ ์•„์ด๋””์— ์ €์žฅ๋œ ์˜ค๋””์˜ค ๋ถˆ๋Ÿฌ์˜ค๊ธฐ", - description = "์—…๋กœ๋“œ ๋œ ์˜ค๋””์˜ค์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." - ) + @Operation(summary = "ํ–‰์˜ ์•„์ด๋””์— ์ €์žฅ๋œ ์˜ค๋””์˜ค ๋ถˆ๋Ÿฌ์˜ค๊ธฐ", description = "์—…๋กœ๋“œ ๋œ ์˜ค๋””์˜ค์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("read") - public ResponseEntity>> read(@RequestParam List concatRowSeq, - @AuthenticationPrincipal CustomUserDetails userDetails) { - concatRowSeq.forEach(seq -> { - Long projectId = concatRowService.readConcatRow(seq).getConcatTab().getProjectId(); - projectService.projectCheck(userDetails.getMember().getSeq(), projectId); - }); + public ResponseEntity>> read( + @RequestParam List concatRowSeq, + @AuthenticationPrincipal CustomUserDetails userDetails) { + concatRowSeq.forEach( + seq -> { + Long projectId = concatRowService.readConcatRow(seq).getConcatTab().getProjectId(); + projectService.checkProject(userDetails.getMember().getSeq(), projectId); + }); concatRowSeq.sort(Long::compareTo); List audioFileList = audioFileService.findByConcatRowSeq(concatRowSeq); return buildResponse(HttpStatus.OK, audioFileList); } - @Operation( - summary = "์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œ ํ•œ ๋ชจ๋“  ์˜ค๋””์˜ค ํŒŒ์ผ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.", - description = "์—…๋กœ๋“œ ๋œ ์˜ค๋””์˜ค์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." - ) + @Operation(summary = "์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œ ํ•œ ๋ชจ๋“  ์˜ค๋””์˜ค ํŒŒ์ผ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.", description = "์—…๋กœ๋“œ ๋œ ์˜ค๋””์˜ค์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.") @GetMapping("read/my/audio") - public ResponseEntity>> readMyAudio(@AuthenticationPrincipal CustomUserDetails userDetails, - @RequestParam int page, - @RequestParam int size, - @RequestParam String sort) { + public ResponseEntity>> readMyAudio( + @AuthenticationPrincipal CustomUserDetails userDetails, + @RequestParam int page, + @RequestParam int size, + @RequestParam String sort) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - String user = authentication.getPrincipal().toString(); + String user = authentication.getPrincipal().toString(); System.out.println("user = " + user); - Sort.Direction direction = Sort.Direction.fromString(sort); // "ASC" ๋˜๋Š” "DESC" - Pageable pageable = PageRequest.of(page, size, Sort.by(direction, "createdDate")); // "created_date"๊ฐ€ ์•„๋‹ˆ๋ผ ๋งคํ•‘๋œ ์—”ํ‹ฐํ‹ฐ ํ•„๋“œ ์ด๋ฆ„ ์‚ฌ์šฉ - return buildResponse(HttpStatus.OK, audioFileService.getMemberAudioFile(userDetails.getMember().getSeq(), pageable)); + Pageable pageable = + PageRequest.of( + page, size, Sort.by(direction, "createdDate")); // "created_date"๊ฐ€ ์•„๋‹ˆ๋ผ ๋งคํ•‘๋œ ์—”ํ‹ฐํ‹ฐ ํ•„๋“œ ์ด๋ฆ„ ์‚ฌ์šฉ + return buildResponse( + HttpStatus.OK, + audioFileService.getMemberAudioFile(userDetails.getMember().getSeq(), pageable)); } @Operation( summary = "์ „๋‹ฌ๋ฐ›์€ ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ๋กœ ๊ณ„์‚ฐํ•œ ํŽ˜์ด์ง€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค.", - description = "์ˆซ์ž ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค." - ) + description = "์ˆซ์ž ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.") @GetMapping("read/my/audio/pages") - public ResponseEntity>> readMyAudioPages(@AuthenticationPrincipal CustomUserDetails userDetails, - @RequestParam int size) { - return buildResponse(HttpStatus.OK, audioFileService.getAudioFilePages(userDetails.getMember().getSeq(), size)); + public ResponseEntity>> readMyAudioPages( + @AuthenticationPrincipal CustomUserDetails userDetails, @RequestParam int size) { + return buildResponse( + HttpStatus.OK, audioFileService.getAudioFilePages(userDetails.getMember().getSeq(), size)); } private List convertToDto(List audioFiles) { @@ -124,4 +119,4 @@ private List convertToDto(List audioFiles) { private ResponseEntity> buildResponse(HttpStatus status, T data) { return new ResponseEntity<>(new ResponseDto<>(status.value(), data), status); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/BgmFileController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/BgmFileController.java index 866ece47..96796649 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/BgmFileController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/BgmFileController.java @@ -2,6 +2,7 @@ import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.service.BgmFileService; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -9,9 +10,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - - @RestController @RequiredArgsConstructor @RequestMapping("/api/bgms") @@ -23,5 +21,4 @@ public ResponseEntity> getBgmFiles(@PathVariable Long tabSeq) { List bgmFiles = bgmFileService.getBgmFilesByTabSeq(tabSeq); return ResponseEntity.ok(bgmFiles); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java index 4dc040fa..b3d6f368 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java @@ -1,76 +1,94 @@ package com.oreo.finalproject_5re5_be.concat.controller; - import com.oreo.finalproject_5re5_be.concat.dto.ConcatResultDto; import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.service.ConcatResultService; -import com.oreo.finalproject_5re5_be.concat.service.ConcatService; import com.oreo.finalproject_5re5_be.concat.service.ConcatTabService; +import com.oreo.finalproject_5re5_be.concat.service.lambda.LambdaConcatService; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.io.IOException; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.concurrent.ExecutionException; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.io.IOException; -import java.util.List; -import java.util.NoSuchElementException; - @Tag(name = "Concat", description = "Concat ๊ด€๋ จ API") @RestController @RequiredArgsConstructor @RequestMapping("api/concat") public class ConcatController { - private final ConcatService concatService; + private final LambdaConcatService lambdaConcatService; private final ConcatTabService concatTabService; private final ConcatResultService concatResultService; private final ProjectService projectService; - @Operation( - summary = "์˜ค๋””์˜ค ๋ณ‘ํ•ฉ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.", - description = "๋ณ‘ํ•ฉ์ด ์„ฑ๊ณต ํ–ˆ๋‹ค๋ฉด ์ €์žฅ๋œ ์˜ค๋””์˜ค ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." - ) + @Operation(summary = "์˜ค๋””์˜ค ๋ณ‘ํ•ฉ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.", description = "๋ณ‘ํ•ฉ์ด ์„ฑ๊ณต ํ–ˆ๋‹ค๋ฉด ์ €์žฅ๋œ ์˜ค๋””์˜ค ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("") - public ResponseEntity> concat(@RequestBody ConcatRowRequestDto audioRequests, - @RequestParam Long memberSeq) throws IOException { - projectService.projectCheck(memberSeq, audioRequests.getConcatTabId()); + public ResponseEntity>> concat( + @RequestBody ConcatRowRequestDto audioRequests, + @AuthenticationPrincipal CustomUserDetails customUserDetails) + throws IOException, ExecutionException, InterruptedException { + projectService.checkProject( + customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); + + ConcatTabResponseDto concatTabResponseDto = + concatTabService.readConcatTab( + audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); - ConcatTabResponseDto concatTabResponseDto - = concatTabService.readConcatTab(audioRequests.getConcatTabId(), memberSeq); - ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); - return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); + List concatResult = + lambdaConcatService.concatOnLambda(concatTabResponseDto, audioRequests); + + return new ResponseDto<>(HttpStatus.OK.value(), concatResult).toResponseEntity(); } - @Operation( - summary = "์˜ค๋””์˜ค ๊ฒฐ๊ณผ ๋ชฉ๋ก ๋ถˆ๋Ÿฌ์˜ค๊ธฐ", - description = "ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์— ํ•ด๋‹นํ•˜๋Š” ์˜ค๋””์˜ค ๊ฒฐ๊ณผ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." - ) + // @PostMapping("") + // public ResponseEntity> concat(@RequestBody ConcatRowRequestDto + // audioRequests, + // @AuthenticationPrincipal + // CustomUserDetails customUserDetails) throws IOException { + // projectService.projectCheck(customUserDetails.getMember().getSeq(), + // audioRequests.getConcatTabId()); + // + // ConcatTabResponseDto concatTabResponseDto + // = concatTabService.readConcatTab(audioRequests.getConcatTabId(), + // customUserDetails.getMember().getSeq()); + // ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); + // return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); + // } + + @Operation(summary = "์˜ค๋””์˜ค ๊ฒฐ๊ณผ ๋ชฉ๋ก ๋ถˆ๋Ÿฌ์˜ค๊ธฐ", description = "ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์— ํ•ด๋‹นํ•˜๋Š” ์˜ค๋””์˜ค ๊ฒฐ๊ณผ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.") @GetMapping("read/result") - public ResponseEntity>> readConcatResult(@RequestParam Long projectSeq, - @AuthenticationPrincipal CustomUserDetails userDetails) { - projectService.projectCheck(userDetails.getMember().getSeq(), projectSeq); + public ResponseEntity>> readConcatResult( + @RequestParam Long projectSeq, @AuthenticationPrincipal CustomUserDetails userDetails) { + projectService.checkProject(userDetails.getMember().getSeq(), projectSeq); - return new ResponseDto<>(HttpStatus.OK.value(), concatResultService.findByConcatTabSequence(projectSeq)).toResponseEntity(); + return new ResponseDto<>( + HttpStatus.OK.value(), concatResultService.findByConcatTabSequence(projectSeq)) + .toResponseEntity(); } // IllegalArgumentException ์ฒ˜๋ฆฌ @ExceptionHandler(IllegalArgumentException.class) - public ResponseEntity> handleDataNotFoundException(IllegalArgumentException ex) { + public ResponseEntity> handleDataNotFoundException( + IllegalArgumentException ex) { String errorMessage = ex.getMessage(); return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), errorMessage).toResponseEntity(); } - // NoSuchElementException ์ฒ˜๋ฆฌ @ExceptionHandler(NoSuchElementException.class) - public ResponseEntity> handleDataNotFoundException(NoSuchElementException ex) { + public ResponseEntity> handleDataNotFoundException( + NoSuchElementException ex) { String errorMessage = ex.getMessage(); return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), errorMessage).toResponseEntity(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatMaterialController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatMaterialController.java index 462eeb8e..18c63f40 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatMaterialController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatMaterialController.java @@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; +import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -21,8 +22,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @Tag(name = "Concat", description = "Concat ๊ด€๋ จ API") @RestController @RequestMapping("/api/concat/audio/materials") @@ -31,7 +30,8 @@ public class ConcatMaterialController { private final MaterialAudioService materialAudioService; private final ProjectService projectService; - public ConcatMaterialController(MaterialAudioService materialAudioService, ProjectService projectService) { + public ConcatMaterialController( + MaterialAudioService materialAudioService, ProjectService projectService) { this.materialAudioService = materialAudioService; this.projectService = projectService; } @@ -41,35 +41,39 @@ public ConcatMaterialController(MaterialAudioService materialAudioService, Proje public ResponseEntity> getAllMaterialsByResultSeq( @RequestParam("concatresultseq") Long concatResultSeq, @AuthenticationPrincipal CustomUserDetails userDetails) { - projectService.projectCheck(userDetails.getMember().getSeq(), concatResultSeq); + projectService.checkProject(userDetails.getMember().getSeq(), concatResultSeq); // ConcatResult์—์„œ ๊ฒฐ๊ณผ ํŒŒ์ผ URL ์กฐํšŒ - String resultAudioUrl = materialAudioService.findResultAudioUrlByConcatResultSeq(concatResultSeq); + String resultAudioUrl = + materialAudioService.findResultAudioUrlByConcatResultSeq(concatResultSeq); // BGM ํŒŒ์ผ ์กฐํšŒ BgmFile bgmFile = materialAudioService.findBgmFileByConcatResultSeq(concatResultSeq); OriginAudioRequest bgmFileResponse = null; if (bgmFile != null) { - bgmFileResponse = OriginAudioRequest.builder() - .seq(bgmFile.getBgmFileSeq()) - .audioUrl(bgmFile.getAudioUrl()) - .extension(bgmFile.getExtension()) - .fileSize(bgmFile.getFileSize()) - .fileLength(bgmFile.getFileLength()) - .fileName(bgmFile.getFileName()) - .build(); + bgmFileResponse = + OriginAudioRequest.builder() + .seq(bgmFile.getBgmFileSeq()) + .audioUrl(bgmFile.getAudioUrl()) + .extension(bgmFile.getExtension()) + .fileSize(bgmFile.getFileSize()) + .fileLength(bgmFile.getFileLength()) + .fileName(bgmFile.getFileName()) + .build(); } // ์žฌ๋ฃŒ ์˜ค๋””์˜ค ํŒŒ์ผ ์กฐํšŒ - List materialAudioFiles = materialAudioService.findMaterialAudioFilesByConcatResultSeq(concatResultSeq); + List materialAudioFiles = + materialAudioService.findMaterialAudioFilesByConcatResultSeq(concatResultSeq); // ์‘๋‹ต ์ƒ์„ฑ - ConcatResultResponse response = ConcatResultResponse.builder() - .concatResultSeq(concatResultSeq) - .audioUrl(resultAudioUrl) - .bgmFile(bgmFileResponse) - .materialAudioFiles(materialAudioFiles) - .build(); + ConcatResultResponse response = + ConcatResultResponse.builder() + .concatResultSeq(concatResultSeq) + .audioUrl(resultAudioUrl) + .bgmFile(bgmFileResponse) + .materialAudioFiles(materialAudioFiles) + .build(); return new ResponseDto<>(HttpStatus.OK.value(), response).toResponseEntity(); } @@ -81,14 +85,15 @@ public ResponseEntity> getAllMaterialsByResult public ResponseEntity> getMaterialRowListByResultSeq( @NotNull @RequestParam("concatresultseq") Long concatResultSeq, @AuthenticationPrincipal CustomUserDetails userDetails) { - projectService.projectCheck(userDetails.getMember().getSeq(), concatResultSeq); + projectService.checkProject(userDetails.getMember().getSeq(), concatResultSeq); // resultSeq๋กœ ์žฌ๋ฃŒ๊ฐ€ ๋œ concatRowList ์–ป์–ด์˜ค๊ธฐ - List materialConcatRowList = materialAudioService.findConcatRowListByResultSeq(concatResultSeq); + List materialConcatRowList = + materialAudioService.findConcatRowListByResultSeq(concatResultSeq); // ์‘๋‹ต - return new ResponseDto<>(HttpStatus.OK.value(), ConcatRowListDto.of(materialConcatRowList)).toResponseEntity(); + return new ResponseDto<>(HttpStatus.OK.value(), ConcatRowListDto.of(materialConcatRowList)) + .toResponseEntity(); // ์กฐํšŒ ๊ฒฐ๊ณผ ์‘๋‹ต DTO๋กœ ๋ณ€ํ™˜ } - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java index 68db82a3..143a2a5f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java @@ -8,15 +8,14 @@ import com.oreo.finalproject_5re5_be.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.io.IOException; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.io.IOException; -import java.util.List; - @Tag(name = "Concat", description = "Concat ๊ด€๋ จ API") @RestController @RequestMapping("/api/concat/row") @@ -25,92 +24,89 @@ public class ConcatRowController { private final ConcatRowService concatRowService; private final ProjectService projectService; - //์˜ค๋””์˜ค ํŒŒ์ผ ์—…๋กœ๋“œ -> S3url๋ฆฌํ„ด -> ํด๋ผ์—์„œ url๋กœ ๋กœ์šฐ ์ƒ์„ฑ -> ์ €์žฅ ์š”์ฒญ -> url๋กœ ํ…Œ์ด๋ธ” ๋กœ์šฐ ์ƒ์„ฑ - @Operation( - summary = "ํ–‰ ์ €์žฅ", - description = "์ƒˆ๋กœ์šด ํ–‰์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.") + // ์˜ค๋””์˜ค ํŒŒ์ผ ์—…๋กœ๋“œ -> S3url๋ฆฌํ„ด -> ํด๋ผ์—์„œ url๋กœ ๋กœ์šฐ ์ƒ์„ฑ -> ์ €์žฅ ์š”์ฒญ -> url๋กœ ํ…Œ์ด๋ธ” ๋กœ์šฐ ์ƒ์„ฑ + @Operation(summary = "ํ–‰ ์ €์žฅ", description = "์ƒˆ๋กœ์šด ํ–‰์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("save") public ResponseEntity> save( @RequestBody ConcatRowSaveRequestDto concatRowSaveRequestDto, - @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException { - projectService.projectCheck(customUserDetails.getMember().getSeq(), - concatRowSaveRequestDto.getConcatTabId()); + @AuthenticationPrincipal CustomUserDetails customUserDetails) + throws IOException { + projectService.checkProject( + customUserDetails.getMember().getSeq(), concatRowSaveRequestDto.getConcatTabId()); - return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.saveConcatRows(concatRowSaveRequestDto)) + return new ResponseDto<>( + HttpStatus.OK.value(), concatRowService.saveConcatRows(concatRowSaveRequestDto)) .toResponseEntity(); } - @Operation( - summary = "ํ–‰ ๋น„ํ™œ์„ฑ", - description = "์˜ค๋””์˜ค ํŒŒ์ผ์ด ์กฐํšŒ๋˜์ง€ ์•Š๋„๋ก ๋น„ํ™œ์„ฑ ์ฒ˜๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค." - ) + @Operation(summary = "ํ–‰ ๋น„ํ™œ์„ฑ", description = "์˜ค๋””์˜ค ํŒŒ์ผ์ด ์กฐํšŒ๋˜์ง€ ์•Š๋„๋ก ๋น„ํ™œ์„ฑ ์ฒ˜๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("disable") - public ResponseEntity> disable(@RequestParam List rowSeq, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), + public ResponseEntity> disable( + @RequestParam List rowSeq, + @AuthenticationPrincipal CustomUserDetails customUserDetails) { + projectService.checkProject( + customUserDetails.getMember().getSeq(), concatRowService.readConcatRow(rowSeq.get(0)).getConcatTab().getProjectId()); return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.disableConcatRows(rowSeq)) .toResponseEntity(); } - - @Operation( - summary = "ํ–‰ ์กฐํšŒ", - description = "ํ•˜๋‚˜ ํ–‰์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋น„ํ™œ์„ฑ ๋œ ํ–‰์€ ์กฐํšŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." - ) + @Operation(summary = "ํ–‰ ์กฐํšŒ", description = "ํ•˜๋‚˜ ํ–‰์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋น„ํ™œ์„ฑ ๋œ ํ–‰์€ ์กฐํšŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") @GetMapping("read") public ResponseEntity>> readOne( @RequestParam Long concatRowSequence, @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), + projectService.checkProject( + customUserDetails.getMember().getSeq(), concatRowService.readConcatRow(concatRowSequence).getConcatTab().getProjectId()); - //์‚ฌ์šฉ์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.readConcatRows(concatRowSequence)) + // ์‚ฌ์šฉ์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + return new ResponseDto<>( + HttpStatus.OK.value(), concatRowService.readConcatRows(concatRowSequence)) .toResponseEntity(); } - @Operation( - summary = "ํ–‰ ์กฐํšŒ", - description = "ํ”„๋กœ์ ํŠธ์˜ ํ™œ์„ฑ ์ƒํƒœ์ธ ํ–‰์„์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋น„ํ™œ์„ฑ ๋œ ํ–‰์€ ์กฐํšŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." - ) + @Operation(summary = "ํ–‰ ์กฐํšŒ", description = "ํ”„๋กœ์ ํŠธ์˜ ํ™œ์„ฑ ์ƒํƒœ์ธ ํ–‰์„์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋น„ํ™œ์„ฑ ๋œ ํ–‰์€ ์กฐํšŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") @GetMapping("read/recent") public ResponseEntity>> readRecent( @RequestParam Long projectSequence, @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), projectSequence); + projectService.checkProject(customUserDetails.getMember().getSeq(), projectSequence); - //์‚ฌ์šฉ์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.readRecentConcatRows(projectSequence)) + // ์‚ฌ์šฉ์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + return new ResponseDto<>( + HttpStatus.OK.value(), concatRowService.readRecentConcatRows(projectSequence)) .toResponseEntity(); } - @Operation( - summary = "ํ–‰ ์—…๋ฐ์ดํŠธ", - description = "ํ–‰์„ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ–‰์ด ์ƒ์„ฑ ๋˜๋ฏ€๋กœ ์ด์ „์˜ ํ–‰๊ณผ ๋‹ค๋ฅธ ์•„์ด๋””๋ฅผ ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค." - ) + @Operation(summary = "ํ–‰ ์—…๋ฐ์ดํŠธ", description = "ํ–‰์„ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ–‰์ด ์ƒ์„ฑ ๋˜๋ฏ€๋กœ ์ด์ „์˜ ํ–‰๊ณผ ๋‹ค๋ฅธ ์•„์ด๋””๋ฅผ ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("update") - public ResponseEntity> update(@RequestBody ConcatRowSaveRequestDto concatRowSaveRequestDto, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), concatRowSaveRequestDto.getConcatTabId()); + public ResponseEntity> update( + @RequestBody ConcatRowSaveRequestDto concatRowSaveRequestDto, + @AuthenticationPrincipal CustomUserDetails customUserDetails) { + projectService.checkProject( + customUserDetails.getMember().getSeq(), concatRowSaveRequestDto.getConcatTabId()); - return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.updateConcatRows(concatRowSaveRequestDto)) + return new ResponseDto<>( + HttpStatus.OK.value(), concatRowService.updateConcatRows(concatRowSaveRequestDto)) .toResponseEntity(); } - @Operation( - summary = "ํ–‰ ํ…์ŠคํŠธ ์—…๋กœ๋“œ", - description = "ํ–‰์— ํ…์ŠคํŠธ๋ฅผ ์—…๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „๊ณผ ๊ฐ™์€ ์•„์ด๋””๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." - ) + @Operation(summary = "ํ–‰ ํ…์ŠคํŠธ ์—…๋กœ๋“œ", description = "ํ–‰์— ํ…์ŠคํŠธ๋ฅผ ์—…๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „๊ณผ ๊ฐ™์€ ์•„์ด๋””๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("upload/text") public ResponseEntity> uploadText( @AuthenticationPrincipal CustomUserDetails customUserDetails, @RequestBody ConcatRowSaveRequestDto concatRowSaveRequestDto) { - boolean uploadText = concatRowService.uploadText(concatRowSaveRequestDto.getConcatRowRequests()); + + // ์„œ๋น„์Šค ํ˜ธ์ถœ + boolean uploadText = concatRowService.uploadText(concatRowSaveRequestDto); + + // ๊ฒฐ๊ณผ ์‘๋‹ต ์ƒ์„ฑ if (uploadText) { return new ResponseDto<>(HttpStatus.OK.value(), uploadText).toResponseEntity(); + } else { + return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), uploadText).toResponseEntity(); } - return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), uploadText).toResponseEntity(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java index f0951ae7..c2ff5b4d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java @@ -4,108 +4,96 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.*; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.dto.response.TabRowResponseDto; -import com.oreo.finalproject_5re5_be.concat.service.AudioFileService; -import com.oreo.finalproject_5re5_be.concat.service.ConcatRowService; -import com.oreo.finalproject_5re5_be.concat.service.ConcatTabService; +import com.oreo.finalproject_5re5_be.concat.service.*; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.util.List; - @Tag(name = "Concat", description = "Concat ๊ด€๋ จ API") - @RestController @RequiredArgsConstructor @RequestMapping("api/v2/concat") public class ConcatRowTabController { - private final ConcatRowService concatRowService; private final ConcatTabService concatTabService; private final AudioFileService audioFileService; + private final ConcatRowTabService concatRowTabService; - //ํƒญ ๋กœ์šฐ ์กฐํšŒ - //ํƒญ ๋กœ์šฐ ์ €์žฅ + // ํƒญ ๋กœ์šฐ ์กฐํšŒ + // ํƒญ ๋กœ์šฐ ์ €์žฅ - @Operation( - summary = "ConcatRow, ConcatTab์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.", - description = "" - ) + @Operation(summary = "ConcatRow, ConcatTab์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("save") public ResponseEntity> saveRowAndTab( @RequestBody TabRowUpdateRequestDto dto, @AuthenticationPrincipal CustomUserDetails customUserDetails) { - ConcatRowSaveRequestDto concatRows = dto.getConcatRows(); - ConcatUpdateRequestDto concatTabs = dto.getConcatTab(); - boolean updateConcatTab = concatTabService.updateConcatTab(concatTabs, customUserDetails.getMember().getSeq()); - boolean updateConcatRows = concatRowService.updateConcatRows(concatRows); - return new ResponseDto<>(HttpStatus.OK.value(), updateConcatTab && updateConcatRows).toResponseEntity(); - + try { + boolean result = + concatRowTabService.saveTabAndRows(dto, customUserDetails.getMember().getSeq()); + return new ResponseDto<>(HttpStatus.OK.value(), result).toResponseEntity(); + } catch (Exception e) { + e.printStackTrace(); + return new ResponseDto<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), false).toResponseEntity(); + } } -// @Operation( -// summary = "ConcatRow, ConcatTab์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.", -// description = "" -// ) -// @PostMapping("save") -// public ResponseEntity> saveRowAndTab( -// @RequestBody TabRowUpdateRequestDto dto, -// @AuthenticationPrincipal CustomUserDetails customUserDetails) { -// ConcatUpdateRequestDto concatUpdateRequestDto = dto.getConcatTab(); -// Long memberSeq = customUserDetails.getMember().getSeq(); -// List rowAudioFiles = dto.getAudioFiles(); -// boolean updateTab = false; -// boolean updateRow = false; -// if (concatUpdateRequestDto != null) { -// updateTab = concatTabService.updateConcatTab(concatUpdateRequestDto, -// memberSeq); -// updateRow = concatRowService.updateConcatRows(rowAudioFiles, concatUpdateRequestDto.getTabId()); -// } -// -// return new ResponseDto<>(HttpStatus.OK.value(), updateTab && updateRow).toResponseEntity(); -// } -// - - @Operation( - summary = "ConcatRow, ConcatTab์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.", - description = "" - ) + @Operation(summary = "ConcatRow, ConcatTab์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.") @GetMapping("read") public ResponseEntity> readRowAndTab( - @RequestParam Long projectSeq, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { - ConcatTabResponseDto concatTabResponseDto - = concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq()); - - List audioFiles = audioFileService.getAudioFilesByProjectAndStatusTrue(projectSeq); - - - List concatRowRequests = audioFiles.stream().map(x -> ConcatRowRequest.builder() - .originAudioRequest(OriginAudioRequest.builder() - .seq(x.getAudioFileSeq()) - .audioUrl(x.getAudioUrl()) - .fileName(x.getFileName()) - .fileSize(x.getFileSize()) - .fileLength(x.getFileLength()) - .extension(x.getExtension()).build() - ) - .rowText(x.getConcatRow().getRowText()) - .rowIndex(x.getConcatRow().getRowIndex()) - .rowSilence(x.getConcatRow().getSilence()) - .status(x.getConcatRow().getStatus()) - .seq(x.getConcatRow().getConcatRowSequence()) - .build()).toList(); - - - return new ResponseDto<>(HttpStatus.OK.value(), new TabRowResponseDto(concatTabResponseDto, - new ConcatRowSaveRequestDto(concatTabResponseDto.getTabId(), concatRowRequests))) + @RequestParam Long projectSeq, @AuthenticationPrincipal CustomUserDetails customUserDetails) { + + // Tab setting + ConcatTabResponseDto concatTabResponseDto = + concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq()); + + // ConcatTabResponseDto์— bgmFileList ์ถ”๊ฐ€ + concatTabResponseDto = + ConcatTabResponseDto.builder() + .tabId(concatTabResponseDto.getTabId()) + .frontSilence(concatTabResponseDto.getFrontSilence()) + .status(concatTabResponseDto.getStatus()) + .bgmFileList(concatTabResponseDto.getBgmFileList()) // BgmFile ๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€ + .build(); + + // Row setting + // ConcatRow์™€ AudioFile ๋ฆฌ์ŠคํŠธ ์กฐํšŒ + List audioFiles = + audioFileService.getAudioFilesByProjectAndStatusTrue(projectSeq); + + List concatRowRequests = + audioFiles.stream() + .map( + x -> + ConcatRowRequest.builder() + .originAudioRequest( + OriginAudioRequest.builder() + .seq(x.getAudioFileSeq()) + .audioUrl(x.getAudioUrl()) + .fileName(x.getFileName()) + .fileSize(x.getFileSize()) + .fileLength(x.getFileLength()) + .extension(x.getExtension()) + .build()) + .rowText(x.getConcatRow().getRowText()) + .selected(x.getConcatRow().getSelected()) + .rowIndex(x.getConcatRow().getRowIndex()) + .rowSilence(x.getConcatRow().getSilence()) + .status(x.getConcatRow().getStatus()) + .seq(x.getConcatRow().getConcatRowSequence()) + .build()) + .toList(); + + return new ResponseDto<>( + HttpStatus.OK.value(), + new TabRowResponseDto( + concatTabResponseDto, + new ConcatRowSaveRequestDto(concatTabResponseDto.getTabId(), concatRowRequests))) .toResponseEntity(); } } - - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java index 9ae9699d..65bfdccd 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java @@ -10,14 +10,13 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.util.List; - @Tag(name = "Concat", description = "Concat ๊ด€๋ จ API") @RestController @RequiredArgsConstructor @@ -27,57 +26,57 @@ public class ConcatTabController { private final ConcatTabService concatTabService; private final ProjectService projectService; - @Operation( - summary = "ํ”„๋กœ์ ํŠธ์˜ Concat ํƒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.", - description = "์ƒ์„ฑ์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." - ) + @Operation(summary = "ํ”„๋กœ์ ํŠธ์˜ Concat ํƒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.", description = "์ƒ์„ฑ์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("create") - public ResponseEntity> create(@RequestBody ConcatCreateRequestDto createRequestDto) { - projectService.projectCheck(createRequestDto.getMemberSequence(), createRequestDto.getProjectSequence()); - //์‚ฌ์šฉ์ž ์˜ˆ์™ธ์ฒ˜๋ฆฌ - return new ResponseDto<>(HttpStatus.OK.value(), concatTabService.createConcatTab(createRequestDto)) + public ResponseEntity> create( + @AuthenticationPrincipal CustomUserDetails customUserDetails, @RequestParam Long projectSeq) { + projectService.checkProject(customUserDetails.getMember().getSeq(), projectSeq); + // ์‚ฌ์šฉ์ž ์˜ˆ์™ธ์ฒ˜๋ฆฌ + return new ResponseDto<>( + HttpStatus.OK.value(), + concatTabService.createConcatTab( + new ConcatCreateRequestDto(projectSeq, customUserDetails.getMember().getSeq()))) .toResponseEntity(); } - @Operation( - summary = "ํƒญ ์กฐํšŒ", - description = "ํ”„๋กœ์ ํŠธ์˜ Concat ํƒญ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ํƒญ์— ์ €์žฅ๋œ ํ–‰ ์ •๋ณด๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค." - ) + @Operation(summary = "ํƒญ ์กฐํšŒ", description = "ํ”„๋กœ์ ํŠธ์˜ Concat ํƒญ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ํƒญ์— ์ €์žฅ๋œ ํ–‰ ์ •๋ณด๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.") @GetMapping("read") public ResponseEntity> read( - @RequestParam Long projectSeq, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), projectSeq); - //์‚ฌ์šฉ์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - return new ResponseDto<>(HttpStatus.OK.value(), - concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq())) + @RequestParam Long projectSeq, @AuthenticationPrincipal CustomUserDetails customUserDetails) { + projectService.checkProject(customUserDetails.getMember().getSeq(), projectSeq); + // ์‚ฌ์šฉ์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + return new ResponseDto<>( + HttpStatus.OK.value(), + concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq())) .toResponseEntity(); } - @Operation( - summary = "ํƒญ ์—…๋ฐ์ดํŠธ", - description = "ํ–‰ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." - ) + @Operation(summary = "ํƒญ ์—…๋ฐ์ดํŠธ", description = "ํ–‰ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("update") - public ResponseEntity> update(@RequestBody ConcatUpdateRequestDto updateRequestDto, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), updateRequestDto.getTabId()); - return new ResponseDto<>(HttpStatus.OK.value(), - concatTabService.updateConcatTab(updateRequestDto, customUserDetails.getMember().getSeq())) + public ResponseEntity> update( + @RequestBody ConcatUpdateRequestDto updateRequestDto, + @AuthenticationPrincipal CustomUserDetails customUserDetails) { + projectService.checkProject( + customUserDetails.getMember().getSeq(), updateRequestDto.getTabId()); + return new ResponseDto<>( + HttpStatus.OK.value(), + concatTabService.updateConcatTab( + updateRequestDto, customUserDetails.getMember().getSeq())) .toResponseEntity(); } @Operation( summary = "BGM ์˜ค๋””์˜ค ํŒŒ์ผ ์—…๋ฐ์ดํŠธ", - description = "BGM ์˜ค๋””์˜ค ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. BgmFile ID ๋ชฉ๋ก์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค." - ) + description = "BGM ์˜ค๋””์˜ค ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. BgmFile ID ๋ชฉ๋ก์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.") @PostMapping("update-bgm") public ResponseEntity> updateBgm( @RequestParam Long tabSeq, - @RequestBody(required = false) @Schema(description = "BgmFile ID ๋ชฉ๋ก", example = "[101, 102, 103]") List bgmAudioFileSeqs, + @RequestBody(required = false) + @Schema(description = "BgmFile ID ๋ชฉ๋ก", example = "[101, 102, 103]") + List bgmAudioFileSeqs, @AuthenticationPrincipal CustomUserDetails customUserDetails) { // ํ”„๋กœ์ ํŠธ ๊ถŒํ•œ ํ™•์ธ - projectService.projectCheck(customUserDetails.getMember().getSeq(), tabSeq); + projectService.checkProject(customUserDetails.getMember().getSeq(), tabSeq); // BGM ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ boolean result = concatTabService.updateBgmAudioFiles(tabSeq, bgmAudioFileSeqs); @@ -85,6 +84,4 @@ public ResponseEntity> updateBgm( // ์‘๋‹ต ๋ฐ˜ํ™˜ return new ResponseDto<>(HttpStatus.OK.value(), result).toResponseEntity(); } - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java index f208eee4..0996ba7d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java @@ -1,21 +1,15 @@ package com.oreo.finalproject_5re5_be.concat.controller; import com.oreo.finalproject_5re5_be.concat.dto.ConcatResponseDto; -import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; -import com.oreo.finalproject_5re5_be.concat.dto.request.SelectedConcatRowRequest; +import com.oreo.finalproject_5re5_be.concat.dto.request.*; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatUrlResponse; import com.oreo.finalproject_5re5_be.concat.entity.AudioFile; -import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; -import com.oreo.finalproject_5re5_be.concat.service.AudioFileService; -import com.oreo.finalproject_5re5_be.concat.service.AudioStreamService; -import com.oreo.finalproject_5re5_be.concat.service.ConcatResultService; -import com.oreo.finalproject_5re5_be.concat.service.MaterialAudioService; +import com.oreo.finalproject_5re5_be.concat.service.*; import com.oreo.finalproject_5re5_be.concat.service.bgm.BgmProcessor; import com.oreo.finalproject_5re5_be.concat.service.concatenator.AudioProperties; import com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator; import com.oreo.finalproject_5re5_be.concat.service.concatenator.StereoIntervalConcatenator; import com.oreo.finalproject_5re5_be.global.component.S3Service; -import com.oreo.finalproject_5re5_be.global.component.SqsService; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; @@ -27,21 +21,21 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import java.io.ByteArrayOutputStream; -import java.util.ArrayList; -import java.util.List; - - @Tag(name = "Concat", description = "Concat ๊ด€๋ จ API") @RestController +@Log4j2 @RequestMapping("/api/concat") @RequiredArgsConstructor public class ConcatWithBgmController { @@ -49,118 +43,132 @@ public class ConcatWithBgmController { private final S3Service s3Service; private final MaterialAudioService materialAudioService; private final ConcatResultService concatResultService; - private final SqsService sqsService; private final AudioFileService audioFileService; private final AudioStreamService audioStreamService; // ์ถ”๊ฐ€๋œ ์„œ๋น„์Šค private final AudioResample audioResample = new AudioResample(); // ๋ฆฌ์ƒ˜ํ”Œ๋ง ์œ ํ‹ธ. Bean์ด ์•„๋‹ˆ๋ผ new๋กœ ์ƒ์„ฑ - private final AudioFormat defaultAudioFormat = AudioFormats.STEREO_FORMAT_SR441_B32; // ๊ธฐ๋ณธ ํฌ๋งท + private final AudioFormat defaultAudioFormat = AudioFormats.STEREO_FORMAT_SR441_B16; // ๊ธฐ๋ณธ ํฌ๋งท private final ProjectService projectService; - private final BgmFileRepository bgmFileRepository; + private final BgmFileService bgmFileService; @Operation( summary = "Row ์˜ค๋””์˜ค์™€ BGM ํŒŒ์ผ ๋ณ‘ํ•ฉ", description = "์„ ํƒ๋œ Row ์˜ค๋””์˜ค ํŒŒ์ผ๊ณผ BGM ํŒŒ์ผ์„ ๋ณ‘ํ•ฉํ•˜์—ฌ S3์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.", responses = { - @ApiResponse( - responseCode = "200", - description = "์„ฑ๊ณต์ ์œผ๋กœ ๋ณ‘ํ•ฉ๋œ ์˜ค๋””์˜ค URL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ConcatResponseDto.class) - ) - ), - @ApiResponse( - responseCode = "500", - description = "๋ณ‘ํ•ฉ ์ž‘์—… ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ResponseDto.class) - ) - ) - } - ) + @ApiResponse( + responseCode = "200", + description = "์„ฑ๊ณต์ ์œผ๋กœ ๋ณ‘ํ•ฉ๋œ ์˜ค๋””์˜ค URL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = ConcatResponseDto.class))), + @ApiResponse( + responseCode = "500", + description = "๋ณ‘ํ•ฉ ์ž‘์—… ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = ResponseDto.class))) + }) @PostMapping("/execute-with-bgm") public ResponseEntity> executeConcatWithBgm( - @Parameter(description = "๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜จ concatTab", required = true) @RequestParam Long concatTabSeq, - @Parameter(description = "bgm์œผ๋กœ ์“ธ ์˜ค๋””์˜คํŒŒ์ผ์˜ url", required = true) @RequestParam String bgmFileUrl, - @Parameter(description = "์ €์žฅํ•  ๊ฒฐ๊ณผํŒŒ์ผ ์ด๋ฆ„", required = true) @RequestParam String concatResultFileName, -// @RequestBody BgmFunctionRequestDto bgmFunctionRequestDto, - @RequestBody SelectedConcatRowRequest selectedRows, + @Parameter(description = "์ €์žฅํ•  ๊ฒฐ๊ณผํŒŒ์ผ ์ด๋ฆ„", required = true) @RequestParam + String concatResultFileName, + @RequestBody TabRowUpdateRequestDto requestDto, @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), concatTabSeq); try { -// //SQS๋กœ ๋ฉ”์„ธ์ง€ ๋ณด๋‚ด๊ธฐ. ๊ฐ๊ฐ messageBody์™€ messageAttribute๋กœ ๋“ค์–ด๊ฐˆ ๋‚ด์šฉ -// Message message = sqsService.sendMessage(bgmFunctionRequestDto, MessageType.CONCAT_BGM_MAKE); + // Extracting data from the new DTO + ConcatUpdateRequestDto concatTab = requestDto.getConcatTab(); + ConcatRowSaveRequestDto concatRows = requestDto.getConcatRows(); + + Long concatTabSeq = concatTab.getTabId(); + float frontSilence = concatTab.getFrontSilence(); + String bgmFileUrl = concatTab.getBgmFileList().get(0).getAudioUrl(); + + log.info("concatTab:{}", concatTabSeq); - IntervalConcatenator intervalConcatenator = new StereoIntervalConcatenator(defaultAudioFormat); + projectService.checkProject( + customUserDetails.getMember().getSeq(), requestDto.getConcatTab().getTabId()); - // Concat ์ž‘์—…: 1. Row ์˜ค๋””์˜ค ํŒŒ์ผ ๋กœ๋“œ ๋ฐ ๋ฌด์Œ ์ฒ˜๋ฆฌ - List audioProperties = audioStreamService.loadAudioFiles(selectedRows); + IntervalConcatenator intervalConcatenator = + new StereoIntervalConcatenator(defaultAudioFormat); + + List audioProperties = audioStreamService.loadAudioFiles(concatRows); // 2. ๋ณ‘ํ•ฉ๋œ ์˜ค๋””์˜ค ์ƒ์„ฑ - ByteArrayOutputStream concatenatedAudioBuffer = intervalConcatenator.intervalConcatenate(audioProperties, selectedRows.getInitialSilence()); + ByteArrayOutputStream concatenatedAudioBuffer = + intervalConcatenator.intervalConcatenate(audioProperties, frontSilence); - // Bgm ์ž‘์—…: 1. ๋ณ‘ํ•ฉ๋œ ์˜ค๋””์˜ค๋ฅผ AudioInputStream์œผ๋กœ ๋ณ€ํ™˜ - AudioInputStream concatenatedAudioStream = audioStreamService.createAudioInputStream(concatenatedAudioBuffer, defaultAudioFormat); + AudioInputStream concatenatedAudioStream = + audioStreamService.createAudioInputStream(concatenatedAudioBuffer, defaultAudioFormat); - // 2. BGM ์ŠคํŠธ๋ฆผ ๋กœ๋“œ ๋ฐ ๋ฒ„ํผ๋ง - AudioInputStream bufferedBgmStream = s3Service.loadAsBufferedStream(bgmFileUrl); + // BGM ์ž‘์—… 1: BGM ์ŠคํŠธ๋ฆผ ๋กœ๋“œ ๋ฐ ๋ฒ„ํผ๋ง + AudioInputStream bufferedBgmStream = audioStreamService.loadAsBufferedStream(bgmFileUrl); // 3. BGM ๊ธธ์ด ์กฐ์ • long targetFrames = audioStreamService.getValidFrameLength(concatenatedAudioStream); long bgmFrames = audioStreamService.getValidFrameLength(bufferedBgmStream); + + // ๋กœ๊ทธ ์ถ”๊ฐ€: ํ”„๋ ˆ์ž„ ๊ธธ์ด ํ™•์ธ + bufferedBgmStream = BgmProcessor.adjustBgmLength(bufferedBgmStream, targetFrames, bgmFrames); // 4. ๋ฏน์‹ฑ - AudioInputStream mixedAudioStream = BgmProcessor.mixAudio(concatenatedAudioStream, bufferedBgmStream); + AudioInputStream mixedAudioStream = + BgmProcessor.mixAudio(concatenatedAudioStream, bufferedBgmStream); // ๊ฒฐ๊ณผํŒŒ์ผ S3 ์—…๋กœ๋“œ - String resultAudioUrl = s3Service.uploadAudioStream(mixedAudioStream, "concat/result", concatResultFileName); - -// String audioUrl = ""; -// String concatResultFileName = ""; -// AudioInputStream mixedAudioStream = null; -// SelectedConcatRowRequest selectedRows = null; - - // DB ConcatResultํ…Œ์ด๋ธ”์— ๊ฒฐ๊ณผ ์ €์žฅ - ConcatUrlResponse concatResultResponse = concatResultService.saveConcatResult(concatTabSeq, resultAudioUrl, concatResultFileName, mixedAudioStream); - // Material ๋ฐ์ดํ„ฐ ์ €์žฅ (์žฌ๋ฃŒ ํŒŒ์ผ, ๊ฒฐ๊ณผํŒŒ์ผ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ๋กœ ๊ต์ฐจํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ ์ €์žฅ) - materialAudioService.saveMaterialsForSelectedRows(selectedRows, concatResultResponse); - - // Concat ์žฌ๋ฃŒ ํŒŒ์ผ ์ •๋ณด ์ƒ์„ฑ - List concatRowFiles = selectedRows.getRows().stream() - .map(row -> audioFileService.getAudioFileByUrl(row.getAudioUrl())) - .map(this::convertToOriginAudioRequest) - .toList(); - - // BGM ํŒŒ์ผ ์ •๋ณด ์ƒ์„ฑ - AudioFile bgmAudioFile = audioFileService.getAudioFileByUrl(bgmFileUrl); // URL๋กœ AudioFile ์กฐํšŒ - OriginAudioRequest bgmFile = OriginAudioRequest.builder() - .seq(bgmAudioFile.getAudioFileSeq()) // AudioFile์˜ ์‹๋ณ„ ID - .audioUrl(bgmAudioFile.getAudioUrl()) // BGM ํŒŒ์ผ URL - .extension(bgmAudioFile.getExtension()) // BGM ํŒŒ์ผ ํ™•์žฅ์ž - .fileSize(bgmAudioFile.getFileSize()) // ํŒŒ์ผ ํฌ๊ธฐ - .fileLength(bgmAudioFile.getFileLength()) // ํŒŒ์ผ ๊ธธ์ด - .fileName(bgmAudioFile.getFileName()) // ํŒŒ์ผ ์ด๋ฆ„ - .build(); + String resultAudioUrl = + s3Service.uploadAudioStream(mixedAudioStream, "concat/result", concatResultFileName); + + // DB ์ €์žฅ1. ConcatResult DB + ConcatUrlResponse concatResultResponse = + concatResultService.saveConcatResult( + concatTabSeq, resultAudioUrl, concatResultFileName, mixedAudioStream); + + OriginAudioRequest bgmRequest = concatTab.getBgmFileList().get(0); + + // BGM ๋ฐ์ดํ„ฐ์™€ ConcatResult ๋งค์นญ ์—…๋ฐ์ดํŠธ + try { + bgmFileService.updateBgmFileWithConcatResult(bgmFileUrl, concatResultResponse.getSeq()); + } catch (IllegalArgumentException e) { + log.warn("[BGM] Failed to update BgmFile: {}", e.getMessage()); + } + + // DB ์ €์žฅ2. Material ๋ฐ์ดํ„ฐ ์ €์žฅ (์žฌ๋ฃŒ ํŒŒ์ผ, ๊ฒฐ๊ณผํŒŒ์ผ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ๋กœ ๊ต์ฐจํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ ์ €์žฅ) + materialAudioService.saveMaterialsForConcatRows(concatRows, concatResultResponse); + + // ์‘๋‹ต์— ๋“ค์–ด๊ฐˆ concatRowFiles ์ƒ์„ฑ + List concatRowFiles = + concatRows.getConcatRowRequests().stream() + .map( + row -> { + AudioFile audioFile = + audioFileService.getAudioFileByUrl(row.getOriginAudioRequest().getSeq()); + return audioFile; + }) + .map(this::convertToOriginAudioRequest) + .peek( + originAudioRequest -> + log.info("Converted to OriginAudioRequest: {}", originAudioRequest)) + .toList(); // ์‘๋‹ต ์ƒ์„ฑ - ConcatResponseDto responseDto = ConcatResponseDto.builder() - .audioUrl(resultAudioUrl) - .bgmFile(bgmFile) - .concatRowFiles(concatRowFiles) - .build(); + ConcatResponseDto responseDto = + ConcatResponseDto.builder() + .audioUrl(resultAudioUrl) + .bgmFile(bgmRequest) + .concatRowFiles(concatRowFiles) + .build(); return new ResponseDto<>(HttpStatus.OK.value(), responseDto).toResponseEntity(); } catch (Exception e) { - // ์‹คํŒจ ์‘๋‹ต ์ƒ์„ฑ + e.printStackTrace(); return createErrorResponse(); } } - private OriginAudioRequest convertToOriginAudioRequest(AudioFile audioFile) { return OriginAudioRequest.builder() .seq(audioFile.getAudioFileSeq()) @@ -173,12 +181,13 @@ private OriginAudioRequest convertToOriginAudioRequest(AudioFile audioFile) { } private ResponseEntity> createErrorResponse() { - return new ResponseDto<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), - ConcatResponseDto.builder() - .audioUrl(null) // ๊ฒฐ๊ณผ ํŒŒ์ผ URL ์—†์Œ - .bgmFile(null) // BGM ํŒŒ์ผ ์ •๋ณด ์—†์Œ - .concatRowFiles(new ArrayList<>()) // ConcatRow ํŒŒ์ผ ์ •๋ณด ์—†์Œ - .build() - ).toResponseEntity(); + return new ResponseDto<>( + HttpStatus.INTERNAL_SERVER_ERROR.value(), + ConcatResponseDto.builder() + .audioUrl(null) // ๊ฒฐ๊ณผ ํŒŒ์ผ URL ์—†์Œ + .bgmFile(null) // BGM ํŒŒ์ผ ์ •๋ณด ์—†์Œ + .concatRowFiles(new ArrayList<>()) // ConcatRow ํŒŒ์ผ ์ •๋ณด ์—†์Œ + .build()) + .toResponseEntity(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResponseDto.java index f0004909..0c677328 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResponseDto.java @@ -1,9 +1,8 @@ package com.oreo.finalproject_5re5_be.concat.dto; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; -import lombok.*; - import java.util.List; +import lombok.*; @Getter @Setter @@ -14,4 +13,4 @@ public class ConcatResponseDto { private String audioUrl; // ๊ฒฐ๊ณผ ํŒŒ์ผ URL private OriginAudioRequest bgmFile; // BGM ์˜ค๋””์˜ค ํŒŒ์ผ ์ •๋ณด private List concatRowFiles; // ConcatRow์—์„œ ์‚ฌ์šฉ๋œ ํŒŒ์ผ ์ •๋ณด ๋ฆฌ์ŠคํŠธ -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java index 56a9fbce..5be5b806 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java @@ -9,8 +9,10 @@ public class ConcatResultDto { private Long concatResultSequence; private Long fileSize; private Float fileLength; + private Integer seperated; private String audioUrl; private String fileName; private String extension; + private String processId; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowDto.java index 44cc2a7e..d14d9d34 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowDto.java @@ -17,7 +17,6 @@ public class ConcatRowDto { private Float silence; private Integer rowIndex; - // concatRow ์—”ํ‹ฐํ‹ฐ ์ •๋ณด๋กœ ConcatRowDto ๊ฐ์ฒด ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ public static ConcatRowDto of(ConcatRow concatRow) { return ConcatRowDto.builder() diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowListDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowListDto.java index 24412d58..46742651 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowListDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowListDto.java @@ -1,12 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.dto; import com.oreo.finalproject_5re5_be.concat.entity.ConcatRow; +import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.util.List; - @Getter @Builder @ToString @@ -20,8 +19,6 @@ public static ConcatRowListDto of(List concatRowEntityList) { concatRowEntityList.stream().map(ConcatRowDto::of).toList(); // ConcatRowDto ๋ฆฌ์ŠคํŠธ๋ฅผ ๋„ฃ์œผ๋ฉฐ ConcatRowListDto ์ƒ์„ฑ - return ConcatRowListDto.builder() - .rowList(concatRowDtoLList) - .build(); + return ConcatRowListDto.builder().rowList(concatRowDtoLList).build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/RowAudioFileDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/RowAudioFileDto.java index 6fed9882..2db4615c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/RowAudioFileDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/RowAudioFileDto.java @@ -1,23 +1,23 @@ package com.oreo.finalproject_5re5_be.concat.dto; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.time.LocalDateTime; @ToString @Builder @AllArgsConstructor @Getter public class RowAudioFileDto { - private Long audioFileSeq; - private String audioUrl; - private String extension; - private Long fileSize; - private Long fileLength; - private String fileName; - private LocalDateTime createdDate; + private Long audioFileSeq; + private String audioUrl; + private String extension; + private Long fileSize; + private Long fileLength; + private String fileName; + private LocalDateTime createdDate; - private ConcatRowDto concatRow; -} \ No newline at end of file + private ConcatRowDto concatRow; +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java new file mode 100644 index 00000000..67fb8de7 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java @@ -0,0 +1,45 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda; + +import javax.sound.sampled.AudioFormat; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AudioFormatDto { + private Float sampleRate; + private Integer bitDepth; + private Integer channels; + private Integer frameSize; + private Float frameRate; + + public AudioFormatDto() {} + + public AudioFormatDto(AudioFormat audioFormat) { + this.sampleRate = audioFormat.getSampleRate(); + this.bitDepth = audioFormat.getSampleSizeInBits(); + this.channels = audioFormat.getChannels(); + this.frameSize = audioFormat.getFrameSize(); + this.frameRate = audioFormat.getFrameRate(); + } + + public AudioFormatDto( + Float sampleRate, Integer bitDepth, Integer channels, Integer frameSize, Float frameRate) { + this.sampleRate = sampleRate; + this.bitDepth = bitDepth; + this.channels = channels; + this.frameSize = frameSize; + this.frameRate = frameRate; + } + + public AudioFormat toAudioFormat() { + return new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + sampleRate, + bitDepth, + channels, + frameSize, + frameRate, + false); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java new file mode 100644 index 00000000..9bbae75f --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java @@ -0,0 +1,59 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda; + +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequest; +import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; +import java.util.List; +import lombok.Builder; + +@Builder +public class LambdaConcatRequest { + private ConcatTabResponseDto concatTabResponseDto; + private AudioFormatDto audioFormatDto; + private List audios; + private String fileName; + + public LambdaConcatRequest() {} + + public LambdaConcatRequest( + ConcatTabResponseDto concatTabResponseDto, + AudioFormatDto audioFormatDto, + List audios, + String fileName) { + this.concatTabResponseDto = concatTabResponseDto; + this.audioFormatDto = audioFormatDto; + this.audios = audios; + this.fileName = fileName; + } + + public List getAudios() { + return audios; + } + + public void setAudios(List audios) { + this.audios = audios; + } + + public AudioFormatDto getAudioFormatDto() { + return audioFormatDto; + } + + public void setAudioFormatDto(AudioFormatDto audioFormatDto) { + this.audioFormatDto = audioFormatDto; + } + + public ConcatTabResponseDto getConcatTabResponseDto() { + return concatTabResponseDto; + } + + public void setConcatTabResponseDto(ConcatTabResponseDto concatTabResponseDto) { + this.concatTabResponseDto = concatTabResponseDto; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java new file mode 100644 index 00000000..334199e5 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java @@ -0,0 +1,45 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda.response; + +import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import javax.sound.sampled.AudioInputStream; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class AudioInfo { + private byte[] audioData; + private String fileName; + private float contentLength; + private String contentType; + + public AudioInfo( + AudioInputStream audioData, String fileName, float contentLength, String contentType) { + this.audioData = AudioExtensionConverter.mp3ToWav(audioData); + this.fileName = fileName; + this.contentLength = contentLength; + this.contentType = contentType; + } + + private byte[] getAudioBytes(AudioInputStream audioStream) { + + try { + return audioStream.readAllBytes(); + } catch (IOException e) { + throw new RuntimeException("์˜ค๋””์˜ค ๋ณ€ํ™˜ ์‹คํŒจ", e); + } + } + + public Long getContentSize() { + return (long) audioData.length; + } + + public InputStream toInputStream() { + return new ByteArrayInputStream(audioData); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java new file mode 100644 index 00000000..d4748e85 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java @@ -0,0 +1,54 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda.response; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LambdaConcatResultDto { + private final AudioInfo info; + private final List processed; + private final String s3Url; + private final String contentType; + private final String processId; + private final int i; + + @JsonCreator + public LambdaConcatResultDto( + @JsonProperty("info") AudioInfo info, + @JsonProperty("processed") List processed, + @JsonProperty("s3Url") String s3Url, + @JsonProperty("contentType") String contentType, + @JsonProperty("processId") String processId, + @JsonProperty("i") int i) { + this.info = info; + this.processed = processed; + this.s3Url = s3Url; + this.contentType = contentType; + this.processId = processId; + this.i = i; + } + + @Override + public String toString() { + return "LambdaConcatResultDto{" + + ", processed=" + + processed + + ", s3Url='" + + s3Url + + '\'' + + ", contentType='" + + contentType + + '\'' + + ", processId='" + + processId + + '\'' + + ", i=" + + i + + '}'; + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileDto.java index 7ad0c8c6..e5ff6141 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileDto.java @@ -1,12 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.time.LocalDateTime; - @ToString @Builder @AllArgsConstructor diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileRequestDto.java index 47635c5e..e6459edb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileRequestDto.java @@ -16,5 +16,4 @@ public AudioFileRequestDto(String fileName) { this.fileName = fileName; this.audioFile = null; } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFormatRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFormatRequest.java index 8393cdaf..4e9f354c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFormatRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFormatRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; - import lombok.*; @Getter @@ -18,5 +17,4 @@ public class AudioFormatRequest { private Integer frameSize; private Short frameRate; private Character isBigEndian; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/BgmFunctionRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/BgmFunctionRequestDto.java index 771e1353..eb850917 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/BgmFunctionRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/BgmFunctionRequestDto.java @@ -1,9 +1,7 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; - -import lombok.*; - import java.util.List; +import lombok.*; @Getter @Setter @@ -19,7 +17,7 @@ public class BgmFunctionRequestDto { private String bgmFileUrl; // ๊ฒฐ๊ณผ ํŒŒ์ผ S3์— ์ €์žฅ์— ํ•„์š”ํ•œ ์ •๋ณด private String concatResultFileName; - + @Getter @Setter @Builder @@ -29,5 +27,4 @@ public static class Row { private String audioUrl; // S3 URL ๋˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ private float silenceInterval; // ํ•ด๋‹น ํ–‰ ๋’ค์— ์‚ฝ์ž…๋  ๋ฌด์Œ ๊ฐ„๊ฒฉ } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatResultRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatResultRequest.java index eaf1eb60..02910b06 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatResultRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatResultRequest.java @@ -2,9 +2,8 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import lombok.*; - import java.time.LocalDateTime; +import lombok.*; @Getter @Setter @@ -38,5 +37,4 @@ public class ConcatResultRequest { @NotNull(message = "createdDateTime ํ•„๋“œ๋Š” null ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") private LocalDateTime CreatedDateTime; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequest.java index 904591bd..78f58b3d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequest.java @@ -12,11 +12,11 @@ @ToString @NoArgsConstructor @AllArgsConstructor -public class ConcatRowRequest { //ํ™”๋ฉด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด SelectedConcatRowRequest์™€ ๋‹ฌ๋ฆฌ selected์—ฌ๋ถ€๋„ ์ €์žฅํ•ด์•ผํ•จ +public class ConcatRowRequest { // ํ™”๋ฉด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด SelectedConcatRowRequest์™€ ๋‹ฌ๋ฆฌ selected์—ฌ๋ถ€๋„ ์ €์žฅํ•ด์•ผํ•จ private Long seq; @NotNull(message = "originAudioRequest ํ•„๋“œ๋Š” null ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") - private OriginAudioRequest originAudioRequest; //ํ–‰๋งˆ๋‹ค ๋งค์นญ๋˜๋Š” ์›๋ณธ ์˜ค๋””์˜คํŒŒ์ผ + private OriginAudioRequest originAudioRequest; // ํ–‰๋งˆ๋‹ค ๋งค์นญ๋˜๋Š” ์›๋ณธ ์˜ค๋””์˜คํŒŒ์ผ @Size(max = 255, message = "rowText ํ•„๋“œ๋Š” ์ตœ๋Œ€ 255์ž๊นŒ์ง€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.") private String rowText; @@ -31,7 +31,7 @@ public class ConcatRowRequest { //ํ™”๋ฉด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด SelectedConcatRo @Positive(message = "rowIndex ํ•„๋“œ๋Š” ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.") @NotNull(message = "rowIndex ํ•„๋“œ๋Š” null ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") - private Integer rowIndex; //ํ–‰ ์ˆœ์„œ + private Integer rowIndex; // ํ–‰ ์ˆœ์„œ private Character status; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java index 82d6ce47..6f71cd4c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java @@ -1,22 +1,16 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; import jakarta.validation.constraints.NotNull; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; -import java.util.List; - @ToString @Getter @AllArgsConstructor public class ConcatRowRequestDto { - @NotNull - private Long concatTabId; - @NotNull - private Long memberSeq; - @NotNull - private String fileName; - @NotNull - private List concatRowRequests; + @NotNull private Long concatTabId; + @NotNull private String fileName; + @NotNull private List concatRowRequests; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowSaveRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowSaveRequestDto.java index b59c25aa..c1f5f21c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowSaveRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowSaveRequestDto.java @@ -1,11 +1,10 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; -import java.util.List; - @ToString @Getter @AllArgsConstructor diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatTabRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatTabRequest.java index 5b5daa22..90c6d773 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatTabRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatTabRequest.java @@ -2,7 +2,6 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.PositiveOrZero; - import java.util.List; public class ConcatTabRequest { @@ -15,5 +14,5 @@ public class ConcatTabRequest { @NotNull(message = "frontSilence ํ•„๋“œ๋Š” null ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") private Float frontSilence; - private String BgmFileUrl; //์—†์„ ์ˆ˜๋„ ์žˆ์Œ + private String BgmFileUrl; // ์—†์„ ์ˆ˜๋„ ์žˆ์Œ } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatUpdateRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatUpdateRequestDto.java index 6a7634cd..5650129e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatUpdateRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatUpdateRequestDto.java @@ -1,12 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.util.List; - @ToString @AllArgsConstructor @Builder @@ -16,5 +15,4 @@ public class ConcatUpdateRequestDto { private final float frontSilence; private final Character status; private final List bgmFileList; // BgmFile ์ •๋ณด ๋ฆฌ์ŠคํŠธ - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/OriginAudioRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/OriginAudioRequest.java index 5f957e4b..21afe563 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/OriginAudioRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/OriginAudioRequest.java @@ -10,7 +10,7 @@ @ToString @NoArgsConstructor @AllArgsConstructor -public class OriginAudioRequest { //์ˆœ์ˆ˜ํ•œ ์˜ค๋””์˜ค ํŒŒ์ผ +public class OriginAudioRequest { // ์ˆœ์ˆ˜ํ•œ ์˜ค๋””์˜ค ํŒŒ์ผ private Long seq; @Size(max = 1024, message = "fileUrl ํ•„๋“œ๋Š” ์ตœ๋Œ€ 1024์ž๊นŒ์ง€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.") diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/SelectedConcatRowRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/SelectedConcatRowRequest.java index 6513ee3f..6dcfb734 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/SelectedConcatRowRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/SelectedConcatRowRequest.java @@ -1,8 +1,7 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; -import lombok.*; - import java.util.List; +import lombok.*; @Getter @Setter @@ -23,5 +22,4 @@ public static class Row { private String audioUrl; // S3 URL ๋˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ private float silenceInterval; // ํ•ด๋‹น ํ–‰ ๋’ค์— ์‚ฝ์ž…๋  ๋ฌด์Œ ๊ฐ„๊ฒฉ } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultDetailsResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultDetailsResponse.java index 0934c6dd..4179a780 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultDetailsResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultDetailsResponse.java @@ -9,14 +9,14 @@ @Builder public class ConcatResultDetailsResponse { - private Long concatTabSeq; //๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ seq๋ฅผ ๋ฐ˜ํ™˜ - private Long concatOptionSeq; //๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ seq๋ฅผ ๋ฐ˜ํ™˜ + private Long concatTabSeq; // ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ seq๋ฅผ ๋ฐ˜ํ™˜ + private Long concatOptionSeq; // ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ seq๋ฅผ ๋ฐ˜ํ™˜ private String audioUrl; private String extension; private Float fileLength; private String fileName; - //format ๊ด€๋ จ ํ•„๋“œ + // format ๊ด€๋ จ ํ•„๋“œ private String encoding; private Float sampleRate; private Integer sampleSizeBit; @@ -24,6 +24,4 @@ public class ConcatResultDetailsResponse { private Integer frameSize; private Float frameRate; private Character isBigEndian; - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultResponse.java index 8c676300..347c4bbf 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultResponse.java @@ -1,11 +1,10 @@ package com.oreo.finalproject_5re5_be.concat.dto.response; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import java.util.List; import lombok.Builder; import lombok.Getter; -import java.util.List; - @Builder @Getter public class ConcatResultResponse { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatRowTabResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatRowTabResponseDto.java index 2360fc08..13efb3c9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatRowTabResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatRowTabResponseDto.java @@ -1,15 +1,13 @@ package com.oreo.finalproject_5re5_be.concat.dto.response; import com.oreo.finalproject_5re5_be.concat.dto.RowAudioFileDto; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.List; - @Getter @AllArgsConstructor public class ConcatRowTabResponseDto { private ConcatTabResponseDto concatTab; private List audioFiles; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatTabResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatTabResponseDto.java index d5897c3c..3dfcd5ea 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatTabResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatTabResponseDto.java @@ -1,13 +1,12 @@ package com.oreo.finalproject_5re5_be.concat.dto.response; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.util.List; - @ToString @Getter @Builder diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatUrlResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatUrlResponse.java index 0f8263b9..1926da9d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatUrlResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatUrlResponse.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.concat.dto.response; - import lombok.*; @Getter @@ -10,7 +9,7 @@ @NoArgsConstructor @AllArgsConstructor public class ConcatUrlResponse { - //์กฐํšŒ, ์ €์žฅ ํ›„ ์ถœ๋ ฅํ•  SEQ์™€ URL + // ์กฐํšŒ, ์ €์žฅ ํ›„ ์ถœ๋ ฅํ•  SEQ์™€ URL private Long seq; private String url; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/TabRowResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/TabRowResponseDto.java index f26dbeaf..a5fe8d99 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/TabRowResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/TabRowResponseDto.java @@ -5,7 +5,6 @@ import lombok.Getter; import lombok.ToString; - @Getter @AllArgsConstructor @ToString diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/AudioFile.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/AudioFile.java index 7d883a47..6fc6b997 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/AudioFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/AudioFile.java @@ -1,13 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.*; import org.springframework.data.annotation.CreatedDate; -import java.time.LocalDateTime; - @ToString @Getter @Builder @@ -21,8 +19,8 @@ public class AudioFile extends BaseEntity { @SequenceGenerator( name = "audio_file_seq_generator", sequenceName = "audio_file_seq", // ์‹ค์ œ ์‹œํ€€์Šค ์ด๋ฆ„ - allocationSize = 1 // ID๋ฅผ ํ•˜๋‚˜์”ฉ ํ• ๋‹น - ) + allocationSize = 1 // ID๋ฅผ ํ•˜๋‚˜์”ฉ ํ• ๋‹น + ) @Column(name = "audio_file_seq") private Long audioFileSeq; @@ -30,17 +28,13 @@ public class AudioFile extends BaseEntity { @JoinColumn(name = "concat_row_seq") private ConcatRow concatRow; - - private String audioUrl; private String extension; private Long fileSize; private Long fileLength; private String fileName; + @CreatedDate @Column(updatable = false, name = "created_date") private LocalDateTime createdDate; - - } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java index 01964ad5..f2c158e7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java @@ -1,14 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.*; import org.springframework.data.annotation.CreatedDate; -import java.time.LocalDateTime; - -@ToString @Getter @Builder @AllArgsConstructor @@ -21,10 +18,13 @@ public class BgmFile extends BaseEntity { @Column(name = "bgm_file_seq") private Long bgmFileSeq; + @ToString.Exclude @ManyToOne @JoinColumn(name = "concat_tab_seq") // ์™ธ๋ž˜ ํ‚ค: concat_tab์˜ ID private ConcatTab concatTab; + @Setter + @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "concat_result_seq", nullable = true) private ConcatResult concatResult; @@ -34,10 +34,8 @@ public class BgmFile extends BaseEntity { private Long fileSize; private Long fileLength; private String fileName; + @CreatedDate @Column(updatable = false, name = "created_date") private LocalDateTime createdDate; - - } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java index d34d8d5c..329f165a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java @@ -2,10 +2,9 @@ import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; -import lombok.*; - import java.util.ArrayList; import java.util.List; +import lombok.*; @ToString @Getter @@ -24,6 +23,7 @@ public class ConcatResult extends BaseEntity { @JoinColumn(name = "pro_seq") private ConcatTab concatTab; + @ToString.Exclude @OneToMany(mappedBy = "concatResult", cascade = CascadeType.ALL, orphanRemoval = true) private List bgmFiles = new ArrayList<>(); @@ -42,4 +42,23 @@ public class ConcatResult extends BaseEntity { @Column(name = "file_size") private Long fileSize; + @Column(name = "process_id") + private String processId; + + @Column private Integer seperated; + + public void addBgmFile(BgmFile bgmFile) { + this.bgmFiles.add( + BgmFile.builder() + .concatResult(this) + .audioUrl(bgmFile.getAudioUrl()) + .fileName(bgmFile.getFileName()) + .fileLength(bgmFile.getFileLength()) + .extension(bgmFile.getExtension()) + .build()); + } + + public void addBgmFiles(List bgmFiles) { + bgmFiles.forEach(this::addBgmFile); + } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java index 4294bf39..a8950287 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java @@ -4,7 +4,6 @@ import jakarta.persistence.*; import lombok.*; -@ToString @Getter @Builder @AllArgsConstructor @@ -18,26 +17,27 @@ public class ConcatRow extends BaseEntity { @SequenceGenerator( name = "concat_row_seq_generator", sequenceName = "concat_row_seq", // ์‹ค์ œ ์‹œํ€€์Šค ์ด๋ฆ„ - allocationSize = 1 // ID๋ฅผ ํ•˜๋‚˜์”ฉ ํ• ๋‹น - ) + allocationSize = 1 // ID๋ฅผ ํ•˜๋‚˜์”ฉ ํ• ๋‹น + ) @Column(name = "concat_row_seq") private Long concatRowSeq; - @ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "pro_seq") private ConcatTab concatTab; @Column(name = "row_text") private String rowText; + @Column(name = "selected") private Character selected; + @Column(name = "silence") private Float silence; + @Column(name = "row_index") private Integer rowIndex; + @Column(name = "status") private Character status; - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRowLog.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRowLog.java index 185b201c..f82a1ee1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRowLog.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRowLog.java @@ -2,9 +2,8 @@ import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; -import lombok.*; - import java.time.LocalDateTime; +import lombok.*; @ToString @Getter @@ -28,5 +27,4 @@ public class ConcatRowLog extends BaseEntity { private String RequestContext; private Character selected; private Float silence; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java index 042b95e9..b982b19d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java @@ -3,22 +3,19 @@ import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import com.oreo.finalproject_5re5_be.project.entity.Project; import jakarta.persistence.*; -import lombok.*; - import java.util.List; +import lombok.*; -@ToString @Getter @Builder @NoArgsConstructor -@AllArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) @Entity(name = "concat_tab") public class ConcatTab extends BaseEntity { - @Id - private Long projectId; + @Id private Long projectId; @MapsId // Project ์—”ํ‹ฐํ‹ฐ์˜ ID๋ฅผ ConcatTab์˜ ID๋กœ ์‚ฌ์šฉ - @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) + @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) @JoinColumn(name = "pro_seq") private Project project; @@ -28,13 +25,23 @@ public class ConcatTab extends BaseEntity { @Column(name = "front_silence") private Float frontSilence; + @ToString.Exclude // ํ•˜๋‚˜์˜ ConcatTab์— ์—ฌ๋Ÿฌ bgmFile๋“ค ๋งค์นญ - @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "concatTab", fetch = FetchType.EAGER) - @Column(nullable = true) - @Setter + @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "concatTab", fetch = FetchType.LAZY) private List bgmFiles; - + public void addBgmFile(BgmFile bgmFile) { + bgmFiles.add( + BgmFile.builder() + .concatTab(this) + .audioUrl(bgmFile.getAudioUrl()) + .fileName(bgmFile.getFileName()) + .fileLength(bgmFile.getFileLength()) + .extension(bgmFile.getExtension()) + .build()); + } + + public void addBgmFile(List bgmFiles) { + bgmFiles.forEach(this::addBgmFile); + } } - - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java index 2843486b..f3656a0a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java @@ -1,5 +1,6 @@ package com.oreo.finalproject_5re5_be.concat.entity; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; import lombok.*; @@ -18,12 +19,16 @@ public class MaterialAudio extends BaseEntity { @ManyToOne @JoinColumn(name = "concat_result_seq") + @ToString.Exclude // ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐฉ์ง€ + @JsonIgnore // JSON ์ง๋ ฌํ™”์—์„œ ์ œ์™ธ private ConcatResult concatResult; @ManyToOne @JoinColumn(name = "audio_file_seq") + @ToString.Exclude // ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐฉ์ง€ + @JsonIgnore // JSON ์ง๋ ฌํ™”์—์„œ ์ œ์™ธ private AudioFile audioFile; - @Column(name ="method") + @Column(name = "method") private String method; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java index 9e9f9fa7..b08e8aec 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java @@ -1,6 +1,9 @@ package com.oreo.finalproject_5re5_be.concat.repository; import com.oreo.finalproject_5re5_be.concat.entity.AudioFile; +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,14 +11,10 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - @Repository public interface AudioFileRepository extends JpaRepository { - Optional findByAudioUrl(String audioUrl); + // Optional findByAudioUrl(String audioUrl); Optional findByFileName(String filename); @@ -25,42 +24,52 @@ public interface AudioFileRepository extends JpaRepository { @Query("SELECT af FROM audio_file af WHERE FUNCTION('DATE', af.createdDate) = :date") List findByCreatedDateOnly(LocalDate date); - //ํŽ˜์ด์ง• ์ฒ˜๋ฆฌํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌ + // ํŽ˜์ด์ง• ์ฒ˜๋ฆฌํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌ Page findByExtension(String extension, Pageable pageable); - @Query(value = "SELECT * FROM audio_file" + - " WHERE concat_row_seq IN (:concatRowSeq)", nativeQuery = true) + @Query( + value = "SELECT * FROM audio_file" + " WHERE concat_row_seq IN (:concatRowSeq)", + nativeQuery = true) List findAllByConcatRowSeq(@Param("concatRowSeq") List concatRowSeq); - void deleteById(Long seq); - @Query("SELECT af.concatRow.concatRowSeq FROM audio_file af WHERE af.audioFileSeq IN :audioFileSeqs") + @Query( + "SELECT af.concatRow.concatRowSeq FROM audio_file af WHERE af.audioFileSeq IN :audioFileSeqs") List findConcatRowSeqsByAudioFileSeqs(List audioFileSeqs); - @Query(value = "SELECT * FROM audio_file" + - " WHERE concat_row_seq IN (:concatRowSeq)", nativeQuery = true) + @Query( + value = "SELECT * FROM audio_file" + " WHERE concat_row_seq IN (:concatRowSeq)", + nativeQuery = true) List findAllByConcatRowSeqs(@Param("concatRowSeq") List concatRowSeqs); - @Query("SELECT af FROM audio_file af " + - "JOIN af.concatRow cr " + - "JOIN cr.concatTab p " + - "WHERE p.project.member.seq = :member_seq") + @Query( + "SELECT af FROM audio_file af " + + "JOIN af.concatRow cr " + + "JOIN cr.concatTab p " + + "WHERE p.project.member.seq = :member_seq") List findAudioFileByMember(@Param("member_seq") Long memberSeq, Pageable pageable); - @Query("SELECT COUNT(af) FROM audio_file af " + - "JOIN af.concatRow cr " + - "JOIN cr.concatTab p " + - "WHERE p.project.member.seq = :memberSeq") + @Query( + "SELECT COUNT(af) FROM audio_file af " + + "JOIN af.concatRow cr " + + "JOIN cr.concatTab p " + + "WHERE p.project.member.seq = :memberSeq") long countByMemberSeq(@Param("memberSeq") Long memberSeq); @Query("SELECT a FROM audio_file a WHERE a.audioFileSeq = :audioFileSeq") AudioFile findAudioFileById(Long audioFileSeq); - @Query("SELECT af FROM audio_file af" + - " JOIN af.concatRow cr" + - " JOIN cr.concatTab ct" + - " WHERE ct.projectId = :proSeq" + - " AND cr.status = 'Y'") + @Query( + "SELECT af FROM audio_file af" + + " JOIN af.concatRow cr" + + " JOIN cr.concatTab ct" + + " WHERE ct.projectId = :proSeq" + + " AND cr.status = 'Y'") List findAudioFileByProjectSeq(@Param("proSeq") Long projectSeq); + + @Query( + value = "SELECT * FROM audio_file WHERE audio_file_seq = :audioFileSeq ", + nativeQuery = true) + Optional findByAudioFileSeq(Long audioFileSeq); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java index b4ea174b..2e103621 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java @@ -1,13 +1,13 @@ package com.oreo.finalproject_5re5_be.concat.repository; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface BgmFileRepository extends JpaRepository { // concatTab seq์— ๋“ค์–ด๊ฐ€๋Š” bgmFile ์ •๋ณด๋“ค ์กฐํšŒ @@ -18,4 +18,8 @@ public interface BgmFileRepository extends JpaRepository { @Query("SELECT b FROM bgm_file b WHERE b.concatResult.concatResultSequence = :resultSeq") List findByConcatResultSeq(@Param("resultSeq") Long concatResultSeq); + Optional findByAudioUrl(String audioUrl); + + // ํŠน์ • audioUrl๋กœ ๋ชจ๋“  BgmFile ์กฐํšŒ + List findAllByAudioUrl(String audioUrl); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatResultRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatResultRepository.java index 0fac9786..b4914989 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatResultRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatResultRepository.java @@ -1,14 +1,13 @@ package com.oreo.finalproject_5re5_be.concat.repository; import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; - @Repository public interface ConcatResultRepository extends JpaRepository { Optional findByConcatResultSequence(Long concatResultSeq); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowLogRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowLogRepository.java index 39dd50b1..e4a0c4fc 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowLogRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowLogRepository.java @@ -5,5 +5,4 @@ import org.springframework.stereotype.Repository; @Repository -public interface ConcatRowLogRepository extends JpaRepository { -} +public interface ConcatRowLogRepository extends JpaRepository {} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowRepository.java index 8f12457d..201a7e50 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowRepository.java @@ -1,33 +1,29 @@ package com.oreo.finalproject_5re5_be.concat.repository; import com.oreo.finalproject_5re5_be.concat.entity.ConcatRow; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface ConcatRowRepository extends JpaRepository { List findByStatusAndConcatTab_Project_ProSeq(Character status, Long projectSeq); + @Modifying - @Query(value = "UPDATE concat_row " + - "SET status = :status " + - "WHERE concat_row_seq IN :concatRowSeq", + @Query( + value = + "UPDATE concat_row " + "SET status = :status " + "WHERE concat_row_seq IN :concatRowSeq", nativeQuery = true) - int updateStatusByConcatRowSeq(@Param("concatRowSeq") List concatRowSeq, - @Param("status") Character status); + int updateStatusByConcatRowSeq( + @Param("concatRowSeq") List concatRowSeq, @Param("status") Character status); List findByConcatRowSeq(long concatRowSequence); - - @Query(value = "SELECT concat_row_seq " + - " FROM concat_row" + - " WHERE pro_seq=:proSeq", + @Query( + value = "SELECT concat_row_seq " + " FROM concat_row" + " WHERE pro_seq=:proSeq", nativeQuery = true) List findConcatRowIdByProjectSeq(@Param("proSeq") Long projectSeq); - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabLogRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabLogRepository.java index e63df093..40f7885c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabLogRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabLogRepository.java @@ -5,5 +5,4 @@ import org.springframework.stereotype.Repository; @Repository -public interface ConcatTabLogRepository extends JpaRepository { -} +public interface ConcatTabLogRepository extends JpaRepository {} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabRepository.java index ff7744ac..26b691ca 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabRepository.java @@ -5,5 +5,4 @@ import org.springframework.stereotype.Repository; @Repository -public interface ConcatTabRepository extends JpaRepository { -} +public interface ConcatTabRepository extends JpaRepository {} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/MaterialAudioRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/MaterialAudioRepository.java index 5b80b626..c8847c0a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/MaterialAudioRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/MaterialAudioRepository.java @@ -4,30 +4,33 @@ import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; import com.oreo.finalproject_5re5_be.concat.entity.ConcatRow; import com.oreo.finalproject_5re5_be.concat.entity.MaterialAudio; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface MaterialAudioRepository extends JpaRepository { - @Query("SELECT ma.audioFile FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :resultSeq") + @Query( + "SELECT ma.audioFile FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :resultSeq") List findAudioFilesByConcatResult(Long resultSeq); - @Query("SELECT ma.concatResult FROM material_audio ma WHERE ma.audioFile.audioFileSeq = :audioFileSeq") + @Query( + "SELECT ma.concatResult FROM material_audio ma WHERE ma.audioFile.audioFileSeq = :audioFileSeq") List findConcatResultsByAudioFileSeq(Long audioFileSeq); @Modifying(clearAutomatically = true) // ๋ณ€๊ฒฝ ํ›„ ์ž๋™์œผ๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™” - @Query("DELETE FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") + @Query( + "DELETE FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") void deleteByConcatResultSeq(Long concatResultSeq); - - @Query("SELECT ma FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") + + @Query( + "SELECT ma FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") List findByConcatResultSeq(Long concatResultSeq); - @Query("SELECT ma.audioFile.concatRow FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") + @Query( + "SELECT ma.audioFile.concatRow FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") List findConcatRowListByConcatResultSeq(Long concatResultSeq); - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java index 8cf2fae7..e9f6508d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java @@ -11,17 +11,6 @@ import com.oreo.finalproject_5re5_be.concat.service.helper.AudioFileHelper; import com.oreo.finalproject_5re5_be.global.component.S3Service; import com.oreo.finalproject_5re5_be.global.exception.DataNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.UnsupportedAudioFileException; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; @@ -31,7 +20,16 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; - +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; @RequiredArgsConstructor @Service @@ -44,7 +42,8 @@ public class AudioFileService { // audioFile seq๋กœ audioFile ์ •๋ณด ์กฐํšŒ (1๊ฐœ) public AudioFile getAudioFile(Long audioFileSeq) { - return audioFileRepository.findById(audioFileSeq) + return audioFileRepository + .findById(audioFileSeq) .orElseThrow(() -> new RuntimeException("Audio file not found")); } @@ -54,60 +53,61 @@ public List getAudioFilesByProjectAndStatusTrue(Long projectSeq } // audioFile Url๋กœ audioFile ์ •๋ณด ์กฐํšŒ (1๊ฐœ) - public AudioFile getAudioFileByUrl(String audioUrl) { - return audioFileRepository.findByAudioUrl(audioUrl) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with URL: " + audioUrl)); - } - - // audioFile Url๋กœ audioFileSeq ์ •๋ณด ์กฐํšŒ (N๊ฐœ) - public List getAudioFileSeqsByUrls(List audioUrls) { - return audioUrls.stream() - .map(url -> getAudioFileByUrl(url).getAudioFileSeq()) // URL๋กœ AudioFile ์กฐํšŒ ํ›„ Seq ์ถ”์ถœ - .toList(); + public AudioFile getAudioFileByUrl(Long audioSeq) { + return audioFileRepository + .findByAudioFileSeq(audioSeq) + .orElseThrow( + () -> new IllegalArgumentException("AudioFile not found with URL: " + audioSeq)); } // audioFile Name์œผ๋กœ audioFile ์ •๋ณด ์กฐํšŒ (1๊ฐœ) public AudioFile getAudioFileByName(String fileName) { - return audioFileRepository.findByFileName(fileName) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with fileName: " + fileName)); + return audioFileRepository + .findByFileName(fileName) + .orElseThrow( + () -> new IllegalArgumentException("AudioFile not found with fileName: " + fileName)); } - // concatRow์˜ seq๋ฅผ ๋ฐ›์•„์„œ ๊ทธ์— ๋งค์นญ๋˜๋Š” audioFile ์ •๋ณด ์กฐํšŒ (1๊ฐœ) public AudioFile getAudioFileByRowSeq(Long rowSeq) { - return audioFileRepository.findByRowSeq(rowSeq) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found for concatRowSeq: " + rowSeq)); + return audioFileRepository + .findByRowSeq(rowSeq) + .orElseThrow( + () -> new IllegalArgumentException("AudioFile not found for concatRowSeq: " + rowSeq)); } // concatRow์˜ seq๋ฅผ ๋ฐ›์•„์„œ ๊ทธ์— ๋งค์นญ๋˜๋Š” audioFile ์ •๋ณด ์กฐํšŒ (n๊ฐœ) public List getAudioFileByRowSeq(List rowSeq) { return audioFileRepository.findAllByConcatRowSeqs(rowSeq).stream() - .map(this::convertToAudioFileDto).toList(); + .map(this::convertToAudioFileDto) + .toList(); } - // ๋‚ ์งœ๋ฅผ ๋ฐ›์•„์„œ ๋งค์นญ๋˜๋Š” audioFile ์ •๋ณด ์กฐํšŒ (N๊ฐœ) public List getAudioFilesByCreatedDate(LocalDate date) { - //๋งค์นญ๋˜๋Š” ์˜ค๋””์˜คํŒŒ์ผ์„ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅ + // ๋งค์นญ๋˜๋Š” ์˜ค๋””์˜คํŒŒ์ผ์„ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅ List audioFiles = audioFileRepository.findByCreatedDateOnly(date); if (audioFiles.isEmpty()) { - throw new IllegalArgumentException("No AudioFiles found with the specified created date: " + date); + throw new IllegalArgumentException( + "No AudioFiles found with the specified created date: " + date); } return audioFiles; } - // ํŒŒ์ผํ™•์žฅ์ž๋กœ ์˜ค๋””์˜คํŒŒ์ผ๋“ค์„ ํŽ˜์ด์ง•์ฒ˜๋ฆฌํ•ด์„œ ์กฐํšŒ (N๊ฐœ) - public List findAudioFilesByExtensionWithPaging(String extension, int page, int size) { + public List findAudioFilesByExtensionWithPaging( + String extension, int page, int size) { Pageable pageable = PageRequest.of(page, size); // ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ํฌ๊ธฐ๋ฅผ ์„ค์ • Page audioFilePage = audioFileRepository.findByExtension(extension, pageable); // AudioFile -> ConcatUrlResponse ๋ณ€ํ™˜ return audioFilePage.getContent().stream() - .map(file -> ConcatUrlResponse.builder() - .seq(file.getAudioFileSeq()) - .url(file.getAudioUrl()) - .build()) + .map( + file -> + ConcatUrlResponse.builder() + .seq(file.getAudioFileSeq()) + .url(file.getAudioUrl()) + .build()) .collect(Collectors.toList()); } @@ -116,10 +116,9 @@ public List findByConcatRowSeq(List concatRowSeq) { return audioFiles.stream().map(this::convertToAudioFileDto).collect(Collectors.toList()); } - // AudioFile seq๋กœ ์‚ญ์ œ (1๊ฐœ) public void deleteAudioFileBySeq(Long audioFileSeq) { - //๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ + // ๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ if (!audioFileRepository.existsById(audioFileSeq)) { throw new IllegalArgumentException("Audio file not found with seq: " + audioFileSeq); } @@ -129,7 +128,7 @@ public void deleteAudioFileBySeq(Long audioFileSeq) { // AudioFile seq๋กœ ์‚ญ์ œ (N๊ฐœ) public void deleteAudioFilesBySeq(List audioFileSeqList) { for (Long seq : audioFileSeqList) { - //๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ + // ๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ if (!audioFileRepository.existsById(seq)) { throw new IllegalArgumentException("Audio file not found with seq: " + seq); } @@ -142,7 +141,8 @@ public List findConcatRowSeqsByAudioFileSeqs(List audioFileSeqs) { return audioFileRepository.findConcatRowSeqsByAudioFileSeqs(audioFileSeqs); } - public List checkExtension(List audioDto) throws IOException { + public List checkExtension(List audioDto) + throws IOException { List notSupported = new ArrayList<>(); @@ -153,34 +153,38 @@ public List checkExtension(List audioD continue; } - notSupported.add(new AudioFileRequestDto(audioFileRequestDto.getAudioFile().getOriginalFilename())); + notSupported.add( + new AudioFileRequestDto(audioFileRequestDto.getAudioFile().getOriginalFilename())); log.info("checkExtension : [{}]", "AUDIO_FILE_CHECK_FAIL"); } return notSupported; } - //s3 ์—…๋กœ๋“œ - public List saveAudioFile(List audioDto) throws IOException { + // s3 ์—…๋กœ๋“œ + public List saveAudioFile(List audioDto) + throws IOException { if (audioDto.isEmpty()) { throw new IllegalArgumentException("[AudioFileService.saveAudioFile] ์˜ค๋””์˜ค ํŒŒ์ผ์ด ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค."); } if (checkExtension(audioDto).isEmpty()) { - return audioDto.stream().map(dto -> { - // S3 ์—…๋กœ๋“œ - String audioUrl = s3Service.upload(dto.getAudioFile(), "concat/audio"); - - // AudioFile ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ - try { - return prepareDto(dto, audioUrl); - } catch (Exception e) { - throw new RuntimeException(e); - } - }).toList(); + return audioDto.stream() + .map( + dto -> { + // S3 ์—…๋กœ๋“œ + String audioUrl = s3Service.upload(dto.getAudioFile(), "concat/audio"); + + // AudioFile ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ + try { + return prepareDto(dto, audioUrl); + } catch (Exception e) { + throw new RuntimeException(e); + } + }) + .toList(); } throw new DataNotFoundException("ํŒŒ์ผ ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค."); } - public void saveAudioFiles(List audioFiles) { audioFileHelper.batchInsert(audioFiles); } @@ -199,20 +203,22 @@ private OriginAudioRequest prepareDto(AudioFileRequestDto dto, String audioUrl) } } - //์‚ฌ์šฉ์ž์˜ ์˜ค๋””์˜ค ํŒŒ์ผ ์ „์ฒด ์กฐํšŒ + // ์‚ฌ์šฉ์ž์˜ ์˜ค๋””์˜ค ํŒŒ์ผ ์ „์ฒด ์กฐํšŒ public List getMemberAudioFile(Long memberSeq, Pageable pageable) { List memberAudios = audioFileRepository.findAudioFileByMember(memberSeq, pageable); - if (memberAudios.isEmpty()) {//ํŽ˜์ด์ง€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด null์„ ๋ฐ˜ํ™˜ ํ•˜๋ฏ€๋กœ ๊ฐ€์žฅ ๋’ค์˜ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ + if (memberAudios.isEmpty()) { // ํŽ˜์ด์ง€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด null์„ ๋ฐ˜ํ™˜ ํ•˜๋ฏ€๋กœ ๊ฐ€์žฅ ๋’ค์˜ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ log.info("์š”์ฒญ ๊ฐ€๋Šฅํ•œ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ์ดˆ๊ณผ, PageNumber : [{}]", pageable.getPageNumber()); int maxPageNumber = getAudioFilePages(memberSeq, pageable.getPageSize()).size() - 1; - Pageable maxPageable = PageRequest.of(maxPageNumber, pageable.getPageSize(), pageable.getSort()); - List maxMemberAudios = audioFileRepository.findAudioFileByMember(memberSeq, maxPageable); + Pageable maxPageable = + PageRequest.of(maxPageNumber, pageable.getPageSize(), pageable.getSort()); + List maxMemberAudios = + audioFileRepository.findAudioFileByMember(memberSeq, maxPageable); return maxMemberAudios.stream().map(this::convertToAudioFileDto).toList(); } return memberAudios.stream().map(this::convertToAudioFileDto).toList(); } - //์‚ฌ์šฉ์ž ์˜ค๋””์˜ค ํŒŒ์ผ ํŽ˜์ด์ง€ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ + // ์‚ฌ์šฉ์ž ์˜ค๋””์˜ค ํŒŒ์ผ ํŽ˜์ด์ง€ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ public List getAudioFilePages(Long memberSeq, int size) { long totalCount = audioFileRepository.countByMemberSeq(memberSeq); int totalPages = (int) Math.ceil((double) totalCount / size); @@ -236,7 +242,6 @@ public static long getFileLength(InputStream inputStream) throws Exception { } } - public static boolean isAudioFile(File file) { try (AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file)) { return true; // ํŒŒ์ผ์ด ์˜ค๋””์˜ค ํ˜•์‹์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ @@ -254,14 +259,15 @@ public static boolean isAudioFile(InputStream stream) { } public static boolean isAudioFile(byte[] stream) { - try (AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(stream))) { + try (AudioInputStream audioInputStream = + AudioSystem.getAudioInputStream(new ByteArrayInputStream(stream))) { return true; // ํŒŒ์ผ์ด ์˜ค๋””์˜ค ํ˜•์‹์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ } catch (UnsupportedAudioFileException | IOException e) { return false; // ์˜ค๋””์˜ค ํŒŒ์ผ์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ˜•์‹ } } - //AudioFileDto๋ณ€ํ™˜๊ธฐ + // AudioFileDto๋ณ€ํ™˜๊ธฐ private AudioFileDto convertToAudioFileDto(AudioFile audioFile) { return AudioFileDto.builder() .audioFileSeq(audioFile.getAudioFileSeq()) @@ -290,4 +296,4 @@ private RowAudioFileDto convertToRowAudioFileDto(AudioFile audioFile) { public List saveAll(List audioFiles) { return audioFileRepository.saveAll(audioFiles); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioMultipartFile.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioMultipartFile.java index fa8c6e68..49a073ba 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioMultipartFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioMultipartFile.java @@ -1,8 +1,7 @@ package com.oreo.finalproject_5re5_be.concat.service; -import org.springframework.web.multipart.MultipartFile; - import java.io.*; +import org.springframework.web.multipart.MultipartFile; public class AudioMultipartFile implements MultipartFile { private final byte[] data; @@ -56,5 +55,4 @@ public void transferTo(File dest) throws IOException, IllegalStateException { out.write(data); } } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java index 37f86022..da3bf8d7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java @@ -1,39 +1,47 @@ package com.oreo.finalproject_5re5_be.concat.service; -import com.oreo.finalproject_5re5_be.concat.dto.request.SelectedConcatRowRequest; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequest; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; import com.oreo.finalproject_5re5_be.concat.service.bgm.BgmProcessor; import com.oreo.finalproject_5re5_be.concat.service.concatenator.AudioProperties; import com.oreo.finalproject_5re5_be.global.component.S3Service; +import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; +import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import javax.sound.sampled.AudioFileFormat; -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; import java.util.List; +import javax.sound.sampled.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Service; @RequiredArgsConstructor +@Log4j2 @Service public class AudioStreamService { + private final AudioFormat defaultAudioFormat = AudioFormats.STEREO_FORMAT_SR441_B16; // ๊ธฐ๋ณธ ํฌ๋งท private final AudioResample audioResample = new AudioResample(); public AudioInputStream createAudioInputStream(ByteArrayOutputStream buffer, AudioFormat format) { byte[] data = buffer.toByteArray(); - return new AudioInputStream(new ByteArrayInputStream(data), format, data.length / format.getFrameSize()); + return new AudioInputStream( + new ByteArrayInputStream(data), format, data.length / format.getFrameSize()); } - public AudioInputStream bufferAudioStream(AudioInputStream stream, AudioFormat format) throws IOException { + public AudioInputStream bufferAudioStream(AudioInputStream stream, AudioFormat format) + throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); AudioSystem.write(stream, AudioFileFormat.Type.WAVE, buffer); byte[] data = buffer.toByteArray(); - return new AudioInputStream(new ByteArrayInputStream(data), format, data.length / format.getFrameSize()); + return new AudioInputStream( + new ByteArrayInputStream(data), format, data.length / format.getFrameSize()); } public long getValidFrameLength(AudioInputStream audioStream) throws IOException { @@ -41,14 +49,78 @@ public long getValidFrameLength(AudioInputStream audioStream) throws IOException return frameLength > 0 ? frameLength : BgmProcessor.calculateTargetFrames(audioStream); } - public List loadAudioFiles(SelectedConcatRowRequest selectedRows) { + public List loadAudioFiles(ConcatRowSaveRequestDto selectedRows) { List audioPropertiesList = new ArrayList<>(); - for (SelectedConcatRowRequest.Row row : selectedRows.getRows()) { - AudioInputStream audioStream = S3Service.load(row.getAudioUrl()); - audioStream = audioResample.formatting(audioStream); // ๋ฆฌ์ƒ˜ํ”Œ๋ง ์ฒ˜๋ฆฌ - audioPropertiesList.add(new AudioProperties(audioStream, row.getSilenceInterval())); + for (ConcatRowRequest row : selectedRows.getConcatRowRequests()) { + OriginAudioRequest originAudio = row.getOriginAudioRequest(); + + try { + AudioInputStream audioStream = S3Service.load(originAudio.getAudioUrl()); + + // ๋ฆฌ์ƒ˜ํ”Œ๋ง ์ฒ˜๋ฆฌ + audioStream = audioResample.formatting(audioStream); // ๋ฆฌ์ƒ˜ํ”Œ๋ง ์ฒ˜๋ฆฌ + log.info("[loadAudioFiles] ๋ฆฌ์ƒ˜ํ”Œ๋ง ์™„๋ฃŒ๋œ ์˜ค๋””์˜ค ํฌ๋งท: {}", audioStream.getFormat()); + + AudioProperties audioProperties = new AudioProperties(audioStream, row.getRowSilence()); + log.info( + "[loadAudioFiles] ์ƒ์„ฑ๋œ AudioProperties: silenceInterval={}, frameLength={}", + row.getRowSilence(), + audioStream.getFrameLength()); + + audioPropertiesList.add(audioProperties); + } catch (Exception e) { + log.error( + "Failed to load or process audio file from URL: {}", originAudio.getAudioUrl(), e); + } } return audioPropertiesList; } -} \ No newline at end of file + public AudioInputStream loadAsBufferedStream(String s3Url) { + try { + URL url = new URL(s3Url); + + AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); + log.info( + "[loadAsBufferedStream] AudioInputStream ๊ฐ€์ ธ์˜ค๊ธฐ ์„ฑ๊ณต. Format: {}", + audioInputStream.getFormat()); + + // mp3 -> WAV ๋ณ€ํ™˜ + byte[] wavData = AudioExtensionConverter.mp3ToWav(audioInputStream); + + // Target Format์œผ๋กœ ๋ณ€ํ™˜ (formatting) + AudioInputStream wavStream = + new AudioInputStream( + new ByteArrayInputStream(wavData), + defaultAudioFormat, + wavData.length / defaultAudioFormat.getFrameSize()); + AudioInputStream formattedStream = audioResample.formatting(wavStream); + log.info( + "[loadAsBufferedStream] formatting ๋ณ€ํ™˜ ์„ฑ๊ณต. Frame Length: {}", + formattedStream.getFrameLength()); + + // ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฒ„ํผ๋ง + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + AudioSystem.write(formattedStream, AudioFileFormat.Type.WAVE, buffer); + + byte[] bufferedData = buffer.toByteArray(); + AudioFormat format = formattedStream.getFormat(); + + AudioInputStream bufferedStream = + new AudioInputStream( + new ByteArrayInputStream(bufferedData), + format, + bufferedData.length / format.getFrameSize()); + + return bufferedStream; + + } catch (MalformedURLException e) { + throw new IllegalArgumentException("์ž˜๋ชป๋œ S3 URL์ž…๋‹ˆ๋‹ค.", e); + } catch (UnsupportedAudioFileException e) { + throw new IllegalArgumentException("์ง€์›๋˜์ง€ ์•Š๋Š” ์˜ค๋””์˜ค ํŒŒ์ผ ํ˜•์‹์ž…๋‹ˆ๋‹ค.", e); + } catch (IOException e) { + log.error("Error processing S3 URL: {}", s3Url, e); + throw new IllegalArgumentException("์˜ค๋””์˜ค ์ฒ˜๋ฆฌ ์‹คํŒจ", e); + } + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java index 0e4d863e..e934390a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java @@ -1,21 +1,59 @@ package com.oreo.finalproject_5re5_be.concat.service; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; +import com.oreo.finalproject_5re5_be.concat.repository.ConcatResultRepository; +import java.util.List; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; -import java.util.List; - +@Log4j2 @Service @RequiredArgsConstructor public class BgmFileService { private final BgmFileRepository bgmFileRepository; - + private final ConcatResultRepository concatResultRepository; public List getBgmFilesByTabSeq(Long tabSeq) { return bgmFileRepository.findByConcatTabSeq(tabSeq); + } + + public BgmFile getBgmFileByUrl(String bgmFileUrl) { + return bgmFileRepository + .findByAudioUrl(bgmFileUrl) + .orElseThrow( + () -> new IllegalArgumentException("BGM File not found with URL: " + bgmFileUrl)); + } + + public BgmFile saveBgmFile(BgmFile bgmFile) { + return bgmFileRepository.save(bgmFile); + } + + public void updateBgmFileWithConcatResult(String bgmFileUrl, Long concatResultSeq) { + // ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ + List bgmFiles = bgmFileRepository.findAllByAudioUrl(bgmFileUrl); + if (bgmFiles.isEmpty()) { + throw new IllegalArgumentException("BgmFile not found for URL: " + bgmFileUrl); + } + if (bgmFiles.size() > 1) { + log.warn("Multiple BGM files found for URL: {}. Using the first result.", bgmFileUrl); + } + + // ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฒ˜๋ฆฌ + BgmFile bgmFile = bgmFiles.get(0); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found for id: " + concatResultSeq)); + bgmFile.setConcatResult(concatResult); + bgmFileRepository.save(bgmFile); + log.info("[updateBgmFileWithConcatResult] Updated BgmFile with ConcatResult: {}", bgmFile); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java index 5294bc7c..30575993 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.concat.service; - import com.oreo.finalproject_5re5_be.concat.dto.ConcatResultDto; import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatResultRequest; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatResultDetailsResponse; @@ -9,13 +8,11 @@ import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; import com.oreo.finalproject_5re5_be.concat.repository.ConcatResultRepository; import com.oreo.finalproject_5re5_be.concat.repository.ConcatTabRepository; +import java.util.List; +import javax.sound.sampled.AudioInputStream; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import javax.sound.sampled.AudioInputStream; -import java.io.IOException; -import java.util.List; - @RequiredArgsConstructor @Service public class ConcatResultService { @@ -26,41 +23,48 @@ public class ConcatResultService { // ConcatResult ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ ์ €์žฅ (1๊ฐœ) public ConcatUrlResponse saveConcatResult(ConcatResultRequest request) { // 1. ConcatTab ์กฐํšŒ - ConcatTab concatTab = concatTabRepository.findById(request.getConcatTabSeq()) - .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + request.getConcatTabSeq())); - - //์กฐํšŒํ•œ ๊ฐ’๊ณผ ์ž…๋ ฅํ•œ ๊ฐ’ ์ €์žฅ์„ ํ•˜๊ธฐ ์œ„ํ•œ ConcatResult ๊ฐ์ฒด ์ƒ์„ฑ - ConcatResult concatResult = ConcatResult.builder() - .concatTab(concatTab) //concatTab ๊ฐ์ฒด ํ•„์š” - .audioUrl(request.getResultUrl()) - .extension(request.getResultExtension()) - .fileLength(request.getResultFileLength()) - .fileName(request.getResultFileName()) - .build(); + ConcatTab concatTab = + concatTabRepository + .findById(request.getConcatTabSeq()) + .orElseThrow( + () -> + new IllegalArgumentException( + "Invalid ConcatTab ID: " + request.getConcatTabSeq())); + + // ์กฐํšŒํ•œ ๊ฐ’๊ณผ ์ž…๋ ฅํ•œ ๊ฐ’ ์ €์žฅ์„ ํ•˜๊ธฐ ์œ„ํ•œ ConcatResult ๊ฐ์ฒด ์ƒ์„ฑ + ConcatResult concatResult = + ConcatResult.builder() + .concatTab(concatTab) // concatTab ๊ฐ์ฒด ํ•„์š” + .audioUrl(request.getResultUrl()) + .extension(request.getResultExtension()) + .fileLength(request.getResultFileLength()) + .fileName(request.getResultFileName()) + .build(); ConcatResult result = concatResultRepository.save(concatResult); - return ConcatUrlResponse.builder() //response ๊ฐ์ฒด ์ƒ์„ฑ - .seq(result.getConcatResultSequence()) //์ €์žฅ๋œ ๊ฐ์ฒด์˜ seq - .url(result.getAudioUrl()) //์ €์žฅ๋œ ๊ฐ์ฒด์˜ url + return ConcatUrlResponse.builder() // response ๊ฐ์ฒด ์ƒ์„ฑ + .seq(result.getConcatResultSequence()) // ์ €์žฅ๋œ ๊ฐ์ฒด์˜ seq + .url(result.getAudioUrl()) // ์ €์žฅ๋œ ๊ฐ์ฒด์˜ url .build(); - } // AudioInputStream์—์„œ ConcatResult ์ €์žฅ public ConcatUrlResponse saveConcatResult( - Long concatTabSeq, String audioUrl, String fileName, AudioInputStream mixedAudioStream) throws IOException { + Long concatTabSeq, String audioUrl, String fileName, AudioInputStream mixedAudioStream) { // 1. AudioInputStream์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธธ์ด ๊ณ„์‚ฐ - long fileLength = (long) (mixedAudioStream.getFrameLength() / mixedAudioStream.getFormat().getFrameRate()); + long fileLength = + (long) (mixedAudioStream.getFrameLength() / mixedAudioStream.getFormat().getFrameRate()); // 2. ConcatResultRequest ์ƒ์„ฑ - ConcatResultRequest request = ConcatResultRequest.builder() - .concatTabSeq(concatTabSeq) - .ResultUrl(audioUrl) - .ResultFileName(fileName + ".wav") - .ResultExtension("wav") - .ResultFileLength((float) fileLength) - .build(); + ConcatResultRequest request = + ConcatResultRequest.builder() + .concatTabSeq(concatTabSeq) + .ResultUrl(audioUrl) + .ResultFileName(fileName + ".wav") + .ResultExtension("wav") + .ResultFileLength((float) fileLength) + .build(); // 3. ๊ธฐ์กด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ €์žฅ return saveConcatResult(request); @@ -70,14 +74,18 @@ public ConcatResult saveConcatResult(ConcatResult request) { return concatResultRepository.save(request); } - // ConcatResult Seq๋ฅผ ๋ฐ›์•„์„œ ConcatResult์˜ ์„ธ๋ถ€ ์ •๋ณด ์กฐํšŒ (1๊ฐœ) public ConcatResultDetailsResponse getConcatResultDetails(Long concatResultSeq) { // ConcatResult ์กฐํšŒ - ConcatResult concatResult = concatResultRepository.findByConcatResultSequence(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with seq: " + concatResultSeq)); - - //Response์— ์ •๋ณด ๋‹ด๊ธฐ + ConcatResult concatResult = + concatResultRepository + .findByConcatResultSequence(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with seq: " + concatResultSeq)); + + // Response์— ์ •๋ณด ๋‹ด๊ธฐ return ConcatResultDetailsResponse.builder() .concatTabSeq(concatResult.getConcatTab().getProjectId()) .audioUrl(concatResult.getAudioUrl()) @@ -85,29 +93,38 @@ public ConcatResultDetailsResponse getConcatResultDetails(Long concatResultSeq) .fileLength(concatResult.getFileLength()) .fileName(concatResult.getFileName()) .build(); - } // ConcatResult Seq๋ฅผ ๋ฐ›์•„์„œ ํ•ด๋‹น ConcatResult๋ฅผ ์‚ญ์ œ (1๊ฐœ) public void deleteConcatResultBySeq(Long concatResultSeq) { // ConcatResult ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with seq: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with seq: " + concatResultSeq)); // ์‚ญ์ œ concatResultRepository.delete(concatResult); - } public List findByConcatTabSequence(Long projectSeq) { List byProjectSeq = concatResultRepository.findByConcatTabSequence(projectSeq); - return byProjectSeq.stream().map(cr -> ConcatResultDto.builder() - .concatResultSequence(cr.getConcatResultSequence()) - .fileName(cr.getFileName()) - .extension(cr.getExtension()) - .fileSize(cr.getFileSize()) - .audioUrl(cr.getAudioUrl()) - .fileLength(cr.getFileLength()) - .build()).toList(); + return byProjectSeq.stream() + .map( + cr -> + ConcatResultDto.builder() + .concatResultSequence(cr.getConcatResultSequence()) + .fileName(cr.getFileName()) + .extension(cr.getExtension()) + .fileSize(cr.getFileSize()) + .audioUrl(cr.getAudioUrl()) + .fileLength(cr.getFileLength()) + .seperated(cr.getSeperated()) + .processId(cr.getProcessId()) + .build()) + .toList(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java index b9330d83..59387423 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java @@ -10,11 +10,10 @@ import com.oreo.finalproject_5re5_be.concat.repository.ConcatTabRepository; import com.oreo.finalproject_5re5_be.concat.service.helper.ConcatRowHelper; import jakarta.transaction.Transactional; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; - import java.util.*; import java.util.stream.Stream; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; @Service @AllArgsConstructor @@ -24,61 +23,64 @@ public class ConcatRowService { private final ConcatRowHelper concatRowHelper; private final AudioFileService audioFileService; - //ํ˜„์žฌ Hibernate์—์„œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ํ™•์ธ์„ ์œ„ํ•ด ์ž๋™์œผ๋กœ project, concat_tab, concat_option์„ ํ™•์ธ ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•จ + // ํ˜„์žฌ Hibernate์—์„œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ํ™•์ธ์„ ์œ„ํ•ด ์ž๋™์œผ๋กœ project, concat_tab, concat_option์„ ํ™•์ธ ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•จ public List readRecentConcatRows(long projectSequence) { - List concatRows = concatRowRepository - .findByStatusAndConcatTab_Project_ProSeq('Y', projectSequence); + List concatRows = + concatRowRepository.findByStatusAndConcatTab_Project_ProSeq('Y', projectSequence); if (concatRows.isEmpty()) { return new ArrayList<>(); } - return concatRows.stream().map(cr -> ConcatRowDto.builder() - .concatRowSequence(cr.getConcatRowSeq()) - .projectSequence(projectSequence) - .rowText(cr.getRowText()) - .rowIndex(cr.getRowIndex()) - .selected(cr.getSelected()) - .status(cr.getStatus()) - .silence(cr.getSilence()) - .build() - ).toList(); + return concatRows.stream() + .map( + cr -> + ConcatRowDto.builder() + .concatRowSequence(cr.getConcatRowSeq()) + .projectSequence(projectSequence) + .rowText(cr.getRowText()) + .rowIndex(cr.getRowIndex()) + .selected(cr.getSelected()) + .status(cr.getStatus()) + .silence(cr.getSilence()) + .build()) + .toList(); } public List readConcatRows(long concatRowSequence) { - List concatRows = concatRowRepository - .findByConcatRowSeq(concatRowSequence); - return concatRows.stream().map(cr -> ConcatRowDto.builder() - .concatRowSequence(cr.getConcatRowSeq()) - .rowText(cr.getRowText()) - .rowIndex(cr.getRowIndex()) - .selected(cr.getSelected()) - .silence(cr.getSilence()) - .build() - ).toList(); + List concatRows = concatRowRepository.findByConcatRowSeq(concatRowSequence); + return concatRows.stream() + .map( + cr -> + ConcatRowDto.builder() + .concatRowSequence(cr.getConcatRowSeq()) + .rowText(cr.getRowText()) + .rowIndex(cr.getRowIndex()) + .selected(cr.getSelected()) + .silence(cr.getSilence()) + .build()) + .toList(); } @Transactional public boolean disableConcatRows(List rowSeq) { - return concatRowRepository.updateStatusByConcatRowSeq(rowSeq, 'N') == rowSeq.size();//ํ–‰ ๋น„ํ™œ์„ฑ ์ฒ˜๋ฆฌ + return concatRowRepository.updateStatusByConcatRowSeq(rowSeq, 'N') == rowSeq.size(); // ํ–‰ ๋น„ํ™œ์„ฑ ์ฒ˜๋ฆฌ } - - @Transactional(rollbackOn = Exception.class)//๋ชจ๋“  ์˜ˆ์™ธ์— ๋Œ€ํ•ด ๋กค๋ฐฑ ์ˆ˜ํ–‰ + @Transactional(rollbackOn = Exception.class) // ๋ชจ๋“  ์˜ˆ์™ธ์— ๋Œ€ํ•ด ๋กค๋ฐฑ ์ˆ˜ํ–‰ public boolean updateConcatRows(ConcatRowSaveRequestDto requestDto) { Optional concatTabOpt = concatTabRepository.findById(requestDto.getConcatTabId()); if (concatTabOpt.isPresent()) { - return disableConcatRowsForUpdate(requestDto.getConcatRowRequests()) && - saveConcatRows(requestDto); + return disableConcatRowsForUpdate(requestDto.getConcatRowRequests()) + && saveConcatRows(requestDto); } return false; } private boolean disableConcatRowsForUpdate(List concatRows) { - List concatRowSeq = concatRows - .stream().map(ConcatRowRequest::getSeq) - .filter(Objects::nonNull).toList(); - //ํ–‰ ๋น„ํ™œ์„ฑ ์ฒ˜๋ฆฌ + List concatRowSeq = + concatRows.stream().map(ConcatRowRequest::getSeq).filter(Objects::nonNull).toList(); + // ํ–‰ ๋น„ํ™œ์„ฑ ์ฒ˜๋ฆฌ return concatRowRepository.updateStatusByConcatRowSeq(concatRowSeq, 'N') == concatRowSeq.size(); } @@ -86,58 +88,70 @@ public ConcatRow readConcatRow(Long concatRowSeq) { return concatRowRepository.findById(concatRowSeq).orElse(null); } - @Transactional public boolean saveConcatRows(ConcatRowSaveRequestDto requestDto) { // 1. ConcatTab ํ™•์ธ ๋ฐ ์กฐํšŒ - ConcatTab concatTab = concatTabRepository.findById(requestDto.getConcatTabId()) - .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + requestDto.getConcatTabId())); + ConcatTab concatTab = + concatTabRepository + .findById(requestDto.getConcatTabId()) + .orElseThrow( + () -> + new IllegalArgumentException( + "Invalid ConcatTab ID: " + requestDto.getConcatTabId())); List audioFiles = new ArrayList<>(); // 2. ConcatRowRequest ์ฒ˜๋ฆฌ - List saveRows = getConcatRows(requestDto.getConcatRowRequests(), concatTab, audioFiles); + List saveRows = + getConcatRows(requestDto.getConcatRowRequests(), concatTab, audioFiles); // 3. ConcatRow, ์ €์žฅ -// concatRowHelper.batchInsert(saveRows); + // concatRowHelper.batchInsert(saveRows); audioFileService.saveAudioFiles(audioFiles); return true; } // @Transactional -// public boolean saveConcatRows(ConcatRowRequestDto requestDto) { -// // 1. ConcatTab ํ™•์ธ ๋ฐ ์กฐํšŒ -// ConcatTab concatTab = concatTabRepository.findById(requestDto.getConcatTabId()) -// .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + requestDto.getConcatTabId())); -// -// List audioFiles = new ArrayList<>(); -// // 2. ConcatRowRequest ์ฒ˜๋ฆฌ -// List concatRows = getConcatRows(requestDto.getConcatRowRequests(), concatTab, audioFiles); -// -// // 3. ConcatRow, ์ €์žฅ -// concatRowHelper.batchInsert(concatRows); -// audioFileService.saveAudioFiles(audioFiles); -// return true; -// } - private List getConcatRows(List requestDto, ConcatTab concatTab, List audioFiles) { + // public boolean saveConcatRows(ConcatRowRequestDto requestDto) { + // // 1. ConcatTab ํ™•์ธ ๋ฐ ์กฐํšŒ + // ConcatTab concatTab = concatTabRepository.findById(requestDto.getConcatTabId()) + // .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + + // requestDto.getConcatTabId())); + // + // List audioFiles = new ArrayList<>(); + // // 2. ConcatRowRequest ์ฒ˜๋ฆฌ + // List concatRows = getConcatRows(requestDto.getConcatRowRequests(), concatTab, + // audioFiles); + // + // // 3. ConcatRow, ์ €์žฅ + // concatRowHelper.batchInsert(concatRows); + // audioFileService.saveAudioFiles(audioFiles); + // return true; + // } + private List getConcatRows( + List requestDto, ConcatTab concatTab, List audioFiles) { return requestDto.stream() - .filter(rowRequest -> rowRequest.getStatus() != 'N').map(rowRequest -> { - - // 2.2 ConcatRow ์ƒ์„ฑ - ConcatRow concatRow = ConcatRow.builder() - .concatTab(concatTab) - .rowText(rowRequest.getRowText()) - .selected(rowRequest.getSelected()) - .silence(rowRequest.getRowSilence()) - .rowIndex(rowRequest.getRowIndex()) - .status('Y') // ๊ธฐ๋ณธ ์ƒํƒœ ์„ค์ • - .build(); - - // 2.3 AudioFile ์ €์žฅ ๋ฐ ์—ฐ๊ด€ ์„ค์ • - AudioFile originAudio = mapToAudioFile(rowRequest.getOriginAudioRequest(), concatRow); - audioFiles.add(originAudio); - - return concatRow; - }).toList(); + .filter(rowRequest -> rowRequest.getStatus() != 'N') + .map( + rowRequest -> { + + // 2.2 ConcatRow ์ƒ์„ฑ + ConcatRow concatRow = + ConcatRow.builder() + .concatTab(concatTab) + .rowText(rowRequest.getRowText()) + .selected(rowRequest.getSelected()) + .silence(rowRequest.getRowSilence()) + .rowIndex(rowRequest.getRowIndex()) + .status('Y') // ๊ธฐ๋ณธ ์ƒํƒœ ์„ค์ • + .build(); + + // 2.3 AudioFile ์ €์žฅ ๋ฐ ์—ฐ๊ด€ ์„ค์ • + AudioFile originAudio = mapToAudioFile(rowRequest.getOriginAudioRequest(), concatRow); + audioFiles.add(originAudio); + + return concatRow; + }) + .toList(); } private AudioFile mapToAudioFile(OriginAudioRequest originAudioRequest, ConcatRow concatRow) { @@ -152,27 +166,52 @@ private AudioFile mapToAudioFile(OriginAudioRequest originAudioRequest, ConcatRo .build(); } - public boolean uploadText(List concatRowSaveRequestDto) { - boolean check = concatRowSaveRequestDto.stream() - .anyMatch(rowRequest -> rowRequest.getStatus() == 'N' || rowRequest.getSeq() == null); + public boolean uploadText(ConcatRowSaveRequestDto concatRowSaveRequestDto) { + + // 1. ์š”์ฒญ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ + boolean check = + concatRowSaveRequestDto.getConcatRowRequests().stream() + .anyMatch(rowRequest -> rowRequest.getStatus() == 'N' || rowRequest.getSeq() == null); if (check) { return false; } - List list = concatRowSaveRequestDto.stream().map(cr -> ConcatRow - .builder() - .concatRowSeq(cr.getSeq()) - .rowText(cr.getRowText()).build()).toList(); - concatRowHelper.batchInsert(list); + // 2. ConcatTab ์กฐํšŒ + Long concatTabId = concatRowSaveRequestDto.getConcatTabId(); + ConcatTab concatTab = + concatTabRepository + .findById(concatTabId) + .orElseThrow( + () -> new IllegalArgumentException("Invalid ConcatTab ID: " + concatTabId)); + + // 3. ConcatRow ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ + List concatRows = + concatRowSaveRequestDto.getConcatRowRequests().stream() + .map( + request -> + ConcatRow.builder() + .concatRowSeq(request.getSeq()) + .rowIndex(request.getRowIndex()) + .selected(request.getSelected()) + .silence(request.getRowSilence()) + .status(request.getStatus()) + .concatTab(concatTab) // ์กฐํšŒํ•œ concatTab ์„ค์ • + .rowText(request.getRowText()) + .build()) + .toList(); + + // 4. ConcatRow ์ €์žฅ + concatRowRepository.saveAll(concatRows); + return true; } @Transactional(rollbackOn = Exception.class) public boolean updateConcatRows(List rowAudioFiles, Long tabId) { disableConcatRows(rowAudioFiles.stream().map(RowAudioFileDto::getConcatRow)); -// List audioFiles = getAudioFiles(rowAudioFiles, tabId); + // List audioFiles = getAudioFiles(rowAudioFiles, tabId); List audioFiles = audioFileService.saveAll(getAudioFiles(rowAudioFiles, tabId)); -// audioFileService.saveAudioFiles(audioFiles); + // audioFileService.saveAudioFiles(audioFiles); return true; } @@ -184,27 +223,33 @@ public boolean disableConcatRows(Stream concatRows) { private List getAudioFiles(List concatRowAudios, Long tabId) { - ConcatTab concatTab = concatTabRepository.findById(tabId) - .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + tabId)); - - return concatRowAudios.stream().map(a -> { - ConcatRow concatRow = ConcatRow.builder() - .rowText(a.getConcatRow().getRowText()) - .selected(a.getConcatRow().getSelected()) - .silence(a.getConcatRow().getSilence()) - .rowIndex(a.getConcatRow().getRowIndex()) - .status(a.getConcatRow().getStatus()) - .concatTab(concatTab) // ๊ธฐ์กด ๊ฐ์ฒด ์‚ฌ์šฉ - .build(); - - return AudioFile.builder() - .audioUrl(a.getAudioUrl()) - .extension(a.getExtension()) - .fileSize(a.getFileSize()) - .fileLength(a.getFileLength()) - .fileName(a.getFileName()) - .concatRow(concatRow) - .build(); - }).toList(); + ConcatTab concatTab = + concatTabRepository + .findById(tabId) + .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + tabId)); + + return concatRowAudios.stream() + .map( + a -> { + ConcatRow concatRow = + ConcatRow.builder() + .rowText(a.getConcatRow().getRowText()) + .selected(a.getConcatRow().getSelected()) + .silence(a.getConcatRow().getSilence()) + .rowIndex(a.getConcatRow().getRowIndex()) + .status(a.getConcatRow().getStatus()) + .concatTab(concatTab) // ๊ธฐ์กด ๊ฐ์ฒด ์‚ฌ์šฉ + .build(); + + return AudioFile.builder() + .audioUrl(a.getAudioUrl()) + .extension(a.getExtension()) + .fileSize(a.getFileSize()) + .fileLength(a.getFileLength()) + .fileName(a.getFileName()) + .concatRow(concatRow) + .build(); + }) + .toList(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java new file mode 100644 index 00000000..ff4aefc3 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java @@ -0,0 +1,48 @@ +package com.oreo.finalproject_5re5_be.concat.service; + +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatUpdateRequestDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.TabRowUpdateRequestDto; +import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ConcatRowTabService { + + private final ConcatTabService concatTabService; + private final ConcatRowService concatRowService; + + @Transactional // ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์—”ํ‹ฐํ‹ฐ ๋ณ€๊ฒฝ๋‚ด์šฉ ์ ์šฉ ์•ˆ๋จ + public boolean saveTabAndRows(TabRowUpdateRequestDto dto, Long memberSeq) { + // 1. ConcatTab ์—…๋ฐ์ดํŠธ + ConcatUpdateRequestDto concatTabs = dto.getConcatTab(); + // 2. ConcatRow ์—…๋ฐ์ดํŠธ (๋ง๋งŒ ์—…๋ฐ์ดํŠธ๊ณ  ์‚ฌ์‹ค ์ƒ์„ฑ์ž„) + ConcatRowSaveRequestDto concatRows = dto.getConcatRows(); + + // 3. BgmFile ์ €์žฅ + ConcatTab concatTab = concatTabService.getConcatTabBySeq(concatTabs.getTabId()); // ConcatTab ์กฐํšŒ + + List bgmFiles = + concatTabs.getBgmFileList().stream() + .map( + bgmRequest -> + BgmFile.builder() + .concatTab(concatTab) + .audioUrl(bgmRequest.getAudioUrl()) + .fileName(bgmRequest.getFileName()) + .fileSize(bgmRequest.getFileSize()) + .fileLength(bgmRequest.getFileLength()) + .extension(bgmRequest.getExtension()) + .build()) + .toList(); + concatTab.addBgmFile(bgmFiles); + + return concatTabService.updateConcatTab(concatTabs, memberSeq) + && concatRowService.updateConcatRows(concatRows); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java index 52d01927..2760d155 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java @@ -15,28 +15,29 @@ import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import javax.sound.sampled.AudioInputStream; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import javax.sound.sampled.AudioInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.List; - @Slf4j @Service @AllArgsConstructor public class ConcatService { - private final IntervalConcatenator concatenator - = new StereoIntervalConcatenator(AudioFormats.STEREO_FORMAT_SR441_B16); - private final AudioResample audioResample = new AudioResample(AudioFormats.STEREO_FORMAT_SR441_B16); + private final IntervalConcatenator concatenator = + new StereoIntervalConcatenator(AudioFormats.STEREO_FORMAT_SR441_B16); + private final AudioResample audioResample = + new AudioResample(AudioFormats.STEREO_FORMAT_SR441_B16); private final S3Service s3Service; private final MaterialAudioService materialAudioService; private final ConcatResultService concatResultService; - public ConcatResultDto concat(ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests) + public ConcatResultDto concat( + ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests) throws IOException { Result concatResult = getResult(concatTabResponseDto, concatRowRequests); @@ -44,8 +45,9 @@ public ConcatResultDto concat(ConcatTabResponseDto concatTabResponseDto, ConcatR throw new IllegalArgumentException("ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค."); } - //์žฌ๋ฃŒ ์˜ค๋””์˜ค ์ €์žฅ - materialAudioService.saveMaterialAudio(prepareMaterialAudio(concatResult.audios(), concatResult.result())); + // ์žฌ๋ฃŒ ์˜ค๋””์˜ค ์ €์žฅ + materialAudioService.saveMaterialAudio( + prepareMaterialAudio(concatResult.audios(), concatResult.result())); return ConcatResultDto.builder() .concatResultSequence(concatResult.result().getConcatResultSequence()) .extension(concatResult.result().getExtension()) @@ -54,11 +56,11 @@ public ConcatResultDto concat(ConcatTabResponseDto concatTabResponseDto, ConcatR .fileSize(concatResult.result().getFileSize()) .fileLength(concatResult.result().getFileLength()) .build(); - } - //์ฑ…์ž„ : s3 ์ €์žฅ, ๊ฒฐ๊ณผ ์ €์žฅ - private Result getResult(ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests) + // ์ฑ…์ž„ : s3 ์ €์žฅ, ๊ฒฐ๊ณผ ์ €์žฅ + private Result getResult( + ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests) throws IOException { List audios = concatRowRequests.getConcatRowRequests(); if (checkNull(audios)) { @@ -69,26 +71,31 @@ private Result getResult(ConcatTabResponseDto concatTabResponseDto, ConcatRowReq return new Result(audios, result); } - private ConcatResult getConcatResult(ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests, List audios) throws IOException { + private ConcatResult getConcatResult( + ConcatTabResponseDto concatTabResponseDto, + ConcatRowRequestDto concatRowRequests, + List audios) + throws IOException { AudioInputStream concat = resampleAudio(concatTabResponseDto, audios); byte[] audioData = AudioExtensionConverter.mp3ToWav(concat); // AudioInputStream์„ byte[]๋กœ ๋ณ€ํ™˜ - MultipartFile multipartFile - = new AudioMultipartFile(audioData, concatRowRequests.getFileName(), "audio/wav"); + MultipartFile multipartFile = + new AudioMultipartFile(audioData, concatRowRequests.getFileName(), "audio/wav"); String uploadUrl = getUploadtoS3(multipartFile); log.info("[Uploaded file URL : {}] ", uploadUrl); - //๊ฒฐ๊ณผ ์ €์žฅ - ConcatResult result = ConcatResult.builder().concatTab(ConcatTab.builder() - .projectId(concatTabResponseDto.getTabId()).build()) - .audioUrl(uploadUrl) - .extension("WAV") - .fileSize((long) audioData.length) - .fileLength(concat.getFrameLength() / concat.getFormat().getFrameRate()) - .fileName(concatRowRequests.getFileName()) - .build(); + // ๊ฒฐ๊ณผ ์ €์žฅ + ConcatResult result = + ConcatResult.builder() + .concatTab(ConcatTab.builder().projectId(concatTabResponseDto.getTabId()).build()) + .audioUrl(uploadUrl) + .extension("WAV") + .fileSize((long) audioData.length) + .fileLength(concat.getFrameLength() / concat.getFormat().getFrameRate()) + .fileName(concatRowRequests.getFileName()) + .build(); return concatResultService.saveConcatResult(result); } @@ -107,57 +114,48 @@ private String getUploadtoS3(MultipartFile multipartFile) throws IOException { "concat/result", multipartFile.getOriginalFilename(), multipartFile.getSize(), - multipartFile.getContentType() - ); + multipartFile.getContentType()); } - private AudioInputStream resampleAudio(ConcatTabResponseDto concatTabResponseDto, List audios) throws IOException { - List audioProperties = audios.stream().map(cr -> new AudioProperties( - resample(S3Service.load(cr.getOriginAudioRequest().getAudioUrl())) - , cr.getRowSilence() - )).toList();//์˜ค๋””์˜ค ๋ฐ›์•„์˜ค๊ธฐ - - ByteArrayOutputStream concatResult = concatenator - .intervalConcatenate(audioProperties, concatTabResponseDto.getFrontSilence());//๊ฒฐ๊ณผ ์ƒ์„ฑ - - //๋ฆฌ์ƒ˜ํ”Œ + private AudioInputStream resampleAudio( + ConcatTabResponseDto concatTabResponseDto, List audios) throws IOException { + List audioProperties = + audios.stream() + .map( + cr -> + new AudioProperties( + resample(S3Service.load(cr.getOriginAudioRequest().getAudioUrl())), + cr.getRowSilence())) + .toList(); // ์˜ค๋””์˜ค ๋ฐ›์•„์˜ค๊ธฐ + + ByteArrayOutputStream concatResult = + concatenator.intervalConcatenate( + audioProperties, concatTabResponseDto.getFrontSilence()); // ๊ฒฐ๊ณผ ์ƒ์„ฑ + + // ๋ฆฌ์ƒ˜ํ”Œ return audioResample.resample(concatResult); } - public List prepareMaterialAudio(List audios, ConcatResult concatResult) { - - return audios.stream().map(aud -> MaterialAudio.builder() - .concatResult(concatResult) - .method("Normal") - .audioFile(AudioFile.builder().audioFileSeq(aud.getSeq()).build()) - .build()).toList(); - + public List prepareMaterialAudio( + List audios, ConcatResult concatResult) { + + return audios.stream() + .map( + aud -> + MaterialAudio.builder() + .concatResult(concatResult) + .method("Normal") + .audioFile( + AudioFile.builder() + .audioFileSeq(aud.getOriginAudioRequest().getSeq()) + .build()) + .build()) + .toList(); } public AudioInputStream resample(AudioInputStream audioInputStream) { return audioResample.resample(audioInputStream); } - private record Result(List audios, ConcatResult result) { - } - + private record Result(List audios, ConcatResult result) {} } - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java index 48fedf0d..7b826736 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java @@ -5,7 +5,6 @@ import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; -import com.oreo.finalproject_5re5_be.concat.repository.AudioFileRepository; import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; import com.oreo.finalproject_5re5_be.concat.repository.ConcatTabRepository; import com.oreo.finalproject_5re5_be.concat.service.helper.ConcatTabHelper; @@ -14,12 +13,11 @@ import com.oreo.finalproject_5re5_be.project.entity.Project; import com.oreo.finalproject_5re5_be.project.repository.ProjectRepository; import jakarta.transaction.Transactional; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; - import java.util.List; import java.util.NoSuchElementException; import java.util.Optional; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; @Service @AllArgsConstructor @@ -28,7 +26,6 @@ public class ConcatTabService { private ProjectRepository projectRepository; private MemberServiceImpl memberService; private ConcatTabHelper concatTabHelper; - private AudioFileRepository audioFileRepository; private BgmFileRepository bgmFileRepository; /** @@ -37,42 +34,53 @@ public class ConcatTabService { */ @Transactional public boolean createConcatTab(ConcatCreateRequestDto concatCreateRequestDto) { - Optional projectOpt = projectRepository.findById(concatCreateRequestDto.getProjectSequence()); - if (concatTabRepository.existsById(concatCreateRequestDto.getProjectSequence()) || projectOpt.isEmpty()) { + Optional projectOpt = + projectRepository.findById(concatCreateRequestDto.getProjectSequence()); + if (concatTabRepository.existsById(concatCreateRequestDto.getProjectSequence()) + || projectOpt.isEmpty()) { return false; } Project project = projectOpt.get(); System.out.println("project.getProSeq() = " + project.getProSeq()); - ConcatTab concatTab = ConcatTab.builder() - .project(project) // Hibernate๊ฐ€ projectId๋ฅผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™” - .status('Y') - .frontSilence(0.0f) - .bgmFiles(null)//create๋ผ์„œ ์ฒ˜์Œ์—” null - .build(); + ConcatTab concatTab = + ConcatTab.builder() + .project(project) // Hibernate๊ฐ€ projectId๋ฅผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™” + .status('Y') + .frontSilence(0.0f) + .bgmFiles(null) // create๋ผ์„œ ์ฒ˜์Œ์—” null + .build(); concatTabRepository.save(concatTab); return true; } - //์ค‘๋ณต ์กฐํšŒ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์˜ค๋ฒ„๋กœ๋“œ + // ์ค‘๋ณต ์กฐํšŒ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์˜ค๋ฒ„๋กœ๋“œ @Transactional public boolean createConcatTab(Project project) { if (concatTabRepository.existsById(project.getProSeq())) { return false; } - ConcatTab concatTab = new ConcatTab(project.getProSeq(), project, 'Y', 0.0f, null); + + ConcatTab concatTab = + ConcatTab.builder() + .project(project) // Hibernate๊ฐ€ projectId๋ฅผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™” + .status('Y') + .frontSilence(0.0f) + .bgmFiles(null) // create๋ผ์„œ ์ฒ˜์Œ์—” null + .build(); + + System.out.println("concatTab = " + concatTab); concatTabRepository.save(concatTab); return true; } - //projectSeq๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ํ”„๋กœ์ ํŠธ์˜ id๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธ ํ•ด์•ผํ•จ + // projectSeq๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ํ”„๋กœ์ ํŠธ์˜ id๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธ ํ•ด์•ผํ•จ @Transactional public ConcatTabResponseDto readConcatTab(long projectSeq, Long memberSeq) { // ConcatTab, Project ์กฐํšŒ Optional concatOpt = concatTabRepository.findById(projectSeq); Optional projectOpt = projectRepository.findById(projectSeq); - if (projectOpt.isEmpty()) { throw new NoSuchElementException("ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); } @@ -106,55 +114,68 @@ public boolean updateConcatTab(ConcatUpdateRequestDto concatUpdateRequestDto, Lo } // ConcatTab ๋ฐ Project ์กฐํšŒ - ConcatTab existingTab = concatTabRepository.findById(concatUpdateRequestDto.getTabId()) - .orElseThrow(() -> new NoSuchElementException("์ˆ˜์ •ํ•  ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")); - - Project project = projectRepository.findById(concatUpdateRequestDto.getTabId()) - .orElseThrow(() -> new NoSuchElementException("์ˆ˜์ •ํ•  ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")); + ConcatTab existingTab = + concatTabRepository + .findById(concatUpdateRequestDto.getTabId()) + .orElseThrow(() -> new NoSuchElementException("์ˆ˜์ •ํ•  ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")); - // Dto์˜ originAudioRequests๋ฅผ ํ†ตํ•ด bgmFiles ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ - List bgmFiles = concatUpdateRequestDto.getBgmFileList().stream() - .map(request -> bgmFileRepository.findById(request.getSeq()) - .orElseThrow(() -> new NoSuchElementException("BgmFile not found with ID: " + request.getSeq()))) - .toList(); + Project project = + projectRepository + .findById(concatUpdateRequestDto.getTabId()) + .orElseThrow(() -> new NoSuchElementException("์ˆ˜์ •ํ•  ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")); // Builder๋กœ ์ƒˆ๋กœ์šด ConcatTab ์ƒ์„ฑ - ConcatTab updatedTab = ConcatTab.builder() - .projectId(existingTab.getProjectId()) // ๊ธฐ์กด ๊ฐ’ ์œ ์ง€ - .project(existingTab.getProject()) // ๊ธฐ์กด ๊ฐ’ ์œ ์ง€ - .frontSilence(concatUpdateRequestDto.getFrontSilence()) // ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’ - .status(concatUpdateRequestDto.getStatus()) // ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’ - .bgmFiles(bgmFiles) // ์ƒˆ๋กœ์šด BgmFile ๋ฆฌ์ŠคํŠธ - .build(); + ConcatTab updatedTab = + ConcatTab.builder() + .projectId(existingTab.getProjectId()) // ๊ธฐ์กด ๊ฐ’ ์œ ์ง€ + .project(existingTab.getProject()) // ๊ธฐ์กด ๊ฐ’ ์œ ์ง€ + .frontSilence(concatUpdateRequestDto.getFrontSilence()) // ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’ + .status(concatUpdateRequestDto.getStatus()) // ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’ + .build(); concatTabRepository.save(updatedTab); return true; - } // bgmFile๋“ค๋งŒ ์ˆ˜์ • @Transactional public boolean updateBgmAudioFiles(Long tabSeq, List bgmFileSeqs) { // ConcatTab ์ฐพ๊ธฐ - ConcatTab concatTab = concatTabRepository.findById(tabSeq) - .orElseThrow(() -> new NoSuchElementException("ConcatTab not found with ID: " + tabSeq)); + ConcatTab concatTab = + concatTabRepository + .findById(tabSeq) + .orElseThrow( + () -> new NoSuchElementException("ConcatTab not found with ID: " + tabSeq)); if (bgmFileSeqs == null || bgmFileSeqs.isEmpty()) { // bgmFileSeqs๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด ๊ธฐ์กด bgmFiles ์ œ๊ฑฐ - concatTab.setBgmFiles(null); + concatTab.addBgmFile(new BgmFile()); } else { // bgmFileSeqs๋ฅผ ํ†ตํ•ด BgmFile ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ - List bgmFiles = bgmFileSeqs.stream() - .map(seq -> bgmFileRepository.findById(seq) - .orElseThrow(() -> new NoSuchElementException("BgmFile not found with ID: " + seq))) - .toList(); + List bgmFiles = + bgmFileSeqs.stream() + .map( + seq -> + bgmFileRepository + .findById(seq) + .orElseThrow( + () -> + new NoSuchElementException("BgmFile not found with ID: " + seq))) + .toList(); // ConcatTab์— ์ƒˆ๋กœ์šด BgmFile ๋ฆฌ์ŠคํŠธ ์„ค์ • - concatTab.setBgmFiles(bgmFiles); + concatTab.addBgmFile(bgmFiles); } // ์—…๋ฐ์ดํŠธ๋œ ConcatTab ์ €์žฅ concatTabRepository.save(concatTab); return true; } + + @Transactional + public ConcatTab getConcatTabBySeq(Long tabSeq) { + return concatTabRepository + .findById(tabSeq) + .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + tabSeq)); + } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java index 0255e31b..3c2dede7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java @@ -1,20 +1,20 @@ package com.oreo.finalproject_5re5_be.concat.service; - +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; -import com.oreo.finalproject_5re5_be.concat.dto.request.SelectedConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatUrlResponse; import com.oreo.finalproject_5re5_be.concat.entity.*; import com.oreo.finalproject_5re5_be.concat.repository.AudioFileRepository; import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; import com.oreo.finalproject_5re5_be.concat.repository.ConcatResultRepository; import com.oreo.finalproject_5re5_be.concat.repository.MaterialAudioRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - import java.util.List; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Service; +@Log4j2 @RequiredArgsConstructor @Service public class MaterialAudioService { @@ -35,85 +35,97 @@ public BgmFile findBgmFileByConcatResultSeq(Long concatResultSeq) { // ๊ฒฐ๊ณผ์— ์‚ฌ์šฉ๋œ Material ํŒŒ์ผ ์กฐํšŒ public List findMaterialAudioFilesByConcatResultSeq(Long concatResultSeq) { return materialAudioRepository.findByConcatResultSeq(concatResultSeq).stream() - .map(material -> OriginAudioRequest.builder() - .seq(material.getAudioFile().getAudioFileSeq()) - .audioUrl(material.getAudioFile().getAudioUrl()) - .extension(material.getAudioFile().getExtension()) - .fileSize(material.getAudioFile().getFileSize()) - .fileLength(material.getAudioFile().getFileLength()) - .fileName(material.getAudioFile().getFileName()) - .build()) + .map( + material -> + OriginAudioRequest.builder() + .seq(material.getAudioFile().getAudioFileSeq()) + .audioUrl(material.getAudioFile().getAudioUrl()) + .extension(material.getAudioFile().getExtension()) + .fileSize(material.getAudioFile().getFileSize()) + .fileLength(material.getAudioFile().getFileLength()) + .fileName(material.getAudioFile().getFileName()) + .build()) .toList(); } - //๊ฒฐ๊ณผ๋ฌผseq๋กœ ๊ฒฐ๊ณผ๋ฌผurl์กฐํšŒ + // ๊ฒฐ๊ณผ๋ฌผseq๋กœ ๊ฒฐ๊ณผ๋ฌผurl์กฐํšŒ public String findResultAudioUrlByConcatResultSeq(Long concatResultSeq) { - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with seq: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with seq: " + concatResultSeq)); return concatResult.getAudioUrl(); } // 1๊ฐœ์˜ concatResult์™€ ๊ทธ์— ๋งค์นญ๋˜๋Š” 1๊ฐœ์˜ AudioFile์„ ์ €์žฅ (1๊ฐœ) public MaterialAudio saveMaterial(Long concatResultSeq, Long audioFileSeq) { // ConcatResult ์กฐํšŒ - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with id: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with id: " + concatResultSeq)); // AudioFile ์กฐํšŒ - AudioFile audioFile = audioFileRepository.findById(audioFileSeq) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with id: " + audioFileSeq)); + AudioFile audioFile = + audioFileRepository + .findById(audioFileSeq) + .orElseThrow( + () -> new IllegalArgumentException("AudioFile not found with id: " + audioFileSeq)); // MaterialAudio ์ƒ์„ฑ - MaterialAudio materialAudio = MaterialAudio.builder() - .concatResult(concatResult) - .audioFile(audioFile) - .build(); + MaterialAudio materialAudio = + MaterialAudio.builder().concatResult(concatResult).audioFile(audioFile).build(); - //๊ฐ์ฒด๋ฅผ ์ €์žฅ + // ๊ฐ์ฒด๋ฅผ ์ €์žฅ return materialAudioRepository.save(materialAudio); - } - // 1๊ฐœ์˜ concatResult์™€ ๊ทธ์— ๋งค์นญ๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ AudioFile์„ ์ €์žฅ (N๊ฐœ) - public List saveMaterials(Long concatResultSeq, List audioFileSeqs) { + public List saveMaterials(Long concatResultSeq, List audioFiles) { // ConcatResult ์กฐํšŒ - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with id: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with id: " + concatResultSeq)); // AudioFileSeq๋ฅผ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜์—ฌ MaterialAudio ์ƒ์„ฑ ๋ฐ ์ €์žฅ - return audioFileSeqs.stream() - .map(audioFileSeq -> { - // AudioFile ์กฐํšŒ - AudioFile audioFile = audioFileRepository.findById(audioFileSeq) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with id: " + audioFileSeq)); - - // MaterialAudio ์ƒ์„ฑ - MaterialAudio materialAudio = MaterialAudio.builder() - .concatResult(concatResult) - .audioFile(audioFile) - .build(); - - // ์ €์žฅ - return materialAudioRepository.save(materialAudio); - }) + return audioFiles.stream() + .map( + audioFile -> { + // MaterialAudio ์ƒ์„ฑ + MaterialAudio materialAudio = + MaterialAudio.builder().concatResult(concatResult).audioFile(audioFile).build(); + + // ์ €์žฅ + return materialAudioRepository.save(materialAudio); + }) .collect(Collectors.toList()); } - // concatResultSeq์™€ ๋งค์นญ๋˜๋Š” audioFile List ์กฐํšŒ public List findAudioFilesByConcatResultSeq(Long concatResultSeq) { - //MaterialAudio์—์„œ AudioFile ๋ฆฌ์ŠคํŠธ ์กฐํšŒ - List audioFiles = materialAudioRepository.findAudioFilesByConcatResult(concatResultSeq); + // MaterialAudio์—์„œ AudioFile ๋ฆฌ์ŠคํŠธ ์กฐํšŒ + List audioFiles = + materialAudioRepository.findAudioFilesByConcatResult(concatResultSeq); - //AudioFile -> ConcatUrlResponse ๋ณ€ํ™˜ + // AudioFile -> ConcatUrlResponse ๋ณ€ํ™˜ return audioFiles.stream() - .map(audioFile -> ConcatUrlResponse.builder() - .seq(audioFile.getAudioFileSeq()) - .url(audioFile.getAudioUrl()) - .build()) + .map( + audioFile -> + ConcatUrlResponse.builder() + .seq(audioFile.getAudioFileSeq()) + .url(audioFile.getAudioUrl()) + .build()) .collect(Collectors.toList()); - } // AudioFile๊ณผ ๋งค์นญ๋˜๋Š” concatResult List ์กฐํšŒ @@ -128,8 +140,7 @@ public void deleteMaterialsByConcatResultSeq(Long concatResultSeq) { // concatResult์˜ seq๋กœ ๋งค์นญ๋˜๋Š” audioFile seq๋“ค์„ ์กฐํšŒ public List findAudioFileSeqsByConcatResultSeq(Long concatResultSeq) { - return materialAudioRepository.findByConcatResultSeq(concatResultSeq) - .stream() + return materialAudioRepository.findByConcatResultSeq(concatResultSeq).stream() .map(materialAudio -> materialAudio.getAudioFile().getAudioFileSeq()) // AudioFile์˜ seq๋ฅผ ์ถ”์ถœ .collect(Collectors.toList()); } @@ -144,21 +155,65 @@ public boolean saveMaterialAudio(List materialAudios) { materialAudioRepository.saveAll(materialAudios); return true; } catch (Exception e) { - throw new IllegalArgumentException("์žฌ๋ฃŒ ์˜ค๋””์˜ค ์ €์žฅ ์‹คํŒจ"); + throw new IllegalArgumentException("์žฌ๋ฃŒ ์˜ค๋””์˜ค ์ €์žฅ ์‹คํŒจ", e); } } - // ๊ธฐ์กด ๊ธฐ๋Šฅ ์™ธ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ: SelectedConcatRowRequest ์ฒ˜๋ฆฌ - public void saveMaterialsForSelectedRows(SelectedConcatRowRequest selectedRows, ConcatUrlResponse concatResultResponse) { - List usedAudioFileSeqs = selectedRows.getRows().stream() - .map(SelectedConcatRowRequest.Row::getAudioUrl) // URL ์ถ”์ถœ - .map(audioFileRepository::findByAudioUrl) // URL๋กœ AudioFile ์กฐํšŒ - .map(audioFile -> audioFile.orElseThrow(() -> new IllegalArgumentException("AudioFile not found with URL: " + audioFile.get().getAudioUrl()))) - .map(AudioFile::getAudioFileSeq) // Seq ์ถ”์ถœ - .toList(); + public void saveMaterialsForConcatRows( + ConcatRowSaveRequestDto concatRows, ConcatUrlResponse concatResultResponse) { + Long concatResultSeq = concatResultResponse.getSeq(); + if (concatResultSeq == null) { + throw new IllegalArgumentException("ConcatResult seq is null, cannot save materials."); + } + + log.info("[saveMaterialsForConcatRows] Processing concatRows: {}", concatRows); + + List usedAudioFileSeqs = + concatRows.getConcatRowRequests().stream() + .map( + row -> { + Long seq = row.getOriginAudioRequest().getSeq(); + log.info("[saveMaterialsForConcatRows] Fetching AudioFile for seq: {}", seq); + + return audioFileRepository + .findByAudioFileSeq(seq) + .orElseThrow( + () -> + new IllegalArgumentException("AudioFile not found with seq: " + seq)); + }) + .toList(); + + log.info( + "[saveMaterialsForConcatRows] Saving materials with ConcatResult seq: {} and AudioFile seqs: {}", + concatResultSeq, + usedAudioFileSeqs); // ๊ธฐ์กด saveMaterials ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ €์žฅ saveMaterials(concatResultResponse.getSeq(), usedAudioFileSeqs); } + public void updateBgmFileWithConcatResult(String bgmFileUrl, Long concatResultSeq) { + // ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ + List bgmFiles = bgmFileRepository.findAllByAudioUrl(bgmFileUrl); + if (bgmFiles.isEmpty()) { + throw new IllegalArgumentException("BgmFile not found for URL: " + bgmFileUrl); + } + if (bgmFiles.size() > 1) { + log.warn("Multiple BGM files found for URL: {}. Using the first result.", bgmFileUrl); + } + + // ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฒ˜๋ฆฌ + BgmFile bgmFile = bgmFiles.get(0); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found for id: " + concatResultSeq)); + bgmFile.setConcatResult(concatResult); + bgmFileRepository.save(bgmFile); + + log.info("[updateBgmFileWithConcatResult] Updated BgmFile with ConcatResult: {}", bgmFile); + } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/bgm/BgmProcessor.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/bgm/BgmProcessor.java index 38ae4bb9..2921570d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/bgm/BgmProcessor.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/bgm/BgmProcessor.java @@ -4,26 +4,27 @@ import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; public class BgmProcessor { public static AudioInputStream prepareBgm(File bgmFile) throws IOException { try { - AudioResample resampler = new AudioResample(AudioFormats.STEREO_FORMAT_SR441_B32); // ๊ณ ์ •๋œ ๋ชฉํ‘œ ํฌ๋งท + AudioResample resampler = + new AudioResample(AudioFormats.STEREO_FORMAT_SR441_B32); // ๊ณ ์ •๋œ ๋ชฉํ‘œ ํฌ๋งท // 1. ํŒŒ์ผ ํฌ๋งท ๊ฒ€์‚ฌ if (AudioExtensionChecker.isSupported(bgmFile)) { System.out.println("BGM ํŒŒ์ผ์ด MP3 ํ˜•์‹์ž…๋‹ˆ๋‹ค. WAV๋กœ ๋ณ€ํ™˜ ์ค‘..."); byte[] wavBytes = AudioExtensionConverter.mp3ToWav(bgmFile); - AudioInputStream wavStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(wavBytes)); + AudioInputStream wavStream = + AudioSystem.getAudioInputStream(new ByteArrayInputStream(wavBytes)); // ๋ณ€ํ™˜ ํ›„์—๋„ ๋ฆฌ์ƒ˜ํ”Œ๋ง ์ˆ˜ํ–‰ return resampler.resample(wavStream); } else if (AudioExtensionChecker.isWavExtension(bgmFile)) { @@ -39,19 +40,15 @@ public static AudioInputStream prepareBgm(File bgmFile) throws IOException { } } - // BGM์ด ์ด๋ฏธ source๋ณด๋‹ค ๊ธธ ๊ฒฝ์šฐ ํ•„์š” - public static AudioInputStream trimBgm(AudioInputStream bgm, long targetFrames) throws IOException { + public static AudioInputStream trimBgm(AudioInputStream bgm, long targetFrames) + throws IOException { System.out.println("Trimming BGM to " + targetFrames + " frames."); - return new AudioInputStream( - bgm, - bgm.getFormat(), - Math.min(targetFrames, bgm.getFrameLength()) - ); + return new AudioInputStream(bgm, bgm.getFormat(), Math.min(targetFrames, bgm.getFrameLength())); } - - public static AudioInputStream extendBgm(AudioInputStream bgm, long targetFrames) throws IOException { + public static AudioInputStream extendBgm(AudioInputStream bgm, long targetFrames) + throws IOException { // BGM ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ byte[] bgmData = bgm.readAllBytes(); AudioFormat format = bgm.getFormat(); @@ -73,7 +70,8 @@ public static AudioInputStream extendBgm(AudioInputStream bgm, long targetFrames throw new IllegalStateException("Frames to add is zero or negative, check the input data."); } - System.out.println("Current Total Frames: " + totalFrames + ", Frames To Add: " + framesToAdd); + System.out.println( + "Current Total Frames: " + totalFrames + ", Frames To Add: " + framesToAdd); // ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ extendedStream.write(bgmData, 0, (int) (framesToAdd * frameSize)); @@ -84,10 +82,7 @@ public static AudioInputStream extendBgm(AudioInputStream bgm, long targetFrames // ์ƒˆ๋กœ์šด AudioInputStream ์ƒ์„ฑ return new AudioInputStream( - new ByteArrayInputStream(extendedStream.toByteArray()), - format, - totalFrames - ); + new ByteArrayInputStream(extendedStream.toByteArray()), format, totalFrames); } public static long calculateTargetFrames(AudioInputStream audioStream) throws IOException { @@ -107,25 +102,25 @@ public static long calculateTargetFrames(AudioInputStream audioStream) throws IO } // BGM ๊ธธ์ด ์กฐ์ • ๋กœ์ง ๋ถ„๋ฆฌ - public static AudioInputStream adjustBgmLength(AudioInputStream bgmStream, long targetFrames, long bgmFrames) throws IOException { + public static AudioInputStream adjustBgmLength( + AudioInputStream bgmStream, long targetFrames, long bgmFrames) throws IOException { return bgmFrames > targetFrames ? BgmProcessor.trimBgm(bgmStream, targetFrames) : BgmProcessor.extendBgm(bgmStream, targetFrames); } - - public static AudioInputStream mixAudio(AudioInputStream source, AudioInputStream bgm) throws IOException { + public static AudioInputStream mixAudio(AudioInputStream source, AudioInputStream bgm) + throws IOException { AudioFormat format = source.getFormat(); // ์ฒซ ๋ฒˆ์งธ ์˜ค๋””์˜ค ํŒŒ์ผ๊ณผ ๋‘ ๋ฒˆ์งธ ์˜ค๋””์˜ค ํŒŒ์ผ์˜ ๊ธธ์ด๋ฅผ ์–ป์Œ byte[] buffer1 = source.readAllBytes(); byte[] buffer2 = bgm.readAllBytes(); - // ๋ฏน์‹ฑ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ฒ„ํผ ์ƒ์„ฑ byte[] mixedBuffer = new byte[buffer1.length]; // ๋‘ ์˜ค๋””์˜ค ํŒŒ์ผ์„ ์ƒ˜ํ”Œ ๋‹จ์œ„๋กœ ๋ฏน์‹ฑ - for (int i = 0; i < buffer1.length; i += 2) { //16๋น„ํŠธ ๊ธฐ์ค€ + for (int i = 0; i < buffer1.length; i += 2) { // 16๋น„ํŠธ ๊ธฐ์ค€ // ๊ฐ ๋ฒ„ํผ์—์„œ ์ƒ˜ํ”Œ์„ ๊ฐ€์ ธ์˜ด short sample1 = (short) ((buffer1[i + 1] << 8) | (buffer1[i] & 0xFF)); short sample2 = (short) ((buffer2[i + 1] << 8) | (buffer2[i] & 0xFF)); @@ -140,11 +135,9 @@ public static AudioInputStream mixAudio(AudioInputStream source, AudioInputStrea // ๋ฏน์‹ฑ๋œ ์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ๋กœ AudioInputStream ์ƒ์„ฑ ByteArrayInputStream bais = new ByteArrayInputStream(mixedBuffer); - AudioInputStream mixedAudioStream = new AudioInputStream(bais, format, mixedBuffer.length / format.getFrameSize()); + AudioInputStream mixedAudioStream = + new AudioInputStream(bais, format, mixedBuffer.length / format.getFrameSize()); return mixedAudioStream; - } - - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/AudioProperties.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/AudioProperties.java index bf92f02a..407a8b4e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/AudioProperties.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/AudioProperties.java @@ -4,18 +4,17 @@ /** * @apiNote ๋ฌด์Œ๊ตฌ๊ฐ„์„ ํฌํ•จํ•œ ์˜ค๋””์˜ค ๋ณ‘ํ•ฉ์„ ์œ„ํ•œ ๋ ˆ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค. - * * @param audioInputStream * @param silence */ public record AudioProperties(AudioInputStream audioInputStream, float silence) { - /** * @apiNote ์ง€์ •ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ {@code AudioProperties} ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. * @return List */ - public static AudioProperties parsAudioProperties(AudioInputStream audioInputStream, float silence) { + public static AudioProperties parsAudioProperties( + AudioInputStream audioInputStream, float silence) { return new AudioProperties(audioInputStream, silence); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/Concatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/Concatenator.java index 4a40a7f8..9a63d161 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/Concatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/Concatenator.java @@ -1,20 +1,17 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import javax.sound.sampled.AudioInputStream; /** - * {@code Concatenator} ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค ์ž…๋‹ˆ๋‹ค. - *
+ * {@code Concatenator} ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค ์ž…๋‹ˆ๋‹ค.
* ๋ชจ๋“  Concatenator๋Š” ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. */ public interface Concatenator { - ByteArrayOutputStream concatenate(List audioStreams) throws IOException; void setBufferSize(int bufferSize); } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java index aaed32bf..6207cf3b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java @@ -1,28 +1,49 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; import com.oreo.finalproject_5re5_be.global.component.audio.BeepMaker; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; - +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; /** * @apiNote ์Œ์„ฑ๊ฐ„ ๊ฐ„๊ฒฉ์ด ์žˆ๋Š” ์˜ค๋””์˜ค๋ฅผ ์œ„ํ•จ ๋ณ‘ํ•ฉ ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ž…๋‹ˆ๋‹ค.
- * */ public interface IntervalConcatenator extends Concatenator { - ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) throws IOException; + ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) + throws IOException; - //๊ณตํ†ต IntervalConcatenator์— ํ•„์š”ํ•œ ๋กœ์ง์„ ๋ถ„๋ฆฌ - static List prepareAudioStreams(List audioStreams, AudioFormat audioFormat) { + // ๊ณตํ†ต IntervalConcatenator์— ํ•„์š”ํ•œ ๋กœ์ง์„ ๋ถ„๋ฆฌ + static List prepareAudioStreams( + List audioStreams, AudioFormat audioFormat) { List result = new ArrayList<>(); + int index = 1; // ๋กœ๊ทธ๋ฅผ ์œ„ํ•œ ์ธ๋ฑ์Šค ๊ด€๋ฆฌ + for (AudioProperties audioProperties : audioStreams) { - result.add(audioProperties.audioInputStream());//์˜ค๋””์˜ค ํŒŒ์ผ ๋„ฃ๊ธฐ - result.add(BeepMaker.makeSound(audioProperties.silence() * 1000, audioFormat));// ๋ฌด์Œ๊ตฌ๊ฐ„ ์˜ค๋””์˜ค ๋งŒ๋“ค์–ด์„œ ๋„ฃ๊ธฐ + AudioInputStream audioStream = + audioProperties.audioInputStream(); // AudioProperties์—์„œ AudioStream ์ถ”์ถœ + + // row audio ๊ด€๋ จ log + System.out.printf( + "[prepareAudioStreams] ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆผ ์ถ”๊ฐ€: index=%d, frameLength=%d, format=%s%n", + index, audioStream.getFrameLength(), audioStream.getFormat()); + + result.add(audioProperties.audioInputStream()); // ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆผ ์ถ”๊ฐ€ + + // ๋ฌด์Œ ๊ตฌ๊ฐ„ ์ƒ์„ฑ ๋ฐ ์ถ”๊ฐ€ + AudioInputStream silenceStream = + BeepMaker.makeSound(audioProperties.silence() * 1000, audioFormat); + + // row ๋ฌด์Œ๊ตฌ๊ฐ„ ๊ด€๋ จ log + System.out.printf( + "[prepareAudioStreams] ๋ฌด์Œ ๊ตฌ๊ฐ„ ์ถ”๊ฐ€: index=%d, duration=%dms, frameLength=%d%n", + index, (int) (audioProperties.silence() * 1000), silenceStream.getFrameLength()); + + result.add(silenceStream); + + index++; // ์ธ๋ฑ์Šค ์ฆ๊ฐ€ } return result; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoConcatenator.java index 48be2b48..6e3fffba 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoConcatenator.java @@ -1,12 +1,13 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; - -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import javax.sound.sampled.AudioInputStream; /** + * + * * * * @@ -28,14 +29,15 @@ public class MonoConcatenator implements Concatenator { @Override public ByteArrayOutputStream concatenate(List audioStreams) throws IOException { - boolean mono = audioStreams.stream().allMatch(as -> as.getFormat().getChannels() == 1);//๋ชจ๋…ธ ํฌ๋งท์ธ์ง€ ํ™•์ธ + boolean mono = + audioStreams.stream().allMatch(as -> as.getFormat().getChannels() == 1); // ๋ชจ๋…ธ ํฌ๋งท์ธ์ง€ ํ™•์ธ if (mono) { - return merge(audioStreams);//๋ณ‘ํ•ฉ + return merge(audioStreams); // ๋ณ‘ํ•ฉ } throw new IllegalArgumentException("์ž˜๋ชป๋œ ํฌ๋งท ์ž…๋‹ˆ๋‹ค."); } - //์˜ค๋””์˜ค ํŒŒ์ผ ๋ณ‘ํ•ฉ ๋ฉ”์†Œ๋“œ + // ์˜ค๋””์˜ค ํŒŒ์ผ ๋ณ‘ํ•ฉ ๋ฉ”์†Œ๋“œ private ByteArrayOutputStream merge(List audioStreams) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int bytesRead; @@ -49,6 +51,6 @@ private ByteArrayOutputStream merge(List audioStreams) throws @Override public void setBufferSize(int bufferSize) { - buffer = new byte[bufferSize];//๋ฒ„ํผ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ + buffer = new byte[bufferSize]; // ๋ฒ„ํผ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoIntervalConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoIntervalConcatenator.java index 8f0d8a0c..fad20d87 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoIntervalConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoIntervalConcatenator.java @@ -1,21 +1,20 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; +import static com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator.prepareAudioStreams; + import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.global.component.audio.BeepMaker; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; - -import static com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator.prepareAudioStreams; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; /** * @apiNote ๋ชจ๋…ธํฌ๋งท์˜ ๋ฌด์Œ๊ตฌ๊ฐ„์„ ํฌํ•จํ•œ ๋ณ‘ํ•ฉ์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค.
- * ์˜ค๋””์˜ค ํŒŒ์ผ์€ ๋ณ‘ํ•ฉ ํ•˜๋ ค๋Š” ํฌ๋งท ํƒ€์ž…๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๊ฐ™์•„์ง€๋„๋ก ๋ฆฌ์ƒ˜ํ”Œ๋ง ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
- * WAVE ํŒŒ์ผ๋งŒ์„ ์ง€์›ํ•˜๋ฉฐ mp3ํŒŒ์ผ์˜ ๊ฒฝ์šฐ {@link AudioExtensionConverter} ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WAVE ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. + * ์˜ค๋””์˜ค ํŒŒ์ผ์€ ๋ณ‘ํ•ฉ ํ•˜๋ ค๋Š” ํฌ๋งท ํƒ€์ž…๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๊ฐ™์•„์ง€๋„๋ก ๋ฆฌ์ƒ˜ํ”Œ๋ง ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+ * WAVE ํŒŒ์ผ๋งŒ์„ ์ง€์›ํ•˜๋ฉฐ mp3ํŒŒ์ผ์˜ ๊ฒฝ์šฐ {@link AudioExtensionConverter} ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WAVE ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * @see AudioResample * @see AudioExtensionConverter */ @@ -34,7 +33,8 @@ public MonoIntervalConcatenator(AudioFormat audioFormat) { * @throws IOException */ @Override - public ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) throws IOException { + public ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) + throws IOException { List list = prepareAudioStreams(audioStreams, AUDIO_FORMAT); list.add(0, BeepMaker.makeSound(start * 1000, AUDIO_FORMAT)); return super.concatenate(list); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoConcatenator.java index 4c8c541f..b854b705 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoConcatenator.java @@ -1,21 +1,21 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; import com.oreo.finalproject_5re5_be.global.component.audio.AudioChannels; - -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import javax.sound.sampled.AudioInputStream; public class StereoConcatenator implements Concatenator { private byte[] buffer = new byte[2048]; @Override public ByteArrayOutputStream concatenate(List audioStreams) throws IOException { - boolean mono = audioStreams.stream() - .allMatch(as -> as.getFormat().getChannels() == AudioChannels.STEREO);//์Šคํ…Œ๋ ˆ์˜ค ํฌ๋งท ํ™•์ธ + boolean mono = + audioStreams.stream() + .allMatch(as -> as.getFormat().getChannels() == AudioChannels.STEREO); // ์Šคํ…Œ๋ ˆ์˜ค ํฌ๋งท ํ™•์ธ if (mono) { - return merge(audioStreams);//๋ณ‘ํ•ฉ + return merge(audioStreams); // ๋ณ‘ํ•ฉ } throw new IllegalArgumentException("์ž˜๋ชป๋œ ํฌ๋งท ์ž…๋‹ˆ๋‹ค."); } @@ -25,7 +25,7 @@ public void setBufferSize(int bufferSize) { buffer = new byte[bufferSize]; } - //์˜ค๋””์˜ค ํŒŒ์ผ ๋ณ‘ํ•ฉ ๋ฉ”์†Œ๋“œ + // ์˜ค๋””์˜ค ํŒŒ์ผ ๋ณ‘ํ•ฉ ๋ฉ”์†Œ๋“œ private ByteArrayOutputStream merge(List audioStreams) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int bytesRead; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java index 953cb71a..45ef16a9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java @@ -1,25 +1,25 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; +import static com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator.prepareAudioStreams; + import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.global.component.audio.BeepMaker; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; - -import static com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator.prepareAudioStreams; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import lombok.extern.log4j.Log4j2; /** * @apiNote ์Šคํ…Œ๋ ˆ์˜ค ํฌ๋งท์˜ ๋ฌด์Œ๊ตฌ๊ฐ„์„ ํฌํ•จํ•œ ๋ณ‘ํ•ฉ์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค.
- * ์˜ค๋””์˜ค ํŒŒ์ผ์€ ๋ณ‘ํ•ฉ ํ•˜๋ ค๋Š” ํฌ๋งท ํƒ€์ž…๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๊ฐ™์•„์ง€๋„๋ก ๋ฆฌ์ƒ˜ํ”Œ๋ง ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
- * WAVE ํŒŒ์ผ๋งŒ์„ ์ง€์›ํ•˜๋ฉฐ mp3ํŒŒ์ผ์˜ ๊ฒฝ์šฐ {@link AudioExtensionConverter} ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WAVE ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. + * ์˜ค๋””์˜ค ํŒŒ์ผ์€ ๋ณ‘ํ•ฉ ํ•˜๋ ค๋Š” ํฌ๋งท ํƒ€์ž…๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๊ฐ™์•„์ง€๋„๋ก ๋ฆฌ์ƒ˜ํ”Œ๋ง ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+ * WAVE ํŒŒ์ผ๋งŒ์„ ์ง€์›ํ•˜๋ฉฐ mp3ํŒŒ์ผ์˜ ๊ฒฝ์šฐ {@link AudioExtensionConverter} ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WAVE ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * @see AudioResample * @see AudioExtensionConverter - * */ +@Log4j2 public class StereoIntervalConcatenator extends StereoConcatenator implements IntervalConcatenator { private final AudioFormat AUDIO_FORMAT; @@ -36,9 +36,20 @@ public StereoIntervalConcatenator(AudioFormat audioFormat) { * @throws IOException */ @Override - public ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) throws IOException { + public ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) + throws IOException { List list = prepareAudioStreams(audioStreams, AUDIO_FORMAT); + + AudioInputStream initialSilenceStream = BeepMaker.makeSound(start * 1000, AUDIO_FORMAT); + + // ๋กœ๊ทธ ์ถ”๊ฐ€: ๋ฌด์Œ ๊ตฌ๊ฐ„ (๋งจ์•ž) ์ƒ์„ฑ + log.info( + "[intervalConcatenate] ๋งจ์•ž ๋ฌด์Œ ๊ตฌ๊ฐ„ ์ถ”๊ฐ€: duration={}ms, frameLength={}", + (int) (start * 1000), + initialSilenceStream.getFrameLength()); + list.add(0, BeepMaker.makeSound(start * 1000, AUDIO_FORMAT)); + return super.concatenate(list); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/AudioFileHelper.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/AudioFileHelper.java index 74480f4c..e041223e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/AudioFileHelper.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/AudioFileHelper.java @@ -4,14 +4,12 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.transaction.Transactional; -import org.springframework.stereotype.Component; - import java.util.List; +import org.springframework.stereotype.Component; @Component public class AudioFileHelper { - @PersistenceContext - private EntityManager entityManager; + @PersistenceContext private EntityManager entityManager; @Transactional public void batchInsert(List rows) { @@ -25,5 +23,4 @@ public void batchInsert(List rows) { entityManager.flush(); entityManager.clear(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatRowHelper.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatRowHelper.java index 8c4fa66e..88615ca5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatRowHelper.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatRowHelper.java @@ -4,14 +4,12 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.transaction.Transactional; -import org.springframework.stereotype.Component; - import java.util.List; +import org.springframework.stereotype.Component; @Component public class ConcatRowHelper { - @PersistenceContext - private EntityManager entityManager; + @PersistenceContext private EntityManager entityManager; @Transactional public void batchInsert(List rows) { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java index 5e9be3c1..3da76704 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java @@ -4,11 +4,11 @@ import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; -import org.springframework.stereotype.Component; - +import java.util.ArrayList; import java.util.List; import java.util.Objects; - +import java.util.Optional; +import org.springframework.stereotype.Component; /** * @apiNote ConcatTabService์˜ ๋กœ์ง์„ ๋ฐ–์œผ๋กœ ๋ถ„๋ฆฌํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. @@ -16,15 +16,16 @@ @Component public class ConcatTabHelper { - //ConcatTab์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ Dto์— ๋‹ด์•„ ๋ฆฌํ„ด + // ConcatTab์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ Dto์— ๋‹ด์•„ ๋ฆฌํ„ด public ConcatTabResponseDto prepareConcatTab(ConcatTab concatTab, Long memberSeq) { // ์‚ฌ์šฉ์ž ๊ฒ€์ฆ if (validateMemberCurrent(concatTab, memberSeq)) { // bgmFile๊ฐ์ฒด๋“ค์„ ๊ทธ๋Œ€๋กœ ํ”„๋ก ํŠธ์—๊ฒŒ ์ค„ ์ˆ˜ ์—†์œผ๋‹ˆ bgmFiles๋ฅผ OriginAudioRequest(DTO)๋กœ ๋ณ€ํ™˜ - List bgmList = concatTab.getBgmFiles().stream() - .map(this::convertToOriginAudioRequest) - .toList(); + List bgmList = + Optional.ofNullable(concatTab.getBgmFiles()).orElse(new ArrayList<>()).stream() + .map(this::convertToOriginAudioRequest) + .toList(); return ConcatTabResponseDto.builder() .tabId(concatTab.getProjectId()) @@ -33,18 +34,16 @@ public ConcatTabResponseDto prepareConcatTab(ConcatTab concatTab, Long memberSeq .bgmFileList(bgmList) .build(); } - throw new IllegalArgumentException("์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์†Œ์œ ํ•œ ์‚ฌ์šฉ์ž : " - + concatTab.getProject().getMember()); + throw new IllegalArgumentException("์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค."); } - public boolean validateMemberCurrent(ConcatTab concatTab, Long memberSeq) { if (Objects.equals(concatTab.getProject().getMember().getSeq(), memberSeq)) { return true; } - throw new IllegalArgumentException("์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์†Œ์œ ํ•œ ์‚ฌ์šฉ์ž : " - + concatTab.getProject().getMember()); + throw new IllegalArgumentException( + "์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์†Œ์œ ํ•œ ์‚ฌ์šฉ์ž : " + concatTab.getProject().getMember()); } // BgmFile์„ OriginAudioRequest๋กœ ๋ณ€ํ™˜ @@ -58,5 +57,4 @@ private OriginAudioRequest convertToOriginAudioRequest(BgmFile bgmFile) { .fileName(bgmFile.getFileName()) .build(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java new file mode 100644 index 00000000..aa1b5f80 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java @@ -0,0 +1,137 @@ +package com.oreo.finalproject_5re5_be.concat.service.lambda; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.oreo.finalproject_5re5_be.concat.dto.ConcatResultDto; +import com.oreo.finalproject_5re5_be.concat.dto.lambda.AudioFormatDto; +import com.oreo.finalproject_5re5_be.concat.dto.lambda.LambdaConcatRequest; +import com.oreo.finalproject_5re5_be.concat.dto.lambda.response.LambdaConcatResultDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequestDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; +import com.oreo.finalproject_5re5_be.concat.entity.AudioFile; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; +import com.oreo.finalproject_5re5_be.concat.entity.MaterialAudio; +import com.oreo.finalproject_5re5_be.concat.service.ConcatResultService; +import com.oreo.finalproject_5re5_be.concat.service.MaterialAudioService; +import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +@RequiredArgsConstructor +public class LambdaConcatService { + + private final ConcatResultService concatResultService; + private final MaterialAudioService materialAudioService; + private final RestTemplate restTemplate; + + // S3 ์ €์žฅ๊นŒ์ง€ ์™„๋ฃŒ๋œ ์ƒํƒœ + // ํ•ด์•ผํ•˜๋Š”๊ฑฐ + // ์žฌ๋ฃŒ ์˜ค๋””์˜ค DB ์ €์žฅ + // ๊ฒฐ๊ณผ ์˜ค๋””์˜ค DB ์ €์žฅ + // ๋ณ‘ํ•ฉ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ + public List concatOnLambda( + ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto audioRequests) { + LambdaConcatRequest lambdaConcatRequest = + LambdaConcatRequest.builder() + .concatTabResponseDto(concatTabResponseDto) + .audioFormatDto(new AudioFormatDto(AudioFormats.STEREO_FORMAT_SR441_B16)) + .audios(audioRequests.getConcatRowRequests()) + .fileName(audioRequests.getFileName()) + .build(); + + List list = lambdaConcatRequest(lambdaConcatRequest); + + List concatResults = getConcatResults(concatTabResponseDto, list); + + return getConcatResultDtos(concatResults); + } + + private static List getConcatResultDtos(List concatResults) { + return concatResults.stream() + .map( + concatResult -> + ConcatResultDto.builder() + .concatResultSequence(concatResult.getConcatResultSequence()) + .audioUrl(concatResult.getAudioUrl()) + .fileName(concatResult.getFileName()) + .fileLength(concatResult.getFileLength()) + .fileSize(concatResult.getFileSize()) + .extension(concatResult.getExtension()) + .seperated(concatResult.getSeperated()) + .processId(concatResult.getProcessId()) + .build()) + .toList(); + } + + private List lambdaConcatRequest(LambdaConcatRequest lambdaConcatRequest) { + Object response = + restTemplate.postForObject( + "https://bewpsh81xa.execute-api.ap-northeast-2.amazonaws.com/default/Test", // Lambda + // URL + lambdaConcatRequest, + Object.class); + + if (response == null) { + throw new IllegalArgumentException("์˜ค๋””์˜ค ๋ณ‘ํ•ฉ ์‹คํŒจ : ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค."); + } + + // ObjectMapper๋ฅผ ์‚ฌ์šฉํ•ด JSON์„ List๋กœ ๋ณ€ํ™˜ + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.convertValue(response, new TypeReference<>() {}); + } + + private List getConcatResults( + ConcatTabResponseDto concatTabResponseDto, List list) { + // ์žฌ๋ฃŒ ์˜ค๋””์˜ค์™€ ๊ฒฐ๊ณผ ์ €์žฅ + /* + * ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋‚˜๋ˆ ์ ธ ์˜ฌ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ + * ๊ฒฐ๊ณผ ํ•˜๋‚˜๋‹น ์žฌ๋ฃŒ ์˜ค๋””์˜ค ์—ฌ๋Ÿฌ๊ฐœ + * List ํ•˜๋‚˜๋Š” ๋‚˜๋ˆ ์ ธ ์˜จ ๊ฒฐ๊ณผ ์˜ค๋””์˜ค ํ•˜๋‚˜๋ฅผ ๋ณ€ํ™˜ ํ•œ ๊ฐ’ + * */ + List concatResults = new ArrayList<>(); + List> materials = + list.stream() + .map( + result -> { + ConcatResult concatResult = of(result, concatTabResponseDto); + concatResults.add(concatResult); + List processed = result.getProcessed(); + return processed.stream() + .map( + process -> + MaterialAudio.builder() + .concatResult(concatResult) + .audioFile( + AudioFile.builder().audioFileSeq(process.getSeq()).build()) + .method("NORMAL") + .build()) + .toList(); + }) + .toList(); + + materials.forEach(materialAudioService::saveMaterialAudio); + return concatResults; + } + + public ConcatResult of( + LambdaConcatResultDto concatResult, ConcatTabResponseDto concatTabResponseDto) { + ConcatResult build = + ConcatResult.builder() + .concatTab(ConcatTab.builder().projectId(concatTabResponseDto.getTabId()).build()) + .fileName(concatResult.getInfo().getFileName()) + .extension(concatResult.getInfo().getContentType()) + .fileSize(concatResult.getInfo().getContentSize()) + .fileLength(concatResult.getInfo().getContentLength()) + .audioUrl(concatResult.getS3Url()) + .processId(concatResult.getProcessId()) + .seperated(concatResult.getI()) + .build(); + return concatResultService.saveConcatResult(build); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/AudioInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/AudioInfo.java index 04e8bb10..cc77cdae 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/AudioInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/AudioInfo.java @@ -2,21 +2,20 @@ import com.mpatric.mp3agic.Mp3File; import com.oreo.finalproject_5re5_be.global.dto.response.AudioFileInfo; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import java.io.File; import java.util.ArrayList; import java.util.List; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; @Slf4j @Component public class AudioInfo { - //ํŒŒ์ผ ์ด๋ฆ„,๊ธธ์ด,ํฌ๊ธฐ,ํ™•์žฅ์ž ์ถ”์ถœ ๋ฉ”์„œ๋“œ + // ํŒŒ์ผ ์ด๋ฆ„,๊ธธ์ด,ํฌ๊ธฐ,ํ™•์žฅ์ž ์ถ”์ถœ ๋ฉ”์„œ๋“œ public AudioFileInfo extractAudioFileInfo(MultipartFile audioFile) { String fileName = audioFile.getOriginalFilename(); String fileSize = String.valueOf(audioFile.getSize()); @@ -43,8 +42,8 @@ public AudioFileInfo extractAudioFileInfo(MultipartFile audioFile) { fileLength = Math.toIntExact(getWavFileDuration(tempFile)); } - boolean delete = tempFile.delete();// ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ - if (!delete){ + boolean delete = tempFile.delete(); // ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ + if (!delete) { throw new RuntimeException("์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ ์‹คํŒจ"); } } catch (Exception e) { @@ -86,24 +85,26 @@ public List extractAudioFileInfo(List audioFiles) fileLength = Math.toIntExact(getWavFileDuration(tempFile)); } - boolean delete = tempFile.delete();// ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ - if (!delete){ + boolean delete = tempFile.delete(); // ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ + if (!delete) { throw new RuntimeException("์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ ์‹คํŒจ"); } } catch (Exception e) { log.error("์˜ค๋””์˜ค ํŒŒ์ผ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: ", e); } - audioFileInfos.add(AudioFileInfo.builder() - .name(fileName) - .size(fileSize) - .length(fileLength) - .extension(fileExtension) - .build()); + audioFileInfos.add( + AudioFileInfo.builder() + .name(fileName) + .size(fileSize) + .length(fileLength) + .extension(fileExtension) + .build()); } return audioFileInfos; } - //wav ํŒŒ์ผ ์ผ๊ฒฝ์šฐ ํŒŒ์ผ ๊ธธ์ด ์ถ”์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ + + // wav ํŒŒ์ผ ์ผ๊ฒฝ์šฐ ํŒŒ์ผ ๊ธธ์ด ์ถ”์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ private long getWavFileDuration(File wavFile) { try (AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(wavFile)) { AudioFormat format = audioInputStream.getFormat(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/ByteArrayMultipartFile.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/ByteArrayMultipartFile.java index 18bce6a2..54de3754 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/ByteArrayMultipartFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/ByteArrayMultipartFile.java @@ -1,10 +1,10 @@ package com.oreo.finalproject_5re5_be.global.component; -import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import org.springframework.web.multipart.MultipartFile; public class ByteArrayMultipartFile implements MultipartFile { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/MethodTime.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/MethodTime.java new file mode 100644 index 00000000..50aea877 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/MethodTime.java @@ -0,0 +1,45 @@ +package com.oreo.finalproject_5re5_be.global.component; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StopWatch; + +@Aspect +@Component +public class MethodTime { + private static final Logger log = LoggerFactory.getLogger(MethodTime.class); + + @Around( + "execution(* com.oreo.finalproject_5re5_be.code.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.concat.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.member.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.tts.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.vc.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.project.controller.*.*(..))") + public Object executionAspect(ProceedingJoinPoint joinPoint) { + StopWatch stopWatch = new StopWatch(); + try { + stopWatch.start(); + + return joinPoint.proceed(); + } catch (Throwable e) { + log.error( + "Exception in method [{}]: {}", + joinPoint.getSignature().toShortString(), + e.getMessage(), + e); + throw new RuntimeException( + "AOP ์‹œ๊ฐ„ ์ธก์ • ์ฒ˜๋ฆฌ ์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ: " + joinPoint.getSignature().toShortString(), e); + } finally { + stopWatch.stop(); + log.info( + "์‹œ๊ฐ„์ธก์ • time for method [{}]: {} ms", + joinPoint.getSignature().toShortString(), + stopWatch.getTotalTimeMillis()); + } + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java index 43feff48..699b4687 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java @@ -8,13 +8,6 @@ import com.amazonaws.services.s3.model.S3ObjectInputStream; import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.vc.dto.request.VcUrlRequest; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import javax.sound.sampled.*; import java.io.*; import java.net.MalformedURLException; import java.net.URL; @@ -22,6 +15,12 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import javax.sound.sampled.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; @Component @Slf4j @@ -36,7 +35,6 @@ public S3Service(AmazonS3 s3Client) { @Value("${aws.s3.bucket}") private String buketName; - public String upload(MultipartFile file, String dirName) { return uploadSingleFile(file, dirName); } @@ -70,7 +68,6 @@ public List downloadFile(List vcUrlRequest) throws IOExcepti return files; } - public List upload(List files, String dirName) { if (files.isEmpty()) { throw new IllegalArgumentException("ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค"); @@ -119,20 +116,15 @@ private String generateFileKey(String dirName, String originalFilename) { } // PutObjectRequest ์ƒ์„ฑ - private PutObjectRequest createPutObjectRequest(MultipartFile file, String key, ObjectMetadata objectMetadata) { + private PutObjectRequest createPutObjectRequest( + MultipartFile file, String key, ObjectMetadata objectMetadata) { try { - return new PutObjectRequest( - buketName, - key, - file.getInputStream(), - objectMetadata - ); + return new PutObjectRequest(buketName, key, file.getInputStream(), objectMetadata); } catch (IOException e) { throw new IllegalArgumentException("์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์—…๋กœ๋“œ ๋ถˆ๊ฐ€!", e); } } - /** * S3์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋กœ์ปฌ์— ์ €์žฅ * @@ -176,10 +168,8 @@ private String extractFileKeyFromUrl(String url) { return "vc/src/" + url.substring(url.lastIndexOf("/") + 1); } - /** - * File folder = new File("๊ฒฝ๋กœ") - * ํŒŒ์ผ ์‚ญ์ œ + * File folder = new File("๊ฒฝ๋กœ") ํŒŒ์ผ ์‚ญ์ œ * * @param folder */ @@ -195,23 +185,26 @@ public void deleteFolder(File folder) { } else { // ํŒŒ์ผ ์‚ญ์ œ if (!file.delete()) { - log.error("ํŒŒ์ผ ์‚ญ์ œ ์‹คํŒจ: {}" ,file.getAbsolutePath()); + log.error("ํŒŒ์ผ ์‚ญ์ œ ์‹คํŒจ: {}", file.getAbsolutePath()); } } } } // ํด๋” ์‚ญ์ œ if (!folder.delete()) { - log.error("ํด๋” ์‚ญ์ œ ์‹คํŒจ: {}" , folder.getAbsolutePath()); + log.error("ํด๋” ์‚ญ์ œ ์‹คํŒจ: {}", folder.getAbsolutePath()); } } else { log.error("ํด๋”๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ: {} ", folder.getAbsolutePath()); } } - - public String upload(InputStream audioInputStream, String dirName, String fileName - , long fileSize, String contentType) { + public String upload( + InputStream audioInputStream, + String dirName, + String fileName, + long fileSize, + String contentType) { if (audioInputStream == null) { throw new IllegalArgumentException("AudioInputStream์ด null์ž…๋‹ˆ๋‹ค."); } @@ -230,12 +223,12 @@ public String upload(InputStream audioInputStream, String dirName, String fileNa // S3์— ์—…๋กœ๋“œ ์š”์ฒญ try (InputStream inputStream = audioInputStream) { - PutObjectRequest request = new PutObjectRequest( - buketName, // S3 ๋ฒ„ํ‚ท ์ด๋ฆ„ - key, // ์ €์žฅ ๊ฒฝ๋กœ(key) - inputStream, - objectMetadata - ); + PutObjectRequest request = + new PutObjectRequest( + buketName, // S3 ๋ฒ„ํ‚ท ์ด๋ฆ„ + key, // ์ €์žฅ ๊ฒฝ๋กœ(key) + inputStream, + objectMetadata); // S3 ๋ฒ„ํ‚ท์— ๊ฐ์ฒด ์—…๋กœ๋“œ s3Client.putObject(request); @@ -247,19 +240,27 @@ public String upload(InputStream audioInputStream, String dirName, String fileNa return s3Client.getUrl(buketName, key).toString(); } - public static AudioInputStream load(String s3Url) { try { URL url = new URL(s3Url); AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); + log.info("[load] S3 ์ €์žฅ์†Œ์—์„œ URL audioInputStream ๊ฐ€์ ธ์˜ค๊ธฐ: {}", s3Url); + + // ์›๋ณธ ํฌ๋งท ๋กœ๊ทธ + log.info("[load] MP3 to WAV ํ•˜๊ธฐ ์ „, ์˜ค๋ฆฌ์ง€๋„ ํฌ๋งท: {}", audioInputStream.getFormat()); + byte[] bytes = AudioExtensionConverter.mp3ToWav(audioInputStream); + log.info("[load] S3์—์„œ ๊บผ๋‚ธ URL MP3๋ฅผ WAV๋กœ ๋ณ€ํ™˜. bytes.length: {} bytes", bytes.length); return AudioSystem.getAudioInputStream(new ByteArrayInputStream(bytes)); } catch (MalformedURLException e) { + log.error("Invalid S3 URL: {}", s3Url, e); throw new IllegalArgumentException("์ž˜๋ชป๋œ URL์ž…๋‹ˆ๋‹ค"); } catch (IOException e) { + log.error("Error reading audio file from S3 URL: {}", s3Url, e); throw new IllegalArgumentException("์˜ค๋””์˜ค ํŒŒ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค."); } catch (UnsupportedAudioFileException e) { + log.error("Unsupported audio format at S3 URL: {}", s3Url, e); throw new IllegalArgumentException("์ง€์›ํ•˜์ง€ ์•Š๋Š” ์˜ค๋””์˜ค ํ˜•์‹์ž…๋‹ˆ๋‹ค"); } } @@ -269,12 +270,12 @@ public void deleteFile(String buketName, String key) { try { s3Client.deleteObject(buketName, key); } catch (SdkClientException e) { - throw new RuntimeException("S3 ํŒŒ์ผ ์‚ญ์ œ ์š”์ฒญ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ, buketName:"+buketName+", key:"+key); + throw new RuntimeException("S3 ํŒŒ์ผ ์‚ญ์ œ ์š”์ฒญ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ, buketName:" + buketName + ", key:" + key); } - } - public String uploadAudioStream(AudioInputStream audioStream, String dirName, String fileName) throws IOException { + public String uploadAudioStream(AudioInputStream audioStream, String dirName, String fileName) + throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // AudioInputStream -> ByteArrayOutputStream ๋ณ€ํ™˜ @@ -292,35 +293,4 @@ public String uploadAudioStream(AudioInputStream audioStream, String dirName, St return s3Client.getUrl(buketName, key).toString(); } - - /** - * S3์—์„œ URL์„ ํ†ตํ•ด AudioInputStream์œผ๋กœ ์ฝ๊ธฐ (Buffered Stream) - * - * @param s3Url S3์˜ ํŒŒ์ผ URL - * @return AudioInputStream - * @throws IOException - */ - public AudioInputStream loadAsBufferedStream(String s3Url) throws IOException { - try { - URL url = new URL(s3Url); - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); - - // ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฒ„ํผ๋ง - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, buffer); - - byte[] bufferedData = buffer.toByteArray(); - AudioFormat format = audioInputStream.getFormat(); - - return new AudioInputStream( - new ByteArrayInputStream(bufferedData), - format, - bufferedData.length / format.getFrameSize() - ); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("์ž˜๋ชป๋œ S3 URL์ž…๋‹ˆ๋‹ค.", e); - } catch (UnsupportedAudioFileException e) { - throw new IllegalArgumentException("์ง€์›๋˜์ง€ ์•Š๋Š” ์˜ค๋””์˜ค ํŒŒ์ผ ํ˜•์‹์ž…๋‹ˆ๋‹ค.", e); - } - } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java index 03b0906d..4741acef 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java @@ -1,62 +1,64 @@ -package com.oreo.finalproject_5re5_be.global.component; - -import com.amazonaws.services.sqs.AmazonSQSRequester; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.oreo.finalproject_5re5_be.global.constant.MessageType; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import software.amazon.awssdk.services.sqs.SqsClient; -import software.amazon.awssdk.services.sqs.model.Message; -import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; -import software.amazon.awssdk.services.sqs.model.SendMessageRequest; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -@Component -public class SqsService { - private final SqsClient sqsClient; - private final AmazonSQSRequester amazonSQSRequester; - - @Value("${AWS_SQS_QUEUE_URL}") - private String sqsQueueUrl; - - @Value("${AWS_SQS_VIRTUAL_QUEUE_NAME}") - private String virtualQueueName; - - public SqsService(SqsClient sqsClient, AmazonSQSRequester amazonSQSRequester) { - this.sqsClient = sqsClient; - this.amazonSQSRequester = amazonSQSRequester; - } - - public Message sendMessage(T dto, MessageType messageType) throws TimeoutException, JsonProcessingException { - // ๋ณ€์ˆ˜ ์„ค์ • - // ๊ฐ€์ƒ ๋Œ€๊ธฐ์—ด ์‚ฌ์šฉ - String requestQueueUrl = sqsQueueUrl + virtualQueueName; - - // DTO๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ - ObjectMapper objectMapper = new ObjectMapper(); - String messageBody = objectMapper.writeValueAsString(dto); - - // ๋ฉ”์‹œ์ง€ ์†์„ฑ ์„ค์ • - Map messageAttributes = new HashMap<>(); - messageAttributes.put("messageType", - MessageAttributeValue.builder().dataType("String").stringValue(messageType.getType()).build()); - - // sqs์— ๋ฉ”์„ธ์ง€ ๋ณด๋‚ด๊ธฐ - SendMessageRequest sendRequest = SendMessageRequest.builder() - .queueUrl(requestQueueUrl) - .messageBody(messageBody) - .messageAttributes(messageAttributes) - .messageGroupId("messageGroup1") - .build(); - - Message response = amazonSQSRequester.sendMessageAndGetResponse(sendRequest, 50, - TimeUnit.SECONDS); - - return response; - } -} +// package com.oreo.finalproject_5re5_be.global.component; +// +// import com.amazonaws.services.sqs.AmazonSQSRequester; +// import com.fasterxml.jackson.core.JsonProcessingException; +// import com.fasterxml.jackson.databind.ObjectMapper; +// import com.oreo.finalproject_5re5_be.global.constant.MessageType; +// import org.springframework.beans.factory.annotation.Value; +// import org.springframework.stereotype.Component; +// import software.amazon.awssdk.services.sqs.SqsClient; +// import software.amazon.awssdk.services.sqs.model.Message; +// import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; +// import software.amazon.awssdk.services.sqs.model.SendMessageRequest; +// +// import java.util.HashMap; +// import java.util.Map; +// import java.util.concurrent.TimeUnit; +// import java.util.concurrent.TimeoutException; +// +// @Component +// public class SqsService { +// private final SqsClient sqsClient; +// private final AmazonSQSRequester amazonSQSRequester; +// +// @Value("${AWS_SQS_QUEUE_URL}") +// private String sqsQueueUrl; +// +// @Value("${AWS_SQS_VIRTUAL_QUEUE_NAME}") +// private String virtualQueueName; +// +// public SqsService(SqsClient sqsClient, AmazonSQSRequester amazonSQSRequester) { +// this.sqsClient = sqsClient; +// this.amazonSQSRequester = amazonSQSRequester; +// } +// +// public Message sendMessage(T dto, MessageType messageType) throws TimeoutException, +// JsonProcessingException { +// // ๋ณ€์ˆ˜ ์„ค์ • +// // ๊ฐ€์ƒ ๋Œ€๊ธฐ์—ด ์‚ฌ์šฉ +// String requestQueueUrl = sqsQueueUrl + virtualQueueName; +// +// // DTO๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ +// ObjectMapper objectMapper = new ObjectMapper(); +// String messageBody = objectMapper.writeValueAsString(dto); +// +// // ๋ฉ”์‹œ์ง€ ์†์„ฑ ์„ค์ • +// Map messageAttributes = new HashMap<>(); +// messageAttributes.put("messageType", +// +// MessageAttributeValue.builder().dataType("String").stringValue(messageType.getType()).build()); +// +// // sqs์— ๋ฉ”์„ธ์ง€ ๋ณด๋‚ด๊ธฐ +// SendMessageRequest sendRequest = SendMessageRequest.builder() +// .queueUrl(requestQueueUrl) +// .messageBody(messageBody) +// .messageAttributes(messageAttributes) +// .messageGroupId("messageGroup1") +// .build(); +// +// Message response = amazonSQSRequester.sendMessageAndGetResponse(sendRequest, 50, +// TimeUnit.SECONDS); +// +// return response; +// } +// } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionChecker.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionChecker.java index 3de903f1..6b0a40a2 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionChecker.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionChecker.java @@ -7,27 +7,27 @@ * * @author K-KY * @apiNote ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ์กฐ์ž‘ํ•ด ํ™•์žฅ์ž์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ์ผ์น˜ ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ True๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
- * ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์ด ์‹ค์ œ ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•œ ๊ฐ’์ธ์ง€, ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ์„ ํ–‰ ๋˜์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + * ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์ด ์‹ค์ œ ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•œ ๊ฐ’์ธ์ง€, ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ์„ ํ–‰ ๋˜์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. */ public class AudioExtensionChecker { private static final int WAV_SIGNATURE_BYTE = 4; private static final int MP3_SIGNATURE_BYTE = 2; - //wavํ™•์žฅ์ž ๊ฒ€์‚ฌ + // wavํ™•์žฅ์ž ๊ฒ€์‚ฌ public static boolean isWavExtension(File file) throws IOException { - //ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ๋กœ ์ฝ๊ธฐ + // ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ๋กœ ์ฝ๊ธฐ try (FileInputStream fileInputStream = new FileInputStream(file)) { - byte[] buffer = new byte[WAV_SIGNATURE_BYTE]; //wav ์‹œ๊ทธ๋‹ˆ์ฒ˜ 8๊ธ€์ž ์ฝ์–ด์•ผ ํ•˜๊ธฐ๋•Œ๋ฌธ์— 4๋ฐ”์ดํŠธ + byte[] buffer = new byte[WAV_SIGNATURE_BYTE]; // wav ์‹œ๊ทธ๋‹ˆ์ฒ˜ 8๊ธ€์ž ์ฝ์–ด์•ผ ํ•˜๊ธฐ๋•Œ๋ฌธ์— 4๋ฐ”์ดํŠธ if (fileInputStream.read(buffer) != -1) { - String hexSignature = bytesToHex(buffer);//์ฝ์€ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ - fileInputStream.close();//๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜ - return AudioExtensions.isWavExtension(hexSignature);//ํŒŒ์ผ ๊ฒ€์‚ฌ + String hexSignature = bytesToHex(buffer); // ์ฝ์€ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ + fileInputStream.close(); // ๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜ + return AudioExtensions.isWavExtension(hexSignature); // ํŒŒ์ผ ๊ฒ€์‚ฌ } } return false; } - //mp3ํ™•์žฅ์ž ๊ฒ€์‚ฌ + // mp3ํ™•์žฅ์ž ๊ฒ€์‚ฌ public static boolean isSupported(File file) throws IOException { try (FileInputStream fileInputStream = new FileInputStream(file)) { byte[] buffer = new byte[MP3_SIGNATURE_BYTE]; // 4๊ธ€์ž๋งŒ ์ฝ์–ด์•ผ ํ•˜๊ธฐ๋–„๋ฌธ์— 2๋ฐ”์ดํŠธ๋กœ ์ง€์ • @@ -40,26 +40,27 @@ public static boolean isSupported(File file) throws IOException { return false; } - //wavํ™•์žฅ์ž ๊ฒ€์‚ฌ + // wavํ™•์žฅ์ž ๊ฒ€์‚ฌ public static boolean isWavExtension(byte[] byteArray) throws IOException { - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);//InputStream์œผ๋กœ ๋ณ€ํ™˜ + ByteArrayInputStream byteArrayInputStream = + new ByteArrayInputStream(byteArray); // InputStream์œผ๋กœ ๋ณ€ํ™˜ byte[] buffer = new byte[WAV_SIGNATURE_BYTE]; - if (byteArrayInputStream.read(buffer) != -1) {//์ŠคํŠธ๋ฆผ์—์„œ WAV_SIGNATURE_BYTE ๋งŒํผ ์ฝ๊ธฐ - String hexSignature = bytesToHex(buffer);//์ฝ์€ buffer์„ String์œผ๋กœ ๋ณ€ํ™˜ - byteArrayInputStream.close();//๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜ + if (byteArrayInputStream.read(buffer) != -1) { // ์ŠคํŠธ๋ฆผ์—์„œ WAV_SIGNATURE_BYTE ๋งŒํผ ์ฝ๊ธฐ + String hexSignature = bytesToHex(buffer); // ์ฝ์€ buffer์„ String์œผ๋กœ ๋ณ€ํ™˜ + byteArrayInputStream.close(); // ๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜ System.out.println("hexSignature = " + hexSignature); - return AudioExtensions.isWavExtension(hexSignature);//๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๊ฒ€์‚ฌ + return AudioExtensions.isWavExtension(hexSignature); // ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๊ฒ€์‚ฌ } return false; } - //mp3ํ™•์žฅ์ž ๊ฒ€์‚ฌ + // mp3ํ™•์žฅ์ž ๊ฒ€์‚ฌ public static boolean isSupported(byte[] byteArray) throws IOException { return isSupportedWav(byteArray) || isSupportedMp3(byteArray); } - //์ง€์›ํ•˜๋Š” ํ™•์žฅ์ž ๊ฒ€์‚ฌ + // ์ง€์›ํ•˜๋Š” ํ™•์žฅ์ž ๊ฒ€์‚ฌ public static boolean isSupportedMp3(byte[] byteArray) throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); @@ -73,7 +74,7 @@ public static boolean isSupportedMp3(byte[] byteArray) throws IOException { return false; } - //์ง€์›ํ•˜๋Š” ํ™•์žฅ์ž ๊ฒ€์‚ฌ + // ์ง€์›ํ•˜๋Š” ํ™•์žฅ์ž ๊ฒ€์‚ฌ public static boolean isSupportedWav(byte[] byteArray) throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); @@ -87,7 +88,6 @@ public static boolean isSupportedWav(byte[] byteArray) throws IOException { return false; } - // ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ํ—ฅ์‚ฌ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ private static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java index d49fb67d..c2111e95 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java @@ -1,51 +1,39 @@ package com.oreo.finalproject_5re5_be.global.component.audio; - -import javax.sound.sampled.*; import java.io.*; +import javax.sound.sampled.*; public class AudioExtensionConverter { private static final int DEFAULT_BIT_DEPTH = 16; - public static byte[] mp3ToWav(File file) throws UnsupportedAudioFileException, IOException { - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);// ํŒŒ์ผ์„ AudioInputStream์œผ๋กœ ์ฝ๊ธฐ - - AudioFormat baseFormat = audioInputStream.getFormat();// WAV ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋Œ€์ƒ ํฌ๋งท ์„ค์ • + public static byte[] mp3ToWav(AudioInputStream audioInputStream) { + AudioFormat baseFormat = audioInputStream.getFormat(); // WAV ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋Œ€์ƒ ํฌ๋งท ์„ค์ • AudioFormat decodedFormat = getDecodedFormat(baseFormat); - AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); + try { + AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ WAV ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ ๋ฐ ์ €์žฅ - - return wavOutputStream.toByteArray();// ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ + ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream(); // ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ByteArray + AudioSystem.write( + finalStream, AudioFileFormat.Type.WAVE, wavOutputStream); // ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ WAV ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ ๋ฐ ์ €์žฅ + return wavOutputStream.toByteArray(); // ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ + } catch (IOException e) { + throw new RuntimeException("์˜ค๋””์˜ค ๋ณ€ํ™˜์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์Šต๋‹ˆ๋‹ค.", e); + } } - public static byte[] mp3ToWav(AudioInputStream audioInputStream) throws IOException { - AudioFormat baseFormat = audioInputStream.getFormat();// WAV ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋Œ€์ƒ ํฌ๋งท ์„ค์ • - AudioFormat decodedFormat = getDecodedFormat(baseFormat); - AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ WAV ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ ๋ฐ ์ €์žฅ - - return wavOutputStream.toByteArray();// ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ - + public static byte[] mp3ToWav(File file) throws UnsupportedAudioFileException, IOException { + AudioInputStream audioInputStream = + AudioSystem.getAudioInputStream(file); // ํŒŒ์ผ์„ AudioInputStream์œผ๋กœ ์ฝ๊ธฐ + return mp3ToWav(audioInputStream); } - public static byte[] mp3ToWav(InputStream inputStream) throws UnsupportedAudioFileException, IOException { - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputStream);// ํŒŒ์ผ์„ AudioInputStream์œผ๋กœ ์ฝ๊ธฐ - - AudioFormat baseFormat = audioInputStream.getFormat();// WAV ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋Œ€์ƒ ํฌ๋งท ์„ค์ • - AudioFormat decodedFormat = getDecodedFormat(baseFormat); - AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ WAV ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ ๋ฐ ์ €์žฅ - - return wavOutputStream.toByteArray();// ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ˜ํ™˜ - + public static byte[] mp3ToWav(InputStream inputStream) + throws UnsupportedAudioFileException, IOException { + AudioInputStream audioInputStream = + AudioSystem.getAudioInputStream(inputStream); // ํŒŒ์ผ์„ AudioInputStream์œผ๋กœ ์ฝ๊ธฐ + return mp3ToWav(audioInputStream); } private static AudioFormat getDecodedFormat(AudioFormat baseFormat) { @@ -56,8 +44,7 @@ private static AudioFormat getDecodedFormat(AudioFormat baseFormat) { baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), - false - ); + false); } private static AudioInputStream getAudioInputStream( @@ -77,15 +64,13 @@ private static AudioInputStream getAudioInputStream( return getAudioInputStream(decodedFormat, byteArrayOutputStream); } - private static AudioInputStream getAudioInputStream(AudioFormat decodedFormat, - ByteArrayOutputStream byteArrayOutputStream) { + private static AudioInputStream getAudioInputStream( + AudioFormat decodedFormat, ByteArrayOutputStream byteArrayOutputStream) { byte[] pcmData = byteArrayOutputStream.toByteArray(); // ์ƒˆ๋กœ์šด AudioInputStream ์ƒ์„ฑํ•˜์—ฌ ๊ธธ์ด ์ง€์ • ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(pcmData); return new AudioInputStream( - byteArrayInputStream, decodedFormat, pcmData.length / decodedFormat.getFrameSize() - ); + byteArrayInputStream, decodedFormat, pcmData.length / decodedFormat.getFrameSize()); } } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensions.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensions.java index 9c33e8b3..8c6e2dea 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensions.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensions.java @@ -1,48 +1,45 @@ package com.oreo.finalproject_5re5_be.global.component.audio; -import lombok.Getter; - import java.util.Arrays; import java.util.List; +import lombok.Getter; /** - * @apiNote ์ด ํด๋ž˜์Šค๋Š” ํŒŒ์ผ์˜ ํ™•์žฅ์ž(---.ext) ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. - * ํŒŒ์ผ ํ™•์žฅ์ž ๊ณ ์œ ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. - * - * @see @code AudioExtensionChecker + * @apiNote ์ด ํด๋ž˜์Šค๋Š” ํŒŒ์ผ์˜ ํ™•์žฅ์ž(---.ext) ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํŒŒ์ผ ํ™•์žฅ์ž ๊ณ ์œ ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. + * @see @code AudioExtensionChecker * @author K-KY */ @Getter public enum AudioExtensions { - //wavํŒŒ์ผ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์•ž์— ๋ฌธ์ž์—ด์„ ๋ถ™์ž„ - E_52494646("WAV"), E_FFF3("MP3"), E_FFF2("MP3"), E_FFFB("MP3"); + // wavํŒŒ์ผ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์•ž์— ๋ฌธ์ž์—ด์„ ๋ถ™์ž„ + E_52494646("WAV"), + E_FFF3("MP3"), + E_FFF2("MP3"), + E_FFFB("MP3"); AudioExtensions(String signatures) { this.signatures = signatures; } - - - private final static List collect = Arrays.stream(AudioExtensions.values()).map(Enum::toString).toList(); + private static final List collect = + Arrays.stream(AudioExtensions.values()).map(Enum::toString).toList(); private final String signatures; - //ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ Enum์ค‘ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜ + // ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ Enum์ค‘ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜ public static boolean isSupported(String signature) { return collect.contains("E_" + signature); } - //Enum์˜ wav ํ™•์žฅ์ž ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ™์€์ง€ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜ + // Enum์˜ wav ํ™•์žฅ์ž ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ™์€์ง€ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜ public static boolean isWavExtension(String signature) { return AudioExtensions.E_52494646.toString().equals("E_" + signature); } - //wav ํ™•์žฅ์ž๊ฐ€ ์•„๋‹ˆ๊ณ  ์ง€์›๋˜๋Š” ํ™•์žฅ์ž๋ผ๋ฉด mp3ํ™•์žฅ์ž + // wav ํ™•์žฅ์ž๊ฐ€ ์•„๋‹ˆ๊ณ  ์ง€์›๋˜๋Š” ํ™•์žฅ์ž๋ผ๋ฉด mp3ํ™•์žฅ์ž public static boolean isMp3Extension(String signature) { if (isWavExtension(signature)) { return false; } return isSupported(signature); } - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFileTypeConverter.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFileTypeConverter.java index a8b5351e..9fddd4b7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFileTypeConverter.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFileTypeConverter.java @@ -1,23 +1,22 @@ package com.oreo.finalproject_5re5_be.global.component.audio; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.web.multipart.MultipartFile; - import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Files; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.web.multipart.MultipartFile; public class AudioFileTypeConverter { - //File์„ MultipartFile๋กœ ๋ณ€๊ฒฝ + // File์„ MultipartFile๋กœ ๋ณ€๊ฒฝ public static MultipartFile convertFileToMultipartFile(File file) throws IOException { try (FileInputStream inputStream = new FileInputStream(file)) { return new MockMultipartFile( - "file", // ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ - file.getName(), // ํŒŒ์ผ ์ด๋ฆ„ - Files.probeContentType(file.toPath()), // MIME ํƒ€์ž… - inputStream // ํŒŒ์ผ ๋‚ด์šฉ - ); + "file", // ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ + file.getName(), // ํŒŒ์ผ ์ด๋ฆ„ + Files.probeContentType(file.toPath()), // MIME ํƒ€์ž… + inputStream // ํŒŒ์ผ ๋‚ด์šฉ + ); } } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFormats.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFormats.java index 80e9f951..cbce835a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFormats.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFormats.java @@ -3,109 +3,117 @@ import javax.sound.sampled.AudioFormat; public final class AudioFormats { - private AudioFormats() { - } - - public static final AudioFormat MONO_FORMAT_SR441_B32 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 32, // 16๋น„ํŠธ - 1, // ๋ชจ๋…ธ - 4, // 2 bytes/frame - 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + private AudioFormats() {} + public static final AudioFormat MONO_FORMAT_SR441_B32 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 32, // 16๋น„ํŠธ + 1, // ๋ชจ๋…ธ + 4, // 2 bytes/frame + 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); - public static final AudioFormat MONO_FORMAT_SR441_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 16, // 16๋น„ํŠธ - 1, // ๋ชจ๋…ธ - 2, // 2 bytes/frame - 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + public static final AudioFormat MONO_FORMAT_SR441_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 16, // 16๋น„ํŠธ + 1, // ๋ชจ๋…ธ + 2, // 2 bytes/frame + 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); - public static final AudioFormat MONO_FORMAT_SR240_B32 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 24000, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 32, // 16๋น„ํŠธ - 1, // ๋ชจ๋…ธ - 4, // 2 bytes/frame - 24000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + public static final AudioFormat MONO_FORMAT_SR240_B32 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 24000, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 32, // 16๋น„ํŠธ + 1, // ๋ชจ๋…ธ + 4, // 2 bytes/frame + 24000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); - public static final AudioFormat MONO_FORMAT_SR240_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 24000, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 16, // 16๋น„ํŠธ - 1, // ๋ชจ๋…ธ - 2, // 2 bytes/frame - 24000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + public static final AudioFormat MONO_FORMAT_SR240_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 24000, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 16, // 16๋น„ํŠธ + 1, // ๋ชจ๋…ธ + 2, // 2 bytes/frame + 24000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); - public static final AudioFormat STEREO_FORMAT_SR441_B32 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 32, // 16๋น„ํŠธ - 2, // ์Šคํ…Œ๋ ˆ์˜ค - 8, // 4 bytes/frame - 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + public static final AudioFormat STEREO_FORMAT_SR441_B32 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 32, // 16๋น„ํŠธ + 2, // ์Šคํ…Œ๋ ˆ์˜ค + 8, // 4 bytes/frame + 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); - public static final AudioFormat STEREO_FORMAT_SR441_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 16, // 16๋น„ํŠธ - 2, // ์Šคํ…Œ๋ ˆ์˜ค - 4, // 4 bytes/frame - 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + public static final AudioFormat STEREO_FORMAT_SR441_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 16, // 16๋น„ํŠธ + 2, // ์Šคํ…Œ๋ ˆ์˜ค + 4, // 4 bytes/frame + 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); - public static final AudioFormat STEREO_FORMAT_SR240_B32 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 24000, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 32, // 16๋น„ํŠธ - 2, // ์Šคํ…Œ๋ ˆ์˜ค - 8, // 4 bytes/frame - 24000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + public static final AudioFormat STEREO_FORMAT_SR240_B32 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 24000, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 32, // 16๋น„ํŠธ + 2, // ์Šคํ…Œ๋ ˆ์˜ค + 8, // 4 bytes/frame + 24000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); - public static final AudioFormat STEREO_FORMAT_SR240_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 24000, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 16, // 16๋น„ํŠธ - 2, // ์Šคํ…Œ๋ ˆ์˜ค - 4, // 4 bytes/frame - 24000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + public static final AudioFormat STEREO_FORMAT_SR240_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 24000, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 16, // 16๋น„ํŠธ + 2, // ์Šคํ…Œ๋ ˆ์˜ค + 4, // 4 bytes/frame + 24000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); - public static final AudioFormat STEREO_FORMAT_SR480_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 48000, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 16, // 16๋น„ํŠธ - 2, // ์Šคํ…Œ๋ ˆ์˜ค - 4, // 4 bytes/frame - 48000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + public static final AudioFormat STEREO_FORMAT_SR480_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 48000, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 16, // 16๋น„ํŠธ + 2, // ์Šคํ…Œ๋ ˆ์˜ค + 4, // 4 bytes/frame + 48000, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); - public static final AudioFormat MONO_FORMAT_SR441_B8 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 8, // 16๋น„ํŠธ - 1, // ๋ชจ๋…ธ - 1, // 2 bytes/frame - 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + public static final AudioFormat MONO_FORMAT_SR441_B8 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 8, // 16๋น„ํŠธ + 1, // ๋ชจ๋…ธ + 1, // 2 bytes/frame + 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); public static AudioFormat customAudioFormat(int sampleRate, int channels) { if (channels != 1 && channels != 2) { @@ -114,11 +122,11 @@ public static AudioFormat customAudioFormat(int sampleRate, int channels) { return new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, sampleRate, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 16, // 16๋น„ํŠธ - channels, // ์Šคํ…Œ๋ ˆ์˜ค - channels * 2, // 4 bytes/frame + 16, // 16๋น„ํŠธ + channels, // ์Šคํ…Œ๋ ˆ์˜ค + channels * 2, // 4 bytes/frame sampleRate, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java index b549dac7..201401ea 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java @@ -1,24 +1,26 @@ package com.oreo.finalproject_5re5_be.global.component.audio; import com.oreo.finalproject_5re5_be.concat.service.concatenator.Concatenator; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; - +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import lombok.extern.log4j.Log4j2; /** * @apiNote ๋ณ‘ํ•ฉ ๋˜๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ด์ „์˜ ์˜ค๋””์˜ค ํ˜•์‹์„ ์ผ์น˜ ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค * @see Concatenator */ +@Log4j2 public class AudioResample { private final AudioFormat audioFormat; /** + * + * *
๊ธฐ๋ณธ ๋ณ‘ํ•ฉ ํด๋ž˜์Šค
* * @@ -34,6 +36,7 @@ public class AudioResample { *
์˜ค๋””์˜ค ๋ฆฌ์ƒ˜ํ”Œ๋ง
๋ฆฌ์ƒ˜ํ”Œ๋ง ํ•  ์˜ค๋””์˜ค ํฌ๋งท * *
+ * *

*/ public AudioResample(AudioFormat audioFormat) { @@ -41,6 +44,8 @@ public AudioResample(AudioFormat audioFormat) { } /** + * + * * * * @@ -56,21 +61,23 @@ public AudioResample(AudioFormat audioFormat) { *
์˜ค๋””์˜ค ๋ฆฌ์ƒ˜ํ”Œ๋ง
๋ฆฌ์ƒ˜ํ”Œ๋ง ํ•  ์˜ค๋””์˜ค ํฌ๋งท
๋ชจ๋…ธ 44100 SampleRate์˜ ์˜ค๋””์˜ค ํฌ๋งท์„ ์ƒ์„ฑ * *
+ * *

*/ public AudioResample() { - audioFormat = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ - 32, // 32๋น„ํŠธ - 2, // ์Šคํ…Œ๋ ˆ์˜ค - 8, // 2 bytes/frame - 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ - false // ๋ฆฌํ‹€ ์—”๋””์•ˆ - ); + audioFormat = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz๋กœ ๋ณ€ํ™˜ + 16, // 16๋น„ํŠธ + 2, // ์Šคํ…Œ๋ ˆ์˜ค + 4, // 2 bytes/frame + 44100, // frame rate์™€ ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ ์ผ์น˜ + false // ๋ฆฌํ‹€ ์—”๋””์•ˆ + ); } - //๋ฆฌ์ŠคํŠธ ๋ฆฌ์ƒ˜ํ”Œ๋ง + // ๋ฆฌ์ŠคํŠธ ๋ฆฌ์ƒ˜ํ”Œ๋ง public List resample(List audioStreams) { List resampledAudioStreams = new ArrayList<>(); for (AudioInputStream audioStream : audioStreams) { @@ -79,27 +86,41 @@ public List resample(List audioStreams) { return resampledAudioStreams; } - //๊ฐœ๋ณ„ ๋ฆฌ์ƒ˜ํ”Œ๋ง + // ๊ฐœ๋ณ„ ๋ฆฌ์ƒ˜ํ”Œ๋ง public AudioInputStream resample(AudioInputStream audioStream) { return formatting(audioStream); } - //๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ ๋ฆฌ์ƒ˜ํ”Œ๋ง + // ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ ๋ฆฌ์ƒ˜ํ”Œ๋ง public AudioInputStream resample(ByteArrayOutputStream byteArrayOutputStream) { byte[] combinedBytes = byteArrayOutputStream.toByteArray(); ByteArrayInputStream combinedByteArrayInputStream = new ByteArrayInputStream(combinedBytes); return new AudioInputStream( combinedByteArrayInputStream, audioFormat, - combinedBytes.length / audioFormat.getFrameSize() - ); + combinedBytes.length / audioFormat.getFrameSize()); } - //๋ฆฌ์ƒ˜ํ”Œ๋ง ํฌ๋งท ์ผ์น˜ํ™” + // ๋ฆฌ์ƒ˜ํ”Œ๋ง ํฌ๋งท ์ผ์น˜ํ™” public AudioInputStream formatting(AudioInputStream audioInputStream) { + log.info("[formatting] ํ˜„์žฌ ์˜ค๋””์˜ค ํฌ๋งท๊ณผ ํƒ€๊ฒŸ ์˜ค๋””์˜ค ํฌ๋งท์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ ์ค‘..."); + log.info("[formatting] ํ˜„์žฌ ์˜ค๋””์˜ค ํฌ๋งท: {}", audioInputStream.getFormat()); + log.info("[formatting] ํƒ€๊ฒŸ ์˜ค๋””์˜ค ํฌ๋งท: {}", audioFormat); + if (audioInputStream.getFormat().matches(audioFormat)) { + log.info("[formatting] ํƒ€๊ฒŸ ์˜ค๋””์˜ค ํฌ๋งท๊ณผ ์ด๋ฏธ ์ผ์น˜ํ•˜์—ฌ, ๋ฆฌ์ƒ˜ํ”Œ๋ง์ด ํ•„์š”์—†์Šต๋‹ˆ๋‹ค."); return audioInputStream; } - return AudioSystem.getAudioInputStream(audioFormat, audioInputStream); + + log.info("[formatting] ํƒ€๊ฒŸ ์˜ค๋””์˜ค ํฌ๋งท๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์•„์„œ ๋ฆฌ์ƒ˜ํ”Œ๋ง ์ค‘..."); + try { + AudioInputStream resampledStream = + AudioSystem.getAudioInputStream(audioFormat, audioInputStream); + log.info("[formatting] ๋ฆฌ์ƒ˜ํ”Œ๋ง๋œ ํฌ๋งท: {}", resampledStream.getFormat()); + return resampledStream; + } catch (Exception e) { + log.error("Failed to resample audio format", e); + throw new IllegalArgumentException("Resampling failed"); + } } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/BeepMaker.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/BeepMaker.java index e0ece0ca..9acd26bb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/BeepMaker.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/BeepMaker.java @@ -1,20 +1,17 @@ package com.oreo.finalproject_5re5_be.global.component.audio; - +import java.io.ByteArrayInputStream; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; -import java.io.ByteArrayInputStream; -/** - * ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ์ฃผํŒŒ์ˆ˜์˜ ์˜ค๋””์˜ค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. - */ +/** ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ์ฃผํŒŒ์ˆ˜์˜ ์˜ค๋””์˜ค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. */ public class BeepMaker { /** * ์ฃผ์–ด์ง„ ์ฃผํŒŒ์ˆ˜๋กœ ์ง€์ •๋œ ๊ธธ์ด์˜ ๋น„ํ”„ ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. * * @param frequency ์ฃผํŒŒ์ˆ˜ (Hz) - * @param duration ์ง€์† ์‹œ๊ฐ„ (์ดˆ) - * @param format ๋Œ€์ƒ ์˜ค๋””์˜ค ํฌ๋งท + * @param duration ์ง€์† ์‹œ๊ฐ„ (์ดˆ) + * @param format ๋Œ€์ƒ ์˜ค๋””์˜ค ํฌ๋งท * @return ๋น„ํ”„ ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆผ */ public static AudioInputStream makeSound(int frequency, float duration, AudioFormat format) { @@ -43,17 +40,18 @@ public static AudioInputStream makeSound(int frequency, float duration, AudioFor } /** + * * * * *
๊ธฐ๋ณธ ๋ณ‘ํ•ฉ ํด๋ž˜์Šค
* - * @param duration ์ง€์† ์‹œ๊ฐ„ (์ดˆ) - * @param format ๋Œ€์ƒ ์˜ค๋””์˜ค ํฌ๋งท + * @param duration ์ง€์† ์‹œ๊ฐ„ (์ดˆ) + * @param format ๋Œ€์ƒ ์˜ค๋””์˜ค ํฌ๋งท * @return ๋ฌด์Œ ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆผ */ - //๋ฌด์Œ ์˜ค๋””์˜ค ์ƒ์„ฑ + // ๋ฌด์Œ ์˜ค๋””์˜ค ์ƒ์„ฑ public static AudioInputStream makeSound(float duration, AudioFormat format) { return makeSound(0, duration, format); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/SoundPlayer.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/SoundPlayer.java index 441bdccc..aed747e4 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/SoundPlayer.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/SoundPlayer.java @@ -1,7 +1,7 @@ package com.oreo.finalproject_5re5_be.global.component.audio; -import javax.sound.sampled.*; import java.io.IOException; +import javax.sound.sampled.*; public class SoundPlayer { private byte[] buffer = new byte[4096]; // ์˜ค๋””์˜ค๊ฐ€ ์žฌ์ƒ๋˜๋Š” ๋ฒ„ํผ์˜ ํฌ๊ธฐ @@ -16,13 +16,13 @@ public class SoundPlayer { */ public void play(AudioInputStream audioInputStream) throws IOException { try { - Result result = getAudio(audioInputStream);//์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ + Result result = getAudio(audioInputStream); // ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ SourceDataLine sourceDataLine = result.sourceLine(); - sourceDataLine.open(result.format());//์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ํš๋“ - sourceDataLine.start();//sourceLine์˜ IO ์‹คํ–‰ + sourceDataLine.open(result.format()); // ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ํš๋“ + sourceDataLine.start(); // sourceLine์˜ IO ์‹คํ–‰ - loadBuffer(audioInputStream, sourceDataLine);//๋ฒ„ํผ์— ๋‹ด์•„ ์‹คํ–‰ + loadBuffer(audioInputStream, sourceDataLine); // ๋ฒ„ํผ์— ๋‹ด์•„ ์‹คํ–‰ // ์žฌ์ƒ์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜ sourceDataLine.drain(); @@ -34,29 +34,29 @@ public void play(AudioInputStream audioInputStream) throws IOException { } private Result getAudio(AudioInputStream audioInputStream) throws LineUnavailableException { - //AudioInputStream์„ AudioFormat์œผ๋กœ ๋ณ€ํ™˜ + // AudioInputStream์„ AudioFormat์œผ๋กœ ๋ณ€ํ™˜ AudioFormat format = audioInputStream.getFormat(); - //๋‹จ์ผ ์˜ค๋””์˜ค ํ˜•์‹์„ ํฌํ•จํ•˜๋Š” ์ง€์ •๋œ ์ •๋ณด๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ๋ผ์ธ์˜ ์ •๋ณด ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑ + // ๋‹จ์ผ ์˜ค๋””์˜ค ํ˜•์‹์„ ํฌํ•จํ•˜๋Š” ์ง€์ •๋œ ์ •๋ณด๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ๋ผ์ธ์˜ ์ •๋ณด ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑ DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); - //info์— ์ง€์ •๋œ audioFormat์˜ SourceDataLine ๊ฐ์ฒด ํš๋“ + // info์— ์ง€์ •๋œ audioFormat์˜ SourceDataLine ๊ฐ์ฒด ํš๋“ SourceDataLine sourceLine = (SourceDataLine) AudioSystem.getLine(info); return new Result(format, sourceLine); } - private void loadBuffer(AudioInputStream audioInputStream, SourceDataLine sourceLine) throws IOException { - //์‹ค์ œ๋กœ ์˜ค๋””์˜ค๊ฐ€ ์‹คํ–‰๋˜๋Š” ์žฅ์†Œ + private void loadBuffer(AudioInputStream audioInputStream, SourceDataLine sourceLine) + throws IOException { + // ์‹ค์ œ๋กœ ์˜ค๋””์˜ค๊ฐ€ ์‹คํ–‰๋˜๋Š” ์žฅ์†Œ while ((bytesRead = audioInputStream.read(buffer, 0, buffer.length)) != -1) { sourceLine.write(buffer, 0, bytesRead); } } - //๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ ์„ธํ„ฐ + // ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ ์„ธํ„ฐ public void setBuffer(byte[] buffer) { this.buffer = buffer; } - private record Result(AudioFormat format, SourceDataLine sourceLine) { - } + private record Result(AudioFormat format, SourceDataLine sourceLine) {} } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/AuditorAwareImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/AuditorAwareImpl.java index 5502301f..2b9e84c5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/AuditorAwareImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/AuditorAwareImpl.java @@ -1,17 +1,16 @@ package com.oreo.finalproject_5re5_be.global.config; - import jakarta.servlet.http.HttpSession; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.AuditorAware; -import java.util.Optional; - @RequiredArgsConstructor public class AuditorAwareImpl implements AuditorAware { - //session ๊ฐ’ + // session ๊ฐ’ private final HttpSession session; - //session ๊ฐ’์œผ๋กœ memberSeq ๊ฐ€์ง€๊ณ  ์˜ค๊ธฐ + + // session ๊ฐ’์œผ๋กœ memberSeq ๊ฐ€์ง€๊ณ  ์˜ค๊ธฐ @Override public Optional getCurrentAuditor() { Long memberID = (Long) session.getAttribute("memberSeq"); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/JpaAuditingConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/JpaAuditingConfig.java index cb137fc3..a5e25425 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/JpaAuditingConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/JpaAuditingConfig.java @@ -9,7 +9,7 @@ @Configuration @EnableJpaAuditing public class JpaAuditingConfig { - //JPA Auditing Bean ๋“ฑ๋ก + // JPA Auditing Bean ๋“ฑ๋ก @Bean public AuditorAware auditorProvider(HttpSession session) { return new AuditorAwareImpl(session); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/MultipartFileAccepter.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/MultipartFileAccepter.java index 9f3b6d57..018e7a57 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/MultipartFileAccepter.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/MultipartFileAccepter.java @@ -11,8 +11,6 @@ public class MultipartFileAccepter implements Converter server = new ArrayList<>(); - server.add(new Server().description("https Server").url("https://5re5park.site")); - server.add(new Server().description("http Server").url("http://5re5park.site:8080")); + server.add(new Server().description("https Server").url("https://dev1.5re5park.site")); server.add(new Server().description("localhost").url("http://localhost:8080")); - OpenAPI info = new OpenAPI() - .components(new Components()) - .paths(getPaths()) - .servers(server) - .info(apiInfo()); + OpenAPI info = + new OpenAPI() + .components(new Components()) + .paths(getPaths()) + .servers(server) + .info(apiInfo()); return info; } @@ -38,54 +37,61 @@ private Paths getPaths() { Paths paths = new Paths(); // ๋กœ๊ทธ์ธ API ๊ฒฝ๋กœ ์ถ”๊ฐ€ - paths.addPathItem("/api/member/login", new PathItem() - .post(new Operation() - .summary("ํšŒ์› ๋กœ๊ทธ์ธ") - .description("์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ") - .requestBody(new RequestBody() - .required(true) - .content(new Content() - .addMediaType("application/x-www-form-urlencoded", new MediaType() - .schema(new Schema<>() - .addProperty("username", new StringSchema()) - .addProperty("password", new StringSchema()) - ) - ) - ) - ) - .responses(new ApiResponses() - .addApiResponse("200", new ApiResponse().description("๋กœ๊ทธ์ธ ์„ฑ๊ณต")) - .addApiResponse("401", new ApiResponse().description("๋กœ๊ทธ์ธ ์‹คํŒจ")) - ) - ) - ); - + paths.addPathItem( + "/api/member/login", + new PathItem() + .post( + new Operation() + .summary("ํšŒ์› ๋กœ๊ทธ์ธ") + .description("์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ") + .requestBody( + new RequestBody() + .required(true) + .content( + new Content() + .addMediaType( + "application/x-www-form-urlencoded", + new MediaType() + .schema( + new Schema<>() + .addProperty("username", new StringSchema()) + .addProperty("password", new StringSchema()))))) + .responses( + new ApiResponses() + .addApiResponse("200", new ApiResponse().description("๋กœ๊ทธ์ธ ์„ฑ๊ณต")) + .addApiResponse("401", new ApiResponse().description("๋กœ๊ทธ์ธ ์‹คํŒจ"))))); // ๋กœ๊ทธ์•„์›ƒ API ๊ฒฝ๋กœ ์ถ”๊ฐ€ - paths.addPathItem("/api/member/logout", new io.swagger.v3.oas.models.PathItem() - .post(new io.swagger.v3.oas.models.Operation() - .summary("ํšŒ์› ๋กœ๊ทธ์•„์›ƒ") - .description("์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ธฐ๋ณธ ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ") - .responses(new ApiResponses() - .addApiResponse("200", new ApiResponse() - .description("๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต") - .content(new Content() - .addMediaType("application/x-www-form-urlencoded", new MediaType() - .schema(new Schema<>().type("string").example("Logout successful")))) - ) - ) - ) - ); + paths.addPathItem( + "/api/member/logout", + new io.swagger.v3.oas.models.PathItem() + .post( + new io.swagger.v3.oas.models.Operation() + .summary("ํšŒ์› ๋กœ๊ทธ์•„์›ƒ") + .description("์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ธฐ๋ณธ ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ") + .responses( + new ApiResponses() + .addApiResponse( + "200", + new ApiResponse() + .description("๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต") + .content( + new Content() + .addMediaType( + "application/x-www-form-urlencoded", + new MediaType() + .schema( + new Schema<>() + .type("string") + .example("Logout successful")))))))); return paths; } - - private Info apiInfo() { return new Info() .title("5re5 API Test") // API์˜ ์ œ๋ชฉ .description("swagger 5re5 park") // API์— ๋Œ€ํ•œ ์„ค๋ช… .version("1.0.0"); // API์˜ ๋ฒ„์ „ } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/request/SqsRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/request/SqsRequestDto.java index 355bfb3c..e3860ac1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/request/SqsRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/request/SqsRequestDto.java @@ -9,5 +9,4 @@ public class SqsRequestDto { MessageType messageType; String message; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/AudioFileInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/AudioFileInfo.java index fc07e76f..325cd33e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/AudioFileInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/AudioFileInfo.java @@ -10,7 +10,7 @@ @AllArgsConstructor public class AudioFileInfo { private String name; - private String size; //ํฌ๊ธฐ (์šฉ๋Ÿ‰) - private Integer length; // ์ดˆ ๋‹จ์œ„ ๊ธธ์ด - private String extension; //ํ™•์žฅ์ž + private String size; // ํฌ๊ธฐ (์šฉ๋Ÿ‰) + private Integer length; // ์ดˆ ๋‹จ์œ„ ๊ธธ์ด + private String extension; // ํ™•์žฅ์ž } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ErrorResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ErrorResponseDto.java index 83267255..7fe20c86 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ErrorResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ErrorResponseDto.java @@ -1,10 +1,9 @@ package com.oreo.finalproject_5re5_be.global.dto.response; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.List; - @Getter @AllArgsConstructor public class ErrorResponseDto { @@ -31,11 +30,12 @@ public static FieldErrorDetail of(String field, String message) { } } - public static ErrorResponseDto of(int status, String message, List fieldErrors) { + public static ErrorResponseDto of( + int status, String message, List fieldErrors) { return new ErrorResponseDto(status, new Response(message, fieldErrors)); } public static ErrorResponseDto of(int status, String message) { return new ErrorResponseDto(status, new Response(message, null)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ResponseDto.java index dec1b8de..cc11f396 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ResponseDto.java @@ -9,7 +9,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor -public class ResponseDto{ +public class ResponseDto { private int status; private T response; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/entity/BaseEntity.java b/src/main/java/com/oreo/finalproject_5re5_be/global/entity/BaseEntity.java index e585b1ae..adf929b8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/entity/BaseEntity.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/entity/BaseEntity.java @@ -1,6 +1,7 @@ package com.oreo.finalproject_5re5_be.global.entity; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.*; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; @@ -8,8 +9,6 @@ import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import java.time.LocalDateTime; - @Getter @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -26,10 +25,10 @@ public class BaseEntity { private LocalDateTime upDate; @CreatedBy - @Column(updatable = false, name ="reg_seq") + @Column(updatable = false, name = "reg_seq") private Long regSeq; @LastModifiedBy @Column(name = "up_seq") private Long upSeq; -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/EntityNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/EntityNotFoundException.java index 980a6e8d..d985cd93 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/EntityNotFoundException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/EntityNotFoundException.java @@ -5,9 +5,11 @@ public class EntityNotFoundException extends BusinessException { public EntityNotFoundException() { super(ErrorCode.ENTITY_NOT_FOUND.getMessage(), ErrorCode.ENTITY_NOT_FOUND); } + public EntityNotFoundException(String message) { super(message, ErrorCode.ENTITY_NOT_FOUND); } + public EntityNotFoundException(String message, ErrorCode errorCode) { super(message, errorCode); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java index 7ceda041..c83c8b3c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java @@ -29,13 +29,39 @@ public enum ErrorCode { CODE_DUPLICATED_ERROR(409, "์ด๋ฏธ ์‚ฌ์šฉ์ค‘์ธ ์ฝ”๋“œ๋ช…์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ฝ”๋“œ๋ช…์„ ์‚ฌ์šฉํ•ด ์ฃผ์„ธ์š”."), CODE_INVALID_INPUT_VALUE_ERROR(400, "์ฝ”๋“œ ์ž…๋ ฅ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), - - INVALID_INPUT_VALUE(400, " Invalid Input Value"), ENTITY_NOT_FOUND(400, " Entity Not Found"), INTERNAL_SERVER_ERROR(500, "Server Error"), INVALID_TYPE_VALUE(400, " Invalid Type Value"), - HANDLE_ACCESS_DENIED(403, "Access is Denied"); + HANDLE_ACCESS_DENIED(403, "Access is Denied"), + + // ํ”„๋กœ์ ํŠธ ERROR ์ฒ˜๋ฆฌ + PROJECT_NOT_FOUND_ERROR(404, "ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."), + PROJECT_INVALID_NAME(400, "ํ—ค๋‹น ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), + PROJECT_ACCESS_DENIED(403, "ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ํšŒ์›์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค."), + + // TTS ERROR ์ฒ˜๋ฆฌ + PROJECT_MISMATCH_ERROR(400, "์š”์ฒญํ•˜์‹  ํ”„๋กœ์ ํŠธ๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), + VOICE_ENTITY_NOT_FOUND_ERROR(404, "ํ•ด๋‹น ์Œ์„ฑ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."), + TTS_SENTENCE_NOT_FOUND_ERROR(404, "ํ•ด๋‹น ๋ฌธ์žฅ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."), + + // TTS ์ƒ์„ฑ ERROR ์ฒ˜๋ฆฌ + TTS_MAKE_FAILED_ERROR(500, "TTS ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."), + TTS_MAKE_INVALID_INPUT_VALUE_ERROR(400, "TTS ์ƒ์„ฑ ์ž…๋ ฅ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค."), + TTS_MAKE_INVALID_SPEED(400, "ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” TTS ์†๋„์ž…๋‹ˆ๋‹ค."), + TTS_MAKE_INVALID_PITCH(400, "ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” TTS ์Œ๋†’์ด์ž…๋‹ˆ๋‹ค."), + + TTS_MAKE_INVALID_VOLUME(400, "ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” TTS ์Œ๋Ÿ‰์ž…๋‹ˆ๋‹ค."), + + // VC ERROR ์ฒ˜๋ฆฌ + VC_ACCESS_DENIED(403, "ํšŒ์›์—๊ฒŒ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค."), + VC_NOT_FOUND_MEMBER_ERROR(403, "VC ํ•ด๋‹น ์ •๋ณด๊ฐ€ ํšŒ์›์—๊ฒŒ ์—†์Šต๋‹ˆ๋‹ค."), + VC_NOT_FOUND_ERROR(404, "ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ฐพ์„์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."), + VC_NOT_FOUND_PROJECT_ERROR(404, "ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐพ์„์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."), + VC_NOT_FOUND_SRC_ERROR(404, "ํ•ด๋‹น SRC๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."), + VC_NOT_FOUND_TRG_ERROR(404, "ํ•ด๋‹น TRG๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."), + VC_NOT_FOUND_TEXT_ERROR(404, "ํ•ด๋‹น Text๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."), + VC_NOT_FOUND_RESULT_ERROR(404, "ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฌผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); private final String message; private final int status; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/GlobalExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/GlobalExceptionHandler.java deleted file mode 100644 index 6d4babc1..00000000 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/GlobalExceptionHandler.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.oreo.finalproject_5re5_be.global.exception; - -import com.oreo.finalproject_5re5_be.project.exception.InvalidProjectNameException; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -@ControllerAdvice -public class GlobalExceptionHandler { - - @ExceptionHandler ( - InvalidProjectNameException.class - ) - public ResponseEntity handleInvalidProjectNameException(InvalidProjectNameException ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); - } - -} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/README.md b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/README.md deleted file mode 100644 index 244f91c6..00000000 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/README.md +++ /dev/null @@ -1 +0,0 @@ -# ์‚ญ์ œ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค! diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java index 64b5a68e..5615987e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java @@ -1,15 +1,33 @@ package com.oreo.finalproject_5re5_be.global.exception; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; +import com.oreo.finalproject_5re5_be.project.exception.InvalidProjectNameException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.multipart.MultipartException; @RestControllerAdvice public class RestGlobalExceptionHandler { + + @ExceptionHandler(RuntimeException.class) + public ResponseEntity> handleMethodException(DataNotFoundException ex) { + return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), ex.getMessage()).toResponseEntity(); + } + @ExceptionHandler(DataNotFoundException.class) public ResponseEntity> handleDataNotFoundException(DataNotFoundException ex) { return new ResponseDto<>(HttpStatus.NOT_FOUND.value(), ex.getMessage()).toResponseEntity(); } -} \ No newline at end of file + + @ExceptionHandler(MultipartException.class) + public ResponseEntity> handleMultipartException(MultipartException ex) { + return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), ex.getMessage()).toResponseEntity(); + } + + @ExceptionHandler(InvalidProjectNameException.class) + public ResponseEntity handleInvalidProjectNameException(InvalidProjectNameException ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationFailureHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationFailureHandler.java index 82b7995c..a1f2e63f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationFailureHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationFailureHandler.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.config; - import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -14,8 +13,9 @@ public class LoginAuthenticationFailureHandler implements AuthenticationFailureHandler { @Override - public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, - AuthenticationException exception) throws IOException, ServletException { + public void onAuthenticationFailure( + HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) + throws IOException, ServletException { // ๋กœ๊ทธ์ธ ์‹คํŒจ์‹œ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ // ๋กœ๊ทธ์ธ ์‹คํŒจ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java index 5875f346..fa67bb4f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java @@ -3,11 +3,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.member.entity.Member; -import jakarta.servlet.ServletException; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -15,34 +17,41 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - // ๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ @Slf4j @Component public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, - Authentication authentication) throws IOException, ServletException { - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - request : {} -> {} -> {}", request.toString(), response.toString(), authentication.toString()); + public void onAuthenticationSuccess( + HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException { + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - request : {} -> {} -> {}", + request.toString(), + response.toString(), + authentication.toString()); // ๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ ์œ ์ € ์ •๋ณด ๋ฐ˜ํ™˜ // ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”์ถœ Object principal = authentication.getPrincipal(); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", principal); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", principal); Map memberInfo = new HashMap<>(); - String memberId = ""; Long memberSeq = 0L; if (principal instanceof CustomUserDetails) { - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", principal); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", + principal); CustomUserDetails memberDetails = (CustomUserDetails) principal; - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - memberDetails : {} ", memberDetails); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - memberDetails : {} ", + memberDetails); Member member = memberDetails.getMember(); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - member : {} ", member.toString()); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - member : {} ", + member.toString()); memberInfo.put("seq", member.getSeq()); memberInfo.put("id", member.getId()); memberInfo.put("name", member.getName()); @@ -52,32 +61,41 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo memberSeq = member.getSeq(); } else if (principal instanceof UserDetails) { - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", principal); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", + principal); UserDetails userDetails = (UserDetails) principal; - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - userDetails : {} ", userDetails); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - userDetails : {} ", + userDetails); memberInfo.put("username", userDetails.getUsername()); memberId = userDetails.getUsername(); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - memberId = : {} ", memberId); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - memberId = : {} ", + memberId); memberSeq = 0L; } log.info("memberSeq = {}", memberSeq); log.info("memberId = {}", memberId); - // ๊ธฐ์กด ์„ธ์…˜ ์‚ญ์ œ - request.getSession().invalidate(); - // ์„ธ์…˜ ์กฐํšŒ HttpSession session = request.getSession(true); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session = : {} ", session.toString()); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session = : {} ", + session.toString()); // ์„ธ์…˜์— ์•„์ด๋”” ๋“ฑ๋ก session.setAttribute("memberId", memberId); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session-memberId = : {} ", session.getAttribute("memberId")); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session-memberId = : {} ", + session.getAttribute("memberId")); session.setAttribute("memberSeq", memberSeq); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session-memberSeq = : {} ", session.getAttribute("memberSeq")); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session-memberSeq = : {} ", + session.getAttribute("memberSeq")); // ๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„ context ๋“ฑ๋ก SecurityContextHolder.getContext().setAuthentication(authentication); @@ -86,15 +104,20 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // JSON์œผ๋กœ ์‘๋‹ต response.setContentType("application/json;charset=UTF-8"); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - response : {} ", response.toString()); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - response : {} ", response); new ObjectMapper().writeValue(response.getWriter(), memberInfo); } // ์ฟ ํ‚ค ๋“ฑ๋ก // ๋งŒ์•ฝ ์ฟ ํ‚ค ์ฒดํฌ๊ฐ€ rememberMe๋กœ ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •. ์ด ๋ถ€๋ถ„ ์ถ”ํ›„์— ํ”„๋ก ํŠธ๋ž‘ ์–˜๊ธฐํ•ด์•ผํ•จ - private void handleCookie(HttpServletRequest request, HttpServletResponse response, - Authentication authentication) throws IOException { - log.info("[LoginAuthenticationSuccessHandler] handleCookie - request : {} -> {} -> {}", request.toString(), response.toString(), authentication.toString()); + private void handleCookie( + HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + log.info( + "[LoginAuthenticationSuccessHandler] handleCookie - request : {} -> {} -> {}", + request.toString(), + response.toString(), + authentication.toString()); // Authentication์—์„œ ํšŒ์› ์•„์ด๋”” ์กฐํšŒ String memberId = authentication.getName(); log.info("[LoginAuthenticationSuccessHandler] handleCookie - memberId : {} ", memberId); @@ -108,16 +131,20 @@ private void handleCookie(HttpServletRequest request, HttpServletResponse respon Cookie cookie = new Cookie("memberId", memberId); log.info("[LoginAuthenticationSuccessHandler] handleCookie - cookie1 : {} ", cookie); // ์ฟ ํ‚ค ๋„๋ฉ”์ธ ์„ค์ • - cookie.setHttpOnly(true);// HTTPS์—์„œ๋งŒ ์ „์†ก - cookie.setPath("/"); // ์ฟ ํ‚ค๊ฐ€ ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ ์œ ํšจ - response.setHeader("Set-Cookie", String.format("%s=%s; Path=/; HttpOnly; Secure; SameSite=None", - cookie.getName(), cookie.getValue())); + cookie.setHttpOnly(true); // HTTPS์—์„œ๋งŒ ์ „์†ก + cookie.setPath("/"); // ์ฟ ํ‚ค๊ฐ€ ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ ์œ ํšจ + response.setHeader( + "Set-Cookie", + String.format( + "%s=%s; Path=/; HttpOnly; Secure; SameSite=None", + cookie.getName(), cookie.getValue())); // 1์ผ ๊ฐ„ ์œ ์ง€ - cookie.setMaxAge(60 * 60 * 24 * 1); + cookie.setMaxAge(60 * 60 * 24); log.info("[LoginAuthenticationSuccessHandler] handleCookie - cookie2 : {} ", cookie); // ์ฟ ํ‚ค ๋“ฑ๋ก response.addCookie(cookie); response.setHeader("Access-Control-Allow-Origin", "https://5re5park.site"); + response.setHeader("Access-Control-Allow-Origin", "https://dev1.5re5park.site"); response.setHeader("Access-Control-Allow-Credentials", "true"); } else { @@ -128,6 +155,5 @@ private void handleCookie(HttpServletRequest request, HttpServletResponse respon cookie.setMaxAge(0); response.addCookie(cookie); } - } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberConfig.java index d5fc6da6..64059921 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberConfig.java @@ -1,6 +1,6 @@ package com.oreo.finalproject_5re5_be.member.config; - +import java.util.Properties; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -8,12 +8,6 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; - -import java.util.List; -import java.util.Properties; @Configuration public class MemberConfig { @@ -54,7 +48,4 @@ public JavaMailSender javaMailSender() { return mailSender; } - } - - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberSecurityConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberSecurityConfig.java index 29005d68..c1eebd3c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberSecurityConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberSecurityConfig.java @@ -1,87 +1,92 @@ package com.oreo.finalproject_5re5_be.member.config; -import java.util.List; -import org.apache.catalina.filters.CorsFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; - import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; - @Configuration @EnableWebSecurity public class MemberSecurityConfig { private final LoginAuthenticationSuccessHandler successHandler; private final LoginAuthenticationFailureHandler failureHandler; - public MemberSecurityConfig(LoginAuthenticationSuccessHandler successHandler, LoginAuthenticationFailureHandler failureHandler) { + + public MemberSecurityConfig( + LoginAuthenticationSuccessHandler successHandler, + LoginAuthenticationFailureHandler failureHandler) { this.successHandler = successHandler; this.failureHandler = failureHandler; } // SecurityFilterChain ์„ค์ • ๋นˆ ๋“ฑ๋ก, ์ถ”ํ›„์— ์ ์šฉ ์˜ˆ์ •(๋‹ค๋ฅธ ํŒŒํŠธ ์ž‘์—… ์™„๋ฃŒํ›„ ์ธ์ฆ/์ธ๊ฐ€ ์ฒ˜๋ฆฌ ์ ์šฉ์˜ˆ์ •) -// @Bean -// public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { -// http -// .csrf(csrf -> csrf.disable()) // csrf ๋น„ํ™œ์„ฑํ™” -// .authorizeHttpRequests(authorize -> authorize -// .requestMatchers("/", "/api/member/register") // ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์™€ ํ™ˆ ํŽ˜์ด์ง€๋Š” ์ธ์ฆ/์ธ๊ฐ€ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅ -// .permitAll() -// .requestMatchers("/audio/**", "/project/**", "/languagecode/**", -// "/voice/**", "/style", "/vc/**", "/concat") // ๊ทธ์™ธ์˜ ํŽ˜์ด์ง€๋Š” ์ธ์ฆ/์ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•จ -// .authenticated() -// ) -// .formLogin(formLogin -> formLogin -// .loginPage("/api/member/login") // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ฒฝ๋กœ ์„ค์ • -// .successHandler(successHandler) // ๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ ์„ค์ • -// .failureUrl("/api/member/login") // ๋กœ๊ทธ์ธ ์‹คํŒจ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ -// ).logout(logout -> logout -// .logoutUrl("/api/member/logout") // ๋กœ๊ทธ์•„์›ƒ ๊ฒฝ๋กœ ์„ค์ • -// .invalidateHttpSession(true) // ๋กœ๊ทธ์•„์›ƒ์‹œ ์„ธ์…˜ ๋ฌดํšจํ™” ์„ค์ • -// .logoutSuccessUrl("/") // ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต์‹œ ์ด๋™ํ•  ํŽ˜์ด์ง€ ์„ค์ • -// ); -// -// -// return http.build(); -// } -// ๋ฐ‘์— ๊ฐœ๋ฐœ ์–ด๋А์ •๋„ ๋งˆ๋ฌด๋ฆฌ ๋˜๋ฉด ์ฃผ์„์ฒ˜๋ฆฌ๋œ ๋ถ€๋ถ„ ์ฃผ์„ ํ•ด์ œํ•˜๊ณ  ์ ์šฉํ•  ์˜ˆ์ • -// .requestMatchers("/", "/member/**", "/api/member/**", "/api/member-term-condition/**", // ํ—ˆ์šฉ๋˜๋Š” URL -// "/audio/**", "/project/**", "/languagecode/**", -// "/voice/**", "/style/**", "/vc/**", "/concat/**", -// "/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html") // Swagger ๊ด€๋ จ URL ํ—ˆ์šฉ - + // @Bean + // public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + // http + // .csrf(csrf -> csrf.disable()) // csrf ๋น„ํ™œ์„ฑํ™” + // .authorizeHttpRequests(authorize -> authorize + // .requestMatchers("/", "/api/member/register") // ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์™€ ํ™ˆ ํŽ˜์ด์ง€๋Š” ์ธ์ฆ/์ธ๊ฐ€ + // ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅ + // .permitAll() + // .requestMatchers("/audio/**", "/project/**", "/languagecode/**", + // "/voice/**", "/style", "/vc/**", "/concat") // ๊ทธ์™ธ์˜ ํŽ˜์ด์ง€๋Š” ์ธ์ฆ/์ธ๊ฐ€๊ฐ€ + // ํ•„์š”ํ•จ + // .authenticated() + // ) + // .formLogin(formLogin -> formLogin + // .loginPage("/api/member/login") // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ฒฝ๋กœ ์„ค์ • + // .successHandler(successHandler) // ๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ ์„ค์ • + // .failureUrl("/api/member/login") // ๋กœ๊ทธ์ธ ์‹คํŒจ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ + // ).logout(logout -> logout + // .logoutUrl("/api/member/logout") // ๋กœ๊ทธ์•„์›ƒ ๊ฒฝ๋กœ ์„ค์ • + // .invalidateHttpSession(true) // ๋กœ๊ทธ์•„์›ƒ์‹œ ์„ธ์…˜ ๋ฌดํšจํ™” ์„ค์ • + // .logoutSuccessUrl("/") // ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต์‹œ ์ด๋™ํ•  ํŽ˜์ด์ง€ ์„ค์ • + // ); + // + // + // return http.build(); + // } + // ๋ฐ‘์— ๊ฐœ๋ฐœ ์–ด๋А์ •๋„ ๋งˆ๋ฌด๋ฆฌ ๋˜๋ฉด ์ฃผ์„์ฒ˜๋ฆฌ๋œ ๋ถ€๋ถ„ ์ฃผ์„ ํ•ด์ œํ•˜๊ณ  ์ ์šฉํ•  ์˜ˆ์ • + // .requestMatchers("/", "/member/**", "/api/member/**", + // "/api/member-term-condition/**", // ํ—ˆ์šฉ๋˜๋Š” URL + // "/audio/**", "/project/**", "/languagecode/**", + // "/voice/**", "/style/**", "/vc/**", "/concat/**", + // "/v3/api-docs/**", "/swagger-ui/**", + // "/swagger-ui.html") // Swagger ๊ด€๋ จ URL ํ—ˆ์šฉ // SecurityFilterChain์„ ๋นˆ์œผ๋กœ ๋“ฑ๋ก @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http - .cors(cors -> cors.configurationSource(corsConfigurationSource())) // ์ƒˆ๋กœ์šด ๋ฐฉ์‹์œผ๋กœ CORS ์„ค์ • ์ ์šฉ + http.cors(cors -> cors.configurationSource(corsConfigurationSource())) // ์ƒˆ๋กœ์šด ๋ฐฉ์‹์œผ๋กœ CORS ์„ค์ • ์ ์šฉ .csrf(csrf -> csrf.disable()) // CSRF ๋น„ํ™œ์„ฑํ™” - .authorizeHttpRequests(authorize -> authorize - .anyRequest() // ๊ฐœ๋ฐœ ๋‹จ๊ณ„๋กœ ๋ชจ๋“  ์š”์ฒญ ์—ด์–ด๋‘  - .permitAll() // ์œ„ URL๋“ค์€ ์ธ์ฆ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅ - ) - .formLogin(formLogin -> formLogin - .loginPage("/api/member/login") // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ฒฝ๋กœ ์„ค์ • - .successHandler(successHandler) // ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ ์„ค์ • - .failureHandler(failureHandler) // ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ - ) - .logout(logout -> logout - .logoutUrl("/api/member/logout") // ๋กœ๊ทธ์•„์›ƒ ๊ฒฝ๋กœ ์„ค์ • - .invalidateHttpSession(true) // ๋กœ๊ทธ์•„์›ƒ ์‹œ ์„ธ์…˜ ๋ฌดํšจํ™” - .logoutSuccessUrl("/") // ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต ์‹œ ์ด๋™ํ•  ํŽ˜์ด์ง€ - ); + .authorizeHttpRequests( + authorize -> + authorize + .anyRequest() // ๊ฐœ๋ฐœ ๋‹จ๊ณ„๋กœ ๋ชจ๋“  ์š”์ฒญ ์—ด์–ด๋‘  + .permitAll() // ์œ„ URL๋“ค์€ ์ธ์ฆ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅ + ) + .formLogin( + formLogin -> + formLogin + .loginPage("/api/member/login") // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ฒฝ๋กœ ์„ค์ • + .successHandler(successHandler) // ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ ์„ค์ • + .failureHandler(failureHandler) // ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ + ) + .logout( + logout -> + logout + .logoutUrl("/api/member/logout") // ๋กœ๊ทธ์•„์›ƒ ๊ฒฝ๋กœ ์„ค์ • + .invalidateHttpSession(true) // ๋กœ๊ทธ์•„์›ƒ ์‹œ ์„ธ์…˜ ๋ฌดํšจํ™” + .logoutSuccessUrl("/") // ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต ์‹œ ์ด๋™ํ•  ํŽ˜์ด์ง€ + ); return http.build(); } - // CorsConfigurationSource ๋นˆ ๋“ฑ๋ก @Bean public CorsConfigurationSource corsConfigurationSource() { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberController.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberController.java index 6baf3073..d684ef47 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberController.java @@ -6,7 +6,6 @@ import com.oreo.finalproject_5re5_be.member.dto.request.MemberUpdateRequest; import com.oreo.finalproject_5re5_be.member.dto.response.MemberReadResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberRegisterResponse; -import com.oreo.finalproject_5re5_be.member.dto.response.MemberResponse; import com.oreo.finalproject_5re5_be.member.service.MemberServiceImpl; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -14,14 +13,12 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.Min; import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -41,14 +38,14 @@ public class MemberController { @Operation(summary = "ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ") @PostMapping("/register") - public ResponseEntity register(@Valid @RequestBody MemberRegisterRequest request) { + public ResponseEntity register( + @Valid @RequestBody MemberRegisterRequest request) { // ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ memberService.create(request); // ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ ์‘๋‹ต ์ƒ์„ฑ MemberRegisterResponse response = MemberRegisterResponse.of("ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค"); // ์‘๋‹ต ๋ฐ˜ํ™˜ - return ResponseEntity.ok() - .body(response); + return ResponseEntity.ok().body(response); } @Operation(summary = "์ด๋ฉ”์ผ ์ธ์ฆ ๋ฒˆํ˜ธ ๋ฐœ์†ก ์ฒ˜๋ฆฌ") @@ -57,61 +54,71 @@ public ResponseEntity verifyEmail(@RequestBody String email) { // ์ธ์ฆ๋ฒˆํ˜ธ ์ƒ์„ฑ ๋ฐ ์œ ์ €์—๊ฒŒ ์ด๋ฉ”์ผ ๋ฐœ์†ก String verificationCode = memberService.sendVerificationCode(email); // ์ธ์ฆ๋ฒˆํ˜ธ ๋ฐ˜ํ™˜ - return ResponseEntity.ok() - .body(verificationCode); + return ResponseEntity.ok().body(verificationCode); } - @Operation(summary = "ํšŒ์› ๋‹จ์ˆœ ์กฐํšŒ ์ฒ˜๋ฆฌ") @GetMapping("/read/{memberSeq}") - public ResponseEntity read(@Parameter(description = "Member ์‹œํ€€์Šค") @Min(value = 1L, message = "ํšŒ์›์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @PathVariable("memberSeq") Long memberSeq) { + public ResponseEntity read( + @Parameter(description = "Member ์‹œํ€€์Šค") + @Min(value = 1L, message = "ํšŒ์›์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @PathVariable("memberSeq") + Long memberSeq) { // ํšŒ์› ์กฐํšŒ MemberReadResponse response = memberService.read(memberSeq); // ์‘๋‹ต ๋ฐ˜ํ™˜ - return ResponseEntity.ok() - .body(response); + return ResponseEntity.ok().body(response); } @Operation(summary = "ํšŒ์› ์ˆ˜์ • ์ฒ˜๋ฆฌ") @PutMapping("/{memberSeq}") - public ResponseEntity update(@Parameter(description = "Member ์‹œํ€€์Šค") @Min(value = 1L, message = "ํšŒ์›์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @PathVariable("memberSeq") Long memberSeq, @Valid @RequestBody - MemberUpdateRequest request) { + public ResponseEntity update( + @Parameter(description = "Member ์‹œํ€€์Šค") + @Min(value = 1L, message = "ํšŒ์›์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @PathVariable("memberSeq") + Long memberSeq, + @Valid @RequestBody MemberUpdateRequest request) { // ์ˆ˜์ • ์ฒ˜๋ฆฌ memberService.update(memberSeq, request); // ์‘๋‹ต ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @Operation(summary = "ํšŒ์› ์‚ญ์ œ ์ฒ˜๋ฆฌ") @DeleteMapping("/{memberSeq}") - public ResponseEntity remove(@Parameter(description = "Member ์‹œํ€€์Šค") @Min(value = 1L, message = "ํšŒ์›์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @PathVariable("memberSeq") Long memberSeq, @Valid @RequestBody MemberRemoveRequest request) { + public ResponseEntity remove( + @Parameter(description = "Member ์‹œํ€€์Šค") + @Min(value = 1L, message = "ํšŒ์›์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @PathVariable("memberSeq") + Long memberSeq, + @Valid @RequestBody MemberRemoveRequest request) { // ์‚ญ์ œ ์ฒ˜๋ฆฌ memberService.remove(memberSeq, request); // ์‘๋‹ต ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @Operation(summary = "๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ์ฒ˜๋ฆฌ") @PutMapping("/change-password/{memberSeq}") - public ResponseEntity changePassword(@Parameter(description = "Member ์‹œํ€€์Šค") @Min(value = 1L, message = "ํšŒ์›์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @PathVariable("memberSeq") Long memberSeq, @Valid @RequestBody MemberChangePasswordRequest request) { + public ResponseEntity changePassword( + @Parameter(description = "Member ์‹œํ€€์Šค") + @Min(value = 1L, message = "ํšŒ์›์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @PathVariable("memberSeq") + Long memberSeq, + @Valid @RequestBody MemberChangePasswordRequest request) { // ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ์ฒ˜๋ฆฌ memberService.updatePassword(memberSeq, request); // ์‘๋‹ต ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } - @Operation(summary = "ํšŒ์› ์•„์ด๋”” ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ") @GetMapping("/find-id/{email}") - public ResponseEntity findId(@Parameter(description = "์ด๋ฉ”์ผ") @PathVariable("email") String email) { + public ResponseEntity findId( + @Parameter(description = "์ด๋ฉ”์ผ") @PathVariable("email") String email) { // ์•„์ด๋”” ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ String id = memberService.findId(email); // ์‘๋‹ต ๋ฐ˜ํ™˜ - return ResponseEntity.ok() - .body(id); - + return ResponseEntity.ok().body(id); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermConditionController.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermConditionController.java index 46a8aec1..1e5f26e6 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermConditionController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermConditionController.java @@ -2,30 +2,18 @@ import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermConditionRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermConditionUpdateRequest; -import com.oreo.finalproject_5re5_be.member.dto.response.ErrorResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermConditionResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermConditionResponses; -import com.oreo.finalproject_5re5_be.member.exception.MemberInvalidTermConditionException; -import com.oreo.finalproject_5re5_be.member.exception.MemberTermsConditionNotFoundException; import com.oreo.finalproject_5re5_be.member.service.MemberTermsConditionServiceImpl; -import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.ConstraintViolationException; import jakarta.validation.Valid; import java.util.List; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindingResult; -import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -40,87 +28,82 @@ public class MemberTermConditionController { private final MemberTermsConditionServiceImpl memberTermConditionService; - -// @Operation(summary = "ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ ๋“ฑ๋ก ์ฒ˜๋ฆฌ") -// @PostMapping("/register") - public ResponseEntity register(@Valid @RequestBody MemberTermConditionRequest request) { + // @Operation(summary = "ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ ๋“ฑ๋ก ์ฒ˜๋ฆฌ") + // @PostMapping("/register") + public ResponseEntity register( + @Valid @RequestBody MemberTermConditionRequest request) { // ๋‹จ๊ฑด ๋“ฑ๋ก ์ฒ˜๋ฆฌ MemberTermConditionResponse response = memberTermConditionService.create(request); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.CREATED) - .body(response); + return ResponseEntity.status(HttpStatus.CREATED).body(response); } -// @Operation(summary = "ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ ์—ฌ๋Ÿฌ๊ฐœ ๋“ฑ๋ก ์ฒ˜๋ฆฌ") -// @PostMapping("/register-all") - public ResponseEntity register(@Valid @RequestBody List requests) { + // @Operation(summary = "ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ ์—ฌ๋Ÿฌ๊ฐœ ๋“ฑ๋ก ์ฒ˜๋ฆฌ") + // @PostMapping("/register-all") + public ResponseEntity register( + @Valid @RequestBody List requests) { // ์—ฌ๋Ÿฌ๊ฑด ๋“ฑ๋ก ์ฒ˜๋ฆฌ MemberTermConditionResponses response = memberTermConditionService.create(requests); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.CREATED) - .body(response); + return ResponseEntity.status(HttpStatus.CREATED).body(response); } -// @Operation(summary = "ํŠน์ • ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ ์กฐํšŒ") -// @GetMapping("/{condCode}") - public ResponseEntity read(@PathVariable("condCode") String condCode) { + // @Operation(summary = "ํŠน์ • ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ ์กฐํšŒ") + // @GetMapping("/{condCode}") + public ResponseEntity read( + @PathVariable("condCode") String condCode) { // ๋‹จ๊ฑด ์กฐํšŒ ์ฒ˜๋ฆฌ MemberTermConditionResponse response = memberTermConditionService.read(condCode); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ ์กฐํšŒ") -// @GetMapping("/all") + // @Operation(summary = "๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ ์กฐํšŒ") + // @GetMapping("/all") public ResponseEntity readAll() { // ๋ชจ๋“  ์กฐํšŒ ์ฒ˜๋ฆฌ MemberTermConditionResponses response = memberTermConditionService.readAll(); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•ฝ๊ด€ ํ•ญ๋ชฉ ์กฐํšŒ") -// @GetMapping("/available") + // @Operation(summary = "์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•ฝ๊ด€ ํ•ญ๋ชฉ ์กฐํšŒ") + // @GetMapping("/available") public ResponseEntity readAvailable() { // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํšŒ ์ฒ˜๋ฆฌ MemberTermConditionResponses response = memberTermConditionService.readAvailable(); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์•ฝ๊ด€ ํ•ญ๋ชฉ ์กฐํšŒ") -// @GetMapping("/not-available") + // @Operation(summary = "์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์•ฝ๊ด€ ํ•ญ๋ชฉ ์กฐํšŒ") + // @GetMapping("/not-available") public ResponseEntity readNotAvailable() { // ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํšŒ ์ฒ˜๋ฆฌ MemberTermConditionResponses response = memberTermConditionService.readNotAvailable(); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "ํŠน์ • ์•ฝ๊ด€ ํ•ญ๋ชฉ ์ˆ˜์ •") -// @PatchMapping("/{condCode}") - public ResponseEntity update(@PathVariable("condCode") String condCode, @RequestBody @Valid MemberTermConditionUpdateRequest request) { + // @Operation(summary = "ํŠน์ • ์•ฝ๊ด€ ํ•ญ๋ชฉ ์ˆ˜์ •") + // @PatchMapping("/{condCode}") + public ResponseEntity update( + @PathVariable("condCode") String condCode, + @RequestBody @Valid MemberTermConditionUpdateRequest request) { // ์ˆ˜์ • ์ฒ˜๋ฆฌ memberTermConditionService.update(condCode, request); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } -// @Operation(summary = "ํŠน์ • ์•ฝ๊ด€ ํ•ญ๋ชฉ ์‚ญ์ œ") -// @DeleteMapping("/{condCode}") + // @Operation(summary = "ํŠน์ • ์•ฝ๊ด€ ํ•ญ๋ชฉ ์‚ญ์ œ") + // @DeleteMapping("/{condCode}") public ResponseEntity remove(@PathVariable("condCode") String condCode) { // ์‚ญ์ œ ์ฒ˜๋ฆฌ memberTermConditionService.remove(condCode); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermsController.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermsController.java index 0fd03d6b..7ce20c39 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermsController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermsController.java @@ -2,38 +2,24 @@ import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermUpdateRequest; -import com.oreo.finalproject_5re5_be.member.dto.response.ErrorResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermResponses; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermsDetailResponse; -import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; -import com.oreo.finalproject_5re5_be.member.exception.MemberTermInvalidException; -import com.oreo.finalproject_5re5_be.member.exception.MemberTermsConditionNotFoundException; -import com.oreo.finalproject_5re5_be.member.exception.MemberTermsNotFoundException; import com.oreo.finalproject_5re5_be.member.service.MemberTermsServiceImpl; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.ConstraintViolationException; import jakarta.validation.Valid; import jakarta.validation.constraints.Min; -import java.util.List; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindingResult; -import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @Slf4j @@ -46,85 +32,86 @@ public class MemberTermsController { private final MemberTermsServiceImpl memberTermsService; -// @Operation(summary = "ํšŒ์› ์•ฝ๊ด€ ๋“ฑ๋ก ์ฒ˜๋ฆฌ") -// @PostMapping("/register") - public ResponseEntity register(@Valid @RequestBody MemberTermRequest request) { + // @Operation(summary = "ํšŒ์› ์•ฝ๊ด€ ๋“ฑ๋ก ์ฒ˜๋ฆฌ") + // @PostMapping("/register") + public ResponseEntity register( + @Valid @RequestBody MemberTermRequest request) { // ํšŒ์› ์•ฝ๊ด€ ๋“ฑ๋ก ์ฒ˜๋ฆฌ MemberTermResponse response = memberTermsService.create(request); // ๋“ฑ๋ก๋œ ํšŒ์› ์•ฝ๊ด€ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.CREATED) - .body(response); + return ResponseEntity.status(HttpStatus.CREATED).body(response); } -// @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ์กฐํšŒ") -// @GetMapping("/all") + // @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ์กฐํšŒ") + // @GetMapping("/all") public ResponseEntity readAll() { // ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€์— ๋Œ€ํ•ด ์กฐํšŒ MemberTermResponses memberTermResponses = memberTermsService.readAll(); // ์กฐํšŒ๋œ ํšŒ์› ์•ฝ๊ด€์„ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.OK) - .body(memberTermResponses); + return ResponseEntity.status(HttpStatus.OK).body(memberTermResponses); } -// @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ์ค‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์•ฝ๊ด€ ์กฐํšŒ") -// @GetMapping("/available") + // @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ์ค‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์•ฝ๊ด€ ์กฐํšŒ") + // @GetMapping("/available") public ResponseEntity readAvailable() { // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•ฝ๊ด€์— ๋Œ€ํ•ด ์กฐํšŒ MemberTermResponses memberTermResponses = memberTermsService.readAvailable(); // ์กฐํšŒ๋œ ์•ฝ๊ด€ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.OK) - .body(memberTermResponses); + return ResponseEntity.status(HttpStatus.OK).body(memberTermResponses); } -// @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ์ค‘ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์•ฝ๊ด€ ์กฐํšŒ") -// @GetMapping("/not-available") + // @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ์ค‘ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์•ฝ๊ด€ ์กฐํšŒ") + // @GetMapping("/not-available") public ResponseEntity readNotAvailable() { // ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์•ฝ๊ด€์— ๋Œ€ํ•ด ์กฐํšŒ MemberTermResponses memberTermResponses = memberTermsService.readNotAvailable(); // ์กฐํšŒ๋œ ์•ฝ๊ด€ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.OK) - .body(memberTermResponses); + return ResponseEntity.status(HttpStatus.OK).body(memberTermResponses); } -// @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ์ค‘ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์•ฝ๊ด€ ์กฐํšŒ") -// @GetMapping("/latest-available") + // @Operation(summary = "๋“ฑ๋ก๋œ ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ์ค‘ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์•ฝ๊ด€ ์กฐํšŒ") + // @GetMapping("/latest-available") public ResponseEntity readLatestAvailable() { // ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•ฝ๊ด€ ์กฐํšŒ MemberTermResponse response = memberTermsService.readLatestAvailable(); // ์กฐํšŒ๋œ ์•ฝ๊ด€ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "๋“ฑ๋ก๋œ ํšŒ์› ์•ฝ๊ด€ ์ˆ˜์ • ์ฒ˜๋ฆฌ") -// @PutMapping("/{termSeq}") - public ResponseEntity update(@Parameter(description = "Member Term ์‹œํ€€์Šค") @Min(value = 1L, message = "ํšŒ์› ์•ฝ๊ด€์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @PathVariable("termSeq") Long termSeq, @Valid @RequestBody MemberTermUpdateRequest request) { + // @Operation(summary = "๋“ฑ๋ก๋œ ํšŒ์› ์•ฝ๊ด€ ์ˆ˜์ • ์ฒ˜๋ฆฌ") + // @PutMapping("/{termSeq}") + public ResponseEntity update( + @Parameter(description = "Member Term ์‹œํ€€์Šค") + @Min(value = 1L, message = "ํšŒ์› ์•ฝ๊ด€์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @PathVariable("termSeq") + Long termSeq, + @Valid @RequestBody MemberTermUpdateRequest request) { // ์ˆ˜์ • ์ฒ˜๋ฆฌ memberTermsService.update(termSeq, request); // ์ˆ˜์ • ์„ฑ๊ณต์‹œ ์‘๋‹ต ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } -// @Operation(summary = "๋“ฑ๋ก๋œ ํšŒ์› ์•ฝ๊ด€ ์‚ญ์ œ ์ฒ˜๋ฆฌ") -// @DeleteMapping("/{termSeq}") - public ResponseEntity remove(@Parameter(description = "Member Term ์‹œํ€€์Šค") @Min(value = 1L, message = "ํšŒ์› ์•ฝ๊ด€์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @PathVariable("termSeq") Long seq) { + // @Operation(summary = "๋“ฑ๋ก๋œ ํšŒ์› ์•ฝ๊ด€ ์‚ญ์ œ ์ฒ˜๋ฆฌ") + // @DeleteMapping("/{termSeq}") + public ResponseEntity remove( + @Parameter(description = "Member Term ์‹œํ€€์Šค") + @Min(value = 1L, message = "ํšŒ์› ์•ฝ๊ด€์˜ ์‹œํ€€์Šค๊ฐ€ ์ž˜๋ชป๋์Šต๋‹ˆ๋‹ค. ์ž๋™์ฆ๋ถ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @PathVariable("termSeq") + Long seq) { // ์‚ญ์ œ ์ฒ˜๋ฆฌ memberTermsService.remove(seq); // ์‚ญ์ œ ์„ฑ๊ณต์‹œ ์‘๋‹ต ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @Operation(summary = "ํŠน์ • ํšŒ์› ์•ฝ๊ด€ ์ฝ”๋“œ๋กœ ์กฐํšŒ ์ฒ˜๋ฆฌ") @GetMapping("/{termCode}") - public ResponseEntity readByTermCode(@Parameter(description = "Member Term ์ฝ”๋“œ") @PathVariable("termCode") String termCode) { + public ResponseEntity readByTermCode( + @Parameter(description = "Member Term ์ฝ”๋“œ") @PathVariable("termCode") String termCode) { // ํŠน์ • ํšŒ์› ์•ฝ๊ด€ ์ฝ”๋“œ๋กœ ์กฐํšŒ MemberTermsDetailResponse response = memberTermsService.readByTermCode(termCode); // ์กฐํšŒ๋œ ํšŒ์› ์•ฝ๊ด€ ๋ฐ˜ํ™˜ - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/TestController.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/TestController.java index 06ee943c..1bd170dd 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/TestController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/TestController.java @@ -1,12 +1,9 @@ package com.oreo.finalproject_5re5_be.member.controller; - import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -/** - * ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ํ…Œ์ŠคํŠธ์šฉ ์ž„์‹œ ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์ถ”ํ›„ ์‚ญ์ œ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. - */ +/** ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ํ…Œ์ŠคํŠธ์šฉ ์ž„์‹œ ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์ถ”ํ›„ ์‚ญ์ œ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. */ @RestController public class TestController { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/advice/MemberExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/advice/MemberExceptionHandler.java index 225c8b36..02cd2527 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/advice/MemberExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/advice/MemberExceptionHandler.java @@ -16,12 +16,10 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; - @Slf4j @RestControllerAdvice(basePackages = "com.oreo.finalproject_5re5_be.member.controller") public class MemberExceptionHandler { - // ํšŒ์› ํŒŒํŠธ์—์„œ RuntimeException์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ @ExceptionHandler(RuntimeException.class) public ResponseEntity handleRuntimeException(RuntimeException e) { @@ -29,16 +27,13 @@ public ResponseEntity handleRuntimeException(RuntimeException log.error("MEMBER : [RuntimeException] ", e); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ƒ์„ฑ - ErrorResponseDto response = ErrorResponseDto.of(INTERNAL_SERVER_ERROR.getStatus(), - e.getMessage()); + ErrorResponseDto response = + ErrorResponseDto.of(INTERNAL_SERVER_ERROR.getStatus(), e.getMessage()); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(response.getStatus()) - .body(response); - + return ResponseEntity.status(response.getStatus()).body(response); } - // ํšŒ์› ํŒŒํŠธ์—์„œ BusinessException์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ @ExceptionHandler(BusinessException.class) public ResponseEntity handleBusinessException(BusinessException e) { @@ -46,18 +41,16 @@ public ResponseEntity handleBusinessException(BusinessExceptio log.error("MEMBER : [BusinessException] ", e); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ƒ์„ฑ - ErrorResponseDto response = ErrorResponseDto.of(e.getErrorCode().getStatus(), - e.getMessage()); + ErrorResponseDto response = ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(response.getStatus()) - .body(response); + return ResponseEntity.status(response.getStatus()).body(response); } - // ํšŒ์› ํŒŒํŠธ์—์„œ MethodArgumentNotValidException์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ - ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ์‹คํŒจ @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + public ResponseEntity handleMethodArgumentNotValidException( + MethodArgumentNotValidException e) { // ๋กœ๊ทธ๋กœ ์–ด๋–ค ์˜ˆ์™ธ ํด๋ž˜์Šค๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ‘œ์‹œ log.error("MEMBER : [MethodArgumentNotValidException] ", e); @@ -66,43 +59,48 @@ public ResponseEntity handleMethodArgumentNotValidException(Me BindingResult result = e.getBindingResult(); // ํ•„๋“œ ์—๋Ÿฌ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ - List fieldErrorList = result.getFieldErrors() - .stream() - .map(error -> FieldErrorDetail.of(error.getField(), error.getDefaultMessage())) - .toList(); + List fieldErrorList = + result.getFieldErrors().stream() + .map(error -> FieldErrorDetail.of(error.getField(), error.getDefaultMessage())) + .toList(); // ErrorResponseDto ์ƒ์„ฑ - ErrorResponseDto response = ErrorResponseDto.of(MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus(), - MEMBER_INVALID_INPUT_VALUE_ERROR.getMessage(), - fieldErrorList); + ErrorResponseDto response = + ErrorResponseDto.of( + MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus(), + MEMBER_INVALID_INPUT_VALUE_ERROR.getMessage(), + fieldErrorList); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(response.getStatus()) - .body(response); + return ResponseEntity.status(response.getStatus()).body(response); } - // ํšŒ์› ํŒŒํŠธ์—์„œ ConstraintViolationException ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์•ฝ ์กฐ๊ฑด ์œ„๋ฐ˜ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒ(JPA/Hibernate) @ExceptionHandler(ConstraintViolationException.class) - public ResponseEntity handleConstraintViolationException(ConstraintViolationException e) { + public ResponseEntity handleConstraintViolationException( + ConstraintViolationException e) { // ๋กœ๊ทธ๋กœ ์–ด๋–ค ์˜ˆ์™ธ ํด๋ž˜์Šค๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ‘œ์‹œ log.error("MEMBER : [ConstraintViolationException] ", e); // ๊ฐ violation์— ์ ‘๊ทผํ•˜์—ฌ ์—๋Ÿฌ ๋‚ด์šฉ ์ƒ์„ธํ™”ํ•œ Set ์ƒ์„ฑ Set> constraintViolationSet = e.getConstraintViolations(); - List violationList = constraintViolationSet.stream() - .map(violation -> FieldErrorDetail.of(violation.getPropertyPath().toString(), violation.getMessage())) - .toList(); + List violationList = + constraintViolationSet.stream() + .map( + violation -> + FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .toList(); // ErrorResponseDto ์ƒ์„ฑ - ErrorResponseDto response = ErrorResponseDto.of(MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus(), - MEMBER_INVALID_INPUT_VALUE_ERROR.getMessage(), - violationList); - + ErrorResponseDto response = + ErrorResponseDto.of( + MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus(), + MEMBER_INVALID_INPUT_VALUE_ERROR.getMessage(), + violationList); // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ - return ResponseEntity.status(MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus()) - .body(response); + return ResponseEntity.status(MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus()).body(response); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/CustomUserDetails.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/CustomUserDetails.java index 5bd1cdba..1e59986e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/CustomUserDetails.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/CustomUserDetails.java @@ -16,7 +16,6 @@ public CustomUserDetails(Member member) { this.member = member; } - @Override public Collection getAuthorities() { return List.of(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberChangePasswordRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberChangePasswordRequest.java index 2f6428e2..44de4994 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberChangePasswordRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberChangePasswordRequest.java @@ -1,9 +1,7 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -15,9 +13,9 @@ @NoArgsConstructor public class MemberChangePasswordRequest { - @NotBlank(message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ - @Pattern(regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 8~29์ž์˜ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํฌํ•จํ•ด์•ผํ•˜๋ฉฐ, ๋™์ผ ๋ฌธ์ž 4ํšŒ ์ด์ƒ ์—ฐ์† ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.") // ๋น„๋ฐ€๋ฒˆํ˜ธ ํŒจํ„ด ๊ฒ€์ฆ + @NotBlank(message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @Pattern( + regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", + message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 8~29์ž์˜ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํฌํ•จํ•ด์•ผํ•˜๋ฉฐ, ๋™์ผ ๋ฌธ์ž 4ํšŒ ์ด์ƒ ์—ฐ์† ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.") // ๋น„๋ฐ€๋ฒˆํ˜ธ ํŒจํ„ด ๊ฒ€์ฆ private String password; - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRegisterRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRegisterRequest.java index 2d103efc..4b68d233 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRegisterRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRegisterRequest.java @@ -1,5 +1,6 @@ package com.oreo.finalproject_5re5_be.member.dto.request; +import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsHistory; import com.oreo.finalproject_5re5_be.member.exception.MemberMandatoryTermNotAgreedException; @@ -17,7 +18,6 @@ import lombok.Getter; import lombok.Setter; import lombok.ToString; -import com.oreo.finalproject_5re5_be.member.entity.Member; @Getter @Setter @@ -25,36 +25,41 @@ @ToString public class MemberRegisterRequest { - @NotBlank(message = "์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ - @Pattern(regexp = "^[a-zA-Z0-9]{6,20}$", message = "์•„์ด๋””๋Š” 6~20์ž์˜ ์˜๋ฌธ ๋ฐ ์ˆซ์ž๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.") // ์ •๊ทœ์‹์œผ๋กœ ์•„์ด๋”” ํŒจํ„ด ๊ฒ€์ฆ + @NotBlank(message = "์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @Pattern( + regexp = "^[a-zA-Z0-9]{6,20}$", + message = "์•„์ด๋””๋Š” 6~20์ž์˜ ์˜๋ฌธ ๋ฐ ์ˆซ์ž๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.") // ์ •๊ทœ์‹์œผ๋กœ ์•„์ด๋”” ํŒจํ„ด ๊ฒ€์ฆ private String id; - @NotBlank(message = "์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ - @Email(message = "์œ ํšจํ•œ ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.") // ์ด๋ฉ”์ผ ํ˜•์‹ ๊ฒ€์ฆ + @NotBlank(message = "์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @Email(message = "์œ ํšจํ•œ ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.") // ์ด๋ฉ”์ผ ํ˜•์‹ ๊ฒ€์ฆ private String email; - @NotBlank(message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ - @Pattern(regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 8~29์ž์˜ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํฌํ•จํ•ด์•ผํ•˜๋ฉฐ, ๋™์ผ ๋ฌธ์ž 4ํšŒ ์ด์ƒ ์—ฐ์† ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.") // ๋น„๋ฐ€๋ฒˆํ˜ธ ํŒจํ„ด ๊ฒ€์ฆ + @NotBlank(message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @Pattern( + regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", + message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 8~29์ž์˜ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํฌํ•จํ•ด์•ผํ•˜๋ฉฐ, ๋™์ผ ๋ฌธ์ž 4ํšŒ ์ด์ƒ ์—ฐ์† ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.") // ๋น„๋ฐ€๋ฒˆํ˜ธ ํŒจํ„ด ๊ฒ€์ฆ private String password; - @NotBlank(message = "์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ - @Pattern(regexp = "^[a-zA-Z๊ฐ€-ํžฃ]{1,20}$", message = "์ด๋ฆ„์€ ํŠน์ˆ˜๋ฌธ์ž, ์ˆซ์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") // ์ด๋ฆ„ ํŒจํ„ด ๊ฒ€์ฆ + @NotBlank(message = "์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @Pattern(regexp = "^[a-zA-Z๊ฐ€-ํžฃ]{1,20}$", message = "์ด๋ฆ„์€ ํŠน์ˆ˜๋ฌธ์ž, ์ˆซ์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") // ์ด๋ฆ„ ํŒจํ„ด ๊ฒ€์ฆ private String name; - @NotBlank(message = "์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @NotBlank(message = "์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ private String normAddr; private String locaAddr; private String detailAddr; private String passAddr; private String termCode; - @NotNull(message = "ํ•„์ˆ˜ ๋™์˜ ํ•ญ๋ชฉ์ด ์„ ํƒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.") // ํ•„์ˆ˜๊ฐ’ ๊ฒ€์ฆ + + @NotNull(message = "ํ•„์ˆ˜ ๋™์˜ ํ•ญ๋ชฉ์ด ์„ ํƒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.") // ํ•„์ˆ˜๊ฐ’ ๊ฒ€์ฆ private Character chkValid; private LocalDateTime userRegDate; - @NotEmpty(message = "ํ•„์ˆ˜ ์•ฝ๊ด€ ๋™์˜ ํ•ญ๋ชฉ์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.") // ์•ฝ๊ด€ ์š”์ฒญ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜ - private List<@Valid MemberTermCheckOrNotRequest> memberTermCheckOrNotRequests; // ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๊ฒ€์ฆ + @NotEmpty(message = "ํ•„์ˆ˜ ์•ฝ๊ด€ ๋™์˜ ํ•ญ๋ชฉ์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.") // ์•ฝ๊ด€ ์š”์ฒญ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜ + private List<@Valid MemberTermCheckOrNotRequest> memberTermCheckOrNotRequests; // ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๊ฒ€์ฆ // Member ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ public Member createMemberEntity() { @@ -109,7 +114,6 @@ public MemberTermsHistory createMemberTermsHistoryEntity(Member member, MemberTe LocalDateTime now = LocalDateTime.now(); LocalDateTime end = LocalDateTime.MAX; - // DATETIME ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ํฌ๋งทํ„ฐ ์ƒ์„ฑ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @@ -125,4 +129,4 @@ public MemberTermsHistory createMemberTermsHistoryEntity(Member member, MemberTe memberTermsHistory.setMember(member); return memberTermsHistory; } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRemoveRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRemoveRequest.java index 15ba0aa3..c7ddfed0 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRemoveRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRemoveRequest.java @@ -15,5 +15,4 @@ public class MemberRemoveRequest { private String code; private String detailCont; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionRequest.java index 8b326c50..ff288cc3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.request; -import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -19,7 +18,6 @@ @EqualsAndHashCode // ๋ชฉํ‚น ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€ public class MemberTermConditionRequest { - @NotBlank(message = "์•ฝ๊ด€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") @Pattern(regexp = "^[a-zA-Z0-9]{1,20}$", message = "์•ฝ๊ด€ ์ฝ”๋“œ๋Š” 1~20์ž์˜ ์˜๋ฌธ ๋ฐ ์ˆซ์ž๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.") private String condCode; @@ -35,8 +33,7 @@ public class MemberTermConditionRequest { @NotNull(message = "์‚ฌ์šฉ์—ฌ๋ถ€ ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") private Character chkUse; - @NotNull - private Integer ord; + @NotNull private Integer ord; private String law1; private String law2; @@ -60,5 +57,4 @@ public MemberTermsCondition createMemberTermsConditionEntity() { .law3(law3) .build(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionUpdateRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionUpdateRequest.java index eebdbed9..e3f65d67 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionUpdateRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionUpdateRequest.java @@ -1,11 +1,7 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - -import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -23,7 +19,6 @@ public class MemberTermConditionUpdateRequest { @NotBlank(message = "์•ฝ๊ด€ ๊ธด ๋‚ด์šฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") private String longCont; - @NotNull(message = "์•ฝ๊ด€ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") private Character chkUse; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermRequest.java index 1a9fb642..123395fd 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -22,7 +21,10 @@ public class MemberTermRequest { @NotEmpty(message = "ํšŒ์› ์•ฝ๊ด€ ์กฐ๊ฑด ์ฝ”๋“œ๋Š” ๋น„์–ด ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") @Size(min = 5, max = 5, message = "ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ ์ฝ”๋“œ๋Š” 5๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.") - private List<@Pattern(regexp = "TERMS[0-9]{3}", message = "์ฝ”๋“œ ํ˜•์‹์€ 'TERMS'๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์„ธ ์ž๋ฆฌ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.") String> memberTermConditionCodes; + private List< + @Pattern(regexp = "TERMS[0-9]{3}", message = "์ฝ”๋“œ ํ˜•์‹์€ 'TERMS'๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์„ธ ์ž๋ฆฌ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.") + String> + memberTermConditionCodes; @NotEmpty(message = "ํ•„์ˆ˜ ์—ฌ๋ถ€๋Š” ๋น„์–ด ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") private List memberTermConditionMandatoryOrNot; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermUpdateRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermUpdateRequest.java index c38cff6d..140d3f82 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermUpdateRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermUpdateRequest.java @@ -1,11 +1,7 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; import java.util.List; import lombok.Builder; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberUpdateRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberUpdateRequest.java index ea78cfc1..9c52a11b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberUpdateRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberUpdateRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; @@ -17,24 +16,26 @@ @EqualsAndHashCode public class MemberUpdateRequest { - @NotBlank(message = "์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ - @Pattern(regexp = "^[a-zA-Z0-9]{6,20}$", message = "์•„์ด๋””๋Š” 6~20์ž์˜ ์˜๋ฌธ ๋ฐ ์ˆซ์ž๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.") // ์ •๊ทœ์‹์œผ๋กœ ์•„์ด๋”” ํŒจํ„ด ๊ฒ€์ฆ + @NotBlank(message = "์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @Pattern( + regexp = "^[a-zA-Z0-9]{6,20}$", + message = "์•„์ด๋””๋Š” 6~20์ž์˜ ์˜๋ฌธ ๋ฐ ์ˆซ์ž๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.") // ์ •๊ทœ์‹์œผ๋กœ ์•„์ด๋”” ํŒจํ„ด ๊ฒ€์ฆ private String id; - @NotBlank(message = "์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ - @Email(message = "์œ ํšจํ•œ ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.") // ์ด๋ฉ”์ผ ํ˜•์‹ ๊ฒ€์ฆ + @NotBlank(message = "์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @Email(message = "์œ ํšจํ•œ ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.") // ์ด๋ฉ”์ผ ํ˜•์‹ ๊ฒ€์ฆ private String email; - @NotBlank(message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ - @Pattern(regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 8~20์ž์˜ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํฌํ•จํ•ด์•ผํ•˜๋ฉฐ, ๋™์ผ ๋ฌธ์ž 4ํšŒ ์ด์ƒ ์—ฐ์† ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.") // ๋น„๋ฐ€๋ฒˆํ˜ธ ํŒจํ„ด ๊ฒ€์ฆ + @NotBlank(message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @Pattern( + regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", + message = "๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 8~20์ž์˜ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํฌํ•จํ•ด์•ผํ•˜๋ฉฐ, ๋™์ผ ๋ฌธ์ž 4ํšŒ ์ด์ƒ ์—ฐ์† ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.") // ๋น„๋ฐ€๋ฒˆํ˜ธ ํŒจํ„ด ๊ฒ€์ฆ private String password; - @NotBlank(message = "์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ - @Pattern(regexp = "^[a-zA-Z๊ฐ€-ํžฃ]{1,20}$", message = "์ด๋ฆ„์€ ํŠน์ˆ˜๋ฌธ์ž, ์ˆซ์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") // ์ด๋ฆ„ ํŒจํ„ด ๊ฒ€์ฆ + @NotBlank(message = "์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @Pattern(regexp = "^[a-zA-Z๊ฐ€-ํžฃ]{1,20}$", message = "์ด๋ฆ„์€ ํŠน์ˆ˜๋ฌธ์ž, ์ˆซ์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") // ์ด๋ฆ„ ํŒจํ„ด ๊ฒ€์ฆ private String name; - @NotBlank(message = "์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ + @NotBlank(message = "์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") // ํ•„์ˆ˜๊ฐ’, ๋นˆ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ private String normAddr; - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/ErrorResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/ErrorResponse.java index ea9c9ae9..c9d0c546 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/ErrorResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/ErrorResponse.java @@ -14,5 +14,4 @@ public ErrorResponse(String message) { public static ErrorResponse of(String message) { return new ErrorResponse(message); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberReadResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberReadResponse.java index 9e19dd4d..2cfcb127 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberReadResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberReadResponse.java @@ -4,7 +4,6 @@ import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; import lombok.ToString; @Getter @@ -21,11 +20,11 @@ public class MemberReadResponse { public static MemberReadResponse of(Member member) { return MemberReadResponse.builder() - .id(member.getId()) - .email(member.getEmail()) - .name(member.getName()) - .normAddr(member.getNormAddr()) - .detailAddr(member.getDetailAddr()) - .build(); + .id(member.getId()) + .email(member.getEmail()) + .name(member.getName()) + .normAddr(member.getNormAddr()) + .detailAddr(member.getDetailAddr()) + .build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberRegisterResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberRegisterResponse.java index 7e91412f..871dae49 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberRegisterResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberRegisterResponse.java @@ -15,8 +15,6 @@ public class MemberRegisterResponse { // ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ public static MemberRegisterResponse of(String content) { - return MemberRegisterResponse.builder() - .content(content) - .build(); + return MemberRegisterResponse.builder().content(content).build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberResponse.java index 8428aea7..2fead2e8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberResponse.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.response; - import lombok.Builder; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponse.java index 98e5c34e..9a2f70fe 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponse.java @@ -1,14 +1,11 @@ package com.oreo.finalproject_5re5_be.member.dto.response; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import lombok.ToString; @Getter @@ -40,14 +37,14 @@ public MemberTermConditionResponse(MemberTermsCondition memberTermsCondition) { public static MemberTermConditionResponse of(MemberTermsCondition memberTermsCondition) { return MemberTermConditionResponse.builder() - .condCode(memberTermsCondition.getCondCode()) - .shortCont(memberTermsCondition.getShortCont()) - .longCont(memberTermsCondition.getLongCont()) - .chkUse(memberTermsCondition.getChkUse()) - .ord(memberTermsCondition.getOrd()) - .law1(memberTermsCondition.getLaw1()) - .law2(memberTermsCondition.getLaw2()) - .law3(memberTermsCondition.getLaw3()) - .build(); + .condCode(memberTermsCondition.getCondCode()) + .shortCont(memberTermsCondition.getShortCont()) + .longCont(memberTermsCondition.getLongCont()) + .chkUse(memberTermsCondition.getChkUse()) + .ord(memberTermsCondition.getOrd()) + .law1(memberTermsCondition.getLaw1()) + .law2(memberTermsCondition.getLaw2()) + .law3(memberTermsCondition.getLaw3()) + .build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponses.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponses.java index e49dc465..408bbbac 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponses.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponses.java @@ -14,8 +14,8 @@ public class MemberTermConditionResponses { List memberTermConditionResponses; - public MemberTermConditionResponses(List memberTermConditionResponses) { + public MemberTermConditionResponses( + List memberTermConditionResponses) { this.memberTermConditionResponses = memberTermConditionResponses; } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponse.java index 9d81c4d2..1c609211 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponse.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.response; - import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; import java.time.LocalDateTime; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponses.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponses.java index 06fd73db..5edc7f8c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponses.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponses.java @@ -17,5 +17,4 @@ public class MemberTermResponses { public MemberTermResponses(List memberTermResponses) { this.memberTermResponses = memberTermResponses; } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermsDetailResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermsDetailResponse.java index 20706cb8..b96a36c8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermsDetailResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermsDetailResponse.java @@ -1,7 +1,6 @@ package com.oreo.finalproject_5re5_be.member.dto.response; import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; -import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; @@ -28,17 +27,19 @@ public class MemberTermsDetailResponse { private Character chkUse; private MemberTermConditionResponses memberTermConditionResponses; - public static MemberTermsDetailResponse of(MemberTerms terms, List memberTermConditionResponseList) { + public static MemberTermsDetailResponse of( + MemberTerms terms, List memberTermConditionResponseList) { return MemberTermsDetailResponse.builder() - .termCode(terms.getTermCode()) - .termName(terms.getName()) - .chkTerm1(terms.getChkTerm1()) - .chkTerm2(terms.getChkTerm2()) - .chkTerm3(terms.getChkTerm3()) - .chkTerm4(terms.getChkTerm4()) - .chkTerm5(terms.getChkTerm5()) - .chkUse(terms.getChkUse()) - .memberTermConditionResponses(new MemberTermConditionResponses(memberTermConditionResponseList)) - .build(); + .termCode(terms.getTermCode()) + .termName(terms.getName()) + .chkTerm1(terms.getChkTerm1()) + .chkTerm2(terms.getChkTerm2()) + .chkTerm3(terms.getChkTerm3()) + .chkTerm4(terms.getChkTerm4()) + .chkTerm5(terms.getChkTerm5()) + .chkUse(terms.getChkUse()) + .memberTermConditionResponses( + new MemberTermConditionResponses(memberTermConditionResponseList)) + .build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/Member.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/Member.java index dba2c337..b81401de 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/Member.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/Member.java @@ -19,7 +19,8 @@ @Entity @Table(name = "member") -@Getter @Setter +@Getter +@Setter @ToString @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -30,32 +31,43 @@ public class Member extends BaseEntity { @Column(name = "member_seq") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long seq; + @Column(name = "id", nullable = false) private String id; + @Column(name = "email", nullable = false) private String email; + @Column(name = "pwd", nullable = false) private String password; + @Column(name = "birth_date") private String birthDate; + @Column(name = "name", nullable = false) private String name; + @Column(name = "phon") private String phon; + @Column(name = "member_reg_date") private LocalDateTime memberRegDate; + @Column(name = "chk_valid", nullable = false) private Character chkValid; + @Column(name = "norm_addr") private String normAddr; + @Column(name = "pass_addr") private String passAddr; + @Column(name = "loca_addr") private String locaAddr; + @Column(name = "detail_addr") private String detailAddr; - public void update(MemberUpdateRequest request) { this.id = request.getId(); this.email = request.getEmail(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberCategory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberCategory.java index f89f1e17..b778a65d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberCategory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberCategory.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -14,7 +13,8 @@ @Entity @Table(name = "member_category") -@Getter @Setter +@Getter +@Setter @ToString public class MemberCategory extends BaseEntity { @@ -22,8 +22,10 @@ public class MemberCategory extends BaseEntity { @Column(name = "cate_code") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long cateCode; + @Column(name = "name") private String name; + @Column(name = "comt") private String comt; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberChangeHistory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberChangeHistory.java index fd259617..ce8c465d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberChangeHistory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberChangeHistory.java @@ -18,10 +18,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_change_history") -@Getter @Setter +@Getter +@Setter @Builder @NoArgsConstructor @AllArgsConstructor @@ -42,10 +42,13 @@ public class MemberChangeHistory extends BaseEntity { @Column(name = "bef_val", nullable = false) private String befVal; + @Column(name = "aft_val", nullable = false) private String aftVal; + @Column(name = "appl_date", nullable = false) private String applDate; + @Column(name = "end_date", nullable = false) private String endDate; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberConnectionHistory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberConnectionHistory.java index 1912e9f0..30581ed6 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberConnectionHistory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberConnectionHistory.java @@ -15,10 +15,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_connection_history") -@Getter @Setter +@Getter +@Setter @ToString public class MemberConnectionHistory extends BaseEntity { @@ -33,5 +33,4 @@ public class MemberConnectionHistory extends BaseEntity { @Column(name = "conn_date", nullable = false) private LocalDateTime connDate; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberDelete.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberDelete.java index a961a7c1..0db8882f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberDelete.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberDelete.java @@ -19,10 +19,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_delete") -@Getter @Setter +@Getter +@Setter @ToString @EqualsAndHashCode(callSuper = false) public class MemberDelete extends BaseEntity { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRoles.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRoles.java index ffc3b7c3..02d17d35 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRoles.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRoles.java @@ -16,10 +16,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_roles") -@Getter @Setter +@Getter +@Setter @ToString public class MemberRoles extends BaseEntity { @@ -34,13 +34,16 @@ public class MemberRoles extends BaseEntity { @Column(name = "name", nullable = false) private String name; + @Column(name = "detail_cont", nullable = false) private String detailCont; + @Column(name = "appl_reas", nullable = false) private String applReas; + @Column(name = "chk_use", nullable = false) private Character chkUse; + @Column(name = "appl_date", nullable = false) private LocalDateTime poliCodeRegDate; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRolesCategory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRolesCategory.java index 34153cfa..962f2318 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRolesCategory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRolesCategory.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -14,7 +13,8 @@ @Entity @Table(name = "member_roles_category") -@Getter @Setter +@Getter +@Setter @ToString public class MemberRolesCategory extends BaseEntity { @@ -25,6 +25,7 @@ public class MemberRolesCategory extends BaseEntity { @Column(name = "name", nullable = false) private String name; + @Column(name = "comt") private String comt; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberState.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberState.java index eed2e037..d278154d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberState.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberState.java @@ -20,7 +20,8 @@ @Entity @Table(name = "member_state") -@Getter @Setter +@Getter +@Setter @ToString @EqualsAndHashCode(callSuper = false) public class MemberState extends BaseEntity { @@ -40,6 +41,7 @@ public class MemberState extends BaseEntity { @Column(name = "appl_date", nullable = false) private String applDate; + @Column(name = "end_date", nullable = false) private String endDate; @@ -63,8 +65,6 @@ public static MemberState of(Member member, Code code) { memberState.setApplDate(formattedDateTime); memberState.setEndDate(formattedEnd); - return memberState; - } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTerms.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTerms.java index cd58ef79..889fd3a9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTerms.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTerms.java @@ -10,9 +10,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToOne; import jakarta.persistence.Table; -import jakarta.validation.constraints.Pattern; import java.time.LocalDateTime; import java.util.List; import lombok.AllArgsConstructor; @@ -23,16 +21,16 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_terms") -@Getter @Setter +@Getter +@Setter @Builder @AllArgsConstructor @NoArgsConstructor @ToString @EqualsAndHashCode(callSuper = false) -public class MemberTerms extends BaseEntity{ +public class MemberTerms extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -57,8 +55,8 @@ public class MemberTerms extends BaseEntity{ @Column(name = "chk_term_5") private Character chkTerm5; -// @Column(name = "term_end_date") -// private LocalDateTime termEndDate; + // @Column(name = "term_end_date") + // private LocalDateTime termEndDate; @Column(name = "term_reg_date", nullable = false) private LocalDateTime termRegDate; @@ -96,7 +94,8 @@ public void update(MemberTermUpdateRequest request) { this.setChkUse(chk); // ์•ฝ๊ด€ ํ•„์ˆ˜ ์—ฌ๋ถ€ ๋ณ€๊ฒฝ - List memberTermConditionMandatoryOrNot = request.getMemberTermConditionMandatoryOrNot(); + List memberTermConditionMandatoryOrNot = + request.getMemberTermConditionMandatoryOrNot(); this.setChkTerm1(memberTermConditionMandatoryOrNot.get(0)); this.setChkTerm2(memberTermConditionMandatoryOrNot.get(1)); this.setChkTerm3(memberTermConditionMandatoryOrNot.get(2)); @@ -108,5 +107,4 @@ public void update(MemberTermUpdateRequest request) { this.setTermRegDate(now); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsCondition.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsCondition.java index 46c0805a..9e15dfca 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsCondition.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsCondition.java @@ -18,17 +18,16 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_terms_condition") -@Getter @Setter +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder @ToString @EqualsAndHashCode(callSuper = false) -public class MemberTermsCondition extends BaseEntity { - +public class MemberTermsCondition extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -80,7 +79,6 @@ public class MemberTermsCondition extends BaseEntity { @Column(name = "short_cont", nullable = false, length = 255) private String shortCont; - public void update(MemberTermConditionUpdateRequest updateRequest) { this.shortCont = updateRequest.getShortCont(); this.longCont = updateRequest.getLongCont(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsHistory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsHistory.java index 1a88b466..ec6f91bb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsHistory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsHistory.java @@ -1,7 +1,6 @@ package com.oreo.finalproject_5re5_be.member.entity; import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; -import com.oreo.finalproject_5re5_be.member.exception.MemberWrongCountTermCondition; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -11,7 +10,6 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; -import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -20,10 +18,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_terms_history") -@Getter @Setter +@Getter +@Setter @ToString @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -39,23 +37,28 @@ public class MemberTermsHistory extends BaseEntity { @JoinColumn(name = "member_seq") private Member member; - @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "terms_seq") private MemberTerms terms; @Column(name = "hist_reg_date", nullable = false) private String histRegDate; + @Column(name = "hist_end_date", nullable = false) private String histEndDate; + @Column(name = "chk_term_1", nullable = false) private Character chkTerm1; // 'Y' or 'N' + @Column(name = "chk_term_2", nullable = false) private Character chkTerm2; + @Column(name = "chk_term_3", nullable = false) private Character chkTerm3; + @Column(name = "chk_term_4", nullable = false) private Character chkTerm4; + @Column(name = "chk_term_5", nullable = false) private Character chkTerm5; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/DeletedMemberException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/DeletedMemberException.java index baac35a3..dd172ab1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/DeletedMemberException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/DeletedMemberException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // ์‚ญ์ œ ํšŒ์›์— ๋Œ€ํ•œ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ public class DeletedMemberException extends BusinessException { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedEmailException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedEmailException.java index 7cb6a909..9aea3687 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedEmailException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedEmailException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // ์ค‘๋ณต๋œ ์ด๋ฉ”์ผ ๋“ฑ๋ก์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ public class MemberDuplicatedEmailException extends BusinessException { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedIdException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedIdException.java index 1852d3d0..62deb593 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedIdException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedIdException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // ์ค‘๋ณต๋œ ์•„์ด๋”” ๋“ฑ๋ก์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ public class MemberDuplicatedIdException extends BusinessException { @@ -15,5 +14,4 @@ public MemberDuplicatedIdException() { public MemberDuplicatedIdException(String message) { super(message, MEMBER_DUPLICATED_ID_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberInvalidTermConditionException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberInvalidTermConditionException.java index d6ee111c..54d4613c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberInvalidTermConditionException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberInvalidTermConditionException.java @@ -13,5 +13,4 @@ public MemberInvalidTermConditionException() { public MemberInvalidTermConditionException(String message) { super(message, MEMBER_INVALID_TERM_CONDITION_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberMandatoryTermNotAgreedException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberMandatoryTermNotAgreedException.java index fddeae9d..01e564a9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberMandatoryTermNotAgreedException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberMandatoryTermNotAgreedException.java @@ -14,5 +14,4 @@ public MemberMandatoryTermNotAgreedException() { public MemberMandatoryTermNotAgreedException(String message) { super(message, MEMBER_MANDATORY_TERM_NOT_AGREED_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundEmailException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundEmailException.java index f5acfef5..8f7ac1d4 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundEmailException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundEmailException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ด๋ฉ”์ผ์ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์™ธ public class MemberNotFoundEmailException extends BusinessException { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundException.java index 8e76d7bf..d9a67699 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundException.java @@ -14,5 +14,4 @@ public MemberNotFoundException() { public MemberNotFoundException(String message) { super(message, MEMBER_NOT_FOUND_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermInvalidException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermInvalidException.java index add0a8cc..90589f0a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermInvalidException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermInvalidException.java @@ -4,7 +4,6 @@ import com.oreo.finalproject_5re5_be.global.exception.BusinessException; - // ๊ด€๋ฆฌ์ž๊ฐ€ ํšŒ์› ์•ฝ๊ด€ ๋“ฑ๋ก์‹œ ์ž˜๋ชป๋œ ๊ฐ’์ด ์ž…๋ ฅ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ public class MemberTermInvalidException extends BusinessException { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermsNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermsNotFoundException.java index 4936d4bf..5292a781 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermsNotFoundException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermsNotFoundException.java @@ -3,8 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; - // ํšŒ์› ์•ฝ๊ด€ ์ •๋ณด๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ public class MemberTermsNotFoundException extends BusinessException { @@ -16,5 +14,4 @@ public MemberTermsNotFoundException() { public MemberTermsNotFoundException(String message) { super(message, MEMBER_TERM_NOT_FOUND_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberWrongCountTermCondition.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberWrongCountTermCondition.java index cfea77a3..f525cb32 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberWrongCountTermCondition.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberWrongCountTermCondition.java @@ -13,5 +13,4 @@ public MemberWrongCountTermCondition() { public MemberWrongCountTermCondition(String message) { super(message, MEMBER_WRONG_COUNT_TERM_CONDITION_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/RetryFailedException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/RetryFailedException.java index c6519a3c..5cb31a91 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/RetryFailedException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/RetryFailedException.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.exception; -import com.oreo.finalproject_5re5_be.global.exception.BusinessException; import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // ์žฌ์‹œ๋„ ๋ณต๊ตฌ์— ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ @@ -13,4 +12,4 @@ public RetryFailedException() { public RetryFailedException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberCategoryRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberCategoryRepository.java index 3a25345a..cd82746a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberCategoryRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberCategoryRepository.java @@ -1,13 +1,10 @@ package com.oreo.finalproject_5re5_be.member.repository; import com.oreo.finalproject_5re5_be.member.entity.MemberCategory; -import com.oreo.finalproject_5re5_be.member.entity.MemberChangeHistory; -import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; public interface MemberCategoryRepository extends JpaRepository { public MemberCategory findByCateCode(Long cateCode); + public MemberCategory findByName(String name); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberChangeHistoryRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberChangeHistoryRepository.java index 38061dbf..1154c6d7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberChangeHistoryRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberChangeHistoryRepository.java @@ -1,8 +1,8 @@ package com.oreo.finalproject_5re5_be.member.repository; import com.oreo.finalproject_5re5_be.member.entity.MemberChangeHistory; -import java.util.Optional; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -11,16 +11,17 @@ public interface MemberChangeHistoryRepository extends JpaRepository findLatestHistoryByIdAndCode( + @Param("memberSeq") Long memberSeq, @Param("code") String memberFiledCode); - @Query( "SELECT m FROM MemberChangeHistory m " + - "WHERE m.chngFieldCode.code = :code " + - "AND m.member.seq = :memberSeq " + - "AND m.chngHistSeq = (SELECT MAX(subM.chngHistSeq) " + - " FROM MemberChangeHistory subM " + - " WHERE subM.chngFieldCode.code = :code " + - " AND subM.member.seq = :memberSeq)") - public Optional findLatestHistoryByIdAndCode( @Param("memberSeq") Long memberSeq, @Param("code") String memberFiledCode); - @Query( "DELETE FROM MemberChangeHistory mch " + - "WHERE mch.member.seq = :memberSeq") + @Query("DELETE FROM MemberChangeHistory mch " + "WHERE mch.member.seq = :memberSeq") List findMemberChangeHistoriesByMemberSeq(Long memberSeq); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberConnectionHistoryRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberConnectionHistoryRepository.java index 50d23692..ff10873a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberConnectionHistoryRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberConnectionHistoryRepository.java @@ -5,10 +5,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -public interface MemberConnectionHistoryRepository extends JpaRepository { +public interface MemberConnectionHistoryRepository + extends JpaRepository { - - @Query( "DELETE FROM MemberConnectionHistory mch " + - "WHERE mch.member.seq = :memberSeq") + @Query("DELETE FROM MemberConnectionHistory mch " + "WHERE mch.member.seq = :memberSeq") List findMemberConnectionHistoriesByMemberSeq(Long memberSeq); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberDeleteRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberDeleteRepository.java index eb773449..de35f2b9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberDeleteRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberDeleteRepository.java @@ -3,6 +3,4 @@ import com.oreo.finalproject_5re5_be.member.entity.MemberDelete; import org.springframework.data.jpa.repository.JpaRepository; -public interface MemberDeleteRepository extends JpaRepository { - -} +public interface MemberDeleteRepository extends JpaRepository {} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberRepository.java index 5e8b787d..311ec771 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberRepository.java @@ -7,25 +7,30 @@ public interface MemberRepository extends JpaRepository { - @Query( "SELECT m " + - "FROM Member m " + - "WHERE m.seq = :memberSeq " ) + @Query("SELECT m " + "FROM Member m " + "WHERE m.seq = :memberSeq ") public Member findBySeq(Long memberSeq); + public Member findByEmail(String email); + public Member findById(String id); + public boolean existsByEmail(String email); - public boolean existsById(String id); - @Query( "SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END " + - "FROM Member m " + - "WHERE m.seq <> :memberSeq " + - "AND m.id = :id" ) - public boolean existsByIdNotContainingMemberSeq(@Param("memberSeq") Long memberSeq, @Param("id") String id); - @Query( "SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END " + - "FROM Member m " + - "WHERE m.seq <> :memberSeq " + - "AND m.email = :email" ) - public boolean existsByEmailNotContainingMemberSeq(@Param("memberSeq")Long memberSeq, @Param("email") String email); + public boolean existsById(String id); + @Query( + "SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END " + + "FROM Member m " + + "WHERE m.seq <> :memberSeq " + + "AND m.id = :id") + public boolean existsByIdNotContainingMemberSeq( + @Param("memberSeq") Long memberSeq, @Param("id") String id); + @Query( + "SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END " + + "FROM Member m " + + "WHERE m.seq <> :memberSeq " + + "AND m.email = :email") + public boolean existsByEmailNotContainingMemberSeq( + @Param("memberSeq") Long memberSeq, @Param("email") String email); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberStateRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberStateRepository.java index 0787b16f..0ea1cc0f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberStateRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberStateRepository.java @@ -9,17 +9,20 @@ public interface MemberStateRepository extends JpaRepository public List findAllByMemberSeq(Long seq); - @Query(value = " SELECT ms " + - " FROM MemberState ms " + - " WHERE ms.member.seq = :seq " + - " AND ms.code.code = :state ") + @Query( + value = + " SELECT ms " + + " FROM MemberState ms " + + " WHERE ms.member.seq = :seq " + + " AND ms.code.code = :state ") public List findByMemberSeq(Long seq, String state); - @Query( "SELECT ms " + - "FROM MemberState ms " + - "WHERE ms.member.seq = :memberSeq " + - "AND ms.stateSeq = (SELECT MAX(subMS.stateSeq) " + - " FROM MemberState subMS " + - " WHERE subMS.member.seq = :memberSeq)") + @Query( + "SELECT ms " + + "FROM MemberState ms " + + "WHERE ms.member.seq = :memberSeq " + + "AND ms.stateSeq = (SELECT MAX(subMS.stateSeq) " + + " FROM MemberState subMS " + + " WHERE subMS.member.seq = :memberSeq)") public MemberState findLatestHistoryByMemberSeq(Long memberSeq); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermConditionRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermConditionRepository.java index 2b18950c..1aa74f12 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermConditionRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermConditionRepository.java @@ -4,22 +4,22 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; public interface MemberTermConditionRepository extends JpaRepository { MemberTermsCondition findMemberTermsConditionByCondCode(String condCode); - @Query( "SELECT mtc " + - "FROM MemberTermsCondition mtc " + - "WHERE mtc.chkUse = 'Y' " + - "ORDER BY mtc.ord") + @Query( + "SELECT mtc " + + "FROM MemberTermsCondition mtc " + + "WHERE mtc.chkUse = 'Y' " + + "ORDER BY mtc.ord") List findAvailableMemberTermsConditions(); - @Query( "SELECT mtc " + - "FROM MemberTermsCondition mtc " + - "WHERE mtc.chkUse = 'N' " + - "ORDER BY mtc.ord") + @Query( + "SELECT mtc " + + "FROM MemberTermsCondition mtc " + + "WHERE mtc.chkUse = 'N' " + + "ORDER BY mtc.ord") List findNotAvailableMemberTermsConditions(); - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsHistoryRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsHistoryRepository.java index 41fe6f58..524d3d38 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsHistoryRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsHistoryRepository.java @@ -6,5 +6,4 @@ public interface MemberTermsHistoryRepository extends JpaRepository { public List findByMemberSeq(Long seq); - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsRepository.java index 53a22125..f54564f3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsRepository.java @@ -8,32 +8,32 @@ public interface MemberTermsRepository extends JpaRepository { // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ตœ๊ทผ ์•ฝ๊ด€ ์กฐํšŒ - @Query( "SELECT mt " + - "FROM MemberTerms mt " + - "WHERE mt.chkUse = 'Y' " + - "AND mt.termRegDate = (SELECT MAX(mt.termRegDate) " - + "FROM MemberTerms mt " - + "WHERE mt.chkUse = 'Y')") + @Query( + "SELECT mt " + + "FROM MemberTerms mt " + + "WHERE mt.chkUse = 'Y' " + + "AND mt.termRegDate = (SELECT MAX(mt.termRegDate) " + + "FROM MemberTerms mt " + + "WHERE mt.chkUse = 'Y')") MemberTerms findTopByChkUseOrderByTermRegDateDesc(); - - @Query( "SELECT mt " + - "FROM MemberTerms mt " + - "WHERE mt.termCode = :termCode") + @Query("SELECT mt " + "FROM MemberTerms mt " + "WHERE mt.termCode = :termCode") MemberTerms findMemberTermsByTermCode(String termCode); // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์•ฝ๊ด€ ๋ชจ๋‘ ์กฐํšŒ - @Query( "SELECT mt " + - "FROM MemberTerms mt " + - "WHERE mt.chkUse = 'Y' " + - "ORDER BY mt.termRegDate DESC") + @Query( + "SELECT mt " + + "FROM MemberTerms mt " + + "WHERE mt.chkUse = 'Y' " + + "ORDER BY mt.termRegDate DESC") List findAvailableMemberTerms(); // ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์•ฝ๊ด€ ๋ชจ๋‘ ์กฐํšŒ - @Query( "SELECT mt " + - "FROM MemberTerms mt " + - "WHERE mt.chkUse = 'N' " + - "ORDER BY mt.termRegDate DESC") + @Query( + "SELECT mt " + + "FROM MemberTerms mt " + + "WHERE mt.chkUse = 'N' " + + "ORDER BY mt.termRegDate DESC") List findNotAvailableMemberTerms(); // ์•ฝ๊ด€ ์ด๋ฆ„์œผ๋กœ ์กฐํšŒ @@ -41,6 +41,4 @@ public interface MemberTermsRepository extends JpaRepository // ์•ฝ๊ด€ ์‹œํ€€์Šค๋กœ ์กฐํšŒ MemberTerms findMemberTermsByTermsSeq(Long termsSeq); - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImpl.java index 7accda1f..b2c41253 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImpl.java @@ -1,12 +1,14 @@ package com.oreo.finalproject_5re5_be.member.service; +import com.oreo.finalproject_5re5_be.code.entity.Code; +import com.oreo.finalproject_5re5_be.code.exeption.CodeNotFoundException; +import com.oreo.finalproject_5re5_be.code.repository.CodeRepository; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.member.dto.request.MemberChangePasswordRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberRegisterRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberRemoveRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberUpdateRequest; import com.oreo.finalproject_5re5_be.member.dto.response.MemberReadResponse; -import com.oreo.finalproject_5re5_be.code.entity.Code; import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.member.entity.MemberChangeHistory; import com.oreo.finalproject_5re5_be.member.entity.MemberConnectionHistory; @@ -14,7 +16,6 @@ import com.oreo.finalproject_5re5_be.member.entity.MemberState; import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsHistory; -import com.oreo.finalproject_5re5_be.code.exeption.CodeNotFoundException; import com.oreo.finalproject_5re5_be.member.exception.DeletedMemberException; import com.oreo.finalproject_5re5_be.member.exception.HumanMemberException; import com.oreo.finalproject_5re5_be.member.exception.MemberDuplicatedEmailException; @@ -26,7 +27,6 @@ import com.oreo.finalproject_5re5_be.member.exception.MemberWrongCountTermCondition; import com.oreo.finalproject_5re5_be.member.exception.RestrictedMemberException; import com.oreo.finalproject_5re5_be.member.exception.RetryFailedException; -import com.oreo.finalproject_5re5_be.code.repository.CodeRepository; import com.oreo.finalproject_5re5_be.member.repository.MemberChangeHistoryRepository; import com.oreo.finalproject_5re5_be.member.repository.MemberConnectionHistoryRepository; import com.oreo.finalproject_5re5_be.member.repository.MemberDeleteRepository; @@ -93,11 +93,17 @@ public class MemberServiceImpl implements UserDetailsService { private final MemberChangeHistoryRepository memberChangeHistoryRepository; private final MemberDeleteRepository memberDeleteRepository; - - public MemberServiceImpl(MemberConnectionHistoryRepository memberConnectionHistoryRepository, MemberRepository memberRepository, MemberStateRepository memberStateRepository, - MemberTermsHistoryRepository memberTermsHistoryRepository, MemberTermsRepository memberTermsRepository, PasswordEncoder passwordEncoder, - JavaMailSender mailSender, CodeRepository codeRepository, - MemberDeleteRepository memberDeleteRepository, MemberChangeHistoryRepository memberChangeHistoryRepository) { + public MemberServiceImpl( + MemberConnectionHistoryRepository memberConnectionHistoryRepository, + MemberRepository memberRepository, + MemberStateRepository memberStateRepository, + MemberTermsHistoryRepository memberTermsHistoryRepository, + MemberTermsRepository memberTermsRepository, + PasswordEncoder passwordEncoder, + JavaMailSender mailSender, + CodeRepository codeRepository, + MemberDeleteRepository memberDeleteRepository, + MemberChangeHistoryRepository memberChangeHistoryRepository) { this.memberConnectionHistoryRepository = memberConnectionHistoryRepository; this.memberRepository = memberRepository; this.memberStateRepository = memberStateRepository; @@ -122,7 +128,10 @@ public Member create(MemberRegisterRequest request) { // ํšŒ์› ์•ฝ๊ด€ ์œ ํšจ์„ฑ ํ™•์ธ request.checkValidTerms(); request.checkValidTermsCount(); - } catch (MemberDuplicatedEmailException | MemberDuplicatedIdException | MemberMandatoryTermNotAgreedException | MemberWrongCountTermCondition e) { + } catch (MemberDuplicatedEmailException + | MemberDuplicatedIdException + | MemberMandatoryTermNotAgreedException + | MemberWrongCountTermCondition e) { // ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ์— ๋น„์ฆˆ๋‹ˆ์Šค ์˜ˆ์™ธ ์ „๋‹ฌ throw e; } @@ -136,8 +145,7 @@ public Member create(MemberRegisterRequest request) { @Retryable( value = {RuntimeException.class}, maxAttempts = MAX_RETRY, - backoff = @Backoff(delay = RETRY_DELAY) - ) + backoff = @Backoff(delay = RETRY_DELAY)) public Member retryableCreateMember(MemberRegisterRequest request) { // ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” encodePassword(request); @@ -164,7 +172,6 @@ private void checkDuplicatedEmail(String email) { if (foundMember != null) { throw new MemberDuplicatedEmailException(); } - } // ์ค‘๋ณต๋œ ์•„์ด๋”” ํ™•์ธ @@ -203,10 +210,12 @@ private MemberTermsHistory saveMemberTermsHistory(MemberRegisterRequest request, } // ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ํšŒ์› ์•ฝ๊ด€ ์ด๋ ฅ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ - MemberTermsHistory memberTermsHistory = request.createMemberTermsHistoryEntity(member, foundTerms); + MemberTermsHistory memberTermsHistory = + request.createMemberTermsHistoryEntity(member, foundTerms); // ํšŒ์› ์•ฝ๊ด€ ์ด๋ ฅ ์—”ํ‹ฐํ‹ฐ ์ €์žฅ - MemberTermsHistory savedMemberTermsHistory = memberTermsHistoryRepository.save(memberTermsHistory); + MemberTermsHistory savedMemberTermsHistory = + memberTermsHistoryRepository.save(memberTermsHistory); return savedMemberTermsHistory; } @@ -227,11 +236,10 @@ private MemberState saveMemberState(Member member, String code) { return savedMemberState; } - - // 2. ๋กœ๊ทธ์ธ : ์•„์ด๋””๋กœ ํšŒ์› ์กฐํšŒํ•˜์—ฌ UserDetails ๋ฐ˜ํ™˜, ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {; + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + ; // ์•„์ด๋””๋กœ ํšŒ์› ์กฐํšŒ Member foundMember = memberRepository.findById(username); @@ -262,7 +270,7 @@ private String createVerificationCode() { StringBuilder sb = new StringBuilder(); // 6์ž๋ฆฌ ๋žœ๋ค ์ˆซ์ž ์ฝ”๋“œ ์ƒ์„ฑ - for (int i=0; i<6; i++) { + for (int i = 0; i < 6; i++) { int random = (int) (Math.random() * 10); sb.append(random); } @@ -295,7 +303,6 @@ private void sendEmail(String email, String emailContent) { // ์ด๋ฉ”์ผ ์ „์†ก ์‹คํŒจ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ throw new MailSendException("์ด๋ฉ”์ผ ์ „์†ก์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค"); } - } // 4. ํšŒ์›์ •๋ณด ์ƒ์„ธ ์กฐํšŒ @@ -321,7 +328,8 @@ public MemberReadResponse read(Long memberSeq) { // ์กฐํšŒ๋œ ํšŒ์›์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•จ // - ํœด๋จผํšŒ์›(MBS003), ์ œ์žฌํšŒ์›(MBS007), ํƒˆํ‡ดํšŒ์›(MBS004)์ผ ๊ฒฝ์šฐ ๊ฑฐ๋ฅด๊ธฐ - MemberState memberState = memberStateRepository.findLatestHistoryByMemberSeq(foundMember.getSeq()); + MemberState memberState = + memberStateRepository.findLatestHistoryByMemberSeq(foundMember.getSeq()); // ํœด๋จผ ํšŒ์›์ธ์ง€ ํ™•์ธ if ("MBS003".equals(memberState.getCode().getCode())) { @@ -345,29 +353,29 @@ public MemberReadResponse read(Long memberSeq) { return MemberReadResponse.of(foundMember); } - // 5. ํšŒ์›์ •๋ณด ์ˆ˜์ • @Transactional public void update(Long memberSeq, MemberUpdateRequest request) { // 5-1. ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์ฆํ•œ๋‹ค // 5-2. ์•„์ด๋””, ์ด๋ฉ”์ผ์„ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ํšŒ์›๊ณผ ์ค‘๋ณต๋œ ์•„์ด๋””, ์ด๋ฉ”์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค - boolean isDuplicatedId = memberRepository.existsByIdNotContainingMemberSeq(memberSeq, request.getId()); + boolean isDuplicatedId = + memberRepository.existsByIdNotContainingMemberSeq(memberSeq, request.getId()); if (isDuplicatedId) { throw new MemberDuplicatedIdException(); } - boolean isDuplicatedEmail = memberRepository.existsByEmailNotContainingMemberSeq(memberSeq, request.getEmail()); + boolean isDuplicatedEmail = + memberRepository.existsByEmailNotContainingMemberSeq(memberSeq, request.getEmail()); if (isDuplicatedEmail) { throw new MemberDuplicatedEmailException(); } // 5-3. ํšŒ์› ์‹œํ€€์Šค๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค - Member foundMember = memberRepository.findById(memberSeq) - .orElseThrow(MemberNotFoundException::new); - + Member foundMember = + memberRepository.findById(memberSeq).orElseThrow(MemberNotFoundException::new); // 5-4. ์–ด๋А ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ  ์ด๋ ฅ์œผ๋กœ ๊ธฐ๋กํ•œ๋‹ค - List changeHistories = new ArrayList<>(); + List changeHistories = new ArrayList<>(); // ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ ์ตœ๋Œ€ ์‹œ๊ฐ„ ์„ธํŒ… LocalDateTime now = LocalDateTime.now(); @@ -380,7 +388,6 @@ public void update(Long memberSeq, MemberUpdateRequest request) { String formattedNow = now.format(formatter); String formattedEnd = end.format(formatter); - boolean isChangedId = false; boolean isChangedEmail = false; boolean isChangedPassword = false; @@ -412,35 +419,37 @@ public void update(Long memberSeq, MemberUpdateRequest request) { Code memberIdFiledCode = codeRepository.findCodeByCode("MF001"); // ํšŒ์› ์•„์ด๋”” ํ•„๋“œ ์ฝ”๋“œ // ๊ฐ€์žฅ ์ตœ๊ทผ ์ด๋ ฅ ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, memberIdFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); - - - - MemberChangeHistory memberIdChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(memberIdFiledCode) - .befVal(foundMember.getId()) - .aftVal(request.getId()) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, memberIdFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); + + MemberChangeHistory memberIdChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(memberIdFiledCode) + .befVal(foundMember.getId()) + .aftVal(request.getId()) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); changeHistories.add(memberIdChangeHistory); } if (isChangedEmail) { Code emailFiledCode = codeRepository.findCodeByCode("MF002"); // ํšŒ์› ์ด๋ฉ”์ผ ํ•„๋“œ ์ฝ”๋“œ - MemberChangeHistory emailChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(emailFiledCode) - .befVal(foundMember.getEmail()) - .aftVal(request.getEmail()) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + MemberChangeHistory emailChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(emailFiledCode) + .befVal(foundMember.getEmail()) + .aftVal(request.getEmail()) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); // ๊ฐ€์žฅ ์ตœ๊ทผ ์ด๋ ฅ ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, emailFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, emailFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); changeHistories.add(emailChangeHistory); } @@ -450,58 +459,62 @@ public void update(Long memberSeq, MemberUpdateRequest request) { String encodedPassword = passwordEncoder.encode(foundMember.getPassword()); // ๊ฐ€์žฅ ์ตœ๊ทผ ์ด๋ ฅ ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, passwordFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); - - MemberChangeHistory passwordChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(passwordFiledCode) - .befVal(foundMember.getPassword()) - .aftVal(encodedPassword) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, passwordFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); + + MemberChangeHistory passwordChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(passwordFiledCode) + .befVal(foundMember.getPassword()) + .aftVal(encodedPassword) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); changeHistories.add(passwordChangeHistory); } if (isChangedName) { Code nameFiledCode = codeRepository.findCodeByCode("MF004"); // ํšŒ์› ์ด๋ฆ„ ํ•„๋“œ ์ฝ”๋“œ - MemberChangeHistory nameChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(nameFiledCode) - .befVal(foundMember.getName()) - .aftVal(request.getName()) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + MemberChangeHistory nameChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(nameFiledCode) + .befVal(foundMember.getName()) + .aftVal(request.getName()) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); // ๊ฐ€์žฅ ์ตœ๊ทผ ์ด๋ ฅ ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, nameFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, nameFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); changeHistories.add(nameChangeHistory); } if (isChangedNormAddr) { Code normAddrFiledCode = codeRepository.findCodeByCode("MF005"); // ํšŒ์› ์ฃผ์†Œ ํ•„๋“œ ์ฝ”๋“œ - MemberChangeHistory normAddrChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(normAddrFiledCode) - .befVal(foundMember.getNormAddr()) - .aftVal(request.getNormAddr()) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + MemberChangeHistory normAddrChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(normAddrFiledCode) + .befVal(foundMember.getNormAddr()) + .aftVal(request.getNormAddr()) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); // ๊ฐ€์žฅ ์ตœ๊ทผ ์ด๋ ฅ ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, normAddrFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, normAddrFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); changeHistories.add(normAddrChangeHistory); } - - // 5-6. ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค foundMember.update(request); @@ -512,7 +525,6 @@ public void update(Long memberSeq, MemberUpdateRequest request) { memberChangeHistoryRepository.saveAll(changeHistories); } - // 6. ํšŒ์› ํƒˆํ‡ด(์œ ํ•ด๊ธฐ๊ฐ„ 30์ผ ์„ค์ •, ๊ทธ ์ดํ›„์— ์‚ญ์ œ) // (1) ์‚ญ์ œ ์ฒ˜๋ฆฌ๊ฐ€ ์š”์ฒญ๋œ ํšŒ์› // - ํ•ด๋‹น ํšŒ์›์„ ๋น„ํ™œ์„ฑ ํšŒ์›์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค @@ -520,8 +532,8 @@ public void update(Long memberSeq, MemberUpdateRequest request) { // - ํšŒ์› ์‚ญ์ œ ์œ ํ˜• ์ฝ”๋“œ์™€ ์‚ฌ์œ ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค public void remove(Long memberSeq, MemberRemoveRequest request) { // - ํ•ด๋‹น ํšŒ์›์„ ์กฐํšŒํ•œ๋‹ค - Member foundMember = memberRepository.findById(memberSeq) - .orElseThrow(MemberNotFoundException::new); + Member foundMember = + memberRepository.findById(memberSeq).orElseThrow(MemberNotFoundException::new); // - ํ•ด๋‹น ํšŒ์›์„ ๋น„ํ™œ์„ฑ ํšŒ์›์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค Code removeMemberCode = codeRepository.findCodeByCode("MBS003"); // ํœด๋จผ ํšŒ์›์œผ๋กœ ๋“ฑ๋ก @@ -535,7 +547,6 @@ public void remove(Long memberSeq, MemberRemoveRequest request) { memberDeleteRepository.save(memberDelete); } - // (2) ๋งค์ผ ์ƒˆ๋ฒฝ 4:00 ๋งˆ๋‹ค ์‚ญ์ œ ํšŒ์› ์ค‘ ์œ ํ•ด๊ธฐ๊ฐ„ 30์ผ์ด ์ง€๋‚œ ํšŒ์›๋“ค์„ ์‚ญ์ œ(์Šคํ”„๋ง ์Šค์ผ€์ฅด๋Ÿฌ ์ ์šฉ) // - applDate๊ฐ€ ํ˜„์žฌ์™€ 30์ผ ์ฐจ์ด ๋‚˜๋Š” ํšŒ์›์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค // - ํšŒ์›์„ ์‚ญ์ œํ•œ๋‹ค @@ -549,41 +560,50 @@ public void checkRemovedMember() { // ํ˜„์žฌ ์‹œ๊ฐ„ ์กฐํšŒ LocalDateTime now = LocalDateTime.now(); - // - applDate๊ฐ€ ํ˜„์žฌ์™€ 30์ผ ์ฐจ์ด ๋‚˜๋Š” ํšŒ์›์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค List foundAllDeletedMembers = memberDeleteRepository.findAll(); - List candidates = foundAllDeletedMembers.stream() - .filter(m -> { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - LocalDateTime applDate = LocalDateTime.parse(m.getApplDate(), formatter); - return applDate.isBefore(now.minusMonths(1)) || applDate.isEqual(now.minusMonths(1)); - }) - .toList(); + List candidates = + foundAllDeletedMembers.stream() + .filter( + m -> { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime applDate = LocalDateTime.parse(m.getApplDate(), formatter); + return applDate.isBefore(now.minusMonths(1)) + || applDate.isEqual(now.minusMonths(1)); + }) + .toList(); // ์‚ญ์ œ ๋Œ€์ƒ ํšŒ์›์„ ๋ฐ˜๋ณตํ•ด์„œ ์‚ญ์ œ ์ฒ˜๋ฆฌํ•œ๋‹ค for (MemberDelete candidate : candidates) { // - ํšŒ์›์„ ์‚ญ์ œํ•œ๋‹ค - Member foundMember = memberRepository.findById(candidate.getMemberSeq()) - .orElseThrow(MemberNotFoundException::new); + Member foundMember = + memberRepository + .findById(candidate.getMemberSeq()) + .orElseThrow(MemberNotFoundException::new); memberRepository.delete(foundMember); // - ํšŒ์›์˜ ์ƒํƒœ๋ฅผ ์‚ญ์ œํ•œ๋‹ค - List foundMemberStates = memberStateRepository.findAllByMemberSeq(candidate.getMemberSeq()); + List foundMemberStates = + memberStateRepository.findAllByMemberSeq(candidate.getMemberSeq()); memberStateRepository.deleteAll(foundMemberStates); - // - ํšŒ์›์˜ ์•ฝ๊ด€ ์ด๋ ฅ์„ ์‚ญ์ œํ•œ๋‹ค - List foundMemberTermsHistories = memberTermsHistoryRepository.findByMemberSeq(candidate.getMemberSeq()); + List foundMemberTermsHistories = + memberTermsHistoryRepository.findByMemberSeq(candidate.getMemberSeq()); memberTermsHistoryRepository.deleteAll(foundMemberTermsHistories); // - ํšŒ์›์˜ ์ ‘์† ์ด๋ ฅ์„ ์‚ญ์ œํ•œ๋‹ค - List foundMemberConnectionsHistories = memberConnectionHistoryRepository.findMemberConnectionHistoriesByMemberSeq(candidate.getMemberSeq()); + List foundMemberConnectionsHistories = + memberConnectionHistoryRepository.findMemberConnectionHistoriesByMemberSeq( + candidate.getMemberSeq()); memberConnectionHistoryRepository.deleteAll(foundMemberConnectionsHistories); // - ํšŒ์›์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์‚ญ์ œํ•œ๋‹ค // - ํšŒ์› ์‚ญ์ œ ํ…Œ์ด๋ธ”์— ์ฒ˜๋ฆฌ ์™„๋ฃŒ ์ฒดํฌํ‘œ์‹œ ๋„ฃ๊ธฐ - List foundMemberChangeHistories = memberChangeHistoryRepository.findMemberChangeHistoriesByMemberSeq(candidate.getMemberSeq()); + List foundMemberChangeHistories = + memberChangeHistoryRepository.findMemberChangeHistoriesByMemberSeq( + candidate.getMemberSeq()); memberChangeHistoryRepository.deleteAll(foundMemberChangeHistories); // ํšŒ์› ์‚ญ์ œ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ @@ -626,23 +646,24 @@ public void updatePassword(Long memberSeq, MemberChangePasswordRequest request) String formattedEnd = end.format(formatter); // ๊ฐ€์žฅ ์ตœ๊ทผ ์ด๋ ฅ ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, passwordFiledCode.getCode()) + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, passwordFiledCode.getCode()) .ifPresent(history -> history.setEndDate(formattedNow)); - MemberChangeHistory passwordChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(passwordFiledCode) - .befVal(foundMember.getPassword()) - .aftVal(encodedPassword) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + MemberChangeHistory passwordChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(passwordFiledCode) + .befVal(foundMember.getPassword()) + .aftVal(encodedPassword) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); // ๋ณ€๊ฒฝ ์ด๋ ฅ ์ €์žฅ memberChangeHistoryRepository.save(passwordChangeHistory); } - public String findId(String email) { // ์ด๋ฉ”์ผ๋กœ ํšŒ์› ์กฐํšŒ Member foundMember = memberRepository.findByEmail(email); @@ -653,5 +674,4 @@ public String findId(String email) { // ์กฐํšŒ๋œ ํšŒ์›์˜ ์•„์ด๋”” ๋ฐ˜ํ™˜ return foundMember.getId(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsConditionServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsConditionServiceImpl.java index e311944f..3e03f6c8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsConditionServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsConditionServiceImpl.java @@ -18,16 +18,19 @@ public class MemberTermsConditionServiceImpl { private final MemberTermConditionRepository memberTermConditionRepository; - public MemberTermsConditionServiceImpl(MemberTermConditionRepository memberTermConditionRepository) { + public MemberTermsConditionServiceImpl( + MemberTermConditionRepository memberTermConditionRepository) { this.memberTermConditionRepository = memberTermConditionRepository; } + // ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ CRUD // 1-1. ๋‹จ๊ฑด ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ์„ ๋“ฑ๋กํ•œ๋‹ค public MemberTermConditionResponse create(MemberTermConditionRequest request) { // ์œ ํšจ์„ฑ ๊ฒ€์ฆ์ด ์™„๋ฃŒ๋œ request๋กœ๋ถ€ํ„ฐ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค MemberTermsCondition memberTermsConditionEntity = request.createMemberTermsConditionEntity(); // ์ƒ์„ฑ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค - MemberTermsCondition savedMemberTermsCondition = memberTermConditionRepository.save(memberTermsConditionEntity); + MemberTermsCondition savedMemberTermsCondition = + memberTermConditionRepository.save(memberTermsConditionEntity); // ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค return new MemberTermConditionResponse(savedMemberTermsCondition); } @@ -35,16 +38,16 @@ public MemberTermConditionResponse create(MemberTermConditionRequest request) { // 1-2. ์—ฌ๋Ÿฌ๊ฐœ ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ์„ ๋“ฑ๋กํ•œ๋‹ค public MemberTermConditionResponses create(List requests) { // ์œ ํšจ์„ฑ ๊ฒ€์ฆ์ด ์™„๋ฃŒ๋œ requests ๋”๋ฏธ๋กœ๋ถ€ํ„ฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ํ•  ์ˆ˜ ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ ๋”๋ฏธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค - Stream memberTermConditions = requests.stream() - .map(MemberTermConditionRequest::createMemberTermsConditionEntity); + Stream memberTermConditions = + requests.stream().map(MemberTermConditionRequest::createMemberTermsConditionEntity); // ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ ๋”๋ฏธ๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•œ๋‹ค - List savedMemberTermConditions = memberTermConditionRepository.saveAll(memberTermConditions::iterator); + List savedMemberTermConditions = + memberTermConditionRepository.saveAll(memberTermConditions::iterator); // ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ ๋”๋ฏธ๋ฅผ ๊ฐ๊ฐ response๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค - List memberTermCondtionsResponse = savedMemberTermConditions.stream() - .map(MemberTermConditionResponse::new) - .toList(); + List memberTermCondtionsResponse = + savedMemberTermConditions.stream().map(MemberTermConditionResponse::new).toList(); // ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ ๋”๋ฏธ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค return new MemberTermConditionResponses(memberTermCondtionsResponse); @@ -53,10 +56,11 @@ public MemberTermConditionResponses create(List requ // 2-1. ๋‹จ๊ฑด ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ์„ ์กฐํšŒํ•œ๋‹ค public MemberTermConditionResponse read(String condCode) { // ํŠน์ • ์•ฝ๊ด€ ํ•ญ๋ชฉ ์ฝ”๋“œ๋กœ ์กฐํšŒ - MemberTermsCondition foundMemberTermsCondition = memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); + MemberTermsCondition foundMemberTermsCondition = + memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); if (foundMemberTermsCondition == null) { // ์—†์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ - throw new MemberTermsConditionNotFoundException(); + throw new MemberTermsConditionNotFoundException(); } // ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค @@ -69,9 +73,8 @@ public MemberTermConditionResponses readAll() { // ๋ชจ๋“  ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ์„ ์กฐํšŒํ•œ๋‹ค List foundMemberTermsConditions = memberTermConditionRepository.findAll(); // ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค - List memberTermCondtionsResponse = foundMemberTermsConditions.stream() - .map(MemberTermConditionResponse::new) - .toList(); + List memberTermCondtionsResponse = + foundMemberTermsConditions.stream().map(MemberTermConditionResponse::new).toList(); // ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค return new MemberTermConditionResponses(memberTermCondtionsResponse); } @@ -80,12 +83,12 @@ public MemberTermConditionResponses readAll() { @Transactional(readOnly = true) public MemberTermConditionResponses readAvailable() { // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ๊ฐœ ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ์„ ์กฐํšŒํ•œ๋‹ค - List availableMemberTermsConditions = memberTermConditionRepository.findAvailableMemberTermsConditions(); + List availableMemberTermsConditions = + memberTermConditionRepository.findAvailableMemberTermsConditions(); // ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ ๋”๋ฏธ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค - List memberTermConditionResponses = availableMemberTermsConditions.stream() - .map(MemberTermConditionResponse::new) - .toList(); + List memberTermConditionResponses = + availableMemberTermsConditions.stream().map(MemberTermConditionResponse::new).toList(); return new MemberTermConditionResponses(memberTermConditionResponses); } @@ -93,40 +96,39 @@ public MemberTermConditionResponses readAvailable() { @Transactional(readOnly = true) public MemberTermConditionResponses readNotAvailable() { // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ๊ฐœ ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ์„ ์กฐํšŒํ•œ๋‹ค - List availableMemberTermsConditions = memberTermConditionRepository.findNotAvailableMemberTermsConditions(); + List availableMemberTermsConditions = + memberTermConditionRepository.findNotAvailableMemberTermsConditions(); // ์กฐํšŒ๋œ ์—”ํ‹ฐํ‹ฐ ๋”๋ฏธ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค - List memberTermConditionResponses = availableMemberTermsConditions.stream() - .map(MemberTermConditionResponse::new) - .toList(); + List memberTermConditionResponses = + availableMemberTermsConditions.stream().map(MemberTermConditionResponse::new).toList(); return new MemberTermConditionResponses(memberTermConditionResponses); } // 3-1. ๋‹จ๊ฑด ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ์„ ์ˆ˜์ •ํ•œ๋‹ค public void update(String condCode, MemberTermConditionUpdateRequest request) { // ํŠน์ • ์•ฝ๊ด€ ํ•ญ๋ชฉ ์ฝ”๋“œ๋กœ ์•ฝ๊ณผ ์กฐํšŒ - MemberTermsCondition foundMemberTermCondition = memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); + MemberTermsCondition foundMemberTermCondition = + memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); if (foundMemberTermCondition == null) { // ์—†์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ - throw new MemberTermsConditionNotFoundException(); + throw new MemberTermsConditionNotFoundException(); } // ์žˆ์„ ๊ฒฝ์šฐ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ • foundMemberTermCondition.update(request); } - // 4-1. ๋‹จ๊ฑด ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•œ๋‹ค public void remove(String condCode) { // ํŠน์ • ์•ฝ๊ด€ ํ•ญ๋ชฉ ์ฝ”๋“œ๋กœ ์•ฝ๊ด€์„ ์กฐํšŒํ•œ๋‹ค - MemberTermsCondition foundMemberTermCondition = memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); + MemberTermsCondition foundMemberTermCondition = + memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); if (foundMemberTermCondition == null) { // ์—†์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ - throw new MemberTermsConditionNotFoundException(); + throw new MemberTermsConditionNotFoundException(); } // ์กฐํšŒ๋œ ์•ฝ๊ด€์„ ์‚ญ์ œํ•œ๋‹ค memberTermConditionRepository.delete(foundMemberTermCondition); } - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsServiceImpl.java index 51574643..7e1c5ba6 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsServiceImpl.java @@ -6,22 +6,18 @@ import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermResponses; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermsDetailResponse; -import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; import com.oreo.finalproject_5re5_be.member.exception.MemberTermsConditionNotFoundException; import com.oreo.finalproject_5re5_be.member.exception.MemberTermsNotFoundException; -import com.oreo.finalproject_5re5_be.member.exception.RetryFailedException; import com.oreo.finalproject_5re5_be.member.repository.MemberTermConditionRepository; import com.oreo.finalproject_5re5_be.member.repository.MemberTermsRepository; -import jakarta.validation.constraints.Pattern; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - @Service @Transactional public class MemberTermsServiceImpl { @@ -29,22 +25,25 @@ public class MemberTermsServiceImpl { private final MemberTermsRepository memberTermsRepository; private final MemberTermConditionRepository memberTermConditionRepository; - public MemberTermsServiceImpl(MemberTermsRepository memberTermsRepository, MemberTermConditionRepository memberTermConditionRepository) { + public MemberTermsServiceImpl( + MemberTermsRepository memberTermsRepository, + MemberTermConditionRepository memberTermConditionRepository) { this.memberTermsRepository = memberTermsRepository; this.memberTermConditionRepository = memberTermConditionRepository; } - // ํšŒ์› ์•ฝ๊ด€ ์ƒ์„ฑ public MemberTermResponse create(MemberTermRequest request) { // ์•ฝ๊ด€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•จ MemberTerms terms = new MemberTerms(); - List foundMemberTermConditions = findMemberTermsConditions(request.getMemberTermConditionCodes()); + List foundMemberTermConditions = + findMemberTermsConditions(request.getMemberTermConditionCodes()); // ๊ฐ ์ฝ”๋“œ์— ๋งž๋Š” ํšŒ์› ์•ฝ๊ด€ ํ•ญ๋ชฉ๋“ค์„ ์ฐพ์•„์„œ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์Œ // ๊ฐ ์•ฝ๊ด€ ํ•ญ๋ชฉ๊ณผ ํ•„์ˆ˜ ์—ฌ๋ถ€๋ฅผ ์„ธํŒ…ํ•จ - List memberTermConditionMandatoryOrNot = request.getMemberTermConditionMandatoryOrNot(); + List memberTermConditionMandatoryOrNot = + request.getMemberTermConditionMandatoryOrNot(); terms.setTermCond1(foundMemberTermConditions.get(0)); terms.setChkTerm1(memberTermConditionMandatoryOrNot.get(0)); @@ -82,8 +81,6 @@ public MemberTermResponse create(MemberTermRequest request) { return new MemberTermResponse(savedMemberTerm); } - - // ํšŒ์› ์•ฝ๊ด€ ์‹œํ€€์Šค๋กœ ์กฐํšŒ public MemberTermResponse read(Long termSeq) { MemberTerms foundMemberTerm = findMemberTerm(termSeq); @@ -101,9 +98,9 @@ public MemberTermResponse readLatestAvailable() { return new MemberTermResponse(foundMemberTerms); } - /** * ๋ฐ‘์— ์ฝ”๋“œ๋“ค ์ค‘๋ณต, ์ถ”ํ›„์— ๋ฆฌํŒฉํ† ๋ง ์ฒ˜๋ฆฌ[] + * * @return */ // ์ถ”ํ›„์— ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ํ•„์š” @@ -112,9 +109,8 @@ public MemberTermResponses readAll() { List foundMemberTerms = memberTermsRepository.findAll(); // ์กฐํšŒ๋œ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค - List memberTermResponseList = foundMemberTerms.stream() - .map(MemberTermResponse::new) - .toList(); + List memberTermResponseList = + foundMemberTerms.stream().map(MemberTermResponse::new).toList(); // ๋ณ€ํ™˜๋œ ๋ชจ๋“  response๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์€ response์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค return new MemberTermResponses(memberTermResponseList); @@ -125,9 +121,8 @@ public MemberTermResponses readAvailable() { List foundMemberTerms = memberTermsRepository.findAvailableMemberTerms(); // ์กฐํšŒ๋œ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค - List memberTermResponseList = foundMemberTerms.stream() - .map(MemberTermResponse::new) - .toList(); + List memberTermResponseList = + foundMemberTerms.stream().map(MemberTermResponse::new).toList(); // ๋ณ€ํ™˜๋œ ๋ชจ๋“  response๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์€ response์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค return new MemberTermResponses(memberTermResponseList); @@ -138,9 +133,8 @@ public MemberTermResponses readNotAvailable() { List foundMemberTerms = memberTermsRepository.findNotAvailableMemberTerms(); // ์กฐํšŒ๋œ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ response๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค - List memberTermResponseList = foundMemberTerms.stream() - .map(MemberTermResponse::new) - .toList(); + List memberTermResponseList = + foundMemberTerms.stream().map(MemberTermResponse::new).toList(); // ๋ณ€ํ™˜๋œ ๋ชจ๋“  response๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์€ response์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค return new MemberTermResponses(memberTermResponseList); @@ -155,7 +149,6 @@ public void update(Long termSeq, MemberTermUpdateRequest request) { foundMemberTerms.update(request); } - // ํšŒ์› ์•ฝ๊ด€ ์‚ญ์ œ public void remove(Long termSeq) { // ์•ฝ๊ด€ ์‹œํ€€์Šค๋กœ ํ•ด๋‹น ์•ฝ๊ด€ ์กฐํšŒ @@ -195,14 +188,14 @@ private List findMemberTermsConditions(List condCo // ๊ฐ ์ฝ”๋“œ์— ๋งž๋Š” ์•ฝ๊ด€ ํ•ญ๋ชฉ์„ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•จ private MemberTermsCondition findMemberTermsCondition(String condCode) { - MemberTermsCondition foundMemberTermCondition = memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); + MemberTermsCondition foundMemberTermCondition = + memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); if (foundMemberTermCondition == null) { throw new MemberTermsConditionNotFoundException(); } return foundMemberTermCondition; } - // ํŠน์ • ์ฝ”๋“œ๋กœ ํ˜ธ์› ์•ฝ๊ด€ ์ƒ์„ธ ์กฐํšŒ public MemberTermsDetailResponse readByTermCode(String termCode) { // ํŠน์ • ํšŒ์› ์•ฝ๊ด€ ์ฝ”๋“œ๋กœ ์กฐํšŒ @@ -239,11 +232,16 @@ public MemberTermsDetailResponse readByTermCode(String termCode) { } // ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ ์ „ํ™˜ - MemberTermConditionResponse memberTermConditionResponse1 = MemberTermConditionResponse.of(termCond1); - MemberTermConditionResponse memberTermConditionResponse2 = MemberTermConditionResponse.of(termCond2); - MemberTermConditionResponse memberTermConditionResponse3 = MemberTermConditionResponse.of(termCond3); - MemberTermConditionResponse memberTermConditionResponse4 = MemberTermConditionResponse.of(termCond4); - MemberTermConditionResponse memberTermConditionResponse5 = MemberTermConditionResponse.of(termCond5); + MemberTermConditionResponse memberTermConditionResponse1 = + MemberTermConditionResponse.of(termCond1); + MemberTermConditionResponse memberTermConditionResponse2 = + MemberTermConditionResponse.of(termCond2); + MemberTermConditionResponse memberTermConditionResponse3 = + MemberTermConditionResponse.of(termCond3); + MemberTermConditionResponse memberTermConditionResponse4 = + MemberTermConditionResponse.of(termCond4); + MemberTermConditionResponse memberTermConditionResponse5 = + MemberTermConditionResponse.of(termCond5); // ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ memberTermConditionResponseList.add(memberTermConditionResponse1); @@ -254,6 +252,5 @@ public MemberTermsDetailResponse readByTermCode(String termCode) { // ์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ return MemberTermsDetailResponse.of(foundMemberTerms, memberTermConditionResponseList); - } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java index 8632c056..f8b83321 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java @@ -1,28 +1,24 @@ package com.oreo.finalproject_5re5_be.project.controller; -import com.google.api.Http; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; -import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; +import com.oreo.finalproject_5re5_be.project.dto.request.ProjectTextRequest; import com.oreo.finalproject_5re5_be.project.dto.response.ProjectResponse; import com.oreo.finalproject_5re5_be.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpSession; import jakarta.validation.Valid; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - @Tag(name = "Project", description = "Project ๊ด€๋ จ API") @RestController @Slf4j @@ -33,72 +29,56 @@ public class ProjectController { private ProjectService projectService; @Autowired - public ProjectController(ProjectService projectService){ + public ProjectController(ProjectService projectService) { this.projectService = projectService; } - @Operation( - summary = "Project ์ •๋ณด ๊ฒ€์ƒ‰", - description = "ํšŒ์› Seq๋กœ ํ”„๋กœ์ ํŠธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ ์˜ต๋‹ˆ๋‹ค." - ) - @GetMapping("/{memSeq}") - public ResponseEntity>>> projectGet( -// HttpSession session) { - @PathVariable Long memSeq){//session memberSeq๊ฐ’ - List projectResponses = - projectService.projectFindAll(memSeq); -// List projectResponses = projectService.projectFindAll(userDetails.getMember().getSeq()); - log.info("[ProjectController] projectGet - projectResponses : {} ", projectResponses.toString()); + @Operation(summary = "Project ์ •๋ณด ๊ฒ€์ƒ‰", description = "ํšŒ์› Seq๋กœ ํ”„๋กœ์ ํŠธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ ์˜ต๋‹ˆ๋‹ค.") + @GetMapping("") + public ResponseEntity>>> projectGet(HttpSession session) { + // @PathVariable Long memSeq){//session memberSeq๊ฐ’ + // List projectResponses = + Long memberSeq = (Long) session.getAttribute("memberSeq"); + projectService.findAllProject(memberSeq); + List projectResponses = projectService.findAllProject(memberSeq); + log.info( + "[ProjectController] projectGet - projectResponses : {} ", projectResponses.toString()); - Map> map = new HashMap<>();//๋งต ์ƒ์„ฑ - map.put("row", Collections.singletonList(projectResponses));//row : [] ๋กœ ์‘๋‹ต - return ResponseEntity.ok() - .body(new ResponseDto<>(HttpStatus.OK.value(), map)); + Map> map = new HashMap<>(); // ๋งต ์ƒ์„ฑ + map.put("row", Collections.singletonList(projectResponses)); // row : [] ๋กœ ์‘๋‹ต + return ResponseEntity.ok().body(new ResponseDto<>(HttpStatus.OK.value(), map)); } - @Operation( - summary = "Project ์ƒ์„ฑ", - description = "ํšŒ์› Seq๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ ํ•ฉ๋‹ˆ๋‹ค." - ) - @PostMapping("/{memSeq}") - public ResponseEntity>> projectSave( - @PathVariable Long memSeq){//session memberSeq๊ฐ’ - //project ์ƒ์„ฑ - Long projectSeq = projectService.projectSave(memSeq); + @Operation(summary = "Project ์ƒ์„ฑ", description = "ํšŒ์› Seq๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ ํ•ฉ๋‹ˆ๋‹ค.") + @PostMapping("") + public ResponseEntity>> projectSave( + HttpSession session) { // session memberSeq๊ฐ’ + // project ์ƒ์„ฑ + Long projectSeq = projectService.saveProject((Long) session.getAttribute("memberSeq")); Map map = new HashMap<>(); - map.put("projectSeq", projectSeq);//ํ”„๋กœ์ ํŠธseq ์‘๋‹ต์— ์ถ”๊ฐ€ - map.put("msg", "ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");//๋ฉ”์‹œ์ง€ ์ถ”๊ฐ€ - return ResponseEntity.ok() - .body(new ResponseDto<>(HttpStatus.OK.value(),map)); + map.put("projectSeq", projectSeq); // ํ”„๋กœ์ ํŠธseq ์‘๋‹ต์— ์ถ”๊ฐ€ + map.put("msg", "ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); // ๋ฉ”์‹œ์ง€ ์ถ”๊ฐ€ + return ResponseEntity.ok().body(new ResponseDto<>(HttpStatus.OK.value(), map)); } - @Operation( - summary = "Project ์ด๋ฆ„ ์ˆ˜์ •(์ €์žฅ)", - description = "ํ”„๋กœ์ ํŠธ Seq์™€ ๋ณ€๊ฒฝํ•  ์ด๋ฆ„์„ ๋ฐ›์•„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค." - ) - @PutMapping("/{memSeq}") + @Operation(summary = "Project ์ด๋ฆ„ ์ˆ˜์ •(์ €์žฅ)", description = "ํ”„๋กœ์ ํŠธ Seq์™€ ๋ณ€๊ฒฝํ•  ์ด๋ฆ„์„ ๋ฐ›์•„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.") + @PutMapping("") public ResponseEntity> projectUpdate( - @PathVariable Long memSeq, - @Valid @RequestBody Long proSeq, - @Valid @RequestBody String projectName){ - projectService.projectCheck(memSeq, proSeq); //ํšŒ์›์˜ ํ”„๋กœ์ ํŠธ์ธ์ง€ ํ™•์ธ - projectService.projectUpdate(proSeq, projectName);//ํ”„๋กœ์ ํŠธ ์ˆ˜์ • + HttpSession session, @Valid @RequestBody ProjectTextRequest request) { + projectService.checkProject( + (Long) session.getAttribute("memberSeq"), request.getProSeq()); // ํšŒ์›์˜ ํ”„๋กœ์ ํŠธ์ธ์ง€ ํ™•์ธ + projectService.updateProject(request.getProSeq(), request.getProjectName()); // ํ”„๋กœ์ ํŠธ ์ˆ˜์ • return ResponseEntity.ok() - .body(new ResponseDto<>(HttpStatus.OK.value(), - "Project ์ด๋ฆ„ ๋ณ€๊ฒฝ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")); //์‘๋‹ต + .body(new ResponseDto<>(HttpStatus.OK.value(), "Project ์ด๋ฆ„ ๋ณ€๊ฒฝ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")); // ์‘๋‹ต } - @Operation( - summary = "Project ์‚ญ์ œ", - description = "ํ”„๋กœ์ ํŠธ Seq๋ฅผ ๋ฐ›์•„ activate ์ƒํƒœ๋ฅผ 'N'์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค." - ) - @DeleteMapping("/{memSeq}") + + @Operation(summary = "Project ์‚ญ์ œ", description = "ํ”„๋กœ์ ํŠธ Seq๋ฅผ ๋ฐ›์•„ activate ์ƒํƒœ๋ฅผ 'N'์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.") + @DeleteMapping("") public ResponseEntity> projectDelete( - @RequestParam List proSeq, - @PathVariable Long memSeq){ - projectService.projectCheck(memSeq, proSeq); //ํšŒ์›์˜ ํ”„๋กœ์ ํŠธ์ธ์ง€ ํ™•์ธ - projectService.projectDelete(proSeq);//ํ”„๋กœ์ ํŠธ ์‚ญ์ œ ๋ฐฐ์—ด๋กœ ๋ฐ›์Œ + @RequestParam List proSeq, HttpSession session) { + projectService.checkProject((Long) session.getAttribute("memberSeq"), proSeq); // ํšŒ์›์˜ ํ”„๋กœ์ ํŠธ์ธ์ง€ ํ™•์ธ + projectService.deleteProject(proSeq); // ํ”„๋กœ์ ํŠธ ์‚ญ์ œ ๋ฐฐ์—ด๋กœ ๋ฐ›์Œ return ResponseEntity.ok() - .body(new ResponseDto<>(HttpStatus.OK.value(), - "Project ์‚ญ์ œ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."));//๋ชจ๋‘ ์‚ญ์ œ + .body(new ResponseDto<>(HttpStatus.OK.value(), "Project ์‚ญ์ œ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")); // ๋ชจ๋‘ ์‚ญ์ œ } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java new file mode 100644 index 00000000..f8d3e81a --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java @@ -0,0 +1,14 @@ +package com.oreo.finalproject_5re5_be.project.dto.request; + +import lombok.*; + +@Getter +@Setter +@Builder +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class ProjectTextRequest { + private Long proSeq; + private String projectName; +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/dto/response/ProjectResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/response/ProjectResponse.java index c9121cbd..ccb657a8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/dto/response/ProjectResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/response/ProjectResponse.java @@ -1,8 +1,7 @@ package com.oreo.finalproject_5re5_be.project.dto.response; -import lombok.*; - import java.time.LocalDateTime; +import lombok.*; @Getter @Setter diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java index e973fc9f..635d7b5d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java @@ -1,15 +1,13 @@ package com.oreo.finalproject_5re5_be.project.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import com.oreo.finalproject_5re5_be.member.entity.Member; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.*; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; -import java.time.LocalDateTime; - @Entity @Table(name = "project") @Getter @@ -18,7 +16,6 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @EqualsAndHashCode(callSuper = false) -@ToString public class Project extends BaseEntity { @Id @@ -32,7 +29,7 @@ public class Project extends BaseEntity { @Builder.Default @Column(nullable = false, name = "pro_name") - private String proName="ProjectName"; + private String proName = "ProjectName"; @Column(name = "pro_cmt") private String proCmt; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/ProjectStatus.java b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/ProjectStatus.java index d940af59..a823a18a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/ProjectStatus.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/ProjectStatus.java @@ -1,18 +1,17 @@ package com.oreo.finalproject_5re5_be.project.entity; - import com.oreo.finalproject_5re5_be.code.entity.Code; import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import java.time.LocalDateTime; - @Entity @Table(name = "project_status") -@Getter @Setter +@Getter +@Setter @ToString public class ProjectStatus extends BaseEntity { @@ -25,13 +24,13 @@ public class ProjectStatus extends BaseEntity { @JoinColumn(name = "pro_seq") private Project project; - /** ์ถ”ํ›„์— ํ†ตํ•ฉ ์ฝ”๋“œ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๊ด€๊ณ„ ๋งบ๊ธฐ **/ + /** ์ถ”ํ›„์— ํ†ตํ•ฉ ์ฝ”๋“œ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๊ด€๊ณ„ ๋งบ๊ธฐ * */ @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "code") private Code ccSeq; - private LocalDateTime applDate;//์ ์šฉ ์‹œ์ ์ผ - private LocalDateTime endDate;//์ ์šฉ ์ข…๋ฃŒ์ผ + private LocalDateTime applDate; // ์ ์šฉ ์‹œ์ ์ผ + private LocalDateTime endDate; // ์ ์šฉ ์ข…๋ฃŒ์ผ public void prePersist() { applDate = LocalDateTime.now(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/InvalidProjectNameException.java b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/InvalidProjectNameException.java index 3e68b02d..655fdaa0 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/InvalidProjectNameException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/InvalidProjectNameException.java @@ -1,7 +1,10 @@ package com.oreo.finalproject_5re5_be.project.exception; -public class InvalidProjectNameException extends RuntimeException { +import com.oreo.finalproject_5re5_be.global.exception.BusinessException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class InvalidProjectNameException extends BusinessException { public InvalidProjectNameException(String message) { - super(message); + super(message, ErrorCode.PROJECT_INVALID_NAME); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectExceptionHandler.java index 4c9ad7f5..557a2675 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectExceptionHandler.java @@ -1,7 +1,9 @@ package com.oreo.finalproject_5re5_be.project.exception; +import com.oreo.finalproject_5re5_be.global.dto.response.ErrorResponseDto; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -12,19 +14,48 @@ @Slf4j @RestControllerAdvice(value = "com.oreo.finalproject_5re5_be.project") public class ProjectExceptionHandler { - @ExceptionHandler(value = Exception.class) // ์–ด๋–ค ์˜ˆ์™ธํด๋ž˜์Šค๋ฅผ ์ฒ˜๋ฆฌํ• ๊ฑด์ง€ ์ง€์ • - public ResponseEntity> handle(Exception e, HttpServletRequest request) { - log.error("VC RestController1 ๋‚ด handlerException ํ˜ธ์ถœ , {} , {}", - request.getRequestURI(), e.getMessage()); - return ResponseEntity.badRequest() - .body(new ResponseDto<> (HttpStatus.BAD_REQUEST.value(), e.getMessage())); + + @ExceptionHandler(value = ProjectNotFoundException.class) // ์–ด๋–ค ์˜ˆ์™ธํด๋ž˜์Šค๋ฅผ ์ฒ˜๋ฆฌํ• ๊ฑด์ง€ ์ง€์ • + public ResponseEntity> ProjectNotFoundExceptionHandler( + ProjectNotFoundException e, HttpServletRequest request) { + log.error( + "[Project] ProjectNotFoundExceptionHandler ํ˜ธ์ถœ , {} , {}", + request.getRequestURI(), + e.getMessage()); + return ResponseEntity.status(ErrorCode.PROJECT_NOT_FOUND_ERROR.getStatus()) + .body(new ResponseDto<>(HttpStatus.NOT_FOUND.value(), e.getMessage())); + } + + @ExceptionHandler(value = ProjectNotMemberException.class) // ์–ด๋–ค ์˜ˆ์™ธํด๋ž˜์Šค๋ฅผ ์ฒ˜๋ฆฌํ• ๊ฑด์ง€ ์ง€์ • + public ResponseEntity> ProjectNotMemberExceptionHandler( + ProjectNotMemberException e, HttpServletRequest request) { + log.error( + "[Project] ProjectNotMemberExceptionHandler ํ˜ธ์ถœ , {} , {}", + request.getRequestURI(), + e.getMessage()); + return ResponseEntity.status(ErrorCode.PROJECT_ACCESS_DENIED.getStatus()) + .body(new ResponseDto<>(HttpStatus.FORBIDDEN.value(), e.getMessage())); } - @ExceptionHandler(value = BusinessException.class) // ์–ด๋–ค ์˜ˆ์™ธํด๋ž˜์Šค๋ฅผ ์ฒ˜๋ฆฌํ• ๊ฑด์ง€ ์ง€์ • - public ResponseEntity> handle2(Exception e, HttpServletRequest request) { - log.error("VC RestController2 ๋‚ด handlerException ํ˜ธ์ถœ , {} , {}", - request.getRequestURI(), e.getMessage()); - return ResponseEntity.badRequest() - .body(new ResponseDto<> (HttpStatus.BAD_REQUEST.value(), e.getMessage())); + @ExceptionHandler(RuntimeException.class) + public ResponseEntity runtimeExceptionHandler(RuntimeException e) { + log.error("[project] RuntimeException ํ˜ธ์ถœ : {}", e); + + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), + ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); + return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) + .body(errorResponseDto); + } + + // BusinessException ์ฒ˜๋ฆฌ + @ExceptionHandler(BusinessException.class) + public ResponseEntity ttsExceptionHandler(BusinessException e) { + log.error("[project] BusinessException ํ˜ธ์ถœ : {} ", e); + + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); + return ResponseEntity.status(e.getErrorCode().getStatus()).body(errorResponseDto); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java new file mode 100644 index 00000000..0df640ed --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java @@ -0,0 +1,19 @@ +package com.oreo.finalproject_5re5_be.project.exception; + +import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class ProjectNotFoundException extends EntityNotFoundException { + + public ProjectNotFoundException() { + super(ErrorCode.PROJECT_NOT_FOUND_ERROR.getMessage(), ErrorCode.PROJECT_NOT_FOUND_ERROR); + } + + public ProjectNotFoundException(String message) { + super(message, ErrorCode.PROJECT_NOT_FOUND_ERROR); + } + + public ProjectNotFoundException(String message, ErrorCode errorCode) { + super(message, errorCode); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotMemberException.java b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotMemberException.java new file mode 100644 index 00000000..4d6a8b90 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotMemberException.java @@ -0,0 +1,14 @@ +package com.oreo.finalproject_5re5_be.project.exception; + +import com.oreo.finalproject_5re5_be.global.exception.BusinessException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class ProjectNotMemberException extends BusinessException { + public ProjectNotMemberException() { + super(ErrorCode.PROJECT_ACCESS_DENIED.getMessage(), ErrorCode.PROJECT_ACCESS_DENIED); + } + + public ProjectNotMemberException(String message) { + super(message, ErrorCode.PROJECT_ACCESS_DENIED); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/projectNotMemberException.java b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/projectNotMemberException.java deleted file mode 100644 index 09a9f166..00000000 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/projectNotMemberException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.oreo.finalproject_5re5_be.project.exception; - -import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; - -public class projectNotMemberException extends BusinessException { - public projectNotMemberException() { - super(ErrorCode.HANDLE_ACCESS_DENIED.getMessage(), ErrorCode.HANDLE_ACCESS_DENIED); - } - public projectNotMemberException(String message) { - super(message, ErrorCode.HANDLE_ACCESS_DENIED); - } -} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/repository/ProjectRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/project/repository/ProjectRepository.java index 61a533af..eb443804 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/repository/ProjectRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/repository/ProjectRepository.java @@ -1,16 +1,14 @@ package com.oreo.finalproject_5re5_be.project.repository; -import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.project.entity.Project; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface ProjectRepository extends JpaRepository { - @Query("SELECT p FROM Project p JOIN p.member m WHERE m.seq = :memberSeq") - List findByMemberSeq(@Param("memberSeq") Long memberSeq); -} \ No newline at end of file + @Query("SELECT p FROM Project p JOIN p.member m WHERE m.seq = :memberSeq AND p.proActivate = 'Y'") + List findByMemberSeq(@Param("memberSeq") Long memberSeq); // 1500ms +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectService.java b/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectService.java index a9f58844..e558870e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectService.java @@ -3,23 +3,21 @@ import com.oreo.finalproject_5re5_be.project.dto.response.ProjectResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import org.springframework.validation.annotation.Validated; - import java.util.List; +import org.springframework.validation.annotation.Validated; @Validated public interface ProjectService { - /** - * 1. ํ”„๋กœ์ ํŠธ ์กฐํšŒ - * 2. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ - * 3. ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ๋ณ€๊ฒฝ - * 4. ํ”„๋กœ์ ํŠธ ์‚ญ์ œ - */ + /** 1. ํ”„๋กœ์ ํŠธ ์กฐํšŒ 2. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ 3. ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ๋ณ€๊ฒฝ 4. ํ”„๋กœ์ ํŠธ ์‚ญ์ œ */ + List findAllProject(Long memberSeq); + + Long saveProject(Long memberSeq); + + void updateProject(@Valid @NotNull Long projectSeq, @Valid @NotNull String projectName); + + void deleteProject(@Valid @NotNull List projectSeq); + + boolean checkProject(Long memberSeq, Long projectSeq); - List projectFindAll(Long memberSeq); - Long projectSave(Long memberSeq); - void projectUpdate(@Valid @NotNull Long projectSeq,@Valid @NotNull String projectName); - void projectDelete(@Valid @NotNull List projectSeq); - boolean projectCheck(Long memberSeq, Long projectSeq); - boolean projectCheck(Long memberSeq, List projectSeq); + boolean checkProject(Long memberSeq, List projectSeq); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectServiceImpl.java index 68efbc03..e80c55a0 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectServiceImpl.java @@ -7,20 +7,23 @@ import com.oreo.finalproject_5re5_be.project.dto.response.ProjectResponse; import com.oreo.finalproject_5re5_be.project.entity.Project; import com.oreo.finalproject_5re5_be.project.exception.InvalidProjectNameException; -import com.oreo.finalproject_5re5_be.project.exception.projectNotMemberException; +import com.oreo.finalproject_5re5_be.project.exception.ProjectNotFoundException; +import com.oreo.finalproject_5re5_be.project.exception.ProjectNotMemberException; import com.oreo.finalproject_5re5_be.project.repository.ProjectRepository; import com.oreo.finalproject_5re5_be.tts.repository.TtsSentenceRepository; import com.oreo.finalproject_5re5_be.vc.repository.VcRepository; +import java.util.ArrayList; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import java.util.ArrayList; -import java.util.List; - @Service @Slf4j @RequiredArgsConstructor @@ -32,12 +35,14 @@ public class ProjectServiceImpl implements ProjectService { private TtsSentenceRepository ttsSentenceRepository; private VcRepository vcRepository; private ConcatTabRepository concatTabRepository; + @Autowired - public ProjectServiceImpl(ProjectRepository projectRepository, - MemberRepository memberRepository, - TtsSentenceRepository ttsSentenceRepository, - VcRepository vcRepository, - ConcatTabRepository concatTabRepository) { + public ProjectServiceImpl( + ProjectRepository projectRepository, + MemberRepository memberRepository, + TtsSentenceRepository ttsSentenceRepository, + VcRepository vcRepository, + ConcatTabRepository concatTabRepository) { this.projectRepository = projectRepository; this.memberRepository = memberRepository; this.ttsSentenceRepository = ttsSentenceRepository; @@ -45,137 +50,159 @@ public ProjectServiceImpl(ProjectRepository projectRepository, this.concatTabRepository = concatTabRepository; } - /** * ํ”„๋กœ์ ํŠธ ํšŒ์› ์กฐํšŒ + * * @return List */ @Override @Transactional - public List projectFindAll(Long memberSeq) { + public List findAllProject(Long memberSeq) { log.info("[projectService] projectFindAll - memberSeq : {} ", memberSeq); - Member member = memberFind(memberSeq); + Member member = findMember(memberSeq); log.info("[projectService] projectFindAll - member : {} ", member.toString()); - //member ํ™•์ธํ›„ ์˜ˆ์™ธ ๋˜์ง€๊ธฐ -// memberSeqCheck(member.getSeq()); + // member ํ™•์ธํ›„ ์˜ˆ์™ธ ๋˜์ง€๊ธฐ + // memberSeqCheck(member.getSeq()); - //ํšŒ์› ์ •๋ณด๋กœ ์ „์ฒด ์กฐํšŒ - List project = projectRepository - .findByMemberSeq(member.getSeq()); - log.info("[projectService] projectFindAll - project : {} ", project.toString()); - //์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ + // ํšŒ์› ์ •๋ณด๋กœ ์ „์ฒด ์กฐํšŒ + List project = projectRepository.findByMemberSeq(member.getSeq()); + // ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ List projectResponses = new ArrayList<>(); - //project ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋„ฃ๊ณ  + List projectSeqs = new ArrayList<>(); + // project ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋„ฃ๊ณ  for (Project p : project) { - ProjectResponse projectResponse = ProjectResponse.builder() - .projectSeq(p.getProSeq()) - .projectName(p.getProName()) - .projectContent(p.getProName()) - .projectDate(p.getProDate()) - .projectUpdateDate(p.getProUpDate()) - .tts(ttsSentenceRepository.existsByProject_ProSeq(p.getProSeq())) - .vc(vcRepository.existsById(p.getProSeq())) - .concat(concatTabRepository.existsById(p.getProSeq())) - .projectActivate(p.getProActivate()) - .build(); + ProjectResponse projectResponse = + ProjectResponse.builder() + .projectSeq(p.getProSeq()) + .projectName(p.getProName()) + .projectContent(p.getProName()) + .projectDate(p.getProDate()) + .projectUpdateDate(p.getProUpDate()) + .tts(ttsSentenceRepository.existsByProject_ProSeq(p.getProSeq())) + .vc(vcRepository.existsById(p.getProSeq())) + .concat(concatTabRepository.existsById(p.getProSeq())) + .projectActivate(p.getProActivate()) + .build(); projectResponses.add(projectResponse); + projectSeqs.add(p.getProSeq()); } - log.info("[projectService] projectFindAll - projectResponses : {} ", projectResponses); - //Response ๋กœ ์ถ”์ถœ + log.info("ํšŒ์›์ด ์กฐํšŒํ•œ Project Seqs : {}", projectSeqs); + // Response ๋กœ ์ถ”์ถœ return projectResponses; } /** * ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ + * * @return Long */ @Override - public Long projectSave(Long memberSeq) { - //ํšŒ์›์ •๋ณด ์ถ”์ถœ - Member member = memberFind(memberSeq); - memberSeqCheck(member.getSeq()); - //ํšŒ์›์ •๋ณด๋กœ ํ”„๋กœ์ ํŠธ ๊ฐ์ฒด ์ƒ์„ฑ - Project project = Project.builder() - .member(member) - .build(); - //์ €์žฅ - Project save = projectRepository.save(project); - log.info("Save project : {}", save); - //์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ ID ์ •๋ณด ์ถ”์ถœ - return save.getProSeq(); + public Long saveProject(Long memberSeq) { + // ํšŒ์›์ •๋ณด ์ถ”์ถœ + Member member = findMember(memberSeq); + checkMemberSeq(member.getSeq()); + // ํšŒ์›์ •๋ณด๋กœ ํ”„๋กœ์ ํŠธ ๊ฐ์ฒด ์ƒ์„ฑ + Project project = Project.builder().member(member).build(); + try { + // ์ €์žฅ + Project save = projectRepository.save(project); + log.info("Save project : {}", save); + // ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ ID ์ •๋ณด ์ถ”์ถœ + return save.getProSeq(); + } catch (DataAccessException e) { + log.error("Error Save project ์ €์žฅ์ค‘ ์˜ค๋ฅ˜ : {} ", e.getMessage(), e); + throw new RuntimeException("Project ์ €์žฅ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค."); + } } /** * ํ”„๋กœ์ ํŠธ ์—…๋ฐ์ดํŠธ + * * @param projectSeq * @param projectName */ @Override - public void projectUpdate(Long projectSeq, String projectName) { - //ํ”„๋กœ์ ํŠธ ๊ธธ์ด ์ œํ•œ + public void updateProject(Long projectSeq, String projectName) { + // ํ”„๋กœ์ ํŠธ ๊ธธ์ด ์ œํ•œ validateProjectName(projectName); // ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ๋กœ ํ”„๋กœ์ ํŠธ ์ฐพ๊ธฐ - Project projectFind = projectFind(projectSeq); - //ํ”„๋กœ์ ํŠธ ์ฐพ์€ ๋ฒˆํ˜ธ๋กœ ๋ฐ›์€ ํ”„๋กœ์ ํŠธ๋ช…์œผ๋กœ ๋ณ€๊ฒฝ - Project project = projectFind.toBuilder() - .proSeq(projectSeq) - .proName(projectName) - .build(); - //์ˆ˜์ • - projectRepository.save(project); + Project projectFind = findProject(projectSeq); + // ํ”„๋กœ์ ํŠธ ์ฐพ์€ ๋ฒˆํ˜ธ๋กœ ๋ฐ›์€ ํ”„๋กœ์ ํŠธ๋ช…์œผ๋กœ ๋ณ€๊ฒฝ + Project project = projectFind.toBuilder().proSeq(projectSeq).proName(projectName).build(); + // ์ˆ˜์ • + try { + projectRepository.save(project); + } catch (DataAccessException e) { + log.error("Error update Porject ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ์ˆ˜์ • ์˜ค๋ฅ˜: {} ", e.getMessage(), e); + throw new RuntimeException("Porject ์ด๋ฆ„ ์ˆ˜์ • ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค."); + } } /** * ํ”„๋กœ์ ํŠธ ์‚ญ์ œ(์ˆ˜์ •) + * * @param projectSeq */ @Override + @Retryable( + value = {DataAccessException.class}, + maxAttempts = 3, + backoff = @Backoff(delay = 2000)) @Transactional - public void projectDelete(List projectSeq) { - //๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ›์€ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒ - for (int i = 0; i < projectSeq.size(); i++) { - Project projectFind = projectFind(projectSeq.get(i)); - //ํ”„๋กœ์ ํŠธ๋“ค์˜ ์ƒํƒœ๋ฅผ N์œผ๋กœ ๋ณ€๊ฒฝ - Project project = projectFind.toBuilder() - .proSeq(projectSeq.get(i)) - .proActivate('N') - .build(); - //์ €์žฅ - projectRepository.save(project); + public void deleteProject(List projectSeq) { + // ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ›์€ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒ + try { + for (int i = 0; i < projectSeq.size(); i++) { + Project projectFind = findProject(projectSeq.get(i)); + // ํ”„๋กœ์ ํŠธ๋“ค์˜ ์ƒํƒœ๋ฅผ N์œผ๋กœ ๋ณ€๊ฒฝ + Project project = + projectFind.toBuilder().proSeq(projectSeq.get(i)).proActivate('N').build(); + // ์ €์žฅ + projectRepository.save(project); + } + } catch (DataAccessException e) { + log.error("Error Save Porject ์‚ญ์ œ(์ˆ˜์ •) ์˜ค๋ฅ˜: {} ", e.getMessage(), e); + throw new RuntimeException("Porject ์‚ญ์ œ(์ˆ˜์ •) ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค."); } } /** * ํšŒ์›์˜ ํ”„๋กœ์ ํŠธ์ธ์ง€ ํ™•์ธ ๋‹จ์ผ + * * @param memberSeq * @param projectSeq * @return */ @Override - public boolean projectCheck(Long memberSeq, Long projectSeq) { - log.info("[projectService] projectcheck - memberSeq, projectSeq : {} | {}",memberSeq, projectSeq); - Project project = projectFind(projectSeq); - log.info("[projectService] projectcheck - project : {} ",project.toString()); + public boolean checkProject(Long memberSeq, Long projectSeq) { + log.info( + "[projectService] projectcheck - memberSeq, projectSeq : {} | {}", memberSeq, projectSeq); + Project project = findProject(projectSeq); + log.info("[projectService] projectcheck - project : {} ", project.toString()); Long seq = project.getMember().getSeq(); - log.info("[projectService] projectcheck - seq : {} ",seq); - if(seq.equals(memberSeq)){ + log.info("[projectService] projectcheck - seq : {} ", seq); + if (seq.equals(memberSeq)) { return true; } - throw new projectNotMemberException(); + throw new ProjectNotMemberException(); } /** * ํšŒ์›์˜ ํ”„๋กœ์ ํŠธ์ธ์ง€ ํ™•์ธ ์—ฌ๋Ÿฌ๊ฐœ + * * @param memberSeq * @param projectSeq * @return */ @Override - public boolean projectCheck(Long memberSeq, List projectSeq){ - log.info("[projectService] projectCheck - memberSeq, projectSeq : {} , {} ", memberSeq, projectSeq.toString()); + public boolean checkProject(Long memberSeq, List projectSeq) { + log.info( + "[projectService] projectCheck - memberSeq, projectSeq : {} , {} ", + memberSeq, + projectSeq.toString()); for (Long pro : projectSeq) { - boolean b = projectCheck(memberSeq, pro); - log.info("[projectService] projectCheck - boolean : {} ",b); + boolean b = checkProject(memberSeq, pro); + log.info("[projectService] projectCheck - boolean : {} ", b); } return true; } @@ -187,18 +214,20 @@ private void validateProjectName(String projectName) { } } - private Project projectFind(Long seq){ - return projectRepository.findById(seq) - .orElseThrow(() -> new IllegalArgumentException("project not found")); + private Project findProject(Long seq) { + return projectRepository + .findById(seq) + .orElseThrow(() -> new ProjectNotFoundException("project not found")); } - private Member memberFind(Long seq){ - return memberRepository.findById(seq) - .orElseThrow( - () -> new IllegalArgumentException("Member not found")); + + private Member findMember(Long seq) { + return memberRepository + .findById(seq) + .orElseThrow(() -> new MemberNotFoundException("Member not found")); } - private void memberSeqCheck(Long seq){ - if(seq == null){ + private void checkMemberSeq(Long seq) { + if (seq == null) { throw new MemberNotFoundException(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java index ebed83df..89dab664 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java @@ -2,19 +2,20 @@ import com.google.cloud.texttospeech.v1.AudioConfig; import com.google.cloud.texttospeech.v1.AudioEncoding; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; +import com.oreo.finalproject_5re5_be.tts.exception.TtsMakeInvalidParamException; public class AudioConfigGenerator { // Google TTS AudioConfig ์ •์ฑ… - private final static double MAX_SPEED = 4.0; - private final static double MIN_SPEED = 0.25; - private final static double MAX_PITCH= 20.0; - private final static double MIN_PITCH = -20.0; - private final static double MAX_VOLUME = 16.0; - private final static double MIN_VOLUME = -96.0; + private static final double MAX_SPEED = 4.0; + private static final double MIN_SPEED = 0.25; + private static final double MAX_PITCH = 20.0; + private static final double MIN_PITCH = -20.0; + private static final double MAX_VOLUME = 16.0; + private static final double MIN_VOLUME = -96.0; // ์ƒ˜ํ”Œ๋ง ๋ ˆ์ดํŠธ๋Š” 44100์œผ๋กœ ๊ณ ์ •(๋‚ด๋ถ€ ๊ฒฐ์ •) - private final static int SAMPLING_RATE = 44100; - + private static final int SAMPLING_RATE = 44100; // ์Œ์„ฑ ์†๋„, ํ”ผ์น˜, ๋ณผ๋ฅจ ๊ฐ’์„ ๋ฐ›์•„ AudioConfig ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ public static AudioConfig generate() { @@ -24,9 +25,7 @@ public static AudioConfig generate() { public static AudioConfig generate(double speed, double pitch, double volume) { // 1. ๊ฒ€์ฆ ํ†ต๊ณผ ๋ชปํ•˜๋ฉด ์˜ˆ์™ธ ๋˜์ง€๊ธฐ - if( !vaildSpeed(speed) || !validPitch(pitch) || !validVolume(volume) ) { - throw new IllegalArgumentException("์ž˜๋ชป๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ์ž…๋‹ˆ๋‹ค."); - } + checkParams(speed, pitch, volume); // 2. ๊ฐ์ฒด ์ƒ์„ฑ return AudioConfig.newBuilder() @@ -40,17 +39,29 @@ public static AudioConfig generate(double speed, double pitch, double volume) { // ์Œ์„ฑ ์†๋„ ๊ฐ’ ๊ฒ€์ฆ private static boolean vaildSpeed(double speed) { - return speed > MIN_SPEED && speed < MAX_SPEED; + return speed >= MIN_SPEED && speed <= MAX_SPEED; } // ํ”ผ์น˜ ๊ฐ’ ๊ฒ€์ฆ private static boolean validPitch(double pitch) { - return pitch > MIN_PITCH && pitch < MAX_PITCH; + return pitch >= MIN_PITCH && pitch <= MAX_PITCH; } // ๋ณผ๋ฅจ ๊ฐ’ ๊ฒ€์ฆ private static boolean validVolume(double volume) { - return volume > MIN_VOLUME && volume < MAX_VOLUME ; + return volume > MIN_VOLUME && volume < MAX_VOLUME; } + private static void checkParams(double speed, double pitch, double volume) { + if (!vaildSpeed(speed)) { + throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_INVALID_SPEED); + } + + if (!validPitch(pitch)) { + throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_FAILED_ERROR); + } + if (!validVolume(volume)) { + throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_INVALID_VOLUME); + } + } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSConfig.java index 8a9ef73a..bebb2b00 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSConfig.java @@ -3,12 +3,11 @@ import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.texttospeech.v1.TextToSpeechClient; import com.google.cloud.texttospeech.v1.TextToSpeechSettings; +import java.io.IOException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; -import java.io.IOException; - @Configuration public class GoogleTTSConfig { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSService.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSService.java index 29ccdf30..63cca642 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSService.java @@ -10,11 +10,10 @@ @Service public class GoogleTTSService { - @Autowired - TextToSpeechClient ttsClient; + @Autowired TextToSpeechClient ttsClient; public byte[] make(SynthesisInput input, VoiceSelectionParams voice, AudioConfig audioConfig) { - if(checkInvalidParams(input, voice, audioConfig)) { + if (checkInvalidParams(input, voice, audioConfig)) { throw new InvalidTTSParamException("TTS ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค"); } @@ -25,20 +24,20 @@ public byte[] make(SynthesisInput input, VoiceSelectionParams voice, AudioConfig ByteString audioContents = response.getAudioContent(); return audioContents.toByteArray(); - } - - public MultipartFile makeToMultipartFile(SynthesisInput input, VoiceSelectionParams voice, AudioConfig audioConfig, String ttsFileName) { + public MultipartFile makeToMultipartFile( + SynthesisInput input, + VoiceSelectionParams voice, + AudioConfig audioConfig, + String ttsFileName) { byte[] result = make(input, voice, audioConfig); - return new ByteArrayMultipartFile( - result, ttsFileName + ".wav", "audio/wav" - ); + return new ByteArrayMultipartFile(result, ttsFileName + ".wav", "audio/wav"); } // tts ์ƒ์„ฑ์— ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค null ์•„๋‹Œ์ง€ ๊ฒ€์‚ฌ - private boolean checkInvalidParams(SynthesisInput input, VoiceSelectionParams voice, AudioConfig audioConfig) { + private boolean checkInvalidParams( + SynthesisInput input, VoiceSelectionParams voice, AudioConfig audioConfig) { return input == null || voice == null || audioConfig == null; } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/SynthesisInputGenerator.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/SynthesisInputGenerator.java index 929e388e..aba5e5df 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/SynthesisInputGenerator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/SynthesisInputGenerator.java @@ -9,12 +9,10 @@ public class SynthesisInputGenerator { // ํ…์ŠคํŠธ ๊ฐ’์„ ์ „๋‹ฌ ๋ฐ›์•„ SynthesisInput ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ public static SynthesisInput generate(String text) { - if(checkInvalidText(text)) { + if (checkInvalidText(text)) { throw new InvalidTTSParamException("text ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."); } - return SynthesisInput.newBuilder() - .setText(text) - .build(); + return SynthesisInput.newBuilder().setText(text).build(); } // ํ…์ŠคํŠธ ๊ธธ์ด ๊ฒ€์ฆ ๋ฉ”์„œ๋“œ diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/VoiceParamsGenerator.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/VoiceParamsGenerator.java index 2e125040..b54c9f36 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/VoiceParamsGenerator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/VoiceParamsGenerator.java @@ -7,8 +7,9 @@ public class VoiceParamsGenerator { // ์–ธ์–ด ์ฝ”๋“œ, ๋ณด์ด์Šค๋ช…, ์„ฑ๋ณ„ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  VoiceSelectionParmas ๊ฐ์ฒด ์ƒ์„ฑ - public static VoiceSelectionParams generate(String languageCode, String voiceName, String gender) { - if(checkParamsNull(languageCode, voiceName, gender)) { + public static VoiceSelectionParams generate( + String languageCode, String voiceName, String gender) { + if (checkParamsNull(languageCode, voiceName, gender)) { throw new InvalidTTSParamException("๋ณด์ด์Šค ๊ฐ์ฒด ์ƒ์„ฑ์„ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค."); } @@ -26,7 +27,6 @@ private static SsmlVoiceGender convertToSsmlVoiceGender(String gender) { } catch (IllegalArgumentException e) { throw new InvalidTTSParamException("SsmlVoiceGender ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์„ฑ๋ณ„ ๊ฐ’ ์ž…๋‹ˆ๋‹ค."); } - } // ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’ null ์•„๋‹Œ์ง€ ๊ฒ€์ฆ diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/LanguageController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/LanguageController.java index 7fe4509f..6470bebf 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/LanguageController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/LanguageController.java @@ -29,9 +29,7 @@ public ResponseEntity> getLanguageList() { // ์–ธ์–ด ์ „์ฒด ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ LanguageListDto languageList = languageService.getLanguageList(); - return ResponseEntity - .status(HttpStatus.OK) + return ResponseEntity.status(HttpStatus.OK) .body(new ResponseDto<>(HttpStatus.OK.value(), languageList)); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/StyleController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/StyleController.java index d700ecda..aa14ff06 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/StyleController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/StyleController.java @@ -12,16 +12,15 @@ import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.constraints.NotNull; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - @Slf4j @Tag(name = "TTS-Voice", description = "Voice์˜ Style ๊ด€๋ จ API") @RestController @@ -40,9 +39,11 @@ public StyleController(StyleService styleService) { public ResponseEntity runtimeExceptionHandler(RuntimeException e) { log.error("[RuntimeException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); - return ResponseEntity - .status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), + ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); + return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) .body(errorResponseDto); } @@ -50,24 +51,30 @@ public ResponseEntity runtimeExceptionHandler(RuntimeException public ResponseEntity ttsExceptionHandler(BusinessException e) { log.error("[BusinessException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); - return ResponseEntity - .status(e.getErrorCode().getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); + return ResponseEntity.status(e.getErrorCode().getStatus()).body(errorResponseDto); } @ExceptionHandler(ConstraintViolationException.class) - public ResponseEntity constraintViolationExceptionHandler(ConstraintViolationException e) { + public ResponseEntity constraintViolationExceptionHandler( + ConstraintViolationException e) { Set> constraintViolations = e.getConstraintViolations(); - List fieldErrors = constraintViolations.stream() - .map(violation -> ErrorResponseDto.FieldErrorDetail.of(violation.getPropertyPath().toString(), violation.getMessage())) - .collect(Collectors.toList()); - - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(ErrorCode.INVALID_INPUT_VALUE.getStatus(), ErrorCode.INVALID_INPUT_VALUE.getMessage(), fieldErrors); - return ResponseEntity - .status(ErrorCode.INVALID_INPUT_VALUE.getStatus()) - .body(errorResponseDto); + List fieldErrors = + constraintViolations.stream() + .map( + violation -> + ErrorResponseDto.FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .collect(Collectors.toList()); + + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INVALID_INPUT_VALUE.getStatus(), + ErrorCode.INVALID_INPUT_VALUE.getMessage(), + fieldErrors); + return ResponseEntity.status(ErrorCode.INVALID_INPUT_VALUE.getStatus()).body(errorResponseDto); } @Operation(summary = "voice ์Šคํƒ€์ผ ์ „์ฒด ์กฐํšŒ") @@ -77,23 +84,19 @@ public ResponseEntity> getStyleList() { // ์Šคํƒ€์ผ ์ „์ฒด ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ StyleListDto styleListDto = styleService.getStyleList(); - return ResponseEntity - .status(HttpStatus.OK) + return ResponseEntity.status(HttpStatus.OK) .body(new ResponseDto<>(HttpStatus.OK.value(), styleListDto)); } @Operation(summary = "์–ธ์–ด ์ฝ”๋“œ๋กœ voice๊ฐ€ ์žˆ๋Š” style๋งŒ ์กฐํšŒ") - @Parameter(name="languagecode", description = "์–ธ์–ด ์ฝ”๋“œ๋ช…์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”") + @Parameter(name = "languagecode", description = "์–ธ์–ด ์ฝ”๋“œ๋ช…์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”") @GetMapping("/search") public ResponseEntity> getStyleListByLang( - @RequestParam("languagecode") @NotNull String langCode - ) { + @RequestParam("languagecode") @NotNull String langCode) { // langCode๋กœ ๋ชฉ์†Œ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š” ์Šคํƒ€์ผ ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ StyleListDto styleListDto = styleService.getStyleListByLang(langCode); - return ResponseEntity - .status(HttpStatus.OK) + return ResponseEntity.status(HttpStatus.OK) .body(new ResponseDto<>(HttpStatus.OK.value(), styleListDto)); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java index 24bf59d4..a438392e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java @@ -14,6 +14,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpSession; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.Valid; @@ -34,7 +35,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.SessionAttribute; @Slf4j @Tag(name = "TTS", description = "TTS ๊ด€๋ จ API") @@ -47,8 +47,10 @@ public class TtsController { private final TtsMakeService ttsMakeService; private final ProjectService projectService; - public TtsController(TtsSentenceService ttsSentenceService, TtsMakeService ttsMakeService, - ProjectService projectService) { + public TtsController( + TtsSentenceService ttsSentenceService, + TtsMakeService ttsMakeService, + ProjectService projectService) { this.ttsSentenceService = ttsSentenceService; this.ttsMakeService = ttsMakeService; this.projectService = projectService; @@ -58,174 +60,198 @@ public TtsController(TtsSentenceService ttsSentenceService, TtsMakeService ttsMa public ResponseEntity runtimeExceptionHandler(RuntimeException e) { log.error("[RuntimeException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of( - ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), - ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); - return ResponseEntity - .status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), + ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); + return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) + .body(errorResponseDto); } - // BusinessException ์ฒ˜๋ฆฌ @ExceptionHandler(BusinessException.class) public ResponseEntity ttsExceptionHandler(BusinessException e) { log.error("[BusinessException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(e.getErrorCode().getStatus(), - e.getMessage()); - return ResponseEntity - .status(e.getErrorCode().getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); + return ResponseEntity.status(e.getErrorCode().getStatus()).body(errorResponseDto); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity methodArgumentNotValidExceptionHandler( - MethodArgumentNotValidException e) { + MethodArgumentNotValidException e) { log.error("[MethodArgumentNotValidException]", e); // bindingResult์— ์—๋Ÿฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ if (e.getBindingResult().hasErrors()) { // fieldErrors ์ƒ์„ฑ - List fieldErrors = e.getBindingResult() - .getFieldErrors().stream() - .map(error -> ErrorResponseDto.FieldErrorDetail.of(error.getField(), - error.getDefaultMessage())) - .toList(); + List fieldErrors = + e.getBindingResult().getFieldErrors().stream() + .map( + error -> + ErrorResponseDto.FieldErrorDetail.of( + error.getField(), error.getDefaultMessage())) + .toList(); // errorResponseDto ์ƒ์„ฑ - ErrorResponseDto errorResponseDto = ErrorResponseDto.of( - ErrorCode.INVALID_INPUT_VALUE.getStatus(), - ErrorCode.INVALID_INPUT_VALUE.getMessage(), fieldErrors); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INVALID_INPUT_VALUE.getStatus(), + ErrorCode.INVALID_INPUT_VALUE.getMessage(), + fieldErrors); - return ResponseEntity - .status(HttpStatus.BAD_REQUEST) - .body(errorResponseDto); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponseDto); } // bindingResult์— ์—๋Ÿฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(HttpStatus.BAD_REQUEST.value(), - "Invalid Request"); - return ResponseEntity - .status(HttpStatus.BAD_REQUEST) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of(HttpStatus.BAD_REQUEST.value(), "Invalid Request"); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponseDto); } @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity constraintViolationExceptionHandler( - ConstraintViolationException e) { + ConstraintViolationException e) { Set> constraintViolations = e.getConstraintViolations(); - List fieldErrors = constraintViolations.stream() - .map(violation -> ErrorResponseDto.FieldErrorDetail.of( - violation.getPropertyPath().toString(), violation.getMessage())) - .toList(); - - ErrorResponseDto errorResponseDto = ErrorResponseDto.of( - ErrorCode.INVALID_INPUT_VALUE.getStatus(), ErrorCode.INVALID_INPUT_VALUE.getMessage(), - fieldErrors); - return ResponseEntity - .status(ErrorCode.INVALID_INPUT_VALUE.getStatus()) - .body(errorResponseDto); + List fieldErrors = + constraintViolations.stream() + .map( + violation -> + ErrorResponseDto.FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .toList(); + + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INVALID_INPUT_VALUE.getStatus(), + ErrorCode.INVALID_INPUT_VALUE.getMessage(), + fieldErrors); + return ResponseEntity.status(ErrorCode.INVALID_INPUT_VALUE.getStatus()).body(errorResponseDto); } @Operation(summary = "TTS ๋ฌธ์žฅ ์ƒ์„ฑ ์š”์ฒญ") @PostMapping("/sentence") public ResponseEntity> registerSentence( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "tts ๋ฌธ์žฅ ์ƒ์„ฑ ์š”์ฒญ body") @Valid @RequestBody TtsSentenceRequest createRequest, - @SessionAttribute(value = "memberSeq") Long memberSeq) { - //ํšŒ์›์˜ ์ •๋ณด์ธ์ง€ ํ™•์ธ - projectService.projectCheck(memberSeq, proSeq); + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "tts ๋ฌธ์žฅ ์ƒ์„ฑ ์š”์ฒญ body") @Valid @RequestBody + TtsSentenceRequest createRequest, + HttpSession session) { + // ํšŒ์›์˜ ์ •๋ณด์ธ์ง€ ํ™•์ธ + Long memberSeq = (Long) session.getAttribute("memberSeq"); + projectService.checkProject(memberSeq, proSeq); // ๋ฌธ์žฅ ์ƒ์„ฑ TtsSentenceDto response = ttsSentenceService.addSentence(proSeq, createRequest); - return ResponseEntity - .status(HttpStatus.CREATED) - .body(new ResponseDto<>(HttpStatus.CREATED.value(), response)); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new ResponseDto<>(HttpStatus.CREATED.value(), response)); } @Operation(summary = "TTS ๋ฌธ์žฅ ์ˆ˜์ • ์š”์ฒญ") @PutMapping("/sentence/{tsSeq}") public ResponseEntity> updateSentence( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "TTS ๋ฌธ์žฅ ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq, - @Parameter(description = "tts ๋ฌธ์žฅ ์ˆ˜์ • ์š”์ฒญ body") @Valid @RequestBody TtsSentenceRequest updateRequest, - @SessionAttribute(value = "memberSeq") Long memberSeq) { + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "TTS ๋ฌธ์žฅ ID") + @Min(value = 1L, message = "tsSeq is invalid") + @PathVariable + Long tsSeq, + @Parameter(description = "tts ๋ฌธ์žฅ ์ˆ˜์ • ์š”์ฒญ body") @Valid @RequestBody + TtsSentenceRequest updateRequest, + HttpSession session) { // ํšŒ์›์˜ ์ •๋ณด์ธ์ง€ ํ™•์ธ - projectService.projectCheck(memberSeq, proSeq); + Long memberSeq = (Long) session.getAttribute("memberSeq"); + projectService.checkProject(memberSeq, proSeq); // ํ•ด๋‹น ๋ฌธ์žฅ์„ ์†Œ์œ ํ•œ ๋ฉค๋ฒ„์ธ์ง€ ํ™•์ธ (๋ฌธ์žฅ ์ˆ˜์ • ๊ถŒํ•œ ํ™•์ธ) ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); // ๋ฌธ์žฅ ์ˆ˜์ • - TtsSentenceDto response = ttsSentenceService.updateSentence(proSeq, tsSeq, - updateRequest); + TtsSentenceDto response = ttsSentenceService.updateSentence(proSeq, tsSeq, updateRequest); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), response)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), response)); } - @Operation(summary = "TTS ํ˜„์žฌ ์ƒํƒœ ์ €์žฅ (์ €์žฅ ๋ฐ ์ˆ˜์ •)", description = "TTS ๋ฌธ์žฅ ์ €์žฅ ์‹œ ์ •๋ ฌ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ ์ •๋ณด๊ฐ€ null ์ธ ๊ฒฝ์šฐ๋Š” ์ „๋ถ€ ๋’ค๋กœ ๋ณด๋‚ผ ๊ฒƒ์ด๋ฉฐ, null ์ธ ๊ฐ์ฒด๊ฐ„์˜ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.") + @Operation( + summary = "TTS ํ˜„์žฌ ์ƒํƒœ ์ €์žฅ (์ €์žฅ ๋ฐ ์ˆ˜์ •)", + description = + "TTS ๋ฌธ์žฅ ์ €์žฅ ์‹œ ์ •๋ ฌ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ ์ •๋ณด๊ฐ€ null ์ธ ๊ฒฝ์šฐ๋Š” ์ „๋ถ€ ๋’ค๋กœ ๋ณด๋‚ผ ๊ฒƒ์ด๋ฉฐ, null ์ธ ๊ฐ์ฒด๊ฐ„์˜ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.") @PostMapping("/batch") public ResponseEntity> batchSave( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "tts ๋ฌธ์žฅ ์ƒ์„ฑ ์š”์ฒญ body") @Valid @RequestBody TtsSentenceBatchRequest batchRequest, - @SessionAttribute(value = "memberSeq") Long memberSeq) { + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "tts ๋ฌธ์žฅ ์ƒ์„ฑ ์š”์ฒญ body") @Valid @RequestBody + TtsSentenceBatchRequest batchRequest, + HttpSession session) { // ํšŒ์›์˜ ์ •๋ณด์ธ์ง€ ํ™•์ธ - projectService.projectCheck(memberSeq, proSeq); + Long memberSeq = (Long) session.getAttribute("memberSeq"); + projectService.checkProject(memberSeq, proSeq); // ํ•ด๋‹น ๋ฌธ์žฅ์„ ์†Œ์œ ํ•œ ๋ฉค๋ฒ„์ธ์ง€ ํ™•์ธ (๋ฌธ์žฅ ์ˆ˜์ • ๊ถŒํ•œ ํ™•์ธ) ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, batchRequest.getSentenceList()); // ๋ฌธ์žฅ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ • - TtsSentenceListDto response = ttsSentenceService.batchSaveSentence(proSeq, - batchRequest); + TtsSentenceListDto response = ttsSentenceService.batchSaveSentence(proSeq, batchRequest); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), response)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), response)); } @Operation(summary = "TTS ๋ฌธ์žฅ ์กฐํšŒ ์š”์ฒญ") @GetMapping("/sentence/{tsSeq}") public ResponseEntity> getSentence( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "TTS ๋ฌธ์žฅ ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq) { + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "TTS ๋ฌธ์žฅ ID") + @Min(value = 1L, message = "tsSeq is invalid") + @PathVariable + Long tsSeq) { // ๋ฌธ์žฅ ์กฐํšŒ TtsSentenceDto response = ttsSentenceService.getSentence(proSeq, tsSeq); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), response)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), response)); } @Operation(summary = "ํ”„๋กœ์ ํŠธ TTS ์กฐํšŒ") @GetMapping("") public ResponseEntity> getSentenceList( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq) { + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq) { // ํ”„๋กœ์ ํŠธ TTS ์กฐํšŒ TtsSentenceListDto response = ttsSentenceService.getSentenceList(proSeq); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), response)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), response)); } @Operation(summary = "TTS ์ƒ์„ฑ ์š”์ฒญ", description = "TTS ๋ฌธ์žฅ์„ ์ €์žฅํ•œ ํ›„ ์ˆ˜ํ–‰ํ•ด์ฃผ์„ธ์š”!") @GetMapping("/sentence/{tsSeq}/maketts") public ResponseEntity> makeTts( - @Parameter(description = "TTS Sentence ID (๋ฌธ์žฅ ์‹๋ณ„ ๋ฒˆํ˜ธ)") @Min(value = 1L) @PathVariable Long tsSeq, - @Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq, - @SessionAttribute(value = "memberSeq") Long memberSeq) { - + @Parameter(description = "TTS Sentence ID (๋ฌธ์žฅ ์‹๋ณ„ ๋ฒˆํ˜ธ)") @Min(value = 1L) @PathVariable + Long tsSeq, + @Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq, + HttpSession session) { // ํšŒ์›์˜ ์ •๋ณด์ธ์ง€ ํ™•์ธ - projectService.projectCheck(memberSeq, proSeq); + Long memberSeq = (Long) session.getAttribute("memberSeq"); + projectService.checkProject(memberSeq, proSeq); // ํ•ด๋‹น ๋ฌธ์žฅ์„ ์†Œ์œ ํ•œ ๋ฉค๋ฒ„์ธ์ง€ ํ™•์ธ (๋ฌธ์žฅ ์ˆ˜์ • ๊ถŒํ•œ ํ™•์ธ) ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); @@ -233,52 +259,53 @@ public ResponseEntity> makeTts( // tts ์ƒ์„ฑ TtsSentenceDto ttsSentenceDto = ttsMakeService.makeTts(tsSeq); - return ResponseEntity - .status(HttpStatus.CREATED) - .body( - new ResponseDto<>( - HttpStatus.CREATED.value(), - ttsSentenceDto - ) - ); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new ResponseDto<>(HttpStatus.CREATED.value(), ttsSentenceDto)); } - @Operation(summary = "TTS ์ƒ์„ฑ ์š”์ฒญ(ํ ์ž‘์—…)", description = "TTS ๋ฌธ์žฅ์„ ์ €์žฅํ•œ ํ›„ ์ˆ˜ํ–‰ํ•ด์ฃผ์„ธ์š”!") - @GetMapping("/sentence/{tsSeq}/maketts/multi") - public ResponseEntity> makeTtsMuti( - @Parameter(description = "TTS Sentence ID (๋ฌธ์žฅ ์‹๋ณ„ ๋ฒˆํ˜ธ)") @Min(value = 1L) @PathVariable Long tsSeq - ,@Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq - , @SessionAttribute(value = "memberSeq") Long memberSeq - ) { - - // ํšŒ์›์˜ ์ •๋ณด์ธ์ง€ ํ™•์ธ - projectService.projectCheck(memberSeq, proSeq); - - // ํ•ด๋‹น ๋ฌธ์žฅ์„ ์†Œ์œ ํ•œ ๋ฉค๋ฒ„์ธ์ง€ ํ™•์ธ (๋ฌธ์žฅ ์ˆ˜์ • ๊ถŒํ•œ ํ™•์ธ) - ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); - - // tts ์ƒ์„ฑ - TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); - - return ResponseEntity - .status(HttpStatus.CREATED) - .body( - new ResponseDto<>( - HttpStatus.CREATED.value(), - ttsMakeResult - ) - ); - } + // @Operation(summary = "TTS ์ƒ์„ฑ ์š”์ฒญ(ํ ์ž‘์—…)", description = "TTS ๋ฌธ์žฅ์„ ์ €์žฅํ•œ ํ›„ ์ˆ˜ํ–‰ํ•ด์ฃผ์„ธ์š”!") + // @GetMapping("/sentence/{tsSeq}/maketts/multi") + // public ResponseEntity> makeTtsMuti( + // @Parameter(description = "TTS Sentence ID (๋ฌธ์žฅ ์‹๋ณ„ ๋ฒˆํ˜ธ)") @Min(value = 1L) + // @PathVariable Long tsSeq + // ,@Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq + // , @SessionAttribute(value = "memberSeq") Long memberSeq + // ) { + // + // // ํšŒ์›์˜ ์ •๋ณด์ธ์ง€ ํ™•์ธ + // projectService.projectCheck(memberSeq, proSeq); + // + // // ํ•ด๋‹น ๋ฌธ์žฅ์„ ์†Œ์œ ํ•œ ๋ฉค๋ฒ„์ธ์ง€ ํ™•์ธ (๋ฌธ์žฅ ์ˆ˜์ • ๊ถŒํ•œ ํ™•์ธ) + // ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); + // + // // tts ์ƒ์„ฑ + // TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); + // + // return ResponseEntity + // .status(HttpStatus.CREATED) + // .body( + // new ResponseDto<>( + // HttpStatus.CREATED.value(), + // ttsMakeResult + // ) + // ); + // } @Operation(summary = "TTS ๋ฌธ์žฅ ์‚ญ์ œ ์š”์ฒญ") @DeleteMapping("/sentence/{tsSeq}") public ResponseEntity> deleteSentence( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "TTS ๋ฌธ์žฅ ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq, - @SessionAttribute(value = "memberSeq") Long memberSeq) { - + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "TTS ๋ฌธ์žฅ ID") + @Min(value = 1L, message = "tsSeq is invalid") + @PathVariable + Long tsSeq, + HttpSession session) { // ํšŒ์›์˜ ์ •๋ณด์ธ์ง€ ํ™•์ธ - projectService.projectCheck(memberSeq, proSeq); + Long memberSeq = (Long) session.getAttribute("memberSeq"); + projectService.checkProject(memberSeq, proSeq); // ํšŒ์›์ด ์†Œ์œ ํ•œ tts ๋ฌธ์žฅ์ธ์ง€ ํ™•์ธ ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); @@ -289,8 +316,7 @@ public ResponseEntity> deleteSentence( // ์‘๋‹ต ๋ฉ”์‹œ์ง€ String message = response ? "์‚ญ์ œ ์„ฑ๊ณต" : "์‚ญ์ œ ์‹คํŒจ"; - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), message)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), message)); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/VoiceController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/VoiceController.java index 69ae9775..136dec33 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/VoiceController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/VoiceController.java @@ -12,16 +12,15 @@ import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.constraints.NotNull; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - @Tag(name = "TTS-Voice", description = "Voice ๊ด€๋ จ API") @Slf4j @RestController @@ -39,9 +38,11 @@ public VoiceController(VoiceService voiceService) { public ResponseEntity runtimeExceptionHandler(RuntimeException e) { log.error("[RuntimeException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); - return ResponseEntity - .status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), + ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); + return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) .body(errorResponseDto); } @@ -49,41 +50,46 @@ public ResponseEntity runtimeExceptionHandler(RuntimeException public ResponseEntity ttsExceptionHandler(BusinessException e) { log.error("[BusinessException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); - return ResponseEntity - .status(e.getErrorCode().getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); + return ResponseEntity.status(e.getErrorCode().getStatus()).body(errorResponseDto); } @ExceptionHandler(ConstraintViolationException.class) - public ResponseEntity constraintViolationExceptionHandler(ConstraintViolationException e) { + public ResponseEntity constraintViolationExceptionHandler( + ConstraintViolationException e) { Set> constraintViolations = e.getConstraintViolations(); - List fieldErrors = constraintViolations.stream() - .map(violation -> ErrorResponseDto.FieldErrorDetail.of(violation.getPropertyPath().toString(), violation.getMessage())) - .collect(Collectors.toList()); + List fieldErrors = + constraintViolations.stream() + .map( + violation -> + ErrorResponseDto.FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .collect(Collectors.toList()); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(ErrorCode.INVALID_INPUT_VALUE.getStatus(), ErrorCode.INVALID_INPUT_VALUE.getMessage(), fieldErrors); - return ResponseEntity - .status(ErrorCode.INVALID_INPUT_VALUE.getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INVALID_INPUT_VALUE.getStatus(), + ErrorCode.INVALID_INPUT_VALUE.getMessage(), + fieldErrors); + return ResponseEntity.status(ErrorCode.INVALID_INPUT_VALUE.getStatus()).body(errorResponseDto); } // ๋ณด์ด์Šค ์กฐ๊ฑด ์กฐํšŒ ์ปจํŠธ๋กค๋Ÿฌ - @Operation(summary = "์–ธ์–ด์ฝ”๋“œ, ์Šคํƒ€์ผ๋ช…์œผ๋กœ ๋ชฉ์†Œ๋ฆฌ ์กฐํšŒ", description = "DB์— ์ €์žฅ๋œ ์–ธ์–ด ์ฝ”๋“œ, ์Šคํƒ€์ผ ๋ช…์„ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ ๋ฐ˜๋“œ์‹œ ์ „๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") + @Operation( + summary = "์–ธ์–ด์ฝ”๋“œ, ์Šคํƒ€์ผ๋ช…์œผ๋กœ ๋ชฉ์†Œ๋ฆฌ ์กฐํšŒ", + description = "DB์— ์ €์žฅ๋œ ์–ธ์–ด ์ฝ”๋“œ, ์Šคํƒ€์ผ ๋ช…์„ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ ๋ฐ˜๋“œ์‹œ ์ „๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.") @GetMapping("") public ResponseEntity> getVoiceList( - @Parameter(description = "์–ธ์–ด ์ฝ”๋“œ(์–ธ์–ด ์‹๋ณ„ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค)") @RequestParam("languagecode") @NotNull String langCode, - @Parameter(description = "์Šคํƒ€์ผ๋ช…(์Šคํƒ€์ผ ์‹๋ณ„ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค)") @RequestParam("stylename") @NotNull String styleName - ) { + @Parameter(description = "์–ธ์–ด ์ฝ”๋“œ(์–ธ์–ด ์‹๋ณ„ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค)") @RequestParam("languagecode") @NotNull + String langCode, + @Parameter(description = "์Šคํƒ€์ผ๋ช…(์Šคํƒ€์ผ ์‹๋ณ„ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค)") @RequestParam("stylename") @NotNull + String styleName) { // ๋ณด์ด์Šค ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ VoiceListDto voiceListDto = voiceService.getVoiceList(langCode, styleName); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>( - HttpStatus.OK.value(), - voiceListDto - )); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), voiceListDto)); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/external/common/TtsSentenceDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/external/common/TtsSentenceDto.java index 7eaf8414..5420cef9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/external/common/TtsSentenceDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/external/common/TtsSentenceDto.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.tts.dto.external.common; - import com.oreo.finalproject_5re5_be.tts.entity.TtsSentence; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAttributeInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAttributeInfo.java index bb7bc0a2..7bca916a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAttributeInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAttributeInfo.java @@ -21,36 +21,45 @@ public class TtsAttributeInfo { @NotNull(message = "volume ๋Š” ํ•„์ˆ˜ ์ž…๋ ฅ๊ฐ’์ž…๋‹ˆ๋‹ค.") @Min(value = -10, message = "volume ๋Š” -10์ด์ƒ ๋ถ€ํ„ฐ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.") @Max(value = 10, message = "volume ๋Š” 10์ดํ•˜ ๊นŒ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.") - private Integer volume; // ์Œ์„ฑ ํฌ๊ธฐ + private Integer volume; // ์Œ์„ฑ ํฌ๊ธฐ @Schema(description = "์Œ์„ฑ ์†๋„", example = "1.0") @Positive(message = "speed ๋Š” 0.25์ด์ƒ ๋ถ€ํ„ฐ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.") // ์–‘์ˆ˜ ํ—ˆ์šฉ - private Float speed; // ์Œ์„ฑ ์†๋„ + private Float speed; // ์Œ์„ฑ ์†๋„ @Schema(description = "์‹œ์ž‘ ์Œ์„ฑ ๋†’๋‚ฎ์ด", example = "0") @Min(value = -20, message = "stPitch ๋Š” -20์ด์ƒ ๋ถ€ํ„ฐ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.") @Max(value = 20, message = "stPitch ๋Š” 20์ดํ•˜ ๊นŒ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.") - private Integer stPitch; // ์‹œ์ž‘ ์Œ์„ฑ ๋†’๋‚ฎ์ด + private Integer stPitch; // ์‹œ์ž‘ ์Œ์„ฑ ๋†’๋‚ฎ์ด @Schema(description = "๊ฐ์ • ๊ตฌ๋ถ„", example = "neutral") - private String emotion; // ๊ฐ์ • ๊ตฌ๋ถ„ + private String emotion; // ๊ฐ์ • ๊ตฌ๋ถ„ @Schema(description = "๊ฐ์ • ๊ฐ•๋„", example = "100") - private Integer emotionStrength; // ๊ฐ์ • ๊ฐ•๋„ + private Integer emotionStrength; // ๊ฐ์ • ๊ฐ•๋„ @Schema(description = "์ƒ˜ํ”Œ ์†๋„", example = "16000") - private Integer sampleRate; // ์ƒ˜ํ”Œ ์†๋„ + private Integer sampleRate; // ์ƒ˜ํ”Œ ์†๋„ @Schema(description = "์Œ์ƒ‰", example = "0") - private Integer alpha; // ์Œ์ƒ‰ + private Integer alpha; // ์Œ์ƒ‰ @Schema(description = "๋งˆ์ง€๋ง‰ ์Œ์„ฑ ๋†’๋‚ฎ์ด", example = "0") - private Float endPitch; // ๋งˆ์ง€๋ง‰ ์Œ์„ฑ ๋†’๋‚ฎ์ด + private Float endPitch; // ๋งˆ์ง€๋ง‰ ์Œ์„ฑ ๋†’๋‚ฎ์ด @Schema(description = "์˜ค๋””์˜ค ํŒŒ์ผ ํฌ๋งท", example = "wav") - private String audioFormat; // ์˜ค๋””์˜ค ํŒŒ์ผ ํฌ๋งท + private String audioFormat; // ์˜ค๋””์˜ค ํŒŒ์ผ ํฌ๋งท - public static TtsAttributeInfo of(Integer volume, Float speed, Integer stPitch, String emotion, Integer emotionStrength, Integer sampleRate, Integer alpha, Float endPitch, String audioFormat) { + public static TtsAttributeInfo of( + Integer volume, + Float speed, + Integer stPitch, + String emotion, + Integer emotionStrength, + Integer sampleRate, + Integer alpha, + Float endPitch, + String audioFormat) { return TtsAttributeInfo.builder() .volume(volume) .speed(speed) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAudioFileInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAudioFileInfo.java index ae3b503b..0053e0fa 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAudioFileInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAudioFileInfo.java @@ -8,10 +8,10 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder public class TtsAudioFileInfo { - private Long ttsAudioSeq; // TTS ์˜ค๋””์˜ค ํŒŒ์ผ ์‹๋ณ„๋ฒˆํ˜ธ - private String audioUrl; // ์˜ค๋””์˜ค ํŒŒ์ผ ๊ฒฝ๋กœ - private Character downloadYn; // ๋‹ค์šด๋กœ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ - private Character audioPlayYn; // ์žฌ์ƒ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ + private Long ttsAudioSeq; // TTS ์˜ค๋””์˜ค ํŒŒ์ผ ์‹๋ณ„๋ฒˆํ˜ธ + private String audioUrl; // ์˜ค๋””์˜ค ํŒŒ์ผ ๊ฒฝ๋กœ + private Character downloadYn; // ๋‹ค์šด๋กœ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ + private Character audioPlayYn; // ์žฌ์ƒ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ public static TtsAudioFileInfo of(TtsAudioFile ttsAudioFile) { // null check diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchInfo.java index 70ee3fc2..76186a2a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchInfo.java @@ -3,10 +3,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.oreo.finalproject_5re5_be.global.constant.BatchProcessType; import com.oreo.finalproject_5re5_be.tts.dto.response.SentenceInfo; -import com.oreo.finalproject_5re5_be.tts.exception.InValidRequestException; import jakarta.validation.constraints.NotNull; import lombok.*; -import org.springframework.web.bind.MethodArgumentNotValidException; @Getter @Setter(AccessLevel.PRIVATE) @@ -15,17 +13,14 @@ public class TtsSentenceBatchInfo { BatchProcessType batchProcessType; - @NotNull - SentenceInfo sentence; + @NotNull SentenceInfo sentence; @JsonCreator - public static TtsSentenceBatchInfo of(BatchProcessType batchProcessType, - SentenceInfo sentenceInfo) { + public static TtsSentenceBatchInfo of( + BatchProcessType batchProcessType, SentenceInfo sentenceInfo) { TtsSentenceBatchInfo ttsSentenceBatchInfo = new TtsSentenceBatchInfo(); ttsSentenceBatchInfo.setBatchProcessType(batchProcessType); ttsSentenceBatchInfo.setSentence(sentenceInfo); return ttsSentenceBatchInfo; } - - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchRequest.java index 0e191e8f..0d98bcc3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchRequest.java @@ -5,14 +5,13 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import java.util.ArrayList; +import java.util.List; import java.util.stream.Collectors; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; - @Getter @NoArgsConstructor @AllArgsConstructor @@ -25,9 +24,10 @@ public class TtsSentenceBatchRequest { public List sortSentenceList() { // ์ •๋ ฌ - List sortedSentencelist = sentenceList.stream() - .sorted(new TtsSentenceComparator()).collect( - Collectors.toCollection(ArrayList::new)); + List sortedSentencelist = + sentenceList.stream() + .sorted(new TtsSentenceComparator()) + .collect(Collectors.toCollection(ArrayList::new)); // ์ •๋ ฌ ์ˆœ์„œ ์ˆ˜์ • for (int orderIndex = 0; orderIndex < sortedSentencelist.size(); orderIndex++) { @@ -36,8 +36,9 @@ public List sortSentenceList() { // orderIndex ์ˆœ์„œ๋กœ ์ˆ˜์ • SentenceInfo withOrderSentence = SentenceInfo.withOrder(sentenceInfo, orderIndex); // orderIndex ์ˆœ์„œ๋กœ ์ˆ˜์ •๋œ SentenceInfo ๋กœ TtsSentenceBatchInfo ์ƒ์„ฑ - TtsSentenceBatchInfo withOrderBatchInfo = TtsSentenceBatchInfo.of( - sortedSentencelist.get(orderIndex).getBatchProcessType(), withOrderSentence); + TtsSentenceBatchInfo withOrderBatchInfo = + TtsSentenceBatchInfo.of( + sortedSentencelist.get(orderIndex).getBatchProcessType(), withOrderSentence); // orderIndex ์ˆœ์„œ๋กœ ์ˆ˜์ •๋œ TtsSentenceBatchInfo ๋กœ ๋ณ€๊ฒฝ sortedSentencelist.set(orderIndex, withOrderBatchInfo); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceRequest.java index 73e56f25..890336dd 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceRequest.java @@ -22,16 +22,17 @@ public class TtsSentenceRequest { @Schema(description = "ํ…์ŠคํŠธ ๋‚ด์šฉ", example = "์•ˆ๋…•ํ•˜์„ธ์š”") @NotBlank(message = "text is required") - private String text; // ํ…์ŠคํŠธ ๋‚ด์šฉ + private String text; // ํ…์ŠคํŠธ ๋‚ด์šฉ @Schema(description = "ํ‘œ์‹œ ์ˆœ์„œ", example = "1") - private Integer order; // ํ‘œ์‹œ ์ˆœ์„œ + private Integer order; // ํ‘œ์‹œ ์ˆœ์„œ @Schema(description = "์˜ต์…˜ ์ •๋ณด") @Valid private TtsAttributeInfo attribute; // ์˜ต์…˜ ์ •๋ณด - public static TtsSentenceRequest of(Long voiceSeq, String text, Integer order, TtsAttributeInfo attribute) { + public static TtsSentenceRequest of( + Long voiceSeq, String text, Integer order, TtsAttributeInfo attribute) { return TtsSentenceRequest.builder() .voiceSeq(voiceSeq) .text(text) @@ -39,6 +40,4 @@ public static TtsSentenceRequest of(Long voiceSeq, String text, Integer order, T .attribute(attribute) .build(); } - - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageDto.java index 716ef660..443c630c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageDto.java @@ -24,5 +24,4 @@ public static LanguageDto of(Language language) { .regionName(language.getRegionName()) .build(); } - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageListDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageListDto.java index b43e173e..4bcd54ec 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageListDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageListDto.java @@ -1,13 +1,12 @@ package com.oreo.finalproject_5re5_be.tts.dto.response; import com.oreo.finalproject_5re5_be.tts.entity.Language; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; - @Getter @Builder @NoArgsConstructor @@ -15,14 +14,9 @@ public class LanguageListDto { private List languageList; - public static LanguageListDto of(List languageList) { - List list = languageList.stream() - .map(LanguageDto::of) - .toList(); + List list = languageList.stream().map(LanguageDto::of).toList(); - return LanguageListDto.builder() - .languageList(list) - .build(); + return LanguageListDto.builder().languageList(list).build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/SentenceInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/SentenceInfo.java index 4a1566bd..a1dc37f0 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/SentenceInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/SentenceInfo.java @@ -15,14 +15,14 @@ @Builder public class SentenceInfo { private Long tsSeq; // ํ–‰ id - private Long voiceSeq; // ๋ชฉ์†Œ๋ฆฌ id - private String text; // ํ…์ŠคํŠธ ๋‚ด์šฉ + private Long voiceSeq; // ๋ชฉ์†Œ๋ฆฌ id + private String text; // ํ…์ŠคํŠธ ๋‚ด์šฉ @Min(value = 0) - private Integer order; // ํ‘œ์‹œ ์ˆœ์„œ + private Integer order; // ํ‘œ์‹œ ์ˆœ์„œ private TtsAttributeInfo ttsAttributeInfo; // ์˜ต์…˜ ์ •๋ณด - private TtsAudioFileInfo ttsAudioFileInfo; // TTS ์˜ค๋””์˜ค ์ •๋ณด + private TtsAudioFileInfo ttsAudioFileInfo; // TTS ์˜ค๋””์˜ค ์ •๋ณด public static SentenceInfo of(TtsSentence ttsSentence) { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleDto.java index 1482100a..8464ae80 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleDto.java @@ -24,4 +24,4 @@ public static StyleDto of(Style style) { .desc(style.getDescription()) .build(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleListDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleListDto.java index 073bbd79..ca8dcbd5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleListDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleListDto.java @@ -1,13 +1,12 @@ package com.oreo.finalproject_5re5_be.tts.dto.response; import com.oreo.finalproject_5re5_be.tts.entity.Style; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; - @Getter @Builder @NoArgsConstructor @@ -16,12 +15,8 @@ public class StyleListDto { private List styleList; public static StyleListDto of(List