diff --git a/.github/scripts/generate-coverage-badge.sh b/.github/scripts/generate-coverage-badge.sh new file mode 100644 index 00000000..120dde48 --- /dev/null +++ b/.github/scripts/generate-coverage-badge.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +set -e + +REPORT_FILE="build/reports/jacoco/test/jacocoTestReport.xml" +BADGE_FILE="badges/coverage.svg" + +mkdir -p badges + +if [ ! -f "$REPORT_FILE" ]; then + echo "❌ Report not found: $REPORT_FILE" + exit 1 +fi + +# awk로 missed, covered 값 추출 +read missed covered < <(awk -F'"' '/= 90" | bc -l) )); then + color="4c1" # brightgreen +elif (( $(echo "$percent >= 75" | bc -l) )); then + color="dfb317" # yellow +else + color="e05d44" # red +fi + +# SVG badge 생성 +cat > "$BADGE_FILE" < + + + + + + + + + + + + + + coverage + coverage + ${percent}% + ${percent}% + + +EOF + +echo "✅ Coverage badge generated: ${percent}% -> $BADGE_FILE" diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml new file mode 100644 index 00000000..0d8b6c67 --- /dev/null +++ b/.github/workflows/pr-ci.yml @@ -0,0 +1,87 @@ +name: Spring CI for Pull Request + +on: + pull_request: + branches: [ main, dev ] + types: [opened, synchronize, reopened] + +permissions: + contents: write + pull-requests: write + +jobs: + build-and-test: + name: Build, Test, and Coverage + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Grant execute permission for gradlew + run: chmod +x ./gradlew + + - name: Run Tests and Generate Coverage + run: ./gradlew clean test jacocoTestReport --no-daemon + + - name: Upload Test Report + uses: actions/upload-artifact@v4 + with: + name: test-report + path: build/reports/tests/test/ + + - name: Upload Coverage Report + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: build/reports/jacoco/test/html/ + + - name: Extract JaCoCo Coverage Percentage + id: coverage + run: | + xml_file="build/reports/jacoco/test/jacocoTestReport.xml" + + missed=$(awk -F'"' '/> "$GITHUB_OUTPUT" + + - name: Comment PR with Test and Coverage Result + if: always() + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: test-results + message: | + ### ✅ 테스트 결과 for PR + **Build:** ${{ job.status }} + + 🧪 테스트 실행 with Gradle + 📈 **Coverage:** `${{ steps.jacoco.outputs.COVERAGE }}%` + + 📁 [Test Report](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) + 📁 [Coverage Report (HTML)](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) + + - name: Fail PR if tests fail + if: failure() + run: | + echo "❌ Tests failed. Please fix them before merging." + exit 1 + - name: Generate Coverage Badge + run: | + chmod +x .github/scripts/generate-coverage-badge.sh + .github/scripts/generate-coverage-badge.sh + + - name: Commit & Push Coverage Badge + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore: update coverage badge" + file_pattern: badges/coverage.svg diff --git a/README.md b/README.md index 8cb553cd..38c69c77 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🎮 마비노기 경매장 거래 내역 조회 및 통계 서비스 -[![Coverage](https://img.shields.io/codecov/c/github/devnogi/open-api-batch-server/main)](https://codecov.io/gh/devnogi/open-api-batch-server) +![Coverage](https://github.com/devnogi/open-api-batch-server/dev/badges/coverage.svg) [![License](https://img.shields.io/github/license/devnogi/open-api-batch-server)](LICENSE) [![Last Commit](https://img.shields.io/github/last-commit/devnogi/open-api-batch-server)](https://github.com/devnogi/open-api-batch-server) diff --git a/badges/coverage.svg b/badges/coverage.svg new file mode 100644 index 00000000..21b85f9b --- /dev/null +++ b/badges/coverage.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + coverage + coverage + -0.00% + -0.00% + + diff --git a/build.gradle.kts b/build.gradle.kts index bca05958..f8b314df 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,6 +7,7 @@ plugins { id("io.spring.dependency-management") version "1.1.4" id("org.asciidoctor.jvm.convert") version "4.0.2" id("com.diffplug.spotless") version "6.25.0" + id("jacoco") } group = property("projectGroup") as String @@ -18,6 +19,7 @@ java { } } + val querydslDir = "$buildDir/generated/querydsl" sourceSets["main"].java.srcDirs(querydslDir) @@ -95,12 +97,44 @@ dependencies { testImplementation("org.flywaydb.flyway-test-extensions:flyway-spring-test:${property("flywayTestExtensionVersion")}") } +extensions.configure("jacoco") { + toolVersion = "0.8.10" +} + // QueryDSL Q 클래스 생성 위치 tasks.withType { options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir) options.annotationProcessorPath = configurations.annotationProcessor.get() } +tasks.test { + useJUnitPlatform() + finalizedBy("jacocoTestReport") // 테스트 끝나면 커버리지 리포트 생성 +} + +tasks.named("jacocoTestReport") { + dependsOn(tasks.test) + + reports { + xml.required.set(true) + html.required.set(true) + } + + classDirectories.setFrom( + fileTree("${buildDir}/classes/java/main") { + exclude( + "**/config/**", + "**/dto/**", + "**/entity/**", + "**/exception/**" + ) + } + ) + + sourceDirectories.setFrom(files("src/main/java")) + executionData.setFrom(fileTree(buildDir).include("jacoco/test.exec")) +} + // Spotless spotless { java { diff --git a/src/main/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryService.java b/src/main/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryService.java index 2ad35f4e..e3199a3e 100644 --- a/src/main/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryService.java +++ b/src/main/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryService.java @@ -1,5 +1,6 @@ package until.the.eternity.auctionhistory.application.service; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -18,8 +19,6 @@ import until.the.eternity.common.request.PageRequestDto; import until.the.eternity.common.response.PageResponseDto; -import java.util.List; - @Service @RequiredArgsConstructor @Slf4j diff --git a/src/main/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcher.java b/src/main/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcher.java index c3a68170..5f457a55 100644 --- a/src/main/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcher.java +++ b/src/main/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcher.java @@ -1,5 +1,7 @@ package until.the.eternity.auctionhistory.application.service.fetcher; +import java.util.ArrayList; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -9,9 +11,6 @@ import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse; import until.the.eternity.common.enums.ItemCategory; -import java.util.ArrayList; -import java.util.List; - @Slf4j @Component @RequiredArgsConstructor diff --git a/src/main/java/until/the/eternity/auctionhistory/application/service/persister/AuctionHistoryPersister.java b/src/main/java/until/the/eternity/auctionhistory/application/service/persister/AuctionHistoryPersister.java index 8fb71c2d..cccf4dcd 100644 --- a/src/main/java/until/the/eternity/auctionhistory/application/service/persister/AuctionHistoryPersister.java +++ b/src/main/java/until/the/eternity/auctionhistory/application/service/persister/AuctionHistoryPersister.java @@ -1,5 +1,6 @@ package until.the.eternity.auctionhistory.application.service.persister; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -11,8 +12,6 @@ import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse; import until.the.eternity.common.enums.ItemCategory; -import java.util.List; - @Slf4j @RequiredArgsConstructor @Component diff --git a/src/main/java/until/the/eternity/auctionhistory/domain/entity/AuctionHistory.java b/src/main/java/until/the/eternity/auctionhistory/domain/entity/AuctionHistory.java index e15f27ed..f9174a12 100644 --- a/src/main/java/until/the/eternity/auctionhistory/domain/entity/AuctionHistory.java +++ b/src/main/java/until/the/eternity/auctionhistory/domain/entity/AuctionHistory.java @@ -1,11 +1,10 @@ package until.the.eternity.auctionhistory.domain.entity; import jakarta.persistence.*; -import lombok.*; -import until.the.eternity.itemoption.domain.entity.ItemOption; - import java.time.Instant; import java.util.List; +import lombok.*; +import until.the.eternity.itemoption.domain.entity.ItemOption; @Entity @Table(name = "auction_history") diff --git a/src/main/java/until/the/eternity/auctionhistory/domain/mapper/AuctionHistoryMapper.java b/src/main/java/until/the/eternity/auctionhistory/domain/mapper/AuctionHistoryMapper.java index f6cb0f29..977d6f66 100644 --- a/src/main/java/until/the/eternity/auctionhistory/domain/mapper/AuctionHistoryMapper.java +++ b/src/main/java/until/the/eternity/auctionhistory/domain/mapper/AuctionHistoryMapper.java @@ -1,5 +1,6 @@ package until.the.eternity.auctionhistory.domain.mapper; +import java.util.List; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import until.the.eternity.auctionhistory.domain.entity.AuctionHistory; @@ -7,8 +8,6 @@ import until.the.eternity.auctionhistory.interfaces.rest.dto.response.ItemOptionResponse; import until.the.eternity.itemoption.domain.entity.ItemOption; -import java.util.List; - /** * AuctionHistory Entity to internal.responseDto transfer mapper class 데이터 흐름은 external.responseDto * -> entity -> internal.responseDto 단방향으로 흐름 diff --git a/src/main/java/until/the/eternity/auctionhistory/domain/mapper/OpenApiAuctionHistoryMapper.java b/src/main/java/until/the/eternity/auctionhistory/domain/mapper/OpenApiAuctionHistoryMapper.java index 713b51ff..a2732317 100644 --- a/src/main/java/until/the/eternity/auctionhistory/domain/mapper/OpenApiAuctionHistoryMapper.java +++ b/src/main/java/until/the/eternity/auctionhistory/domain/mapper/OpenApiAuctionHistoryMapper.java @@ -1,5 +1,6 @@ package until.the.eternity.auctionhistory.domain.mapper; +import java.time.Instant; import org.mapstruct.Context; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -8,8 +9,6 @@ import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse; import until.the.eternity.common.enums.ItemCategory; -import java.time.Instant; - @Mapper(componentModel = "spring", uses = OpenApiItemOptionMapper.class) public interface OpenApiAuctionHistoryMapper { diff --git a/src/main/java/until/the/eternity/auctionhistory/domain/repository/AuctionHistoryRepositoryPort.java b/src/main/java/until/the/eternity/auctionhistory/domain/repository/AuctionHistoryRepositoryPort.java index 986935f6..c831c745 100644 --- a/src/main/java/until/the/eternity/auctionhistory/domain/repository/AuctionHistoryRepositoryPort.java +++ b/src/main/java/until/the/eternity/auctionhistory/domain/repository/AuctionHistoryRepositoryPort.java @@ -1,13 +1,12 @@ package until.the.eternity.auctionhistory.domain.repository; +import java.util.List; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import until.the.eternity.auctionhistory.domain.entity.AuctionHistory; import until.the.eternity.auctionhistory.interfaces.rest.dto.request.AuctionHistorySearchRequest; -import java.util.List; -import java.util.Optional; - /** 경매장 거래 내역 POJO Repository - Mock 또는 Stub 으로 대체해 단위 테스트 용이성 확보 */ public interface AuctionHistoryRepositoryPort { diff --git a/src/main/java/until/the/eternity/auctionhistory/domain/service/AuctionHistoryDuplicateChecker.java b/src/main/java/until/the/eternity/auctionhistory/domain/service/AuctionHistoryDuplicateChecker.java index df3cfbcf..58c73159 100644 --- a/src/main/java/until/the/eternity/auctionhistory/domain/service/AuctionHistoryDuplicateChecker.java +++ b/src/main/java/until/the/eternity/auctionhistory/domain/service/AuctionHistoryDuplicateChecker.java @@ -1,13 +1,12 @@ package until.the.eternity.auctionhistory.domain.service; +import java.util.Collection; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import until.the.eternity.auctionhistory.domain.repository.AuctionHistoryRepositoryPort; import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse; -import java.util.Collection; -import java.util.List; - @Component @RequiredArgsConstructor public class AuctionHistoryDuplicateChecker { diff --git a/src/main/java/until/the/eternity/auctionhistory/domain/service/fetcher/AuctionHistoryFetcherPort.java b/src/main/java/until/the/eternity/auctionhistory/domain/service/fetcher/AuctionHistoryFetcherPort.java index cf00412a..5b649be4 100644 --- a/src/main/java/until/the/eternity/auctionhistory/domain/service/fetcher/AuctionHistoryFetcherPort.java +++ b/src/main/java/until/the/eternity/auctionhistory/domain/service/fetcher/AuctionHistoryFetcherPort.java @@ -1,10 +1,9 @@ package until.the.eternity.auctionhistory.domain.service.fetcher; +import java.util.List; import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse; import until.the.eternity.common.enums.ItemCategory; -import java.util.List; - public interface AuctionHistoryFetcherPort { List fetch(ItemCategory category); } diff --git a/src/main/java/until/the/eternity/auctionhistory/domain/service/persister/AuctionHistoryPersisterPort.java b/src/main/java/until/the/eternity/auctionhistory/domain/service/persister/AuctionHistoryPersisterPort.java index 00ba99e8..ea4c6d51 100644 --- a/src/main/java/until/the/eternity/auctionhistory/domain/service/persister/AuctionHistoryPersisterPort.java +++ b/src/main/java/until/the/eternity/auctionhistory/domain/service/persister/AuctionHistoryPersisterPort.java @@ -1,10 +1,9 @@ package until.the.eternity.auctionhistory.domain.service.persister; +import java.util.List; import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse; import until.the.eternity.common.enums.ItemCategory; -import java.util.List; - public interface AuctionHistoryPersisterPort { void saveIfNotExists(List dtoList, ItemCategory category); diff --git a/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryJpaRepository.java b/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryJpaRepository.java index 94b824fd..ca7f0f72 100644 --- a/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryJpaRepository.java +++ b/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryJpaRepository.java @@ -1,5 +1,7 @@ package until.the.eternity.auctionhistory.infrastructure.persistence; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; @@ -7,9 +9,6 @@ import org.springframework.stereotype.Repository; import until.the.eternity.auctionhistory.domain.entity.AuctionHistory; -import java.util.List; -import java.util.Optional; - @Repository public interface AuctionHistoryJpaRepository extends JpaRepository, JpaSpecificationExecutor { diff --git a/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryQueryDslRepository.java b/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryQueryDslRepository.java index 757bfd36..9271563b 100644 --- a/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryQueryDslRepository.java +++ b/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryQueryDslRepository.java @@ -2,6 +2,7 @@ import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -11,8 +12,6 @@ import until.the.eternity.auctionhistory.domain.entity.QAuctionHistory; import until.the.eternity.auctionhistory.interfaces.rest.dto.request.AuctionHistorySearchRequest; -import java.util.List; - @Component @RequiredArgsConstructor class AuctionHistoryQueryDslRepository { diff --git a/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryRepositoryPortImpl.java b/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryRepositoryPortImpl.java index 437bb63d..25ffa185 100644 --- a/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryRepositoryPortImpl.java +++ b/src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryRepositoryPortImpl.java @@ -1,5 +1,7 @@ package until.the.eternity.auctionhistory.infrastructure.persistence; +import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -8,9 +10,6 @@ import until.the.eternity.auctionhistory.domain.repository.AuctionHistoryRepositoryPort; import until.the.eternity.auctionhistory.interfaces.rest.dto.request.AuctionHistorySearchRequest; -import java.util.List; -import java.util.Optional; - /** AuctionHistoryRepository Interface 구현체 */ @Repository @RequiredArgsConstructor diff --git a/src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryListResponse.java b/src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryListResponse.java index c49a6b2b..e194aeb7 100644 --- a/src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryListResponse.java +++ b/src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryListResponse.java @@ -1,7 +1,6 @@ package until.the.eternity.auctionhistory.interfaces.external.dto; import com.fasterxml.jackson.annotation.JsonProperty; - import java.util.List; public record OpenApiAuctionHistoryListResponse( diff --git a/src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryResponse.java b/src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryResponse.java index f00827f9..2ba2968a 100644 --- a/src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryResponse.java +++ b/src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryResponse.java @@ -1,9 +1,8 @@ package until.the.eternity.auctionhistory.interfaces.external.dto; import com.fasterxml.jackson.annotation.JsonProperty; -import until.the.eternity.itemoption.domain.dto.external.OpenApiItemOptionResponse; - import java.util.List; +import until.the.eternity.itemoption.domain.dto.external.OpenApiItemOptionResponse; public record OpenApiAuctionHistoryResponse( @JsonProperty("item_name") String itemName, diff --git a/src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/response/AuctionHistoryDetailResponse.java b/src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/response/AuctionHistoryDetailResponse.java index 8ee6c2f3..f940fdfd 100644 --- a/src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/response/AuctionHistoryDetailResponse.java +++ b/src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/response/AuctionHistoryDetailResponse.java @@ -1,7 +1,6 @@ package until.the.eternity.auctionhistory.interfaces.rest.dto.response; import com.fasterxml.jackson.annotation.JsonFormat; - import java.time.Instant; import java.util.List; diff --git a/src/main/java/until/the/eternity/auctionitem/domain/entity/AuctionItem.java b/src/main/java/until/the/eternity/auctionitem/domain/entity/AuctionItem.java index 0d5202c6..7a4f4118 100644 --- a/src/main/java/until/the/eternity/auctionitem/domain/entity/AuctionItem.java +++ b/src/main/java/until/the/eternity/auctionitem/domain/entity/AuctionItem.java @@ -1,11 +1,10 @@ package until.the.eternity.auctionitem.domain.entity; import jakarta.persistence.*; -import lombok.*; -import until.the.eternity.itemoption.domain.entity.ItemOption; - import java.time.LocalDateTime; import java.util.List; +import lombok.*; +import until.the.eternity.itemoption.domain.entity.ItemOption; @Entity @Table(name = "auction_item") diff --git a/src/main/java/until/the/eternity/common/enums/ItemCategory.java b/src/main/java/until/the/eternity/common/enums/ItemCategory.java index d608c038..04ac4124 100644 --- a/src/main/java/until/the/eternity/common/enums/ItemCategory.java +++ b/src/main/java/until/the/eternity/common/enums/ItemCategory.java @@ -1,12 +1,11 @@ package until.the.eternity.common.enums; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - import java.util.Arrays; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; +import lombok.Getter; +import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor diff --git a/src/main/java/until/the/eternity/common/exception/GlobalExceptionCode.java b/src/main/java/until/the/eternity/common/exception/GlobalExceptionCode.java index 1169e930..21c217b0 100644 --- a/src/main/java/until/the/eternity/common/exception/GlobalExceptionCode.java +++ b/src/main/java/until/the/eternity/common/exception/GlobalExceptionCode.java @@ -1,11 +1,11 @@ package until.the.eternity.common.exception; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; + import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; -import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; - @Getter @RequiredArgsConstructor public enum GlobalExceptionCode implements ExceptionCode { diff --git a/src/main/java/until/the/eternity/common/exception/GlobalExceptionHandler.java b/src/main/java/until/the/eternity/common/exception/GlobalExceptionHandler.java index bc069d00..4cf5af10 100644 --- a/src/main/java/until/the/eternity/common/exception/GlobalExceptionHandler.java +++ b/src/main/java/until/the/eternity/common/exception/GlobalExceptionHandler.java @@ -1,5 +1,7 @@ package until.the.eternity.common.exception; +import static until.the.eternity.common.exception.GlobalExceptionCode.SERVER_ERROR; + import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -7,8 +9,6 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; import until.the.eternity.common.response.ApiResponse; -import static until.the.eternity.common.exception.GlobalExceptionCode.SERVER_ERROR; - @Slf4j @RestControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { diff --git a/src/main/java/until/the/eternity/common/response/ApiResponse.java b/src/main/java/until/the/eternity/common/response/ApiResponse.java index c7b99b00..c7f83b13 100644 --- a/src/main/java/until/the/eternity/common/response/ApiResponse.java +++ b/src/main/java/until/the/eternity/common/response/ApiResponse.java @@ -1,10 +1,9 @@ package until.the.eternity.common.response; +import java.time.Instant; import lombok.Builder; import lombok.Getter; -import java.time.Instant; - @Getter public class ApiResponse { diff --git a/src/main/java/until/the/eternity/common/response/PageResponseDto.java b/src/main/java/until/the/eternity/common/response/PageResponseDto.java index 0919ce20..c142faac 100644 --- a/src/main/java/until/the/eternity/common/response/PageResponseDto.java +++ b/src/main/java/until/the/eternity/common/response/PageResponseDto.java @@ -1,7 +1,6 @@ package until.the.eternity.common.response; import io.swagger.v3.oas.annotations.media.Schema; - import java.util.List; @Schema(description = "페이지 응답 객체") diff --git a/src/main/java/until/the/eternity/config/openapi/OpenApiFilters.java b/src/main/java/until/the/eternity/config/openapi/OpenApiFilters.java index 29ca38fe..af0147a8 100644 --- a/src/main/java/until/the/eternity/config/openapi/OpenApiFilters.java +++ b/src/main/java/until/the/eternity/config/openapi/OpenApiFilters.java @@ -1,13 +1,12 @@ package until.the.eternity.config.openapi; +import java.time.Duration; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import reactor.core.publisher.Mono; -import java.time.Duration; - @Slf4j @Component @RequiredArgsConstructor diff --git a/src/main/java/until/the/eternity/config/openapi/OpenApiRetryPolicy.java b/src/main/java/until/the/eternity/config/openapi/OpenApiRetryPolicy.java index a419df7c..8c9d0cff 100644 --- a/src/main/java/until/the/eternity/config/openapi/OpenApiRetryPolicy.java +++ b/src/main/java/until/the/eternity/config/openapi/OpenApiRetryPolicy.java @@ -1,12 +1,11 @@ package until.the.eternity.config.openapi; +import java.time.Duration; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClientResponseException; import reactor.util.retry.Retry; import reactor.util.retry.RetryBackoffSpec; -import java.time.Duration; - /** Nexon OPEN API 전용 재시도(Back-off) 정책. */ @Component public class OpenApiRetryPolicy { diff --git a/src/main/java/until/the/eternity/config/openapi/OpenApiWebClientProperties.java b/src/main/java/until/the/eternity/config/openapi/OpenApiWebClientProperties.java index f8d79043..9d51746d 100644 --- a/src/main/java/until/the/eternity/config/openapi/OpenApiWebClientProperties.java +++ b/src/main/java/until/the/eternity/config/openapi/OpenApiWebClientProperties.java @@ -2,11 +2,10 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Positive; +import java.time.Duration; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; -import java.time.Duration; - /** 외부 API용 WebClient 설정값 홀더 application.yml 사용) */ @Validated @ConfigurationProperties(prefix = "openapi.nexon") diff --git a/src/main/java/until/the/eternity/hornBugle/domain/entity/HornBugleWorldHistory.java b/src/main/java/until/the/eternity/hornBugle/domain/entity/HornBugleWorldHistory.java index ca38a0ef..0ab19420 100644 --- a/src/main/java/until/the/eternity/hornBugle/domain/entity/HornBugleWorldHistory.java +++ b/src/main/java/until/the/eternity/hornBugle/domain/entity/HornBugleWorldHistory.java @@ -1,9 +1,8 @@ package until.the.eternity.hornBugle.domain.entity; import jakarta.persistence.*; -import lombok.*; - import java.time.LocalDateTime; +import lombok.*; @Entity @Table(name = "horn_bugle_world_history") diff --git a/src/main/java/until/the/eternity/itemminprice/controller/ItemDailyMinPriceController.java b/src/main/java/until/the/eternity/itemminprice/controller/ItemDailyMinPriceController.java index 4a0f6e78..6c03fb72 100644 --- a/src/main/java/until/the/eternity/itemminprice/controller/ItemDailyMinPriceController.java +++ b/src/main/java/until/the/eternity/itemminprice/controller/ItemDailyMinPriceController.java @@ -2,6 +2,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; @@ -12,8 +13,6 @@ import until.the.eternity.itemminprice.domain.dto.response.ItemDailyMinPriceResponseDto; import until.the.eternity.itemminprice.service.ItemDailyMinPriceService; -import java.util.List; - @Slf4j @RestController @RequiredArgsConstructor diff --git a/src/main/java/until/the/eternity/itemminprice/domain/dto/response/ItemDailyMinPriceResponseDto.java b/src/main/java/until/the/eternity/itemminprice/domain/dto/response/ItemDailyMinPriceResponseDto.java index d0ef6d5d..e5fcf6f5 100644 --- a/src/main/java/until/the/eternity/itemminprice/domain/dto/response/ItemDailyMinPriceResponseDto.java +++ b/src/main/java/until/the/eternity/itemminprice/domain/dto/response/ItemDailyMinPriceResponseDto.java @@ -1,7 +1,6 @@ package until.the.eternity.itemminprice.domain.dto.response; import io.swagger.v3.oas.annotations.media.Schema; - import java.time.LocalDate; import java.time.LocalDateTime; diff --git a/src/main/java/until/the/eternity/itemminprice/domain/entity/ItemDailyMinPrice.java b/src/main/java/until/the/eternity/itemminprice/domain/entity/ItemDailyMinPrice.java index 72de26b8..a3dec6fe 100644 --- a/src/main/java/until/the/eternity/itemminprice/domain/entity/ItemDailyMinPrice.java +++ b/src/main/java/until/the/eternity/itemminprice/domain/entity/ItemDailyMinPrice.java @@ -2,10 +2,9 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.persistence.*; -import lombok.*; - import java.time.LocalDate; import java.time.LocalDateTime; +import lombok.*; @Entity @Table( diff --git a/src/main/java/until/the/eternity/itemminprice/domain/mapper/ItemDailyMinPriceMapper.java b/src/main/java/until/the/eternity/itemminprice/domain/mapper/ItemDailyMinPriceMapper.java index 596ddc4b..2f54a40b 100644 --- a/src/main/java/until/the/eternity/itemminprice/domain/mapper/ItemDailyMinPriceMapper.java +++ b/src/main/java/until/the/eternity/itemminprice/domain/mapper/ItemDailyMinPriceMapper.java @@ -1,5 +1,6 @@ package until.the.eternity.itemminprice.domain.mapper; +import java.util.List; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; @@ -7,8 +8,6 @@ import until.the.eternity.itemminprice.domain.dto.response.ItemDailyMinPriceResponseDto; import until.the.eternity.itemminprice.domain.entity.ItemDailyMinPrice; -import java.util.List; - @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface ItemDailyMinPriceMapper { diff --git a/src/main/java/until/the/eternity/itemminprice/service/ItemDailyMinPriceService.java b/src/main/java/until/the/eternity/itemminprice/service/ItemDailyMinPriceService.java index 83095e05..6c5c6aae 100644 --- a/src/main/java/until/the/eternity/itemminprice/service/ItemDailyMinPriceService.java +++ b/src/main/java/until/the/eternity/itemminprice/service/ItemDailyMinPriceService.java @@ -1,5 +1,7 @@ package until.the.eternity.itemminprice.service; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -9,9 +11,6 @@ import until.the.eternity.itemminprice.domain.mapper.ItemDailyMinPriceMapper; import until.the.eternity.itemminprice.repository.ItemDailyMinPriceRepository; -import java.util.List; -import java.util.stream.Collectors; - @Slf4j @Service @RequiredArgsConstructor diff --git a/src/test/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryServiceTest.java b/src/test/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryServiceTest.java index 002c33aa..a910d0db 100644 --- a/src/test/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryServiceTest.java +++ b/src/test/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryServiceTest.java @@ -1,5 +1,11 @@ package until.the.eternity.auctionhistory.application.service; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + +import java.util.List; +import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -22,13 +28,6 @@ import until.the.eternity.common.request.PageRequestDto; import until.the.eternity.common.response.PageResponseDto; -import java.util.List; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class AuctionHistoryServiceTest { diff --git a/src/test/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcherTest.java b/src/test/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcherTest.java index cde90887..b95722bb 100644 --- a/src/test/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcherTest.java +++ b/src/test/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcherTest.java @@ -1,5 +1,10 @@ package until.the.eternity.auctionhistory.application.service.fetcher; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -13,12 +18,6 @@ import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse; import until.the.eternity.common.enums.ItemCategory; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - @ExtendWith(MockitoExtension.class) class AuctionHistoryFetcherTest {