From 89524a7579894883a62eee674d25855832dfedfc Mon Sep 17 00:00:00 2001 From: Jeyong Date: Mon, 23 Feb 2026 12:47:38 +0900 Subject: [PATCH 1/4] =?UTF-8?q?ci:=20=EC=9E=84=EC=8B=9C=20CI=20Workflow=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20=EB=B0=8F=20=EB=B0=B0=ED=8F=AC=20=EC=A4=91?= =?UTF-8?q?=EB=8B=A8=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20CD=20Workflo?= =?UTF-8?q?w=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/CD.yml | 147 --------------------------------------- .github/workflows/CI.yml | 54 +++----------- 2 files changed, 10 insertions(+), 191 deletions(-) delete mode 100644 .github/workflows/CD.yml diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml deleted file mode 100644 index 6617f84..0000000 --- a/.github/workflows/CD.yml +++ /dev/null @@ -1,147 +0,0 @@ -name: CD-Dev - -on: - push: - branches: ["main"] - -concurrency: - group: creditto - cancel-in-progress: true - -jobs: - CI: - runs-on: self-hosted - - steps: - - name: 체크아웃 - uses: actions/checkout@v3 - - - name: .env 파일 생성 - run: | - - # .env 파일 생성 - touch .env - - # .env 파일 작성 - echo "${{ secrets.ENV_DEV_FILE }}" >> .env - - chmod 600 .env - - shell: bash - - - name: build & sonarqube 실행 - run: | - chmod +x gradlew - ./gradlew clean build sonar \ - -Dspring.profiles.active=dev \ - -Dsonar.projectKey=${{ secrets.SONAR_PROJECT_NAME }} \ - -Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} \ - -Dsonar.login=${{ secrets.SONAR_TOKEN }} - - shell: bash - - - name: SonarQube Quality Gate check - id: sonarqube-quality-gate-check - uses: sonarsource/sonarqube-quality-gate-action@master - with: - pollingTimeoutSec: 600 - scanMetadataReportFile: build/sonar/report-task.txt - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} - - - name: clean - run: | - rm .env - shell: bash - - - name: Docker Hub 로그인 - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} - - - name: Docker Image 빌드 및 태깅 - run: | - VERSION=0.${{ github.run_number }} - echo "VERSION=$VERSION" - docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:$VERSION . - docker tag ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:$VERSION \ - ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:lts - - - name: Docker Image 푸쉬 - run: | - VERSION=0.${{ github.run_number }} - docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:$VERSION - docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:lts - - CD: - needs: CI - runs-on: self-hosted - - steps: - - name: .env 파일 전달 - run: | - echo "${{ secrets.ENV_DEV_FILE }}" > .env - - - name: .env 파일 업로드 - uses: appleboy/scp-action@v0.1.4 - with: - host: ${{ secrets.EC2_IP }} - username: ${{ secrets.EC2_USER }} - key: ${{ secrets.EC2_KEY }} - source: ".env" - target: ${{ secrets.EC2_ENV_PWD }} - overwrite: true - - - name: DOCKER 컨테이너 실행 - uses: appleboy/ssh-action@master - env: - DOCKER_USER: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKER_PW: ${{ secrets.DOCKERHUB_PASSWORD }} - IMAGE_NAME: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }} - IMAGE_TAG: lts - with: - host: ${{ secrets.EC2_IP }} - username: ${{ secrets.EC2_USER }} - key: ${{ secrets.EC2_KEY }} - envs: DOCKER_USER,DOCKER_PW,IMAGE_NAME,IMAGE_TAG - script: | - export DOCKER_USER="${DOCKER_USER}" - export DOCKER_PW="${DOCKER_PW}" - export IMAGE_NAME="${IMAGE_NAME}" - export IMAGE_TAG="${IMAGE_TAG}" - bash ${{ secrets.DEPLOY_SCRIPT_PATH }} - - - name: Health Check - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.EC2_IP }} - username: ${{ secrets.EC2_USER }} - key: ${{ secrets.EC2_KEY }} - script: | - sleep 5; - echo "Health Check 시작...🩺" - - for i in {1..10} - do - STATUS=$(curl -s -o /dev/null -w "%{http_code}" ${{ secrets.HEALTH_URL }}) - if [ "$STATUS" -eq 200 ]; then - echo "✅ 서버 정상 응답 (HTTP 200)" - exit 0 - fi - - echo "⏳ 서버 기동 대기중... ($i/10)" - sleep 5 - done - - echo "❌ Health Check 실패" - exit 1 - - - name: Cleanup - if: always() - run: | - rm .env - rm -rf build - docker system prune -af --volumes - shell: bash \ No newline at end of file diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 714db3f..f59bbc2 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -2,58 +2,24 @@ name: CI on: pull_request: - branches: [ "main", "dev" ] + branches: ["main", "dev"] jobs: build: - runs-on: self-hosted + runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v3 - - name: .env 파일 생성 - run: | - - # .env 파일 생성 - touch .env - - # .env 파일 작성 - echo "${{ secrets.ENV_FILE }}" >> .env - - chmod 600 .env - - shell: bash - - - name: build 실행 - run: | - chmod +x gradlew - ./gradlew clean build - shell: bash - - - name: sonarqube - run: | - ./gradlew sonar \ - -Dsonar.projectKey=${{ secrets.SONAR_PROJECT_NAME }} \ - -Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} \ - -Dsonar.login=${{ secrets.SONAR_TOKEN }} - - shell: bash - - - name: SonarQube Quality Gate check - id: sonarqube-quality-gate-check - uses: sonarsource/sonarqube-quality-gate-action@master + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - pollingTimeoutSec: 600 - scanMetadataReportFile: build/sonar/report-task.txt - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} + distribution: temurin + java-version: "17" + cache: gradle - - name: Cleanup - if: always() + - name: Run CI validation run: | - rm .env - rm -rf build - docker system prune -af --volumes - shell: bash \ No newline at end of file + chmod +x gradlew + ./gradlew clean build --no-daemon From 7d416bb4c99cf442069da1a5dd5fc907205f0605 Mon Sep 17 00:00:00 2001 From: Jeyong Date: Mon, 23 Feb 2026 14:42:11 +0900 Subject: [PATCH 2/4] =?UTF-8?q?build:=20springdoc=20openapi=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index a55732d..e8dd5e6 100644 --- a/build.gradle +++ b/build.gradle @@ -35,6 +35,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.security:spring-security-crypto' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5' implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.redisson:redisson-spring-boot-starter:3.45.1' implementation 'io.micrometer:micrometer-tracing-bridge-brave' From 0fc2bb3b66f3d58dd25264f391aada4b71e54a77 Mon Sep 17 00:00:00 2001 From: Jeyong Date: Mon, 23 Feb 2026 14:42:34 +0900 Subject: [PATCH 3/4] =?UTF-8?q?chore:=20openApi=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/config/OpenApiConfig.java | 28 +++++++++++++++++++ src/main/resources/application.yml | 8 ++++++ 2 files changed, 36 insertions(+) create mode 100644 src/main/java/org/creditto/core_banking/global/config/OpenApiConfig.java diff --git a/src/main/java/org/creditto/core_banking/global/config/OpenApiConfig.java b/src/main/java/org/creditto/core_banking/global/config/OpenApiConfig.java new file mode 100644 index 0000000..62a5818 --- /dev/null +++ b/src/main/java/org/creditto/core_banking/global/config/OpenApiConfig.java @@ -0,0 +1,28 @@ +package org.creditto.core_banking.global.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.servers.Server; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class OpenApiConfig { + + @Bean + public OpenAPI coreBankingOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("Creditto Core Banking API") + .description("코어뱅킹 도메인 API 문서") + .version("v1") + .contact(new Contact() + .name("Creditto Backend Team"))) + .servers(List.of( + new Server().url("/").description("Default Server") + )); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 72b192b..3e72b8e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -43,6 +43,14 @@ management: server: port: ${SERVER_PORT:8090} +springdoc: + api-docs: + path: /api-docs + swagger-ui: + path: /swagger-ui.html + operations-sorter: method + tags-sorter: alpha + logging: level: org.hibernate.sql: DEBUG From 642444fc325ca77782be9812a973b451daf5bfd9 Mon Sep 17 00:00:00 2001 From: Jeyong Date: Mon, 23 Feb 2026 14:43:01 +0900 Subject: [PATCH 4/4] =?UTF-8?q?chore:=20=EA=B8=B0=EC=A1=B4=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20Swagger=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/controller/AccountController.java | 17 +++++++++++------ .../exchange/controller/ExchangeController.java | 6 ++++++ .../controller/OneTimeRemittanceController.java | 4 ++++ .../controller/RemittanceQueryController.java | 6 +++++- .../controller/RegularRemittanceController.java | 10 ++++++++++ .../controller/RemittanceFeeController.java | 4 ++++ .../controller/TransactionController.java | 4 ++++ 7 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/creditto/core_banking/domain/account/controller/AccountController.java b/src/main/java/org/creditto/core_banking/domain/account/controller/AccountController.java index 821090c..9b61453 100644 --- a/src/main/java/org/creditto/core_banking/domain/account/controller/AccountController.java +++ b/src/main/java/org/creditto/core_banking/domain/account/controller/AccountController.java @@ -1,10 +1,12 @@ package org.creditto.core_banking.domain.account.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.creditto.core_banking.domain.account.dto.AccountCreateReq; +import org.creditto.core_banking.domain.account.dto.AccountPasswordConfirmReq; import org.creditto.core_banking.domain.account.dto.AccountRes; import org.creditto.core_banking.domain.account.dto.AccountSummaryRes; -import org.creditto.core_banking.domain.account.dto.AccountPasswordConfirmReq; import org.creditto.core_banking.domain.account.service.AccountService; import org.creditto.core_banking.global.response.ApiResponseUtil; import org.creditto.core_banking.global.response.BaseResponse; @@ -12,27 +14,25 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - import java.math.BigDecimal; import java.util.List; @RestController @RequiredArgsConstructor @RequestMapping("/api/core/account") +@Tag(name = "Account", description = "계좌 관련 API") public class AccountController { private final AccountService accountService; + @Operation(summary = "계좌 생성", description = "사용자 ID 기준으로 신규 계좌를 생성합니다.") @PostMapping("/{userId}") public ResponseEntity> createAccount(@RequestBody AccountCreateReq request, @PathVariable Long userId) { return ApiResponseUtil.success(SuccessCode.CREATED, accountService.createAccount(request, userId)); } + @Operation(summary = "계좌 비밀번호 검증", description = "요청된 계좌 비밀번호 일치 여부를 검증합니다.") @PostMapping("/{accountId}/verify-password") public ResponseEntity> verifyPassword(@PathVariable Long accountId, @RequestBody AccountPasswordConfirmReq request) { @@ -40,26 +40,31 @@ public ResponseEntity> verifyPassword(@PathVariable Long acco return ApiResponseUtil.success(SuccessCode.OK); } + @Operation(summary = "계좌 단건 조회", description = "계좌 ID로 계좌 정보를 조회합니다.") @GetMapping("/{accountId}") public ResponseEntity> getAccountByAccountId(@PathVariable Long accountId) { return ApiResponseUtil.success(SuccessCode.OK, accountService.getAccountById(accountId)); } + @Operation(summary = "계좌 잔액 조회", description = "계좌 ID로 현재 잔액을 조회합니다.") @GetMapping("/{accountId}/balance") public ResponseEntity> getAccountBalanceByAccountId(@PathVariable Long accountId) { return ApiResponseUtil.success(SuccessCode.OK, accountService.getAccountBalanceById(accountId)); } + @Operation(summary = "계좌번호 조회", description = "계좌번호로 계좌 정보를 조회합니다.") @GetMapping(params = "accountNo") public ResponseEntity> getAccountByAccountNo(@RequestParam(name = "accountNo") String accountNo) { return ApiResponseUtil.success(SuccessCode.OK, accountService.getAccountByAccountNo(accountNo)); } + @Operation(summary = "사용자 계좌 목록 조회", description = "사용자 ID로 보유 계좌 목록을 조회합니다.") @GetMapping(params = "userId") public ResponseEntity>> getAccountByClientId(@RequestParam(name = "userId") Long userId) { return ApiResponseUtil.success(SuccessCode.OK, accountService.getAccountByUserId(userId)); } + @Operation(summary = "사용자 총 잔액 조회", description = "사용자 ID 기준 전체 계좌 수와 총 잔액을 조회합니다.") @GetMapping("/balance/total") public ResponseEntity> getTotalBalanceByUserId(@RequestParam(name = "userId") Long userId) { return ApiResponseUtil.success(SuccessCode.OK, accountService.getTotalBalanceByUserId(userId)); diff --git a/src/main/java/org/creditto/core_banking/domain/exchange/controller/ExchangeController.java b/src/main/java/org/creditto/core_banking/domain/exchange/controller/ExchangeController.java index bb10dda..76e388a 100644 --- a/src/main/java/org/creditto/core_banking/domain/exchange/controller/ExchangeController.java +++ b/src/main/java/org/creditto/core_banking/domain/exchange/controller/ExchangeController.java @@ -1,5 +1,7 @@ package org.creditto.core_banking.domain.exchange.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.creditto.core_banking.domain.creditscore.service.CreditScoreService; import org.creditto.core_banking.domain.exchange.dto.*; @@ -19,6 +21,7 @@ @RestController @RequestMapping("/api/core/exchange") @RequiredArgsConstructor +@Tag(name = "Exchange", description = "환율 및 우대환율 조회 API") public class ExchangeController { private final ExchangeService exchangeService; @@ -29,6 +32,7 @@ public class ExchangeController { * * @return 성공 응답 및 최신 환율 정보 리스트 */ + @Operation(summary = "최신 환율 목록 조회", description = "지원 통화의 최신 환율 목록을 조회합니다.") @GetMapping public ResponseEntity>> getExchangeRates() { return ApiResponseUtil.success(SuccessCode.OK, exchangeService.getLatestRates()); @@ -40,12 +44,14 @@ public ResponseEntity>> getExchangeRat * @param currency 조회할 통화 * @return 성공 응답 및 특정 통화 최신 환율 정보 */ + @Operation(summary = "통화별 환율 조회", description = "특정 통화의 최신 환율을 조회합니다.") @GetMapping("/{currency}") public ResponseEntity> getExchangeRate(@PathVariable String currency) { CurrencyCode currencyCode = CurrencyCode.from(currency); return ApiResponseUtil.success(SuccessCode.OK, exchangeService.getRateByCurrency(currencyCode)); } + @Operation(summary = "우대환율 조회", description = "사용자와 통화 기준 우대환율 정보를 조회합니다.") @GetMapping("/preferential-rate/{userId}/{currency}") public ResponseEntity> getPreferentialRate( @PathVariable Long userId, diff --git a/src/main/java/org/creditto/core_banking/domain/overseasremittance/controller/OneTimeRemittanceController.java b/src/main/java/org/creditto/core_banking/domain/overseasremittance/controller/OneTimeRemittanceController.java index 1eddb6d..0398ab4 100644 --- a/src/main/java/org/creditto/core_banking/domain/overseasremittance/controller/OneTimeRemittanceController.java +++ b/src/main/java/org/creditto/core_banking/domain/overseasremittance/controller/OneTimeRemittanceController.java @@ -1,5 +1,7 @@ package org.creditto.core_banking.domain.overseasremittance.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.creditto.core_banking.domain.overseasremittance.dto.OverseasRemittanceRequestDto; @@ -21,6 +23,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/core/remittance") +@Tag(name = "Remittance (One-time)", description = "일회성 해외송금 API") public class OneTimeRemittanceController { private final OneTimeRemittanceService oneTimeRemittanceService; @@ -31,6 +34,7 @@ public class OneTimeRemittanceController { * @param request 송금에 필요한 정보(고객 ID, 수취인 정보, 금액 등)를 담은 DTO * @return 처리 결과를 담은 응답 DTO ({@link OverseasRemittanceResponseDto}) */ + @Operation(summary = "일회성 해외송금 요청", description = "사용자 ID 기준 일회성 해외송금을 실행합니다.") @PostMapping("/once/{userId}") public ResponseEntity> processRemittance( @PathVariable Long userId, diff --git a/src/main/java/org/creditto/core_banking/domain/overseasremittance/controller/RemittanceQueryController.java b/src/main/java/org/creditto/core_banking/domain/overseasremittance/controller/RemittanceQueryController.java index fc4dc9c..abfbb0c 100644 --- a/src/main/java/org/creditto/core_banking/domain/overseasremittance/controller/RemittanceQueryController.java +++ b/src/main/java/org/creditto/core_banking/domain/overseasremittance/controller/RemittanceQueryController.java @@ -1,6 +1,8 @@ package org.creditto.core_banking.domain.overseasremittance.controller; // 송금에 관하여 일회/정기 구분 없이 통합해서 +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.creditto.core_banking.domain.overseasremittance.dto.CreditAnalysisRes; import org.creditto.core_banking.domain.overseasremittance.dto.OverseasRemittanceResponseDto; @@ -12,7 +14,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -24,6 +25,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/core/remittance") +@Tag(name = "Remittance (Query)", description = "송금 조회 및 신용분석 데이터 API") public class RemittanceQueryController { private final RemittanceQueryService remittanceService; @@ -34,6 +36,7 @@ public class RemittanceQueryController { * @param userId 송금 내역을 조회할 고객의 ID * @return 해당 고객의 송금 내역 리스트 ({@link OverseasRemittanceResponseDto}) */ + @Operation(summary = "송금 내역 조회", description = "사용자 ID 기준 전체 송금 내역(일회성/정기)을 조회합니다.") @GetMapping("/{userId}") public ResponseEntity>> getRemittanceList(@PathVariable Long userId) { return ApiResponseUtil.success(SuccessCode.OK, remittanceService.getRemittanceList(userId)); @@ -45,6 +48,7 @@ public ResponseEntity>> getRemi * @param userId 조회할 고객의 ID * @return 해당 고객의 모든 송금에 대한 신용 분석용 데이터 리스트 ({@link CreditAnalysisRes}) */ + @Operation(summary = "송금 신용분석 데이터 조회", description = "사용자 ID 기준 신용평가용 송금 데이터 목록을 조회합니다.") @GetMapping("/credit-analysis/{userId}") public ResponseEntity>> getCreditAnalysisData(@PathVariable Long userId) { return ApiResponseUtil.success(SuccessCode.OK, remittanceService.getCreditAnalysisData(userId)); diff --git a/src/main/java/org/creditto/core_banking/domain/regularremittance/controller/RegularRemittanceController.java b/src/main/java/org/creditto/core_banking/domain/regularremittance/controller/RegularRemittanceController.java index 83aa892..39903db 100644 --- a/src/main/java/org/creditto/core_banking/domain/regularremittance/controller/RegularRemittanceController.java +++ b/src/main/java/org/creditto/core_banking/domain/regularremittance/controller/RegularRemittanceController.java @@ -1,5 +1,7 @@ package org.creditto.core_banking.domain.regularremittance.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import org.creditto.core_banking.domain.regularremittance.dto.*; import org.creditto.core_banking.domain.regularremittance.dto.RegularRemittanceResponseDto; import org.creditto.core_banking.domain.regularremittance.service.RegularRemittanceService; @@ -13,6 +15,7 @@ @RestController @RequestMapping("/api/core/remittance/schedule") +@Tag(name = "Remittance (Scheduled)", description = "정기송금 관리 API") public class RegularRemittanceController { private final RegularRemittanceService regularRemittanceService; @@ -27,6 +30,7 @@ public RegularRemittanceController(RegularRemittanceService regularRemittanceSer * @param userId 사용자 ID * @return 해당 사용자의 모든 정기송금 설정 목록 ({@link RegularRemittanceResponseDto}) */ + @Operation(summary = "정기송금 목록 조회", description = "사용자 ID 기준 정기송금 설정 목록을 조회합니다.") @GetMapping public ResponseEntity>> getScheduledRemittancesByUserId(@RequestParam("userId") Long userId) { return ApiResponseUtil.success(SuccessCode.OK, regularRemittanceService.getScheduledRemittancesByUserId(userId)); @@ -39,6 +43,7 @@ public ResponseEntity>> getSched * @param regRemId 정기송금 ID * @return 해당 정기송금 설정의 세부 사항 목록 */ + @Operation(summary = "정기송금 상세 조회", description = "정기송금 ID 기준 설정 상세를 조회합니다.") @GetMapping("/{regRemId}") public ResponseEntity> getScheduledRemittanceDetail(@RequestParam("userId") Long userId, @PathVariable("regRemId") Long regRemId) { return ApiResponseUtil.success(SuccessCode.OK, regularRemittanceService.getScheduledRemittanceDetail(userId, regRemId)); @@ -51,6 +56,7 @@ public ResponseEntity> getScheduledRemittanceD * @param userId 사용자 ID * @return 해당 정기송금 설정에 대한 모든 송금 기록 목록 ({@link RemittanceHistoryDto}) */ + @Operation(summary = "정기송금 이력 조회", description = "정기송금 ID 기준 실행 이력 목록을 조회합니다.") @GetMapping("/history/{regRemId}") public ResponseEntity>> getRemittanceRecordsByRecurId(@PathVariable("regRemId") Long regRemId, @RequestParam("userId") Long userId) { return ApiResponseUtil.success(SuccessCode.OK, regularRemittanceService.getRegularRemittanceHistoryByRegRemId(userId, regRemId)); @@ -64,6 +70,7 @@ public ResponseEntity>> getRemittanceRec * @param userId 사용자 ID * @return 해당 송금의 상세 정보 ({@link RemittanceHistoryDetailDto}) */ + @Operation(summary = "정기송금 이력 상세 조회", description = "정기송금 이력 단건 상세를 조회합니다.") @GetMapping("/history/{regRemId}/{remittanceId}") public ResponseEntity> getRemittanceHistoryDetail( @PathVariable Long regRemId, @@ -80,6 +87,7 @@ public ResponseEntity> getRemittanceHis * @param dto 정기송금 생성에 필요한 정보를 담은 DTO * @return 생성된 정기송금 정보 ({@link RegularRemittanceResponseDto}) */ + @Operation(summary = "정기송금 생성", description = "신규 정기송금 설정을 생성합니다.") @PostMapping("/add") public ResponseEntity> createScheduledRemittance( @RequestParam("userId") Long userId, @@ -97,6 +105,7 @@ public ResponseEntity> createSchedule * @param dto 정기송금 수정에 필요한 정보를 담은 DTO * @return 성공 응답 (HTTP 200 OK) */ + @Operation(summary = "정기송금 수정", description = "기존 정기송금 설정을 수정합니다.") @PutMapping("/{regRemId}") public ResponseEntity> updateScheduledRemittance( @PathVariable("regRemId") Long regRemId, @@ -114,6 +123,7 @@ public ResponseEntity> updateScheduledRemittance( * @param userId 사용자 ID * @return 성공 응답 (HTTP 200 OK) */ + @Operation(summary = "정기송금 삭제", description = "기존 정기송금 설정을 삭제합니다.") @DeleteMapping("/{regRemId}") public ResponseEntity> deleteScheduledRemittance( @PathVariable("regRemId") Long regRemId, diff --git a/src/main/java/org/creditto/core_banking/domain/remittancefee/controller/RemittanceFeeController.java b/src/main/java/org/creditto/core_banking/domain/remittancefee/controller/RemittanceFeeController.java index 733c0d5..a013dd6 100644 --- a/src/main/java/org/creditto/core_banking/domain/remittancefee/controller/RemittanceFeeController.java +++ b/src/main/java/org/creditto/core_banking/domain/remittancefee/controller/RemittanceFeeController.java @@ -1,5 +1,7 @@ package org.creditto.core_banking.domain.remittancefee.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.creditto.core_banking.domain.remittancefee.dto.RemittanceFeeReq; import org.creditto.core_banking.domain.remittancefee.entity.FeeRecord; @@ -16,11 +18,13 @@ @RestController @RequestMapping("/api/remittance-fee") @RequiredArgsConstructor +@Tag(name = "Remittance Fee", description = "송금 수수료 계산 API") public class RemittanceFeeController { private final RemittanceFeeService remittanceFeeService; // 테스트를 위한 API + @Operation(summary = "송금 수수료 계산", description = "요청된 송금 조건 기준 수수료를 계산하고 저장합니다.") @PostMapping("/calculate") public ResponseEntity> calculateRemittanceFee(@RequestBody RemittanceFeeReq dto) { FeeRecord feeRecord = remittanceFeeService.calculateAndSaveFee(dto); diff --git a/src/main/java/org/creditto/core_banking/domain/transaction/controller/TransactionController.java b/src/main/java/org/creditto/core_banking/domain/transaction/controller/TransactionController.java index a4cff10..cd2b5e3 100644 --- a/src/main/java/org/creditto/core_banking/domain/transaction/controller/TransactionController.java +++ b/src/main/java/org/creditto/core_banking/domain/transaction/controller/TransactionController.java @@ -1,5 +1,7 @@ package org.creditto.core_banking.domain.transaction.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.creditto.core_banking.domain.transaction.dto.TransactionRes; import org.creditto.core_banking.domain.transaction.service.TransactionService; @@ -17,10 +19,12 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/core/transactions") +@Tag(name = "Transaction", description = "거래 내역 조회 API") public class TransactionController { private final TransactionService transactionService; + @Operation(summary = "계좌 거래내역 조회", description = "계좌 ID 기준 거래내역 목록을 조회합니다.") @GetMapping("/{accountId}") public ResponseEntity>> getTransactions(@PathVariable Long accountId) { return ApiResponseUtil.success(SuccessCode.OK, transactionService.findByAccountId(accountId));