From 6c3145b87f9910be1c2e2bb8c0126c6c99c5314f Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Tue, 8 Jul 2025 21:46:43 +0900 Subject: [PATCH 01/10] chore: spotless style formatting --- .../application/service/AuctionHistoryService.java | 3 +-- .../service/fetcher/AuctionHistoryFetcher.java | 5 ++--- .../service/persister/AuctionHistoryPersister.java | 3 +-- .../domain/entity/AuctionHistory.java | 5 ++--- .../domain/mapper/AuctionHistoryMapper.java | 3 +-- .../domain/mapper/OpenApiAuctionHistoryMapper.java | 3 +-- .../repository/AuctionHistoryRepositoryPort.java | 5 ++--- .../service/AuctionHistoryDuplicateChecker.java | 5 ++--- .../service/fetcher/AuctionHistoryFetcherPort.java | 3 +-- .../persister/AuctionHistoryPersisterPort.java | 3 +-- .../persistence/AuctionHistoryJpaRepository.java | 5 ++--- .../AuctionHistoryQueryDslRepository.java | 3 +-- .../AuctionHistoryRepositoryPortImpl.java | 5 ++--- .../dto/OpenApiAuctionHistoryListResponse.java | 1 - .../external/dto/OpenApiAuctionHistoryResponse.java | 3 +-- .../dto/response/AuctionHistoryDetailResponse.java | 1 - .../auctionitem/domain/entity/AuctionItem.java | 5 ++--- .../the/eternity/common/enums/ItemCategory.java | 5 ++--- .../common/exception/GlobalExceptionCode.java | 4 ++-- .../common/exception/GlobalExceptionHandler.java | 4 ++-- .../the/eternity/common/response/ApiResponse.java | 3 +-- .../eternity/common/response/PageResponseDto.java | 1 - .../the/eternity/config/openapi/OpenApiFilters.java | 3 +-- .../eternity/config/openapi/OpenApiRetryPolicy.java | 3 +-- .../config/openapi/OpenApiWebClientProperties.java | 3 +-- .../domain/entity/HornBugleWorldHistory.java | 3 +-- .../controller/ItemDailyMinPriceController.java | 3 +-- .../dto/response/ItemDailyMinPriceResponseDto.java | 1 - .../domain/entity/ItemDailyMinPrice.java | 3 +-- .../domain/mapper/ItemDailyMinPriceMapper.java | 3 +-- .../service/ItemDailyMinPriceService.java | 5 ++--- .../service/AuctionHistoryServiceTest.java | 13 ++++++------- .../service/fetcher/AuctionHistoryFetcherTest.java | 11 +++++------ 33 files changed, 49 insertions(+), 80 deletions(-) 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 { From 8cdf8e472860ac6f5cb3737422d7a407cd3cf98e Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Tue, 8 Jul 2025 22:05:34 +0900 Subject: [PATCH 02/10] =?UTF-8?q?chore:=20jacoco=20=EC=A2=85=EC=86=8D?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) 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 { From 166331f9670f516b17d00474c7da67dba4c2ff50 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Tue, 8 Jul 2025 22:09:32 +0900 Subject: [PATCH 03/10] =?UTF-8?q?infra:=20pr=20ci=20github=20actions=20wor?= =?UTF-8?q?kflows=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-ci.yml | 83 +++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 .github/workflows/pr-ci.yml diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml new file mode 100644 index 00000000..097589bc --- /dev/null +++ b/.github/workflows/pr-ci.yml @@ -0,0 +1,83 @@ +name: Spring CI for Pull Request + +on: + pull_request: + branches: [ main, develop ] + types: [opened, synchronize, reopened] + +permissions: + contents: read + 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: jacoco + run: | + lineRate=$(grep -oPm1 '(?<=> $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 From 5341803d7c36fb179b3a06933629416c3cfe9d01 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Tue, 8 Jul 2025 22:11:51 +0900 Subject: [PATCH 04/10] =?UTF-8?q?infra:=20coverage=20badge=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=83=9D=EC=84=B1=20=EC=8A=A4=ED=81=AC=EB=A6=BD?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/scripts/generate-coverage-badge.sh | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/scripts/generate-coverage-badge.sh diff --git a/.github/scripts/generate-coverage-badge.sh b/.github/scripts/generate-coverage-badge.sh new file mode 100644 index 00000000..3700bc4f --- /dev/null +++ b/.github/scripts/generate-coverage-badge.sh @@ -0,0 +1,52 @@ +#!/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 + +missed=$(grep -oPm1 '(?<== 90" | bc -l) )); then + color="brightgreen" +elif (( $(echo "$percent >= 75" | bc -l) )); then + color="yellow" +else + color="red" +fi + +# Generate SVG badge using shields.io style +cat > "$BADGE_FILE" < + + + + + + + + + + + + + + coverage + coverage + ${percent}% + ${percent}% + + +EOF From 460f0bb50b1a061a5c7e25a2a7abece5034fd9c1 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Tue, 8 Jul 2025 22:14:53 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat:=20README=EC=97=90=20coverage=20badg?= =?UTF-8?q?e=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From b6ae58ff9f5532ee8f20c2d6b2d4c266ebb2e576 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Tue, 8 Jul 2025 22:27:04 +0900 Subject: [PATCH 06/10] =?UTF-8?q?fix:=20github=20actions=20pr-ci=20?= =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml index 097589bc..064e4efc 100644 --- a/.github/workflows/pr-ci.yml +++ b/.github/workflows/pr-ci.yml @@ -2,7 +2,7 @@ name: Spring CI for Pull Request on: pull_request: - branches: [ main, develop ] + branches: [ main, dev ] types: [opened, synchronize, reopened] permissions: From 835d0234363b962ac23c5e577e2d78c3a9d83f25 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Tue, 8 Jul 2025 22:46:31 +0900 Subject: [PATCH 07/10] =?UTF-8?q?fix:=20pr-ci=20grep=20=EB=B0=A9=EC=8B=9D?= =?UTF-8?q?=EC=9D=84=20awk=20=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-ci.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml index 064e4efc..4567a8b3 100644 --- a/.github/workflows/pr-ci.yml +++ b/.github/workflows/pr-ci.yml @@ -43,13 +43,17 @@ jobs: path: build/reports/jacoco/test/html/ - name: Extract JaCoCo Coverage Percentage - id: jacoco + id: coverage run: | - lineRate=$(grep -oPm1 '(?<=> $GITHUB_OUTPUT + xml_file="build/reports/jacoco/test/jacocoTestReport.xml" + + missed=$(awk -F'"' '/> "$GITHUB_OUTPUT" - name: Comment PR with Test and Coverage Result if: always() From 4ee9c2bbd47745d6cf04abd06ceeea1cfb3716ae Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Tue, 8 Jul 2025 23:21:02 +0900 Subject: [PATCH 08/10] =?UTF-8?q?fix:=20coverage=20=EB=B1=83=EC=A7=80=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=83=9D=EC=84=B1=20grep=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20awk=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/scripts/generate-coverage-badge.sh | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/scripts/generate-coverage-badge.sh b/.github/scripts/generate-coverage-badge.sh index 3700bc4f..120dde48 100644 --- a/.github/scripts/generate-coverage-badge.sh +++ b/.github/scripts/generate-coverage-badge.sh @@ -12,21 +12,22 @@ if [ ! -f "$REPORT_FILE" ]; then exit 1 fi -missed=$(grep -oPm1 '(?<== 90" | bc -l) )); then - color="brightgreen" + color="4c1" # brightgreen elif (( $(echo "$percent >= 75" | bc -l) )); then - color="yellow" + color="dfb317" # yellow else - color="red" + color="e05d44" # red fi -# Generate SVG badge using shields.io style +# SVG badge 생성 cat > "$BADGE_FILE" < @@ -50,3 +51,5 @@ cat > "$BADGE_FILE" < EOF + +echo "✅ Coverage badge generated: ${percent}% -> $BADGE_FILE" From a8a826f73f918f531f0b343f7aa6ad285de965bd Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Tue, 8 Jul 2025 23:36:12 +0900 Subject: [PATCH 09/10] =?UTF-8?q?fix:=20pr-ci=20coverage=20badge=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=9C=20permission?= =?UTF-8?q?=20=EB=B6=80=EC=97=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml index 4567a8b3..0d8b6c67 100644 --- a/.github/workflows/pr-ci.yml +++ b/.github/workflows/pr-ci.yml @@ -6,7 +6,7 @@ on: types: [opened, synchronize, reopened] permissions: - contents: read + contents: write pull-requests: write jobs: From a03f006ec2ffe5ac59d0ec5d3410e842858ac87d Mon Sep 17 00:00:00 2001 From: dev-ant <59863112+dev-ant@users.noreply.github.com> Date: Tue, 8 Jul 2025 14:38:38 +0000 Subject: [PATCH 10/10] chore: update coverage badge --- badges/coverage.svg | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 badges/coverage.svg 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% + +