From 9c4e738940162b888ac2beb7d9d1da0f0d21c049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 24 Feb 2026 21:14:28 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=E2=9C=A8=20feat:=20=EA=B4=91=EA=B3=A0=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0(MetricFact)=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/entity/MetricFact.java | 59 +++++++++++++++++++ .../repository/MetricFactRepository.java | 7 +++ 2 files changed, 66 insertions(+) create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/repository/MetricFactRepository.java diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java new file mode 100644 index 0000000..00f4698 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java @@ -0,0 +1,59 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.persistence.entity; + +import com.whereyouad.WhereYouAd.domains.advertisement.domain.constant.Grain; +import com.whereyouad.WhereYouAd.domains.advertisement.domain.constant.Provider; +import com.whereyouad.WhereYouAd.domains.project.persistence.entity.Project; +import com.whereyouad.WhereYouAd.global.common.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Entity +@Getter +@Table(name = "metric_fact") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class MetricFact extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "metric_fact_id") + private Long id; + + @Enumerated(EnumType.STRING) + @Column(name = "grain", nullable = false) + private Grain grain; // 집계 단위(HOURLY, DAILY) + + @Column(name = "time_bucket", nullable = false) + private LocalDateTime timeBucket; // 집계 단위 시작 시간 + +// @Column(name = "dimension_type") +// private String dimensionType; + + @Column(name = "impressions") + private Long impressions; // 노출수 + + @Column(name = "clicks") + private Long clicks; // 클릭수 + + @Column(name = "conversions") + private Long conversions; // 전환수 + + @Column(name = "spend", precision = 18, scale = 2) + private BigDecimal spend; // 광고비 + + @Column(name = "revenue", precision = 18, scale = 2) + private BigDecimal revenue; // 매출 + + @Enumerated(EnumType.STRING) + @Column(name = "provider", nullable = false) + private Provider provider; + + // 연관 관계 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "project_id") + private Project project; +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/repository/MetricFactRepository.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/repository/MetricFactRepository.java new file mode 100644 index 0000000..c3fdcd4 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/repository/MetricFactRepository.java @@ -0,0 +1,7 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.persistence.repository; + +import com.whereyouad.WhereYouAd.domains.advertisement.persistence.entity.MetricFact; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MetricFactRepository extends JpaRepository { +} From dd13666a2deec892214f5a1defb889cd17e508f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 24 Feb 2026 21:15:02 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=E2=9C=A8=20feat:=20=EA=B4=91=EA=B3=A0=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=EC=A1=B0=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/AdvertisementRequest.java | 4 ++++ .../dto/response/AdvertisementResponse.java | 5 +++++ .../mapper/AdvertisementConverter.java | 4 ++++ .../advertisement/domain/constant/Grain.java | 5 +++++ .../domain/constant/Provider.java | 6 ++++++ .../service/AdvertisementQueryService.java | 4 ++++ .../service/AdvertisementQueryServiceImpl.java | 13 +++++++++++++ .../exception/AdvertisementException.java | 10 ++++++++++ .../exception/code/AdvertisementErrorCode.java | 18 ++++++++++++++++++ .../presentation/AdvertisementController.java | 13 +++++++++++++ .../docs/AdvertisementControllerDocs.java | 5 +++++ 11 files changed, 87 insertions(+) create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/request/AdvertisementRequest.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/response/AdvertisementResponse.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/mapper/AdvertisementConverter.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Grain.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Provider.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryService.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryServiceImpl.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/AdvertisementException.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/code/AdvertisementErrorCode.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/AdvertisementController.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/docs/AdvertisementControllerDocs.java diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/request/AdvertisementRequest.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/request/AdvertisementRequest.java new file mode 100644 index 0000000..483a660 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/request/AdvertisementRequest.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.application.dto.request; + +public class AdvertisementRequest { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/response/AdvertisementResponse.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/response/AdvertisementResponse.java new file mode 100644 index 0000000..b94b4a7 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/response/AdvertisementResponse.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.application.dto.response; + +public class AdvertisementResponse { + // TODO: 대시보드 공통 응답값 정의 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/mapper/AdvertisementConverter.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/mapper/AdvertisementConverter.java new file mode 100644 index 0000000..4e5053c --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/mapper/AdvertisementConverter.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.application.mapper; + +public class AdvertisementConverter { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Grain.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Grain.java new file mode 100644 index 0000000..1f1be5e --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Grain.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.domain.constant; + +public enum Grain { + HOURLY, DAILY +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Provider.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Provider.java new file mode 100644 index 0000000..17d9e64 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Provider.java @@ -0,0 +1,6 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.domain.constant; + +public enum Provider { + GOOGLE, KAKAO, NAVER + // 추후 값 추가 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryService.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryService.java new file mode 100644 index 0000000..2f38926 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryService.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.domain.service; + +public interface AdvertisementQueryService { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryServiceImpl.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryServiceImpl.java new file mode 100644 index 0000000..82718ec --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryServiceImpl.java @@ -0,0 +1,13 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.domain.service; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class AdvertisementQueryServiceImpl implements AdvertisementQueryService{ + +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/AdvertisementException.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/AdvertisementException.java new file mode 100644 index 0000000..3a71dab --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/AdvertisementException.java @@ -0,0 +1,10 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.exception; + +import com.whereyouad.WhereYouAd.global.exception.AppException; +import com.whereyouad.WhereYouAd.global.exception.BaseErrorCode; + +public class AdvertisementException extends AppException { + public AdvertisementException(BaseErrorCode code) { + super(code); + } +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/code/AdvertisementErrorCode.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/code/AdvertisementErrorCode.java new file mode 100644 index 0000000..718bb6e --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/code/AdvertisementErrorCode.java @@ -0,0 +1,18 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.exception.code; + +import com.whereyouad.WhereYouAd.global.exception.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum AdvertisementErrorCode implements BaseErrorCode { + + // TODO: 에러 코드 추가 + ; + + private final HttpStatus httpStatus; + private final String code; + private final String message; +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/AdvertisementController.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/AdvertisementController.java new file mode 100644 index 0000000..e284422 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/AdvertisementController.java @@ -0,0 +1,13 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.presentation; + +import com.whereyouad.WhereYouAd.domains.advertisement.presentation.docs.AdvertisementControllerDocs; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +@RequestMapping("/api/advertisement") +public class AdvertisementController implements AdvertisementControllerDocs { + +} \ No newline at end of file diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/docs/AdvertisementControllerDocs.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/docs/AdvertisementControllerDocs.java new file mode 100644 index 0000000..284a884 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/docs/AdvertisementControllerDocs.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.presentation.docs; + +public interface AdvertisementControllerDocs { + +} From b8a88b58192db2384b6f5a6bcc2dde9281d3c2cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 24 Feb 2026 21:15:40 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=E2=9C=A8=20feat:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/persistence/entity/Project.java | 34 +++++++++++++++++++ .../repository/ProjectRepository.java | 7 ++++ 2 files changed, 41 insertions(+) create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/entity/Project.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/repository/ProjectRepository.java diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/entity/Project.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/entity/Project.java new file mode 100644 index 0000000..81f2b4b --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/entity/Project.java @@ -0,0 +1,34 @@ +package com.whereyouad.WhereYouAd.domains.project.persistence.entity; + +import com.whereyouad.WhereYouAd.domains.organization.persistence.entity.Organization; +import com.whereyouad.WhereYouAd.global.common.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Table(name = "project") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class Project extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "project_id") + private Long id; + + @Column(name = "name", nullable = false) + private String name; + + @Column(name = "description") + private String description; + + @Column(name = "created_by", nullable = false) + private Long createdBy; + + // 연관 관계 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "org_id") + private Organization organization; +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/repository/ProjectRepository.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/repository/ProjectRepository.java new file mode 100644 index 0000000..f31811f --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/repository/ProjectRepository.java @@ -0,0 +1,7 @@ +package com.whereyouad.WhereYouAd.domains.project.persistence.repository; + +import com.whereyouad.WhereYouAd.domains.project.persistence.entity.Project; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProjectRepository extends JpaRepository { +} From 94e465ebd855f87324490131f012b0972d438b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 24 Feb 2026 21:17:04 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=E2=9C=A8=20feat:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/request/ProjectRequest.java | 4 ++++ .../dto/response/ProjectResponse.java | 4 ++++ .../application/mapper/ProjectConverter.java | 4 ++++ .../project/domain/service/ProjectService.java | 4 ++++ .../domain/service/ProjectServiceImpl.java | 13 +++++++++++++ .../project/exception/ProjectException.java | 10 ++++++++++ .../exception/code/ProjectErrorCode.java | 17 +++++++++++++++++ .../project/presentation/ProjectController.java | 12 ++++++++++++ .../docs/ProjectControllerDocs.java | 5 +++++ 9 files changed, 73 insertions(+) create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/request/ProjectRequest.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/response/ProjectResponse.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/application/mapper/ProjectConverter.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectService.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectServiceImpl.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/ProjectException.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/code/ProjectErrorCode.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/ProjectController.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/docs/ProjectControllerDocs.java diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/request/ProjectRequest.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/request/ProjectRequest.java new file mode 100644 index 0000000..4cfedcf --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/request/ProjectRequest.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.project.application.dto.request; + +public class ProjectRequest { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/response/ProjectResponse.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/response/ProjectResponse.java new file mode 100644 index 0000000..f5d4c48 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/response/ProjectResponse.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.project.application.dto.response; + +public class ProjectResponse { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/mapper/ProjectConverter.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/mapper/ProjectConverter.java new file mode 100644 index 0000000..2df8b82 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/mapper/ProjectConverter.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.project.application.mapper; + +public class ProjectConverter { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectService.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectService.java new file mode 100644 index 0000000..928da01 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectService.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.project.domain.service; + +public interface ProjectService { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectServiceImpl.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectServiceImpl.java new file mode 100644 index 0000000..1e173ec --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectServiceImpl.java @@ -0,0 +1,13 @@ +package com.whereyouad.WhereYouAd.domains.project.domain.service; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ProjectServiceImpl implements ProjectService{ + +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/ProjectException.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/ProjectException.java new file mode 100644 index 0000000..4f3ecf3 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/ProjectException.java @@ -0,0 +1,10 @@ +package com.whereyouad.WhereYouAd.domains.project.exception; + +import com.whereyouad.WhereYouAd.global.exception.AppException; +import com.whereyouad.WhereYouAd.global.exception.BaseErrorCode; + +public class ProjectException extends AppException { + public ProjectException(BaseErrorCode code) { + super(code); + } +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/code/ProjectErrorCode.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/code/ProjectErrorCode.java new file mode 100644 index 0000000..7a5d33b --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/code/ProjectErrorCode.java @@ -0,0 +1,17 @@ +package com.whereyouad.WhereYouAd.domains.project.exception.code; + +import com.whereyouad.WhereYouAd.global.exception.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum ProjectErrorCode implements BaseErrorCode { + + ; + + private final HttpStatus httpStatus; + private final String code; + private final String message; +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/ProjectController.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/ProjectController.java new file mode 100644 index 0000000..06dabf6 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/ProjectController.java @@ -0,0 +1,12 @@ +package com.whereyouad.WhereYouAd.domains.project.presentation; + +import com.whereyouad.WhereYouAd.domains.project.presentation.docs.ProjectControllerDocs; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +@RequestMapping("/api/project") +public class ProjectController implements ProjectControllerDocs { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/docs/ProjectControllerDocs.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/docs/ProjectControllerDocs.java new file mode 100644 index 0000000..211b470 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/docs/ProjectControllerDocs.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.domains.project.presentation.docs; + +public interface ProjectControllerDocs { + +} From 15cbf5e330bb8ced522f28f70f4b96de5069de6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EA=B7=9C?= Date: Tue, 24 Feb 2026 21:18:53 +0900 Subject: [PATCH 5/7] =?UTF-8?q?=E2=9C=A8=20feat:=20=ED=94=8C=EB=9E=AB?= =?UTF-8?q?=ED=8F=BC=20=EB=B3=84=20=EC=9D=91=EB=8B=B5=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/google/converter/GoogleConverter.java | 5 +++++ .../infrastructure/client/google/dto/GoogleDTO.java | 5 +++++ .../client/kakao/converter/KakaoConverter.java | 5 +++++ .../WhereYouAd/infrastructure/client/kakao/dto/KakaoDTO.java | 5 +++++ .../client/naver/converter/NaverConverter.java | 5 +++++ .../WhereYouAd/infrastructure/client/naver/dto/NaverDTO.java | 5 +++++ 6 files changed, 30 insertions(+) create mode 100644 src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/converter/GoogleConverter.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/dto/GoogleDTO.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/converter/KakaoConverter.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/dto/KakaoDTO.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/converter/NaverConverter.java create mode 100644 src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/dto/NaverDTO.java diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/converter/GoogleConverter.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/converter/GoogleConverter.java new file mode 100644 index 0000000..8e7ed26 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/converter/GoogleConverter.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.google.converter; + +public class GoogleConverter { + // GoogleDTO -> MetricFactResponse 변환 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/dto/GoogleDTO.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/dto/GoogleDTO.java new file mode 100644 index 0000000..a3992a4 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/dto/GoogleDTO.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.google.dto; + +public class GoogleDTO { + // Google 응답 원문 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/converter/KakaoConverter.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/converter/KakaoConverter.java new file mode 100644 index 0000000..66f6f6b --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/converter/KakaoConverter.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.kakao.converter; + +public class KakaoConverter { + // KakaoDTO -> MetricFactResponse 변환 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/dto/KakaoDTO.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/dto/KakaoDTO.java new file mode 100644 index 0000000..eb819d3 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/dto/KakaoDTO.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.kakao.dto; + +public class KakaoDTO { + // Kakao 응답 원문 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/converter/NaverConverter.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/converter/NaverConverter.java new file mode 100644 index 0000000..c0f4f59 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/converter/NaverConverter.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.naver.converter; + +public class NaverConverter { + // NaverDTO -> MetricFactResponse 변환 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/dto/NaverDTO.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/dto/NaverDTO.java new file mode 100644 index 0000000..bf054f5 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/dto/NaverDTO.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.naver.dto; + +public class NaverDTO { + // Naver 응답 원문 +} From eef418b6e63c95f073c444facf76d4dc7ad7b27a Mon Sep 17 00:00:00 2001 From: ojy0903 Date: Thu, 26 Feb 2026 00:34:43 +0900 Subject: [PATCH 6/7] =?UTF-8?q?:sparkles:=20feat:=20=EA=B4=91=EA=B3=A0=20?= =?UTF-8?q?=EA=B0=9C=EC=B2=B4=20Advertisement=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EC=B6=94=EA=B0=80(DB=20=EC=84=B1=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=B0=EB=A0=A4=EB=A1=9C=20status=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EB=B3=B4=EB=A5=98=20=EC=83=81=ED=83=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/entity/Advertisement.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/Advertisement.java diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/Advertisement.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/Advertisement.java new file mode 100644 index 0000000..861186e --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/Advertisement.java @@ -0,0 +1,37 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.persistence.entity; + +import com.whereyouad.WhereYouAd.domains.advertisement.domain.constant.Provider; +import com.whereyouad.WhereYouAd.global.common.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Table(name = "advertisement") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class Advertisement extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ad_id") + private Long id; + + @Enumerated(EnumType.STRING) + @Column(name = "provider", nullable = false) + private Provider provider; + + private LocalDateTime startDate; + + private LocalDateTime endDate; + +// @Enumerated(EnumType.STRING) +// @Column(name = "status", nullable = false) +// @ColumnDefault("'ON_GOING'") +// AdStatus 는 ON_GOING, PAUSED, OVER 가 존재 +// join 연산으로 인한 성능 저하 우려 -> 일단은 주석 처리 +// private AdStatus adStatus; +} From 062560977a537429f2371c7f95286b1116ff5d80 Mon Sep 17 00:00:00 2001 From: ojy0903 Date: Thu, 26 Feb 2026 00:35:11 +0900 Subject: [PATCH 7/7] =?UTF-8?q?:sparkles:=20feat:=20MetricFact=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EC=97=90=20Advertisement=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EC=99=80=EC=9D=98=201:N=20=EC=97=B0=EA=B4=80?= =?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 --- .../domains/advertisement/persistence/entity/MetricFact.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java index 00f4698..ef0154d 100644 --- a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java @@ -56,4 +56,9 @@ public class MetricFact extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "project_id") private Project project; + + //추가 연관관계 -> Advertisement + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "ad_id", nullable = false) + private Advertisement advertisement; }