diff --git a/.github/workflows/cd-api-dev.yml b/.github/workflows/cd-api-dev.yml deleted file mode 100644 index 3a45e37..0000000 --- a/.github/workflows/cd-api-dev.yml +++ /dev/null @@ -1,92 +0,0 @@ -name: CD API DEV - -on: - push: - branches: [ develop ] - -jobs: - build-api: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: 'corretto' - java-version: '17' - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Grant execute permission for run-test-mysql.sh - run: chmod +x run-test-mysql.sh - working-directory: ./domain - - - name: Grant execute permission for run-test-redis.sh - run: chmod +x run-test-redis.sh - working-directory: ./common - - - name: Run test mysql script - run: ./run-test-mysql.sh - working-directory: ./domain - - - name: Run test redis script - run: ./run-test-redis.sh - working-directory: ./common - - - name: Test & Build api only - run: ./gradlew :api:build - - - name: Sign in Dockerhub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build the Docker image - run: docker build -f ./Dockerfile --platform linux/amd64 --no-cache -t samhap/kokomen-payment-api:dev . - working-directory: ./api - - - name: Push the Docker Image to Dockerhub - run: docker push samhap/kokomen-payment-api:dev - working-directory: ./api - - deploy-api: - needs: build-api - runs-on: [ self-hosted, org, dev, new ] - steps: - - name: Stop existing container - run: sudo docker rm -f kokomen-payment-dev-api || true - - - name: Remove old API Docker image - run: | - if sudo docker images samhap/kokomen-payment-api:dev -q | grep -q .; then - sudo docker rmi -f samhap/kokomen-payment-api:dev || true - fi - - - name: pull docker compose yaml files - working-directory: /home/ubuntu - run: | - [ -d kokomen-payment ] || git clone --filter=blob:none --no-checkout https://github.com/samhap-soft/kokomen-payment.git - cd kokomen-payment - git sparse-checkout init --cone - git fetch origin develop - git checkout develop - git sparse-checkout set docker/dev - git pull origin develop - - - name: Docker Image pull - run: sudo docker pull samhap/kokomen-payment-api:dev - - - name: Docker run - working-directory: /home/ubuntu - env: - MYSQL_ROOT_PASSWORD_DEV: ${{ secrets.MYSQL_ROOT_PASSWORD_DEV }} - SPRING_DATASOURCE_USERNAME_DEV: ${{ secrets.SPRING_DATASOURCE_USERNAME_DEV }} - SPRING_DATASOURCE_PASSWORD_DEV: ${{ secrets.SPRING_DATASOURCE_PASSWORD_DEV }} - SPRING_DATASOURCE_URL_DEV: ${{ secrets.SPRING_DATASOURCE_URL_DEV }} - MYSQL_HOST: ${{ secrets.MYSQL_HOST }} - run: | - export HOSTNAME=$(hostname) - cd kokomen-payment/docker/dev - sudo -E docker compose -f docker-compose-dev.yml up -d diff --git a/.github/workflows/cd-api-prod.yml b/.github/workflows/cd-api-prod.yml deleted file mode 100644 index f14798b..0000000 --- a/.github/workflows/cd-api-prod.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: CD API PROD - -on: - push: - branches: [ main ] - -jobs: - build-api: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: 'corretto' - java-version: '17' - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Grant execute permission for run-test-mysql.sh - run: chmod +x run-test-mysql.sh - working-directory: ./domain - - - name: Grant execute permission for run-test-redis.sh - run: chmod +x run-test-redis.sh - working-directory: ./common - - - name: Run test mysql script - run: ./run-test-mysql.sh - working-directory: ./domain - - - name: Run test redis script - run: ./run-test-redis.sh - working-directory: ./common - - - name: Test & Build api only - run: ./gradlew :api:build - - - name: Sign in Dockerhub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build the Docker image - run: docker build -f ./Dockerfile --platform linux/arm64 --no-cache -t samhap/kokomen-payment-api:prod . - working-directory: ./api - - - name: Push the Docker Image to Dockerhub - run: docker push samhap/kokomen-payment-api:prod - working-directory: ./api - - deploy-api: - needs: build-api - runs-on: [ self-hosted, prod, new, payment ] - steps: - - name: Stop existing container - run: sudo docker rm -f kokomen-payment-api || true - - - name: Remove old API Docker image - run: | - if sudo docker images samhap/kokomen-payment-api:prod -q | grep -q .; then - sudo docker rmi -f samhap/kokomen-payment-api:prod || true - fi - - - name: pull docker compose yaml files - working-directory: /home/ubuntu - run: | - [ -d kokomen-payment ] || git clone --filter=blob:none --no-checkout https://github.com/samhap-soft/kokomen-payment.git - cd kokomen-payment - git sparse-checkout init --cone - git fetch origin main - git checkout main - git sparse-checkout set docker/prod - git pull origin main - - - name: Docker Image pull - run: sudo docker pull samhap/kokomen-payment-api:prod - - - name: Docker run - working-directory: /home/ubuntu - env: - MYSQL_ROOT_PASSWORD_PROD: ${{ secrets.MYSQL_ROOT_PASSWORD_PROD }} - SPRING_DATASOURCE_USERNAME_PROD: ${{ secrets.SPRING_DATASOURCE_USERNAME_PROD }} - SPRING_DATASOURCE_PASSWORD_PROD: ${{ secrets.SPRING_DATASOURCE_PASSWORD_PROD }} - SPRING_DATASOURCE_URL_PROD: ${{ secrets.SPRING_DATASOURCE_URL_PROD }} - run: | - export HOSTNAME=$(hostname) - cd kokomen-payment/docker/prod - sudo -E docker compose -f docker-compose-prod.yml up -d diff --git a/.github/workflows/cd-internal-dev.yml b/.github/workflows/cd-internal-dev.yml index 82da3ea..7b9dd40 100644 --- a/.github/workflows/cd-internal-dev.yml +++ b/.github/workflows/cd-internal-dev.yml @@ -1,4 +1,4 @@ -name: CD INTERNAL DEV +name: CD DEV on: push: @@ -18,24 +18,33 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Grant execute permission for run-test-mysql.sh - run: chmod +x run-test-mysql.sh - working-directory: ./domain + - name: Start test containers + run: docker compose -f test-docker-compose.yml up -d - - name: Grant execute permission for run-test-redis.sh - run: chmod +x run-test-redis.sh - working-directory: ./common - - - name: Run test mysql script - run: ./run-test-mysql.sh - working-directory: ./domain - - - name: Run test redis script - run: ./run-test-redis.sh - working-directory: ./common - - - name: Test & Build internal only - run: ./gradlew :internal:build + - name: Wait for MySQL to be ready + run: | + for i in $(seq 1 30); do + if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then + echo "MySQL is ready" + break + fi + echo "Waiting for MySQL... ($i/30)" + sleep 2 + done + + - name: Wait for Redis to be ready + run: | + for i in $(seq 1 30); do + if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then + echo "Redis is ready" + break + fi + echo "Waiting for Redis... ($i/30)" + sleep 2 + done + + - name: Test & Build + run: ./gradlew build - name: Sign in Dockerhub uses: docker/login-action@v3 @@ -45,11 +54,9 @@ jobs: - name: Build the Docker image run: docker build -f ./Dockerfile --platform linux/amd64 --no-cache -t samhap/kokomen-payment-internal:dev . - working-directory: ./internal - name: Push the Docker Image to Dockerhub run: docker push samhap/kokomen-payment-internal:dev - working-directory: ./internal deploy-internal: needs: build-internal diff --git a/.github/workflows/cd-internal-prod.yml b/.github/workflows/cd-internal-prod.yml index 12a6f89..a2c7e67 100644 --- a/.github/workflows/cd-internal-prod.yml +++ b/.github/workflows/cd-internal-prod.yml @@ -1,4 +1,4 @@ -name: CD INTERNAL PROD +name: CD PROD on: push: @@ -18,24 +18,33 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Grant execute permission for run-test-mysql.sh - run: chmod +x run-test-mysql.sh - working-directory: ./domain + - name: Start test containers + run: docker compose -f test-docker-compose.yml up -d - - name: Grant execute permission for run-test-redis.sh - run: chmod +x run-test-redis.sh - working-directory: ./common - - - name: Run test mysql script - run: ./run-test-mysql.sh - working-directory: ./domain - - - name: Run test redis script - run: ./run-test-redis.sh - working-directory: ./common - - - name: Test & Build internal only - run: ./gradlew :internal:build + - name: Wait for MySQL to be ready + run: | + for i in $(seq 1 30); do + if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then + echo "MySQL is ready" + break + fi + echo "Waiting for MySQL... ($i/30)" + sleep 2 + done + + - name: Wait for Redis to be ready + run: | + for i in $(seq 1 30); do + if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then + echo "Redis is ready" + break + fi + echo "Waiting for Redis... ($i/30)" + sleep 2 + done + + - name: Test & Build + run: ./gradlew build - name: Sign in Dockerhub uses: docker/login-action@v3 @@ -45,11 +54,9 @@ jobs: - name: Build the Docker image run: docker build -f ./Dockerfile --platform linux/arm64 --no-cache -t samhap/kokomen-payment-internal:prod . - working-directory: ./internal - name: Push the Docker Image to Dockerhub run: docker push samhap/kokomen-payment-internal:prod - working-directory: ./internal deploy-internal: needs: build-internal diff --git a/.github/workflows/ci-api-test.yml b/.github/workflows/ci-api-test.yml deleted file mode 100644 index 3bb6876..0000000 --- a/.github/workflows/ci-api-test.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: CI API TEST - -on: - pull_request: - branches: [ main, develop ] - -jobs: - build: - runs-on: ubuntu-latest - permissions: - checks: write - pull-requests: write - - steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: 'corretto' - java-version: '17' - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Grant execute permission for run-test-mysql.sh - run: chmod +x run-test-mysql.sh - working-directory: ./domain - - - name: Grant execute permission for run-test-redis.sh - run: chmod +x run-test-redis.sh - working-directory: ./common - - - name: Run test mysql script - run: ./run-test-mysql.sh - working-directory: ./domain - - - name: Run test redis script - run: ./run-test-redis.sh - working-directory: ./common - - - name: Test & Build api only - run: ./gradlew :api:build - - - name: Publish Unit Test Results - uses: EnricoMi/publish-unit-test-result-action@v2 - if: ${{ always() }} - with: - files: ${{ github.workspace }}/api/build/test-results/**/*.xml - seconds_between_github_reads: 1.0 - seconds_between_github_writes: 3.0 - secondary_rate_limit_wait_seconds: 90.0 - - - name: When test fail, comment on that code - uses: mikepenz/action-junit-report@v3 - if: always() - with: - report_paths: ${{ github.workspace }}/api/build/test-results/**/*.xml - token: ${{ github.token }} diff --git a/.github/workflows/ci-internal-test.yml b/.github/workflows/ci-internal-test.yml index 5ab5ca8..291be56 100644 --- a/.github/workflows/ci-internal-test.yml +++ b/.github/workflows/ci-internal-test.yml @@ -1,4 +1,4 @@ -name: CI INTERNAL TEST +name: CI TEST on: pull_request: @@ -22,30 +22,39 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Grant execute permission for run-test-mysql.sh - run: chmod +x run-test-mysql.sh - working-directory: ./domain + - name: Start test containers + run: docker compose -f test-docker-compose.yml up -d - - name: Grant execute permission for run-test-redis.sh - run: chmod +x run-test-redis.sh - working-directory: ./common + - name: Wait for MySQL to be ready + run: | + for i in $(seq 1 30); do + if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then + echo "MySQL is ready" + break + fi + echo "Waiting for MySQL... ($i/30)" + sleep 2 + done - - name: Run test mysql script - run: ./run-test-mysql.sh - working-directory: ./domain + - name: Wait for Redis to be ready + run: | + for i in $(seq 1 30); do + if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then + echo "Redis is ready" + break + fi + echo "Waiting for Redis... ($i/30)" + sleep 2 + done - - name: Run test redis script - run: ./run-test-redis.sh - working-directory: ./common - - - name: Test & Build internal only - run: ./gradlew :internal:build + - name: Test & Build + run: ./gradlew build - name: Publish Unit Test Results uses: EnricoMi/publish-unit-test-result-action@v2 if: ${{ always() }} with: - files: ${{ github.workspace }}/internal/build/test-results/**/*.xml + files: ${{ github.workspace }}/build/test-results/**/*.xml seconds_between_github_reads: 1.0 seconds_between_github_writes: 3.0 secondary_rate_limit_wait_seconds: 90.0 @@ -54,5 +63,5 @@ jobs: uses: mikepenz/action-junit-report@v3 if: always() with: - report_paths: ${{ github.workspace }}/internal/build/test-results/**/*.xml + report_paths: ${{ github.workspace }}/build/test-results/**/*.xml token: ${{ github.token }} diff --git a/api/Dockerfile b/Dockerfile similarity index 100% rename from api/Dockerfile rename to Dockerfile diff --git a/api/build.gradle b/api/build.gradle deleted file mode 100644 index e4bd56d..0000000 --- a/api/build.gradle +++ /dev/null @@ -1,38 +0,0 @@ -plugins { - id 'org.asciidoctor.jvm.convert' version '3.3.2' -} - -ext { - set('snippetsDir', file("build/generated-snippets")) -} - -dependencies { - implementation project(':domain') - implementation project(':common') - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-data-redis' - implementation 'org.springframework.session:spring-session-data-redis' - - runtimeOnly 'com.mysql:mysql-connector-j' - - testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' -} - -tasks.named('test') { - useJUnitPlatform() - outputs.dir snippetsDir -} - -asciidoctor { - attributes 'snippetsDir': snippetsDir - inputs.dir snippetsDir - dependsOn test -} - -bootJar { - dependsOn asciidoctor - from("${asciidoctor.outputDir}") { - into 'static/docs' - } -} diff --git a/api/local-api-docker-compose.yml b/api/local-api-docker-compose.yml deleted file mode 100644 index f456361..0000000 --- a/api/local-api-docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -services: - kokomen-payment-local-api: - container_name: kokomen-payment-local-api - build: - dockerfile: ./Dockerfile - no_cache: true - ports: - - 8200:8080 - - 8201:8001 - environment: - SPRING_PROFILES_ACTIVE: local - networks: - - local-kokomen-net - -networks: - local-kokomen-net: - external: true - driver: bridge diff --git a/api/run-local-api.sh b/api/run-local-api.sh deleted file mode 100755 index 6281800..0000000 --- a/api/run-local-api.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -set -e - -# 현재 쉘 스크립트 파일의 디렉토리로 이동 -cd "$(dirname "$0")" - -cd ../common - -chmod +x run-test-redis.sh -./run-test-redis.sh - -cd ../domain - -chmod +x run-test-mysql.sh -./run-test-mysql.sh - -# 도커 네트워크 생성 -NETWORK_NAME="local-kokomen-net" - -if ! docker network inspect "$NETWORK_NAME" >/dev/null 2>&1; then - echo "Creating Docker network: $NETWORK_NAME" - docker network create --driver bridge "$NETWORK_NAME" -else - echo "Docker network '$NETWORK_NAME' already exists. Skipping." -fi - -# 도메인 도커 컴포즈 실행 -docker compose -f ../domain/local-docker-compose.yml up -d - -../gradlew clean :api:build - -# 로컬 도커 컴포즈 실행 -# 실행 전에 헬스 체크 필요 -cd ../api -docker rm -f kokomen-payment-local-api -docker compose -f local-api-docker-compose.yml up --build -d diff --git a/api/src/docs/asciidoc/index.adoc b/api/src/docs/asciidoc/index.adoc deleted file mode 100644 index cebb872..0000000 --- a/api/src/docs/asciidoc/index.adoc +++ /dev/null @@ -1,21 +0,0 @@ -= Kokomen Payment API Guide -:doctype: book -:icons: font -:toc: left -:toc-title: Table of Contents -:toclevels: 2 -:source-highlighter: highlightjs -:sectlinks: -:sectnums: - -== 결제 - -=== 나의 결제 내역 조회 - -include::{snippetsDir}/payment-findMyPayments/http-request.adoc[] -include::{snippetsDir}/payment-findMyPayments/query-parameters.adoc[] -include::{snippetsDir}/payment-findMyPayments/request-cookies.adoc[] -include::{snippetsDir}/payment-findMyPayments/http-response.adoc[] -include::{snippetsDir}/payment-findMyPayments/response-fields.adoc[] -include::{snippetsDir}/payment-findMyPayments/curl-request.adoc[] - diff --git a/api/src/main/java/com/samhap/kokomen/global/annotation/Authentication.java b/api/src/main/java/com/samhap/kokomen/global/annotation/Authentication.java deleted file mode 100644 index ab06d8f..0000000 --- a/api/src/main/java/com/samhap/kokomen/global/annotation/Authentication.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.samhap.kokomen.global.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface Authentication { - boolean required() default true; -} diff --git a/api/src/main/java/com/samhap/kokomen/global/config/WebConfig.java b/api/src/main/java/com/samhap/kokomen/global/config/WebConfig.java deleted file mode 100644 index 10c1f1b..0000000 --- a/api/src/main/java/com/samhap/kokomen/global/config/WebConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.samhap.kokomen.global.config; - -import com.samhap.kokomen.global.infrastructure.MemberAuthArgumentResolver; -import java.util.List; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class WebConfig implements WebMvcConfigurer { - - private final String[] allowedOrigins; - - public WebConfig( - @Value("${cors.allowed-origins}") String[] allowedOrigins - ) { - this.allowedOrigins = allowedOrigins; - } - - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOrigins(allowedOrigins) - .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH", "OPTIONS") - .allowCredentials(true) - .allowedHeaders("*"); - } - - @Override - public void addArgumentResolvers(List resolvers) { - resolvers.addAll(List.of( - new MemberAuthArgumentResolver() - )); - } -} diff --git a/api/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java b/api/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java deleted file mode 100644 index 69d1d9f..0000000 --- a/api/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.samhap.kokomen.global.dto; - -public record ErrorResponse( - String message -) { -} diff --git a/api/src/main/java/com/samhap/kokomen/global/dto/MemberAuth.java b/api/src/main/java/com/samhap/kokomen/global/dto/MemberAuth.java deleted file mode 100644 index 3d39706..0000000 --- a/api/src/main/java/com/samhap/kokomen/global/dto/MemberAuth.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.samhap.kokomen.global.dto; - -public record MemberAuth( - Long memberId -) { - - private static final MemberAuth NOT_AUTHENTICATED = new MemberAuth(null); - - public static MemberAuth notAuthenticated() { - return NOT_AUTHENTICATED; - } - - public boolean isAuthenticated() { - return memberId != null; - } -} diff --git a/api/src/main/java/com/samhap/kokomen/global/exception/ApiErrorMessage.java b/api/src/main/java/com/samhap/kokomen/global/exception/ApiErrorMessage.java deleted file mode 100644 index 09e603c..0000000 --- a/api/src/main/java/com/samhap/kokomen/global/exception/ApiErrorMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.samhap.kokomen.global.exception; - -import lombok.Getter; - -@Getter -public enum ApiErrorMessage { - - AUTHENTICATION_ANNOTATION_REQUIRED("MemberAuth 파라미터는 @Authentication 어노테이션이 있어야 합니다."), - LOGIN_REQUIRED("로그인이 필요합니다"), - MEMBER_ID_NOT_IN_SESSION("세션에 MEMBER_ID가 없습니다."), - INVALID_REQUEST("잘못된 요청입니다."), - MISSING_REQUEST_PARAMETER("필수 요청 파라미터가 누락되었습니다."), - INVALID_REQUEST_FORMAT("잘못된 요청 형식입니다. JSON 형식을 확인해주세요."), - JSON_PARSE_ERROR("JSON 파싱 오류: 유효하지 않은 값이 전달되었습니다."), - INTERNAL_SERVER_ERROR("서버에 문제가 발생하였습니다."); - - private final String message; - - ApiErrorMessage(String message) { - this.message = message; - } -} diff --git a/api/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java b/api/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java deleted file mode 100644 index 352305d..0000000 --- a/api/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.samhap.kokomen.global.exception; - -import com.fasterxml.jackson.databind.exc.InvalidFormatException; -import com.samhap.kokomen.global.dto.ErrorResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.support.DefaultMessageSourceResolvable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.MissingServletRequestParameterException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -@Slf4j -@RestControllerAdvice -public class GlobalExceptionHandler { - - @ExceptionHandler(KokomenException.class) - public ResponseEntity handleKokomenException(KokomenException e) { - log.warn("KokomenException :: status: {}, message: {}", e.getHttpStatusCode(), e.getMessage()); - return ResponseEntity.status(e.getHttpStatusCode()) - .body(new ErrorResponse(e.getMessage())); - } - - @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - String defaultErrorMessageForUser = ApiErrorMessage.INVALID_REQUEST.getMessage(); - String message = e.getBindingResult() - .getFieldErrors() - .stream() - .findFirst() - .map(DefaultMessageSourceResolvable::getDefaultMessage) - .orElse(defaultErrorMessageForUser); - - if (message.equals(defaultErrorMessageForUser)) { - log.warn("MethodArgumentNotValidException :: message: {}", e.getMessage()); - } else { - log.warn("MethodArgumentNotValidException :: message: {}", message); - } - - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(message)); - } - - @ExceptionHandler(MissingServletRequestParameterException.class) - public ResponseEntity handleMissingServletRequestParameterException( - MissingServletRequestParameterException e) { - log.warn("MissingServletRequestParameterException :: parameterName: {}", e.getParameterName()); - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(ApiErrorMessage.MISSING_REQUEST_PARAMETER.getMessage())); - } - - @ExceptionHandler(HttpMessageNotReadableException.class) - public ResponseEntity handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { - if (e.getCause() instanceof InvalidFormatException invalidFormatException) { - String fieldName = invalidFormatException.getPath().get(0).getFieldName(); - String invalidValue = String.valueOf(invalidFormatException.getValue()); - log.warn("HttpMessageNotReadableException :: fieldName: {}, invalidValue: {}", fieldName, invalidValue); - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(ApiErrorMessage.JSON_PARSE_ERROR.getMessage())); - } - - log.warn("HttpMessageNotReadableException :: message: {}", e.getMessage()); - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(ApiErrorMessage.INVALID_REQUEST_FORMAT.getMessage())); - } - - @ExceptionHandler(Exception.class) - public ResponseEntity handleException(Exception e) { - log.error("Exception :: status: {}, message: {}, stackTrace: ", HttpStatus.INTERNAL_SERVER_ERROR, - e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse(ApiErrorMessage.INTERNAL_SERVER_ERROR.getMessage())); - } -} diff --git a/api/src/main/java/com/samhap/kokomen/global/infrastructure/MemberAuthArgumentResolver.java b/api/src/main/java/com/samhap/kokomen/global/infrastructure/MemberAuthArgumentResolver.java deleted file mode 100644 index d4af78f..0000000 --- a/api/src/main/java/com/samhap/kokomen/global/infrastructure/MemberAuthArgumentResolver.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.samhap.kokomen.global.infrastructure; - -import com.samhap.kokomen.global.annotation.Authentication; -import com.samhap.kokomen.global.dto.MemberAuth; -import com.samhap.kokomen.global.exception.ApiErrorMessage; -import com.samhap.kokomen.global.exception.InternalServerErrorException; -import com.samhap.kokomen.global.exception.UnauthorizedException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpSession; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.MethodParameter; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.support.WebDataBinderFactory; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.method.support.ModelAndViewContainer; - -@Slf4j -@Component -public class MemberAuthArgumentResolver implements HandlerMethodArgumentResolver { - - @Override - public boolean supportsParameter(MethodParameter parameter) { - return parameter.getParameterType().equals(MemberAuth.class); - } - - @Override - public Object resolveArgument(MethodParameter parameter, - ModelAndViewContainer mavContainer, - NativeWebRequest webRequest, - WebDataBinderFactory binderFactory) throws Exception { - Authentication authentication = parameter.getParameterAnnotation(Authentication.class); - if (authentication == null) { - throw new InternalServerErrorException(ApiErrorMessage.AUTHENTICATION_ANNOTATION_REQUIRED.getMessage()); - } - boolean authenticationRequired = authentication.required(); - HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); - HttpSession session = request.getSession(false); - - validateAuthentication(session, authenticationRequired); - if (session == null) { - return MemberAuth.notAuthenticated(); - } - Long memberId = (Long) session.getAttribute("MEMBER_ID"); - validateAuthentication(memberId, authenticationRequired); - - return new MemberAuth(memberId); - } - - private void validateAuthentication(HttpSession session, boolean authenticationRequired) { - if (session == null && authenticationRequired) { - throw new UnauthorizedException(ApiErrorMessage.LOGIN_REQUIRED.getMessage()); - } - } - - private void validateAuthentication(Long memberId, boolean authenticationRequired) { - if (memberId == null) { - log.error(ApiErrorMessage.MEMBER_ID_NOT_IN_SESSION.getMessage()); - } - if (memberId == null && authenticationRequired) { - throw new UnauthorizedException(ApiErrorMessage.MEMBER_ID_NOT_IN_SESSION.getMessage()); - } - } -} diff --git a/api/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java b/api/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java deleted file mode 100644 index 52bc5ed..0000000 --- a/api/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.samhap.kokomen.global.logging; - -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpSession; -import java.io.IOException; -import java.util.List; -import java.util.UUID; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; -import org.springframework.util.AntPathMatcher; -import org.springframework.util.StopWatch; -import org.springframework.web.filter.OncePerRequestFilter; - -@Slf4j -@Component -public class LoggingFilter extends OncePerRequestFilter { - - private static final List WHITE_LIST = List.of( - "/favicon.ico", - "/docs/index.html", - "/metrics", - "/actuator/**"); - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - - String requestId = readRequestId(request); - MDC.put("requestId", requestId); - - try { - filterChain.doFilter(request, response); - } finally { - stopWatch.stop(); - log.info("{} {} {} ({}) - {}ms", - readMemberId(request), - request.getMethod(), - request.getRequestURI(), - HttpStatus.valueOf(response.getStatus()), - stopWatch.getTotalTimeMillis()); - - MDC.clear(); - } - } - - private String readRequestId(HttpServletRequest request) { - String requestId = request.getHeader("X-RequestID"); - if (requestId != null && !requestId.isEmpty()) { - return requestId; - } - return UUID.randomUUID().toString(); - } - - private String readMemberId(HttpServletRequest request) { - HttpSession session = request.getSession(false); - if (session != null) { - Long memberId = (Long) session.getAttribute("MEMBER_ID"); - if (memberId != null) { - return "memberId=" + memberId; - } - } - return ""; - } - - @Override - protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { - String requestURI = request.getRequestURI(); - AntPathMatcher antPathMatcher = new AntPathMatcher(); - return WHITE_LIST.stream().anyMatch(path -> antPathMatcher.match(path, requestURI)); - } -} diff --git a/api/src/main/java/com/samhap/kokomen/payment/dto/MyPaymentResponse.java b/api/src/main/java/com/samhap/kokomen/payment/dto/MyPaymentResponse.java deleted file mode 100644 index 40a4f54..0000000 --- a/api/src/main/java/com/samhap/kokomen/payment/dto/MyPaymentResponse.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.samhap.kokomen.payment.dto; - -import com.samhap.kokomen.payment.domain.PaymentState; -import com.samhap.kokomen.payment.domain.ServiceType; -import com.samhap.kokomen.payment.domain.TosspaymentsPayment; -import com.samhap.kokomen.payment.domain.TosspaymentsPaymentResult; -import java.time.LocalDateTime; - -public record MyPaymentResponse( - String paymentKey, - String orderId, - String orderName, - Long totalAmount, - PaymentState state, - ServiceType serviceType, - LocalDateTime createdAt, - LocalDateTime approvedAt, - String method, - String metadata, - String failureCode, - String failureMessage -) { - - public static MyPaymentResponse from(TosspaymentsPaymentResult result) { - TosspaymentsPayment payment = result.getTosspaymentsPayment(); - - return new MyPaymentResponse( - payment.getPaymentKey(), - payment.getOrderId(), - payment.getOrderName(), - payment.getTotalAmount(), - payment.getState(), - payment.getServiceType(), - payment.getCreatedAt(), - result.getApprovedAt(), - result.getMethod(), - payment.getMetadata(), - result.getFailureCode(), - result.getFailureMessage() - ); - } -} diff --git a/api/src/main/resources/application.yml b/api/src/main/resources/application.yml deleted file mode 100644 index 0edc7b8..0000000 --- a/api/src/main/resources/application.yml +++ /dev/null @@ -1,68 +0,0 @@ -management: - server: - address: 0.0.0.0 - port: 8001 -spring: - application: - name: kokomen-payment-api - profiles: - include: - - domain - - common - jackson: - property-naming-strategy: SNAKE_CASE - default-property-inclusion: non_null - session: - store-type: redis -server: - servlet: - session: - timeout: 24h - cookie: - name: JSESSIONID - path: / - http-only: true - same-site: lax - max-age: 86400 - ---- -# local profile -spring: - config: - activate: - on-profile: local -cors: - allowed-origins: http://localhost:8080 -server: - servlet: - session: - cookie: - secure: true ---- -# dev profile -spring: - config: - activate: - on-profile: dev -cors: - allowed-origins: https://dev.kokomen.kr, https://kokomen.kr:3000, https://local.kokomen.kr:3000, http://local.kokomen.kr:3000, https://www.webview-dev.kokomen.kr, https://webview-dev.kokomen.kr -server: - servlet: - session: - cookie: - domain: kokomen.kr - secure: false ---- -# prod profile -spring: - config: - activate: - on-profile: prod -cors: - allowed-origins: https://kokomen.kr, https://www.kokomen.kr, https://www.webview.kokomen.kr, https://webview.kokomen.kr -server: - servlet: - session: - cookie: - domain: kokomen.kr - secure: true diff --git a/api/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java b/api/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java deleted file mode 100644 index bbc23c2..0000000 --- a/api/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.samhap.kokomen.global; - -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.modifyHeaders; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.modifyUris; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.http.HttpHeaders; -import org.springframework.restdocs.RestDocumentationContextProvider; -import org.springframework.restdocs.RestDocumentationExtension; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -@ExtendWith(RestDocumentationExtension.class) -public abstract class BaseControllerTest extends BaseTest { - - protected MockMvc mockMvc; - - @BeforeEach - void baseControllerTestSetUp(WebApplicationContext context, RestDocumentationContextProvider restDocumentation) { - var uriPreprocessor = modifyUris() - .scheme("https") - .host("payment-api.kokomen.kr") - .removePort(); - - var headerPreprocessor = modifyHeaders().remove(HttpHeaders.CONTENT_LENGTH); - - this.mockMvc = MockMvcBuilders.webAppContextSetup(context) - .alwaysDo(print()) - .apply(documentationConfiguration(restDocumentation).operationPreprocessors() - .withRequestDefaults(uriPreprocessor, prettyPrint(), headerPreprocessor) - .withResponseDefaults(prettyPrint(), headerPreprocessor) - ).build(); - } -} diff --git a/api/src/test/java/com/samhap/kokomen/global/BaseTest.java b/api/src/test/java/com/samhap/kokomen/global/BaseTest.java deleted file mode 100644 index 33da7de..0000000 --- a/api/src/test/java/com/samhap/kokomen/global/BaseTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.samhap.kokomen.global; - -import org.junit.jupiter.api.BeforeEach; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; - -@ActiveProfiles("test") -@SpringBootTest(webEnvironment = WebEnvironment.MOCK) -public abstract class BaseTest { - - @MockitoSpyBean - protected RedisTemplate redisTemplate; - - @Autowired - private MySQLDatabaseCleaner mySQLDatabaseCleaner; - - @BeforeEach - void baseTestSetUp() { - mySQLDatabaseCleaner.executeTruncate(); - } -} diff --git a/api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java b/api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java deleted file mode 100644 index fdedf7d..0000000 --- a/api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.samhap.kokomen.global.fixture; - -import com.samhap.kokomen.payment.domain.PaymentState; -import com.samhap.kokomen.payment.domain.ServiceType; -import com.samhap.kokomen.payment.domain.TosspaymentsPayment; - -public class TosspaymentsPaymentFixtureBuilder { - - private String paymentKey; - private Long memberId; - private String orderId; - private String orderName; - private Long totalAmount; - private String metadata; - private ServiceType serviceType; - - public static TosspaymentsPaymentFixtureBuilder builder() { - return new TosspaymentsPaymentFixtureBuilder(); - } - - public TosspaymentsPaymentFixtureBuilder paymentKey(String paymentKey) { - this.paymentKey = paymentKey; - return this; - } - - public TosspaymentsPaymentFixtureBuilder memberId(Long memberId) { - this.memberId = memberId; - return this; - } - - public TosspaymentsPaymentFixtureBuilder orderId(String orderId) { - this.orderId = orderId; - return this; - } - - public TosspaymentsPaymentFixtureBuilder orderName(String orderName) { - this.orderName = orderName; - return this; - } - - public TosspaymentsPaymentFixtureBuilder totalAmount(Long totalAmount) { - this.totalAmount = totalAmount; - return this; - } - - public TosspaymentsPaymentFixtureBuilder metadata(String metadata) { - this.metadata = metadata; - return this; - } - - public TosspaymentsPaymentFixtureBuilder serviceType(ServiceType serviceType) { - this.serviceType = serviceType; - return this; - } - - public TosspaymentsPayment build() { - return new TosspaymentsPayment( - paymentKey != null ? paymentKey : "test_payment_key_123", - memberId != null ? memberId : 1L, - orderId != null ? orderId : "order_123", - orderName != null ? orderName : "테스트 주문", - totalAmount != null ? totalAmount : 10000L, - metadata != null ? metadata : "{\"test\": \"metadata\"}", - serviceType != null ? serviceType : ServiceType.INTERVIEW - ); - } -} \ No newline at end of file diff --git a/api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java b/api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java deleted file mode 100644 index c832824..0000000 --- a/api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.samhap.kokomen.global.fixture; - -import com.samhap.kokomen.payment.domain.PaymentType; -import com.samhap.kokomen.payment.domain.TosspaymentsPayment; -import com.samhap.kokomen.payment.domain.TosspaymentsPaymentResult; -import com.samhap.kokomen.payment.domain.TosspaymentsStatus; -import java.time.LocalDateTime; - -public class TosspaymentsPaymentResultFixtureBuilder { - - private TosspaymentsPayment tosspaymentsPayment; - private PaymentType type; - private String mId; - private String currency; - private Long totalAmount; - private String method; - private Long balanceAmount; - private TosspaymentsStatus tosspaymentsStatus; - private LocalDateTime requestedAt; - private LocalDateTime approvedAt; - private String lastTransactionKey; - private Long suppliedAmount; - private Long vat; - private Long taxFreeAmount; - private Long taxExemptionAmount; - private boolean isPartialCancelable; - private String receiptUrl; - private String easyPayProvider; - private Long easyPayAmount; - private Long easyPayDiscountAmount; - private String country; - private String failureCode; - private String failureMessage; - - public static TosspaymentsPaymentResultFixtureBuilder builder() { - return new TosspaymentsPaymentResultFixtureBuilder(); - } - - public TosspaymentsPaymentResultFixtureBuilder tosspaymentsPayment(TosspaymentsPayment tosspaymentsPayment) { - this.tosspaymentsPayment = tosspaymentsPayment; - return this; - } - - public TosspaymentsPaymentResultFixtureBuilder type(PaymentType type) { - this.type = type; - return this; - } - - public TosspaymentsPaymentResultFixtureBuilder method(String method) { - this.method = method; - return this; - } - - public TosspaymentsPaymentResultFixtureBuilder tosspaymentsStatus(TosspaymentsStatus status) { - this.tosspaymentsStatus = status; - return this; - } - - public TosspaymentsPaymentResultFixtureBuilder approvedAt(LocalDateTime approvedAt) { - this.approvedAt = approvedAt; - return this; - } - - public TosspaymentsPaymentResultFixtureBuilder receiptUrl(String receiptUrl) { - this.receiptUrl = receiptUrl; - return this; - } - - public TosspaymentsPaymentResultFixtureBuilder failureCode(String failureCode) { - this.failureCode = failureCode; - return this; - } - - public TosspaymentsPaymentResultFixtureBuilder failureMessage(String failureMessage) { - this.failureMessage = failureMessage; - return this; - } - - public TosspaymentsPaymentResult build() { - return new TosspaymentsPaymentResult( - tosspaymentsPayment, - type != null ? type : PaymentType.NORMAL, - mId != null ? mId : "tvivarepublica", - currency != null ? currency : "KRW", - totalAmount != null ? totalAmount : 10000L, - method != null ? method : "카드", - balanceAmount != null ? balanceAmount : 10000L, - tosspaymentsStatus != null ? tosspaymentsStatus : TosspaymentsStatus.DONE, - requestedAt != null ? requestedAt : LocalDateTime.now().minusMinutes(5), - approvedAt, - lastTransactionKey != null ? lastTransactionKey : "test_transaction_key", - suppliedAmount != null ? suppliedAmount : 9091L, - vat != null ? vat : 909L, - taxFreeAmount != null ? taxFreeAmount : 0L, - taxExemptionAmount != null ? taxExemptionAmount : 0L, - isPartialCancelable, - receiptUrl, - easyPayProvider, - easyPayAmount, - easyPayDiscountAmount, - country != null ? country : "KR", - failureCode, - failureMessage - ); - } -} \ No newline at end of file diff --git a/api/src/test/resources/application.yml b/api/src/test/resources/application.yml deleted file mode 100644 index 54c4b1a..0000000 --- a/api/src/test/resources/application.yml +++ /dev/null @@ -1,12 +0,0 @@ -spring: - profiles: - include: - - domain-test - - common-test - main: - lazy-initialization: true - jackson: - property-naming-strategy: SNAKE_CASE - default-property-inclusion: non_null -cors: - allowed-origins: http://localhost:8080 diff --git a/build.gradle b/build.gradle index 60ef75f..8a50c9c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,44 +1,71 @@ plugins { id 'java' - id 'java-library' id 'org.springframework.boot' version '3.4.5' id 'io.spring.dependency-management' version '1.1.7' + id 'org.asciidoctor.jvm.convert' version '3.3.2' } -subprojects { - apply plugin: 'java' - apply plugin: 'java-library' - apply plugin: 'org.springframework.boot' - apply plugin: 'io.spring.dependency-management' +group = 'com.samhap' +version = '0.0.1-SNAPSHOT' - group = 'com.samhap' - version = '0.0.1-SNAPSHOT' - - java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) } +} - repositories { - mavenCentral() - } +repositories { + mavenCentral() +} - configurations { - compileOnly { - extendsFrom annotationProcessor - } +configurations { + compileOnly { + extendsFrom annotationProcessor } +} + +ext { + set('snippetsDir', file("build/generated-snippets")) +} - dependencies { - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-aop' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.retry:spring-retry' + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + implementation 'org.springframework.boot:spring-boot-starter-actuator' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - } + runtimeOnly 'com.mysql:mysql-connector-j' + implementation 'org.flywaydb:flyway-core:11.9.1' + implementation 'org.flywaydb:flyway-mysql:11.9.1' + + implementation 'io.micrometer:micrometer-registry-prometheus' + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +tasks.named('test') { + useJUnitPlatform() + outputs.dir snippetsDir +} + +asciidoctor { + attributes 'snippetsDir': snippetsDir + inputs.dir snippetsDir + dependsOn test +} - tasks.named('test') { - useJUnitPlatform() +bootJar { + dependsOn asciidoctor + from("${asciidoctor.outputDir}") { + into 'static/docs' } } diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index f3fb00c..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,15 +0,0 @@ -dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-redis' - implementation 'org.springframework.boot:spring-boot-starter-actuator' - implementation 'org.springframework.boot:spring-boot-starter-aop' - - implementation 'io.micrometer:micrometer-registry-prometheus' -} - -bootJar { - enabled = false -} - -jar { - enabled = true -} diff --git a/common/run-test-redis.sh b/common/run-test-redis.sh deleted file mode 100755 index ad4e473..0000000 --- a/common/run-test-redis.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -if ! docker ps --format '{{.Names}}' | grep -q '^payment-test-redis$'; then - echo "payment-test-redis 컨테이너가 실행 중이 아닙니다. docker compose -f test-docker-compose.yml up -d payment-test-redis로 시작합니다..." - docker compose -f "$(git rev-parse --show-toplevel)/test-docker-compose.yml" up -d payment-test-redis -else - echo "payment-test-redis 컨테이너가 이미 실행 중입니다." -fi - -# Redis Health check 대기 (최대 30초, 1초 간격) -echo "payment-test-redis 컨테이너의 Health check 상태 확인 중..." -for i in {1..30}; do - health_status=$(docker inspect --format='{{.State.Health.Status}}' payment-test-redis 2>/dev/null) - - if [ "$health_status" == "healthy" ]; then - echo "payment-test-redis 컨테이너가 healthy 상태입니다. 빌드를 시작합니다." - break - elif [ "$health_status" == "unhealthy" ]; then - echo "payment-test-redis 컨테이너가 unhealthy 상태입니다. 중단합니다." - exit 1 - else - echo "아직 healthy 아님 ($i초)..." - sleep 1 - fi - - if [ $i -eq 30 ]; then - echo "payment-test-redis 컨테이너가 30초 안에 healthy 상태가 되지 않았습니다. 중단합니다." - exit 1 - fi -done diff --git a/docker/dev/docker-compose-dev.yml b/docker/dev/docker-compose-dev.yml index 3ba255e..d202e83 100644 --- a/docker/dev/docker-compose-dev.yml +++ b/docker/dev/docker-compose-dev.yml @@ -21,33 +21,12 @@ services: networks: - dev-kokomen-net - kokomen-payment-dev-api: - image: samhap/kokomen-payment-api:dev - container_name: kokomen-payment-dev-api - restart: on-failure:3 - expose: - - 8080 - - 8001 - volumes: - - ./payment/api/app/logs:/logs - environment: - TZ: Asia/Seoul - JAVA_TOOL_OPTIONS: -Duser.timezone=Asia/Seoul - HOSTNAME: ${HOSTNAME} - SPRING_PROFILES_ACTIVE: dev - SPRING_DATASOURCE_URL_DEV: ${SPRING_DATASOURCE_URL_DEV} - SPRING_DATASOURCE_USERNAME_DEV: ${SPRING_DATASOURCE_USERNAME_DEV} - SPRING_DATASOURCE_PASSWORD_DEV: ${SPRING_DATASOURCE_PASSWORD_DEV} - networks: - - dev-kokomen-net - promtail-payment-dev: image: grafana/promtail container_name: promtail-payment-dev volumes: - ./promtail/promtail.yaml:/etc/promtail/promtail.yaml - ./payment/internal/app/logs:/logs/internal - - ./payment/api/app/logs:/logs/api - promtail-payment-tmp:/tmp command: - "-config.file=/etc/promtail/promtail.yaml" diff --git a/docker/dev/promtail/promtail.yaml b/docker/dev/promtail/promtail.yaml index c8b7143..f469b36 100644 --- a/docker/dev/promtail/promtail.yaml +++ b/docker/dev/promtail/promtail.yaml @@ -8,18 +8,6 @@ clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - - job_name: kokomen-payment-api-dev - static_configs: - - labels: - job: kokomen-payment-api - app: kokomen-payment-api - host: ${HOSTNAME} - __path__: /logs/api/app.log - pipeline_stages: - - regex: - expression: '\[.*?\] [\d\-:.\s]+ [^\[\]]+ \[.*?\]\s+(?P[A-Z]+)\s+[^\s]+' - - labels: - level: - job_name: kokomen-payment-internal-dev static_configs: - labels: diff --git a/docker/prod/docker-compose-prod.yml b/docker/prod/docker-compose-prod.yml index bd77ad4..219cade 100644 --- a/docker/prod/docker-compose-prod.yml +++ b/docker/prod/docker-compose-prod.yml @@ -1,23 +1,4 @@ services: - kokomen-payment-api: - image: samhap/kokomen-payment-api:prod - container_name: kokomen-payment-api - restart: on-failure:3 - expose: - - 8080 - ports: - - "8001:8001" - volumes: - - ./payment/api/logs:/logs - environment: - TZ: Asia/Seoul - JAVA_TOOL_OPTIONS: -Duser.timezone=Asia/Seoul - HOSTNAME: ${HOSTNAME} - SPRING_PROFILES_ACTIVE: prod - REDIS_PRIMARY_HOST_PROD: ${REDIS_PRIMARY_HOST_PROD} - SPRING_DATASOURCE_URL_PROD: ${SPRING_DATASOURCE_URL_PROD} - SPRING_DATASOURCE_USERNAME_PROD: ${SPRING_DATASOURCE_USERNAME_PROD} - SPRING_DATASOURCE_PASSWORD_PROD: ${SPRING_DATASOURCE_PASSWORD_PROD} kokomen-payment-internal: image: samhap/kokomen-payment-internal:prod @@ -48,7 +29,6 @@ services: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - - ./nginx/logs/api:/var/log/nginx/api - ./nginx/logs/internal:/var/log/nginx/internal restart: unless-stopped environment: @@ -59,7 +39,6 @@ services: container_name: promtail volumes: - ./promtail/promtail.yaml:/etc/promtail/promtail.yaml - - ./payment/api/logs:/logs/api - ./payment/internal/logs:/logs/internal - promtail-tmp:/tmp command: diff --git a/docker/prod/nginx/nginx.conf b/docker/prod/nginx/nginx.conf index 6dd79af..e2ed778 100644 --- a/docker/prod/nginx/nginx.conf +++ b/docker/prod/nginx/nginx.conf @@ -5,11 +5,6 @@ http { server_names_hash_bucket_size 128; # 서버 네임 길이 짧아서 안된다고함 - log_format api_log '$request_id $remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" "$request_time" ' - '"$http_user_agent" "$http_x_forwarded_for" ' - '"$ssl_protocol/$ssl_cipher" "$content_length" "$request_length"'; - log_format internal_log '$http_x_requestid $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" "$request_time" ' '"$http_user_agent" "$http_x_forwarded_for" ' @@ -22,28 +17,6 @@ http { return 404; } - server { - listen 80; - access_log /var/log/nginx/api/access.log api_log; - - set_real_ip_from 10.0.0.0/16; - set_real_ip_from 43.203.50.14; - real_ip_header X-Forwarded-For; - real_ip_recursive on; - - server_name payment-api.kokomen.kr; - server_tokens off; - - location / { - set $backend "kokomen-payment-api:8080"; - proxy_pass http://$backend; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-RequestID $request_id; - resolver 127.0.0.11 valid=5s; - } - } - server { listen 80; access_log /var/log/nginx/internal/access.log internal_log; diff --git a/docker/prod/promtail/promtail.yaml b/docker/prod/promtail/promtail.yaml index a820637..af3a0fe 100644 --- a/docker/prod/promtail/promtail.yaml +++ b/docker/prod/promtail/promtail.yaml @@ -8,18 +8,6 @@ clients: - url: http://10.0.1.196:3100/loki/api/v1/push scrape_configs: - - job_name: kokomen-payment-api - static_configs: - - labels: - job: kokomen-payment-api - app: kokomen-payment-api - host: ${HOSTNAME} - __path__: /logs/api/app.log - pipeline_stages: - - regex: - expression: '\[.*?\] [\d\-:.\s]+ [^\[\]]+ \[.*?\]\s+(?P[A-Z]+)\s+[^\s]+' - - labels: - level: - job_name: kokomen-payment-internal static_configs: - labels: diff --git a/domain/build.gradle b/domain/build.gradle deleted file mode 100644 index 9fb1470..0000000 --- a/domain/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -dependencies { - implementation project(':common') - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.flywaydb:flyway-core:11.9.1' - implementation 'org.flywaydb:flyway-mysql:11.9.1' - - runtimeOnly 'com.mysql:mysql-connector-j' -} - -bootJar { - enabled = false -} - -jar { - enabled = true -} diff --git a/domain/local-docker-compose.yml b/domain/local-docker-compose.yml deleted file mode 100644 index 38de7f0..0000000 --- a/domain/local-docker-compose.yml +++ /dev/null @@ -1,35 +0,0 @@ -volumes: - kokomen-payment-local-mysql-data: - -services: - # ✅ MySQL - kokomen-payment-local-mysql: - image: mysql:8.4.5 - container_name: kokomen-payment-local-mysql - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: kokomen-payment-local - TZ: Asia/Seoul - LANG: C.UTF-8 - MYSQL_INIT_CONNECT: "SET NAMES utf8mb4" - command: - [ - "mysqld", - "--character-set-server=utf8mb4", - "--collation-server=utf8mb4_general_ci" - ] - expose: - - 3306 - volumes: - - kokomen-payment-local-mysql-data:/var/lib/mysql - healthcheck: - test: [ "CMD", "mysql", "-u", "root", "-proot", "-e", "SELECT 1" ] - interval: 5s - retries: 10 - networks: - - local-kokomen-net - -networks: - local-kokomen-net: - external: true - driver: bridge diff --git a/domain/run-test-mysql.sh b/domain/run-test-mysql.sh deleted file mode 100755 index 73f0bcf..0000000 --- a/domain/run-test-mysql.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -if ! docker ps --format '{{.Names}}' | grep -q '^payment-test-mysql$'; then - echo "payment-test-mysql 컨테이너가 실행 중이 아닙니다. docker compose -f test-docker-compose.yml up -d payment-test-mysql로 시작합니다..." - docker compose -f "$(git rev-parse --show-toplevel)/test-docker-compose.yml" up -d payment-test-mysql -else - echo "payment-test-mysql 컨테이너가 이미 실행 중입니다." -fi - -# MySQL Health check 대기 (최대 30초, 1초 간격) -echo "payment-test-mysql 컨테이너의 Health check 상태 확인 중..." -for i in {1..30}; do - health_status=$(docker inspect --format='{{.State.Health.Status}}' payment-test-mysql 2>/dev/null) - - if [ "$health_status" == "healthy" ]; then - echo "payment-test-mysql 컨테이너가 healthy 상태입니다." - break - elif [ "$health_status" == "unhealthy" ]; then - echo "payment-test-mysql 컨테이너가 unhealthy 상태입니다. 중단합니다." - exit 1 - else - echo "아직 healthy 아님 ($i초)..." - sleep 1 - fi - - if [ $i -eq 30 ]; then - echo "payment-test-mysql 컨테이너가 30초 안에 healthy 상태가 되지 않았습니다. 중단합니다." - exit 1 - fi -done diff --git a/external/build.gradle b/external/build.gradle deleted file mode 100644 index b03b7e8..0000000 --- a/external/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -dependencies { - implementation project(':domain') - implementation project(':common') -// implementation 'org.springframework:spring-web' -// implementation 'org.springframework:spring-core' -// implementation 'org.springframework:spring-beans' -// implementation 'org.springframework:spring-context' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-aop' -} - -bootJar { - enabled = false -} - -jar { - enabled = true -} diff --git a/external/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java b/external/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java deleted file mode 100644 index 69d1d9f..0000000 --- a/external/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.samhap.kokomen.global.dto; - -public record ErrorResponse( - String message -) { -} diff --git a/external/src/main/java/com/samhap/kokomen/global/exception/ExternalErrorMessage.java b/external/src/main/java/com/samhap/kokomen/global/exception/ExternalErrorMessage.java deleted file mode 100644 index 4846793..0000000 --- a/external/src/main/java/com/samhap/kokomen/global/exception/ExternalErrorMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.samhap.kokomen.global.exception; - -import lombok.Getter; - -@Getter -public enum ExternalErrorMessage { - - INVALID_REQUEST("잘못된 요청입니다."), - MISSING_REQUEST_PARAMETER("필수 요청 파라미터가 누락되었습니다."), - INVALID_REQUEST_FORMAT("잘못된 요청 형식입니다. JSON 형식을 확인해주세요."), - JSON_PARSE_ERROR("JSON 파싱 오류: 유효하지 않은 값이 전달되었습니다."), - INTERNAL_SERVER_ERROR("서버에 문제가 발생하였습니다."); - - private final String message; - - ExternalErrorMessage(String message) { - this.message = message; - } -} diff --git a/external/src/main/java/com/samhap/kokomen/global/exception/HttpBadRequestErrorException.java b/external/src/main/java/com/samhap/kokomen/global/exception/HttpBadRequestErrorException.java deleted file mode 100644 index 7714a9a..0000000 --- a/external/src/main/java/com/samhap/kokomen/global/exception/HttpBadRequestErrorException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.samhap.kokomen.global.exception; - -public class HttpBadRequestErrorException extends BadRequestException { - - public HttpBadRequestErrorException(String message) { - super(message); - } -} diff --git a/external/src/main/java/com/samhap/kokomen/global/exception/HttpInternalServerErrorException.java b/external/src/main/java/com/samhap/kokomen/global/exception/HttpInternalServerErrorException.java deleted file mode 100644 index d1e0c26..0000000 --- a/external/src/main/java/com/samhap/kokomen/global/exception/HttpInternalServerErrorException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.samhap.kokomen.global.exception; - -public class HttpInternalServerErrorException extends RuntimeException { - - public HttpInternalServerErrorException(String message) { - super(message); - } -} diff --git a/external/src/main/resources/application-external-test.yml b/external/src/main/resources/application-external-test.yml deleted file mode 100644 index 9a91dfe..0000000 --- a/external/src/main/resources/application-external-test.yml +++ /dev/null @@ -1,12 +0,0 @@ -#spring: -# datasource: -# url: jdbc:mysql://localhost:13308/kokomen-payment-test?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 -# driver-class-name: com.mysql.cj.jdbc.Driver -# username: root -# password: root -# jpa: -# hibernate: -# ddl-auto: none -# show-sql: true -# database-platform: org.hibernate.dialect.MySQL8Dialect -# diff --git a/internal/Dockerfile b/internal/Dockerfile deleted file mode 100644 index 7e66657..0000000 --- a/internal/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM amazoncorretto:17 - -COPY build/libs/*SNAPSHOT.jar /app.jar - -ENTRYPOINT ["java", "-jar", "/app.jar"] diff --git a/internal/build.gradle b/internal/build.gradle deleted file mode 100644 index 8b75b39..0000000 --- a/internal/build.gradle +++ /dev/null @@ -1,40 +0,0 @@ -plugins { - id 'org.asciidoctor.jvm.convert' version '3.3.2' -} - -ext { - set('snippetsDir', file("build/generated-snippets")) -} - -dependencies { - implementation project(':domain') - implementation project(':common') - implementation project(':external') - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.retry:spring-retry' - - runtimeOnly 'com.mysql:mysql-connector-j' - - testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' -} - -tasks.named('test') { - useJUnitPlatform() - outputs.dir snippetsDir -} - -asciidoctor { - attributes 'snippetsDir': snippetsDir - inputs.dir snippetsDir - dependsOn test -} - -bootJar { - dependsOn asciidoctor - from("${asciidoctor.outputDir}") { - into 'static/docs' - } -} diff --git a/internal/src/main/java/com/samhap/kokomen/KokomenPaymentInternalApplication.java b/internal/src/main/java/com/samhap/kokomen/KokomenPaymentInternalApplication.java deleted file mode 100644 index 95dab19..0000000 --- a/internal/src/main/java/com/samhap/kokomen/KokomenPaymentInternalApplication.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.samhap.kokomen; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; - -@EnableJpaAuditing -@SpringBootApplication -public class KokomenPaymentInternalApplication { - - public static void main(String[] args) { - SpringApplication.run(KokomenPaymentInternalApplication.class, args); - - } -} diff --git a/internal/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java b/internal/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java deleted file mode 100644 index 6aaeaae..0000000 --- a/internal/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.samhap.kokomen.global.exception; - -import com.samhap.kokomen.global.dto.ErrorResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.support.DefaultMessageSourceResolvable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.web.HttpMediaTypeNotSupportedException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -@Slf4j -@RestControllerAdvice -public class GlobalExceptionHandler { - - @ExceptionHandler(KokomenException.class) - public ResponseEntity handleKokomenException(KokomenException e) { - log.warn("KokomenException :: status: {}, message: {}", e.getHttpStatusCode(), e.getMessage()); - return ResponseEntity.status(e.getHttpStatusCode()) - .body(new ErrorResponse(e.getMessage())); - } - - @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - String defaultErrorMessageForUser = PaymentServiceErrorMessage.INVALID_REQUEST.getMessage(); - String message = e.getBindingResult() - .getFieldErrors() - .stream() - .findFirst() - .map(DefaultMessageSourceResolvable::getDefaultMessage) - .orElse(defaultErrorMessageForUser); - - if (message.equals(defaultErrorMessageForUser)) { - log.warn("MethodArgumentNotValidException :: message: {}", e.getMessage()); - } else { - log.warn("MethodArgumentNotValidException :: message: {}", message); - } - - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(message)); - } - - @ExceptionHandler(HttpMessageNotReadableException.class) - public ResponseEntity handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { - log.warn("HttpMessageNotReadableException :: message: {}", e.getMessage()); - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(PaymentServiceErrorMessage.INVALID_REQUEST_FORMAT.getMessage())); - } - - @ExceptionHandler(HttpMediaTypeNotSupportedException.class) - public ResponseEntity handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e) { - log.warn("HttpMediaTypeNotSupportedException :: message: {}", e.getMessage()); - return ResponseEntity.status(HttpStatus.UNSUPPORTED_MEDIA_TYPE) - .body(new ErrorResponse(e.getMessage())); - } - - @ExceptionHandler(Exception.class) - public ResponseEntity handleException(Exception e) { - log.error("Exception :: status: {}, message: {}, stackTrace: ", HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse(PaymentServiceErrorMessage.INTERNAL_SERVER_ERROR.getMessage())); - } -} diff --git a/internal/src/test/java/com/samhap/kokomen/KokomenPaymentInternalApplicationTests.java b/internal/src/test/java/com/samhap/kokomen/KokomenPaymentInternalApplicationTests.java deleted file mode 100644 index df1146e..0000000 --- a/internal/src/test/java/com/samhap/kokomen/KokomenPaymentInternalApplicationTests.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.samhap.kokomen; - -import com.samhap.kokomen.global.BaseTest; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class KokomenPaymentInternalApplicationTests extends BaseTest { - - @Test - void contextLoads() { - } - -} diff --git a/internal/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java b/internal/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java deleted file mode 100644 index 9db2dd5..0000000 --- a/internal/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.samhap.kokomen.global; - -import jakarta.annotation.PostConstruct; -import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import jakarta.persistence.metamodel.EntityType; -import java.util.List; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -@Component -public class MySQLDatabaseCleaner { - - public static final String CAMEL_CASE = "([a-z])([A-Z])"; - public static final String SNAKE_CASE = "$1_$2"; - - @PersistenceContext - private EntityManager entityManager; - - private List tableNames; - - @PostConstruct - public void findTableNames() { - tableNames = entityManager.getMetamodel().getEntities().stream() - .filter(e -> e.getJavaType().getAnnotation(Entity.class) != null) - .map(MySQLDatabaseCleaner::convertCamelToSnake) - .toList(); - } - - private static String convertCamelToSnake(final EntityType e) { - return e.getName() - .replaceAll(CAMEL_CASE, SNAKE_CASE) - .toLowerCase(); - } - - @Transactional - public void executeTruncate() { - entityManager.flush(); - entityManager.clear(); - - disableIntegrity(); - for (String tableName : tableNames) { - truncateTable(tableName); - resetAutoIncrement(tableName); - } - enableIntegrity(); - } - - private void disableIntegrity() { - entityManager.createNativeQuery("SET FOREIGN_KEY_CHECKS = 0") - .executeUpdate(); - } - - private void truncateTable(final String tableName) { - entityManager.createNativeQuery(String.format("TRUNCATE TABLE %s", tableName)) - .executeUpdate(); - } - - private void resetAutoIncrement(final String tableName) { - entityManager.createNativeQuery(String.format("ALTER TABLE %s AUTO_INCREMENT = 1", tableName)) - .executeUpdate(); - } - - private void enableIntegrity() { - entityManager.createNativeQuery("SET FOREIGN_KEY_CHECKS = 1") - .executeUpdate(); - } -} diff --git a/internal/local-internal-docker-compose.yml b/local-internal-docker-compose.yml similarity index 100% rename from internal/local-internal-docker-compose.yml rename to local-internal-docker-compose.yml diff --git a/internal/run-local-internal.sh b/run-local-internal.sh similarity index 59% rename from internal/run-local-internal.sh rename to run-local-internal.sh index 898c54f..98e8669 100755 --- a/internal/run-local-internal.sh +++ b/run-local-internal.sh @@ -5,10 +5,8 @@ set -e # 현재 쉘 스크립트 파일의 디렉토리로 이동 cd "$(dirname "$0")" -cd ../domain - -chmod +x run-test-mysql.sh -./run-test-mysql.sh +# 테스트 컨테이너 실행 (MySQL + Redis) +docker compose -f test-docker-compose.yml up -d # 도커 네트워크 생성 NETWORK_NAME="local-kokomen-net" @@ -20,13 +18,7 @@ else echo "Docker network '$NETWORK_NAME' already exists. Skipping." fi -# 도메인 도커 컴포즈 실행 -docker compose -f ../domain/local-docker-compose.yml up -d - -../gradlew clean :internal:build +./gradlew clean build -# 로컬 도커 컴포즈 실행 -# 실행 전에 헬스 체크 필요 -cd ../internal -docker rm -f kokomen-payment-local-internal +docker rm -f kokomen-payment-local-internal || true docker compose -f local-internal-docker-compose.yml up --build -d diff --git a/settings.gradle b/settings.gradle index 75e11f0..dcbee9d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1 @@ rootProject.name = 'kokomen-payment' - -include 'common' -include 'domain' -include 'api' -include 'internal' -include 'external' diff --git a/internal/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc similarity index 100% rename from internal/src/docs/asciidoc/index.adoc rename to src/docs/asciidoc/index.adoc diff --git a/api/src/main/java/com/samhap/kokomen/KokomenPaymentApiApplication.java b/src/main/java/com/samhap/kokomen/KokomenPaymentApplication.java similarity index 73% rename from api/src/main/java/com/samhap/kokomen/KokomenPaymentApiApplication.java rename to src/main/java/com/samhap/kokomen/KokomenPaymentApplication.java index 039f603..9c7e4b1 100644 --- a/api/src/main/java/com/samhap/kokomen/KokomenPaymentApiApplication.java +++ b/src/main/java/com/samhap/kokomen/KokomenPaymentApplication.java @@ -6,10 +6,10 @@ @EnableJpaAuditing @SpringBootApplication -public class KokomenPaymentApiApplication { +public class KokomenPaymentApplication { public static void main(String[] args) { - SpringApplication.run(KokomenPaymentApiApplication.class, args); - } + SpringApplication.run(KokomenPaymentApplication.class, args); + } } diff --git a/common/src/main/java/com/samhap/kokomen/global/annotation/ExecutionTimer.java b/src/main/java/com/samhap/kokomen/global/annotation/ExecutionTimer.java similarity index 100% rename from common/src/main/java/com/samhap/kokomen/global/annotation/ExecutionTimer.java rename to src/main/java/com/samhap/kokomen/global/annotation/ExecutionTimer.java diff --git a/common/src/main/java/com/samhap/kokomen/global/aop/ExecutionTimerAspect.java b/src/main/java/com/samhap/kokomen/global/aop/ExecutionTimerAspect.java similarity index 100% rename from common/src/main/java/com/samhap/kokomen/global/aop/ExecutionTimerAspect.java rename to src/main/java/com/samhap/kokomen/global/aop/ExecutionTimerAspect.java diff --git a/external/src/main/java/com/samhap/kokomen/global/aop/TosspaymentsLoggingAspect.java b/src/main/java/com/samhap/kokomen/global/aop/TosspaymentsLoggingAspect.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/global/aop/TosspaymentsLoggingAspect.java rename to src/main/java/com/samhap/kokomen/global/aop/TosspaymentsLoggingAspect.java diff --git a/common/src/main/java/com/samhap/kokomen/global/config/RedisSingleNodeConfig.java b/src/main/java/com/samhap/kokomen/global/config/RedisSingleNodeConfig.java similarity index 100% rename from common/src/main/java/com/samhap/kokomen/global/config/RedisSingleNodeConfig.java rename to src/main/java/com/samhap/kokomen/global/config/RedisSingleNodeConfig.java diff --git a/internal/src/main/java/com/samhap/kokomen/global/config/RetryConfig.java b/src/main/java/com/samhap/kokomen/global/config/RetryConfig.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/global/config/RetryConfig.java rename to src/main/java/com/samhap/kokomen/global/config/RetryConfig.java diff --git a/internal/src/main/java/com/samhap/kokomen/global/config/TosspaymentsConfirmRetryPolicy.java b/src/main/java/com/samhap/kokomen/global/config/TosspaymentsConfirmRetryPolicy.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/global/config/TosspaymentsConfirmRetryPolicy.java rename to src/main/java/com/samhap/kokomen/global/config/TosspaymentsConfirmRetryPolicy.java diff --git a/domain/src/main/java/com/samhap/kokomen/global/domain/BaseEntity.java b/src/main/java/com/samhap/kokomen/global/domain/BaseEntity.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/global/domain/BaseEntity.java rename to src/main/java/com/samhap/kokomen/global/domain/BaseEntity.java diff --git a/internal/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java b/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java rename to src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java diff --git a/common/src/main/java/com/samhap/kokomen/global/exception/BadRequestException.java b/src/main/java/com/samhap/kokomen/global/exception/BadRequestException.java similarity index 100% rename from common/src/main/java/com/samhap/kokomen/global/exception/BadRequestException.java rename to src/main/java/com/samhap/kokomen/global/exception/BadRequestException.java diff --git a/common/src/main/java/com/samhap/kokomen/global/exception/ForbiddenException.java b/src/main/java/com/samhap/kokomen/global/exception/ForbiddenException.java similarity index 100% rename from common/src/main/java/com/samhap/kokomen/global/exception/ForbiddenException.java rename to src/main/java/com/samhap/kokomen/global/exception/ForbiddenException.java diff --git a/external/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java b/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java similarity index 77% rename from external/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java rename to src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java index 4d4b92a..cb803a5 100644 --- a/external/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java @@ -7,6 +7,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.HttpMediaTypeNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -25,7 +26,7 @@ public ResponseEntity handleKokomenException(KokomenException e) @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - String defaultErrorMessageForUser = ExternalErrorMessage.INVALID_REQUEST.getMessage(); + String defaultErrorMessageForUser = PaymentServiceErrorMessage.INVALID_REQUEST.getMessage(); String message = e.getBindingResult() .getFieldErrors() .stream() @@ -43,14 +44,6 @@ public ResponseEntity handleMethodArgumentNotValidException(Metho .body(new ErrorResponse(message)); } - @ExceptionHandler(MissingServletRequestParameterException.class) - public ResponseEntity handleMissingServletRequestParameterException( - MissingServletRequestParameterException e) { - log.warn("MissingServletRequestParameterException :: parameterName: {}", e.getParameterName()); - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(ExternalErrorMessage.MISSING_REQUEST_PARAMETER.getMessage())); - } - @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { if (e.getCause() instanceof InvalidFormatException invalidFormatException) { @@ -58,12 +51,28 @@ public ResponseEntity handleHttpMessageNotReadableException(HttpM String invalidValue = String.valueOf(invalidFormatException.getValue()); log.warn("HttpMessageNotReadableException :: fieldName: {}, invalidValue: {}", fieldName, invalidValue); return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(ExternalErrorMessage.JSON_PARSE_ERROR.getMessage())); + .body(new ErrorResponse(PaymentServiceErrorMessage.JSON_PARSE_ERROR.getMessage())); } log.warn("HttpMessageNotReadableException :: message: {}", e.getMessage()); return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(ExternalErrorMessage.INVALID_REQUEST_FORMAT.getMessage())); + .body(new ErrorResponse(PaymentServiceErrorMessage.INVALID_REQUEST_FORMAT.getMessage())); + } + + @ExceptionHandler(HttpMediaTypeNotSupportedException.class) + public ResponseEntity handleHttpMediaTypeNotSupportedException( + HttpMediaTypeNotSupportedException e) { + log.warn("HttpMediaTypeNotSupportedException :: message: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.UNSUPPORTED_MEDIA_TYPE) + .body(new ErrorResponse(e.getMessage())); + } + + @ExceptionHandler(MissingServletRequestParameterException.class) + public ResponseEntity handleMissingServletRequestParameterException( + MissingServletRequestParameterException e) { + log.warn("MissingServletRequestParameterException :: parameterName: {}", e.getParameterName()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(new ErrorResponse(PaymentServiceErrorMessage.MISSING_REQUEST_PARAMETER.getMessage())); } @ExceptionHandler(Exception.class) @@ -71,6 +80,6 @@ public ResponseEntity handleException(Exception e) { log.error("Exception :: status: {}, message: {}, stackTrace: ", HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage(), e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(new ErrorResponse(ExternalErrorMessage.INTERNAL_SERVER_ERROR.getMessage())); + .body(new ErrorResponse(PaymentServiceErrorMessage.INTERNAL_SERVER_ERROR.getMessage())); } } diff --git a/common/src/main/java/com/samhap/kokomen/global/exception/InternalServerErrorException.java b/src/main/java/com/samhap/kokomen/global/exception/InternalServerErrorException.java similarity index 100% rename from common/src/main/java/com/samhap/kokomen/global/exception/InternalServerErrorException.java rename to src/main/java/com/samhap/kokomen/global/exception/InternalServerErrorException.java diff --git a/common/src/main/java/com/samhap/kokomen/global/exception/KokomenException.java b/src/main/java/com/samhap/kokomen/global/exception/KokomenException.java similarity index 100% rename from common/src/main/java/com/samhap/kokomen/global/exception/KokomenException.java rename to src/main/java/com/samhap/kokomen/global/exception/KokomenException.java diff --git a/common/src/main/java/com/samhap/kokomen/global/exception/NotFoundException.java b/src/main/java/com/samhap/kokomen/global/exception/NotFoundException.java similarity index 100% rename from common/src/main/java/com/samhap/kokomen/global/exception/NotFoundException.java rename to src/main/java/com/samhap/kokomen/global/exception/NotFoundException.java diff --git a/internal/src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java b/src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java similarity index 84% rename from internal/src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java rename to src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java index 16095e2..9f66fe0 100644 --- a/internal/src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java +++ b/src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java @@ -5,6 +5,8 @@ @Getter public enum PaymentServiceErrorMessage { + MISSING_REQUEST_PARAMETER("필수 요청 파라미터가 누락되었습니다."), + JSON_PARSE_ERROR("JSON 파싱 오류: 유효하지 않은 값이 전달되었습니다."), PAYMENT_NOT_FOUND_BY_ID("해당 id의 결제 정보가 존재하지 않습니다."), PAYMENT_NOT_FOUND_BY_PAYMENT_KEY("해당 paymentKey의 결제 정보가 존재하지 않습니다."), PAYMENT_RESULT_NOT_FOUND("해당 결제의 결과 정보가 존재하지 않습니다."), diff --git a/common/src/main/java/com/samhap/kokomen/global/exception/UnauthorizedException.java b/src/main/java/com/samhap/kokomen/global/exception/UnauthorizedException.java similarity index 100% rename from common/src/main/java/com/samhap/kokomen/global/exception/UnauthorizedException.java rename to src/main/java/com/samhap/kokomen/global/exception/UnauthorizedException.java diff --git a/external/src/main/java/com/samhap/kokomen/global/infrastructure/ObjectToStringDeserializer.java b/src/main/java/com/samhap/kokomen/global/infrastructure/ObjectToStringDeserializer.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/global/infrastructure/ObjectToStringDeserializer.java rename to src/main/java/com/samhap/kokomen/global/infrastructure/ObjectToStringDeserializer.java diff --git a/internal/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java b/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java rename to src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/controller/PaymentController.java b/src/main/java/com/samhap/kokomen/payment/controller/PaymentController.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/controller/PaymentController.java rename to src/main/java/com/samhap/kokomen/payment/controller/PaymentController.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/controller/PaymentTestController.java b/src/main/java/com/samhap/kokomen/payment/controller/PaymentTestController.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/controller/PaymentTestController.java rename to src/main/java/com/samhap/kokomen/payment/controller/PaymentTestController.java diff --git a/domain/src/main/java/com/samhap/kokomen/payment/domain/PaymentErrorMessage.java b/src/main/java/com/samhap/kokomen/payment/domain/PaymentErrorMessage.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/payment/domain/PaymentErrorMessage.java rename to src/main/java/com/samhap/kokomen/payment/domain/PaymentErrorMessage.java diff --git a/domain/src/main/java/com/samhap/kokomen/payment/domain/PaymentState.java b/src/main/java/com/samhap/kokomen/payment/domain/PaymentState.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/payment/domain/PaymentState.java rename to src/main/java/com/samhap/kokomen/payment/domain/PaymentState.java diff --git a/domain/src/main/java/com/samhap/kokomen/payment/domain/PaymentType.java b/src/main/java/com/samhap/kokomen/payment/domain/PaymentType.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/payment/domain/PaymentType.java rename to src/main/java/com/samhap/kokomen/payment/domain/PaymentType.java diff --git a/domain/src/main/java/com/samhap/kokomen/payment/domain/ServiceType.java b/src/main/java/com/samhap/kokomen/payment/domain/ServiceType.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/payment/domain/ServiceType.java rename to src/main/java/com/samhap/kokomen/payment/domain/ServiceType.java diff --git a/domain/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPayment.java b/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPayment.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPayment.java rename to src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPayment.java diff --git a/domain/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResult.java b/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResult.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResult.java rename to src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResult.java diff --git a/domain/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsStatus.java b/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsStatus.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsStatus.java rename to src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsStatus.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/TossPaymentsClientBuilder.java b/src/main/java/com/samhap/kokomen/payment/external/TossPaymentsClientBuilder.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/TossPaymentsClientBuilder.java rename to src/main/java/com/samhap/kokomen/payment/external/TossPaymentsClientBuilder.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/TosspaymentsClient.java b/src/main/java/com/samhap/kokomen/payment/external/TosspaymentsClient.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/TosspaymentsClient.java rename to src/main/java/com/samhap/kokomen/payment/external/TosspaymentsClient.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/TosspaymentsInternalServerErrorCode.java b/src/main/java/com/samhap/kokomen/payment/external/TosspaymentsInternalServerErrorCode.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/TosspaymentsInternalServerErrorCode.java rename to src/main/java/com/samhap/kokomen/payment/external/TosspaymentsInternalServerErrorCode.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/dto/Checkout.java b/src/main/java/com/samhap/kokomen/payment/external/dto/Checkout.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/dto/Checkout.java rename to src/main/java/com/samhap/kokomen/payment/external/dto/Checkout.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/dto/EasyPay.java b/src/main/java/com/samhap/kokomen/payment/external/dto/EasyPay.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/dto/EasyPay.java rename to src/main/java/com/samhap/kokomen/payment/external/dto/EasyPay.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/dto/Failure.java b/src/main/java/com/samhap/kokomen/payment/external/dto/Failure.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/dto/Failure.java rename to src/main/java/com/samhap/kokomen/payment/external/dto/Failure.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/dto/Receipt.java b/src/main/java/com/samhap/kokomen/payment/external/dto/Receipt.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/dto/Receipt.java rename to src/main/java/com/samhap/kokomen/payment/external/dto/Receipt.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/dto/TossDateTimeDeserializer.java b/src/main/java/com/samhap/kokomen/payment/external/dto/TossDateTimeDeserializer.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/dto/TossDateTimeDeserializer.java rename to src/main/java/com/samhap/kokomen/payment/external/dto/TossDateTimeDeserializer.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsCancel.java b/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsCancel.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsCancel.java rename to src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsCancel.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsConfirmRequest.java b/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsConfirmRequest.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsConfirmRequest.java rename to src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsConfirmRequest.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentCancelRequest.java b/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentCancelRequest.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentCancelRequest.java rename to src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentCancelRequest.java diff --git a/external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentResponse.java b/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentResponse.java similarity index 100% rename from external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentResponse.java rename to src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentResponse.java diff --git a/domain/src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepository.java b/src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepository.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepository.java rename to src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepository.java diff --git a/domain/src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentResultRepository.java b/src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentResultRepository.java similarity index 100% rename from domain/src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentResultRepository.java rename to src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentResultRepository.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/PaymentFacadeService.java b/src/main/java/com/samhap/kokomen/payment/service/PaymentFacadeService.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/PaymentFacadeService.java rename to src/main/java/com/samhap/kokomen/payment/service/PaymentFacadeService.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentResultService.java b/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentResultService.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentResultService.java rename to src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentResultService.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentService.java b/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentService.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentService.java rename to src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentService.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionService.java b/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionService.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionService.java rename to src/main/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionService.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/dto/CancelRequest.java b/src/main/java/com/samhap/kokomen/payment/service/dto/CancelRequest.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/dto/CancelRequest.java rename to src/main/java/com/samhap/kokomen/payment/service/dto/CancelRequest.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/dto/Checkout.java b/src/main/java/com/samhap/kokomen/payment/service/dto/Checkout.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/dto/Checkout.java rename to src/main/java/com/samhap/kokomen/payment/service/dto/Checkout.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/dto/ConfirmRequest.java b/src/main/java/com/samhap/kokomen/payment/service/dto/ConfirmRequest.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/dto/ConfirmRequest.java rename to src/main/java/com/samhap/kokomen/payment/service/dto/ConfirmRequest.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/dto/EasyPay.java b/src/main/java/com/samhap/kokomen/payment/service/dto/EasyPay.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/dto/EasyPay.java rename to src/main/java/com/samhap/kokomen/payment/service/dto/EasyPay.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/dto/Failure.java b/src/main/java/com/samhap/kokomen/payment/service/dto/Failure.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/dto/Failure.java rename to src/main/java/com/samhap/kokomen/payment/service/dto/Failure.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/dto/PaymentResponse.java b/src/main/java/com/samhap/kokomen/payment/service/dto/PaymentResponse.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/dto/PaymentResponse.java rename to src/main/java/com/samhap/kokomen/payment/service/dto/PaymentResponse.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/dto/Receipt.java b/src/main/java/com/samhap/kokomen/payment/service/dto/Receipt.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/dto/Receipt.java rename to src/main/java/com/samhap/kokomen/payment/service/dto/Receipt.java diff --git a/internal/src/main/java/com/samhap/kokomen/payment/service/dto/TosspaymentsCancel.java b/src/main/java/com/samhap/kokomen/payment/service/dto/TosspaymentsCancel.java similarity index 100% rename from internal/src/main/java/com/samhap/kokomen/payment/service/dto/TosspaymentsCancel.java rename to src/main/java/com/samhap/kokomen/payment/service/dto/TosspaymentsCancel.java diff --git a/common/src/main/resources/application-common.yml b/src/main/resources/application-common.yml similarity index 100% rename from common/src/main/resources/application-common.yml rename to src/main/resources/application-common.yml diff --git a/domain/src/main/resources/application-domain.yml b/src/main/resources/application-domain.yml similarity index 100% rename from domain/src/main/resources/application-domain.yml rename to src/main/resources/application-domain.yml diff --git a/external/src/main/resources/application-external.yml b/src/main/resources/application-external.yml similarity index 100% rename from external/src/main/resources/application-external.yml rename to src/main/resources/application-external.yml diff --git a/internal/src/main/resources/application.yml b/src/main/resources/application.yml similarity index 95% rename from internal/src/main/resources/application.yml rename to src/main/resources/application.yml index 26d54e7..7f90b7c 100644 --- a/internal/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,7 +4,7 @@ management: port: 8000 spring: application: - name: kokomen-payment-internal + name: kokomen-payment profiles: include: - domain diff --git a/domain/src/main/resources/db/migration/V1__create_tosspayments_tables.sql b/src/main/resources/db/migration/V1__create_tosspayments_tables.sql similarity index 100% rename from domain/src/main/resources/db/migration/V1__create_tosspayments_tables.sql rename to src/main/resources/db/migration/V1__create_tosspayments_tables.sql diff --git a/domain/src/main/resources/db/migration/V2__add_service_type_and_failure_message_column.sql b/src/main/resources/db/migration/V2__add_service_type_and_failure_message_column.sql similarity index 100% rename from domain/src/main/resources/db/migration/V2__add_service_type_and_failure_message_column.sql rename to src/main/resources/db/migration/V2__add_service_type_and_failure_message_column.sql diff --git a/domain/src/main/resources/db/migration/V3__add_cancel_columns.sql b/src/main/resources/db/migration/V3__add_cancel_columns.sql similarity index 100% rename from domain/src/main/resources/db/migration/V3__add_cancel_columns.sql rename to src/main/resources/db/migration/V3__add_cancel_columns.sql diff --git a/common/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml similarity index 100% rename from common/src/main/resources/logback-spring.xml rename to src/main/resources/logback-spring.xml diff --git a/internal/src/main/resources/templates/payment-fail.html b/src/main/resources/templates/payment-fail.html similarity index 100% rename from internal/src/main/resources/templates/payment-fail.html rename to src/main/resources/templates/payment-fail.html diff --git a/internal/src/main/resources/templates/payment-refund.html b/src/main/resources/templates/payment-refund.html similarity index 100% rename from internal/src/main/resources/templates/payment-refund.html rename to src/main/resources/templates/payment-refund.html diff --git a/internal/src/main/resources/templates/payment-success.html b/src/main/resources/templates/payment-success.html similarity index 100% rename from internal/src/main/resources/templates/payment-success.html rename to src/main/resources/templates/payment-success.html diff --git a/internal/src/main/resources/templates/payment-test.html b/src/main/resources/templates/payment-test.html similarity index 100% rename from internal/src/main/resources/templates/payment-test.html rename to src/main/resources/templates/payment-test.html diff --git a/api/src/test/java/com/samhap/kokomen/KokomenPaymentApiApplicationTests.java b/src/test/java/com/samhap/kokomen/KokomenPaymentApplicationTests.java similarity index 79% rename from api/src/test/java/com/samhap/kokomen/KokomenPaymentApiApplicationTests.java rename to src/test/java/com/samhap/kokomen/KokomenPaymentApplicationTests.java index a910542..61b4d2f 100644 --- a/api/src/test/java/com/samhap/kokomen/KokomenPaymentApiApplicationTests.java +++ b/src/test/java/com/samhap/kokomen/KokomenPaymentApplicationTests.java @@ -5,7 +5,7 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class KokomenPaymentApiApplicationTests extends BaseTest { +class KokomenPaymentApplicationTests extends BaseTest { @Test void contextLoads() { diff --git a/internal/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java b/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java similarity index 100% rename from internal/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java rename to src/test/java/com/samhap/kokomen/global/BaseControllerTest.java diff --git a/internal/src/test/java/com/samhap/kokomen/global/BaseTest.java b/src/test/java/com/samhap/kokomen/global/BaseTest.java similarity index 100% rename from internal/src/test/java/com/samhap/kokomen/global/BaseTest.java rename to src/test/java/com/samhap/kokomen/global/BaseTest.java diff --git a/api/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java b/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java similarity index 100% rename from api/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java rename to src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java diff --git a/internal/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java b/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java similarity index 100% rename from internal/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java rename to src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java diff --git a/internal/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java b/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java similarity index 100% rename from internal/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java rename to src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java diff --git a/internal/src/test/java/com/samhap/kokomen/payment/controller/PaymentControllerTest.java b/src/test/java/com/samhap/kokomen/payment/controller/PaymentControllerTest.java similarity index 100% rename from internal/src/test/java/com/samhap/kokomen/payment/controller/PaymentControllerTest.java rename to src/test/java/com/samhap/kokomen/payment/controller/PaymentControllerTest.java diff --git a/domain/src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResultTest.java b/src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResultTest.java similarity index 100% rename from domain/src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResultTest.java rename to src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResultTest.java diff --git a/domain/src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentTest.java b/src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentTest.java similarity index 100% rename from domain/src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentTest.java rename to src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentTest.java diff --git a/internal/src/test/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepositoryTest.java b/src/test/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepositoryTest.java similarity index 100% rename from internal/src/test/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepositoryTest.java rename to src/test/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepositoryTest.java diff --git a/internal/src/test/java/com/samhap/kokomen/payment/service/PaymentFacadeServiceTest.java b/src/test/java/com/samhap/kokomen/payment/service/PaymentFacadeServiceTest.java similarity index 100% rename from internal/src/test/java/com/samhap/kokomen/payment/service/PaymentFacadeServiceTest.java rename to src/test/java/com/samhap/kokomen/payment/service/PaymentFacadeServiceTest.java diff --git a/internal/src/test/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionServiceTest.java b/src/test/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionServiceTest.java similarity index 100% rename from internal/src/test/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionServiceTest.java rename to src/test/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionServiceTest.java diff --git a/common/src/main/resources/application-common-test.yml b/src/test/resources/application-common-test.yml similarity index 100% rename from common/src/main/resources/application-common-test.yml rename to src/test/resources/application-common-test.yml diff --git a/domain/src/main/resources/application-domain-test.yml b/src/test/resources/application-domain-test.yml similarity index 100% rename from domain/src/main/resources/application-domain-test.yml rename to src/test/resources/application-domain-test.yml diff --git a/internal/src/test/resources/application.yml b/src/test/resources/application.yml similarity index 93% rename from internal/src/test/resources/application.yml rename to src/test/resources/application.yml index 402f876..3d759fc 100644 --- a/internal/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -3,7 +3,6 @@ spring: include: - domain-test - common-test - - external-test main: lazy-initialization: true jackson: