Skip to content
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ dependencies {

// Elasticsearch
implementation("org.springframework.boot:spring-boot-starter-data-elasticsearch")
implementation("org.springframework.kafka:spring-kafka")

// QueryDSL (with Jakarta API)
implementation("com.querydsl:querydsl-core:5.1.0")
Expand Down
4 changes: 4 additions & 0 deletions docker-compose-local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ services:

# === External API Configuration ===
NEXON_OPEN_API_KEY: ${NEXON_OPEN_API_KEY}
KAFKA_BOOTSTRAP_SERVERS: ${KAFKA_BOOTSTRAP_SERVERS:-119.194.235.11:9102}
AUCTION_HISTORY_DELAY_MS: ${AUCTION_HISTORY_DELAY_MS:-1000}
AUCTION_HISTORY_CRON: "${AUCTION_HISTORY_CRON:-0 0 * * * *}"
STATISTICS_PREVIOUS_DAY_CRON: "${STATISTICS_PREVIOUS_DAY_CRON:-0 0 * * * *}"
Expand Down Expand Up @@ -77,6 +78,8 @@ services:
- app-logs:/app/logs # Named volume 사용 (권한 문제 해결)
# 로컬 개발 시 설정 파일 마운트 (선택사항)
# - ./config:/app/config:ro
extra_hosts:
- "devnogi.ddns.net:119.194.235.11" # Kafka advertised hostname 임시 해석
Copy link

Copilot AI Feb 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The extra_hosts configuration maps devnogi.ddns.net to a specific IP address. This is hardcoded and environment-specific, which could cause issues in other deployment environments. Consider using environment variables for both the hostname and IP address to make this configuration more flexible and portable across different environments.

Suggested change
- "devnogi.ddns.net:119.194.235.11" # Kafka advertised hostname 임시 해석
- "${KAFKA_ADVERTISED_HOSTNAME:-devnogi.ddns.net}:${KAFKA_ADVERTISED_IP:-119.194.235.11}" # Kafka advertised hostname 임시 해석 (env-overridable)

Copilot uses AI. Check for mistakes.
restart: on-failure:3

# === Docker Resource Limits (Local - 경량) ===
Expand Down Expand Up @@ -143,6 +146,7 @@ services:
start_period: 30s
command:
- --port=${DB_PORT:-3318}
- --skip-log-bin # 로컬 개발환경: 불필요한 binlog 폭증 방지
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_0900_ai_ci
- --skip-character-set-client-handshake
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package until.the.eternity.auctionhistory.application.scheduler;

import java.util.*;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
Expand All @@ -14,9 +16,6 @@
import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse;
import until.the.eternity.common.enums.ItemCategory;

import java.util.*;
import java.util.stream.Collectors;

@Slf4j
@Component
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package until.the.eternity.auctionhistory.application.service;

import jakarta.persistence.EntityManager;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
Expand All @@ -15,8 +16,6 @@
import until.the.eternity.common.request.PageRequestDto;
import until.the.eternity.common.response.PageResponseDto;

import java.util.List;

@Service
@RequiredArgsConstructor
@Slf4j
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package until.the.eternity.auctionhistory.application.service.fetcher;

import java.util.ArrayList;
import java.util.List;
import java.util.OptionalInt;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
Expand All @@ -9,10 +12,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;
import java.util.OptionalInt;

@Slf4j
@Component
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -10,8 +11,6 @@
import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse;
import until.the.eternity.common.enums.ItemCategory;

import java.util.List;

@Slf4j
@RequiredArgsConstructor
@Component
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package until.the.eternity.auctionhistory.domain.entity;

import jakarta.persistence.*;
import lombok.*;
import until.the.eternity.auctionitemoption.domain.entity.AuctionHistoryItemOption;

import java.time.Instant;
import java.util.List;
import lombok.*;
import until.the.eternity.auctionitemoption.domain.entity.AuctionHistoryItemOption;

@Entity
@Table(name = "auction_history")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package until.the.eternity.auctionhistory.domain.event;

import lombok.Getter;

import java.time.LocalDateTime;
import lombok.Getter;

/** 경매장 거래 내역 저장 완료 이벤트 AuctionHistoryScheduler가 거래 내역을 성공적으로 저장한 후 발행됩니다. */
@Getter
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
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;
import until.the.eternity.auctionhistory.interfaces.rest.dto.response.AuctionHistoryDetailResponse;
import until.the.eternity.auctionhistory.interfaces.rest.dto.response.ItemOptionResponse;
import until.the.eternity.auctionitemoption.domain.entity.AuctionHistoryItemOption;

import java.util.List;

/**
* AuctionHistory Entity to internal.responseDto transfer mapper class 데이터 흐름은 external.responseDto
* -> entity -> internal.responseDto 단방향으로 흐름
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package until.the.eternity.auctionhistory.domain.mapper;

import java.time.Instant;
import java.util.List;
import org.mapstruct.*;
import until.the.eternity.auctionhistory.domain.entity.AuctionHistory;
import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse;
import until.the.eternity.common.enums.ItemCategory;

import java.time.Instant;
import java.util.List;

@Mapper(componentModel = "spring", uses = OpenApiItemOptionMapper.class)
public interface OpenApiAuctionHistoryMapper {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package until.the.eternity.auctionhistory.domain.repository;

import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.Set;
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 until.the.eternity.common.enums.ItemCategory;

import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.Set;

/** 경매장 거래 내역 POJO Repository - Mock 또는 Stub 으로 대체해 단위 테스트 용이성 확보 */
public interface AuctionHistoryRepositoryPort {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package until.the.eternity.auctionhistory.domain.service;

import java.time.Instant;
import java.util.List;
import java.util.OptionalInt;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
Expand All @@ -8,11 +12,6 @@
import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse;
import until.the.eternity.common.enums.ItemCategory;

import java.time.Instant;
import java.util.List;
import java.util.OptionalInt;
import java.util.Set;

@Slf4j
@Component
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -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<OpenApiAuctionHistoryResponse> fetch(ItemCategory category);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package until.the.eternity.auctionhistory.domain.service.persister;

import java.util.List;
import until.the.eternity.auctionhistory.domain.entity.AuctionHistory;
import until.the.eternity.auctionhistory.interfaces.external.dto.OpenApiAuctionHistoryResponse;
import until.the.eternity.common.enums.ItemCategory;

import java.util.List;

public interface AuctionHistoryPersisterPort {

List<AuctionHistory> filterOutExisting(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package until.the.eternity.auctionhistory.infrastructure.persistence;

import java.time.Instant;
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;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import until.the.eternity.auctionhistory.domain.entity.AuctionHistory;

import java.time.Instant;
import java.util.List;
import java.util.Optional;

@Repository
public interface AuctionHistoryJpaRepository
extends JpaRepository<AuctionHistory, String>, JpaSpecificationExecutor<AuctionHistory> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
import com.querydsl.core.types.dsl.NumberTemplate;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
Expand All @@ -23,12 +28,6 @@
import until.the.eternity.auctionhistory.interfaces.rest.dto.request.PriceSearchRequest;
import until.the.eternity.auctionitemoption.domain.entity.QAuctionHistoryItemOption;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;

@Component
@RequiredArgsConstructor
class AuctionHistoryQueryDslRepository {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package until.the.eternity.auctionhistory.infrastructure.persistence;

import jakarta.persistence.EntityManager;
import java.time.Instant;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
Expand All @@ -12,11 +16,6 @@
import until.the.eternity.auctionhistory.interfaces.rest.dto.request.AuctionHistorySearchRequest;
import until.the.eternity.common.enums.ItemCategory;

import java.time.Instant;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;

/** AuctionHistoryRepository Interface 구현체 */
@Repository
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import until.the.eternity.auctionitemoption.domain.dto.external.OpenApiAuctionItemOptionResponse;

import java.time.Instant;
import java.util.List;
import until.the.eternity.auctionitemoption.domain.dto.external.OpenApiAuctionItemOptionResponse;

public record OpenApiAuctionHistoryResponse(
@JsonProperty("item_name") String itemName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.Arrays;

/** 검색 기준 (이상/이하/같음) */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.Arrays;

/** 정렬 방향 (오름차순/내림차순) */
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package until.the.eternity.auctionitem.domain.entity;

import jakarta.persistence.*;
import lombok.*;

import java.time.Instant;
import java.util.List;
import lombok.*;

/** 실시간 경매장에서 판매 중인 아이템 정보. V15 마이그레이션에서 auction_item → auction_realtime_item으로 변경됨. */
@Entity
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package until.the.eternity.auctionitem.domain.entity;

import jakarta.persistence.*;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.UUID;

/** 실시간 경매장 아이템(auction_realtime_item)에 연결된 아이템 옵션 정보. */
@Entity
@Table(name = "auction_realtime_item_option")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package until.the.eternity.auctionitemoption.domain.entity;

import jakarta.persistence.*;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import until.the.eternity.auctionhistory.domain.entity.AuctionHistory;

import java.util.UUID;

/**
* 경매장 거래 내역(auction_history)에 연결된 아이템 옵션 정보. V15 마이그레이션에서 auction_item_option →
* auction_history_item_option으로 변경됨.
Expand Down
Loading