From e4a0764b3a686b759d9543c2bbf32d16462455e7 Mon Sep 17 00:00:00 2001 From: junyong Date: Tue, 14 Oct 2025 14:03:50 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat=20:=20Entity=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/library/entity/Library.java | 29 ++++++++ .../domain/library/entity/LibraryPanel.java | 33 ++++++++++ .../library/entity/LibraryPanelKey.java | 25 +++++++ .../domain/members/entity/Agreement.java | 28 ++++++++ .../domain/members/entity/Member.java | 19 +++++- .../domain/members/entity/Onboarding.java | 35 ++++++++++ .../back_end/domain/members/entity/Plan.java | 26 ++++++++ .../domain/members/enums/Industry.java | 10 +++ .../back_end/domain/members/enums/Job.java | 10 +++ .../back_end/domain/panel/entity/Panel.java | 66 +++++++++++++++++++ .../back_end/domain/search/entity/Filter.java | 21 ++++++ .../domain/search/entity/SearchFilter.java | 31 +++++++++ .../domain/search/entity/SearchHistory.java | 40 +++++++++++ .../chart/{CharType.java => ChartType.java} | 2 +- .../domain/search/enums/filters/AgeGroup.java | 14 ++-- .../search/enums/filters/FilterKey.java | 25 +++++++ .../domain/search/enums/filters/Gender.java | 2 +- .../filters/{Region.java => Residence.java} | 2 +- 18 files changed, 406 insertions(+), 12 deletions(-) create mode 100644 src/main/java/DiffLens/back_end/domain/library/entity/Library.java create mode 100644 src/main/java/DiffLens/back_end/domain/library/entity/LibraryPanel.java create mode 100644 src/main/java/DiffLens/back_end/domain/library/entity/LibraryPanelKey.java create mode 100644 src/main/java/DiffLens/back_end/domain/members/entity/Agreement.java create mode 100644 src/main/java/DiffLens/back_end/domain/members/entity/Onboarding.java create mode 100644 src/main/java/DiffLens/back_end/domain/members/entity/Plan.java create mode 100644 src/main/java/DiffLens/back_end/domain/members/enums/Industry.java create mode 100644 src/main/java/DiffLens/back_end/domain/members/enums/Job.java create mode 100644 src/main/java/DiffLens/back_end/domain/panel/entity/Panel.java create mode 100644 src/main/java/DiffLens/back_end/domain/search/entity/Filter.java create mode 100644 src/main/java/DiffLens/back_end/domain/search/entity/SearchFilter.java create mode 100644 src/main/java/DiffLens/back_end/domain/search/entity/SearchHistory.java rename src/main/java/DiffLens/back_end/domain/search/enums/chart/{CharType.java => ChartType.java} (70%) create mode 100644 src/main/java/DiffLens/back_end/domain/search/enums/filters/FilterKey.java rename src/main/java/DiffLens/back_end/domain/search/enums/filters/{Region.java => Residence.java} (70%) diff --git a/src/main/java/DiffLens/back_end/domain/library/entity/Library.java b/src/main/java/DiffLens/back_end/domain/library/entity/Library.java new file mode 100644 index 0000000..1f5d1d9 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/entity/Library.java @@ -0,0 +1,29 @@ +package DiffLens.back_end.domain.library.entity; + +import DiffLens.back_end.domain.search.entity.SearchHistory; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Library { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, length = 50) + private String libraryName; + + @Column(nullable = false, length = 10) + private String tag; + + // 연관관계 + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "history_id") + private SearchHistory history; + +} diff --git a/src/main/java/DiffLens/back_end/domain/library/entity/LibraryPanel.java b/src/main/java/DiffLens/back_end/domain/library/entity/LibraryPanel.java new file mode 100644 index 0000000..b79d381 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/entity/LibraryPanel.java @@ -0,0 +1,33 @@ +package DiffLens.back_end.domain.library.entity; + +import DiffLens.back_end.domain.panel.entity.Panel; +import jakarta.persistence.*; +import lombok.*; + +/** + * Library - Panel 의 중간테이블 + */ +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class LibraryPanel { + + // 복합키 + @EmbeddedId + private LibraryPanelKey id; + + // 연관관계 + + @MapsId("libraryId") // 복합키 클래스 필드와 동기화 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "library_id", insertable = false, updatable = false) // insertable, updatable false => 중복방지 + private Library library; + + @MapsId("panelId") + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "panel_id", insertable = false, updatable = false) + private Panel panel; + +} diff --git a/src/main/java/DiffLens/back_end/domain/library/entity/LibraryPanelKey.java b/src/main/java/DiffLens/back_end/domain/library/entity/LibraryPanelKey.java new file mode 100644 index 0000000..f5c3f1d --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/library/entity/LibraryPanelKey.java @@ -0,0 +1,25 @@ +package DiffLens.back_end.domain.library.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.*; + +import java.io.Serializable; + +/** + * LibraryPanel에 대한 복합키 클래스 + */ +@Getter +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode +@Embeddable +public class LibraryPanelKey implements Serializable { + + @Column(name = "panel_id") + private String panelId; + + @Column(name = "library_id") + private Long libraryId; + +} diff --git a/src/main/java/DiffLens/back_end/domain/members/entity/Agreement.java b/src/main/java/DiffLens/back_end/domain/members/entity/Agreement.java new file mode 100644 index 0000000..52893eb --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/members/entity/Agreement.java @@ -0,0 +1,28 @@ +package DiffLens.back_end.domain.members.entity; + +import DiffLens.back_end.global.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Agreement extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, columnDefinition = "TEXT") + private String content; + + // 연관관계 + + // 양방향 + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + +} diff --git a/src/main/java/DiffLens/back_end/domain/members/entity/Member.java b/src/main/java/DiffLens/back_end/domain/members/entity/Member.java index 472ff89..448373b 100644 --- a/src/main/java/DiffLens/back_end/domain/members/entity/Member.java +++ b/src/main/java/DiffLens/back_end/domain/members/entity/Member.java @@ -13,7 +13,7 @@ @Entity @Getter @Builder -@AllArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member extends BaseEntity implements UserDetails { @@ -29,16 +29,31 @@ public class Member extends BaseEntity implements UserDetails { @Column(length = 50, nullable = false) private String email; - @Column(nullable = true) + @Column(nullable = true, length = 255) private String password; @Enumerated(EnumType.STRING) @Column(nullable = false) private LoginType loginType; + @Column(nullable = true) + private String profileImage; // 연관관계 + // 양방향 + @OneToOne(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) + private Agreement agreement; + + // 양방향 + @OneToOne(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) + private Onboarding onboarding; + + // 단방향 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "plan_id") + private Plan plan; + // Security 관련 @Override public Collection getAuthorities() { diff --git a/src/main/java/DiffLens/back_end/domain/members/entity/Onboarding.java b/src/main/java/DiffLens/back_end/domain/members/entity/Onboarding.java new file mode 100644 index 0000000..142f3af --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/members/entity/Onboarding.java @@ -0,0 +1,35 @@ +package DiffLens.back_end.domain.members.entity; + +import DiffLens.back_end.domain.members.enums.Industry; +import DiffLens.back_end.domain.members.enums.Job; +import DiffLens.back_end.global.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Onboarding extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private Job job; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private Industry industry; + + // 연관관계 + + // 양방향 + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + +} diff --git a/src/main/java/DiffLens/back_end/domain/members/entity/Plan.java b/src/main/java/DiffLens/back_end/domain/members/entity/Plan.java new file mode 100644 index 0000000..95ecfe4 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/members/entity/Plan.java @@ -0,0 +1,26 @@ +package DiffLens.back_end.domain.members.entity; + +import DiffLens.back_end.global.entity.BaseEntity; +import jakarta.persistence.*; +import jakarta.validation.constraints.Min; +import lombok.*; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Plan extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, length = 50) + private String name; + + @Min(0) + @Column(nullable = false) + private Integer price; + +} diff --git a/src/main/java/DiffLens/back_end/domain/members/enums/Industry.java b/src/main/java/DiffLens/back_end/domain/members/enums/Industry.java new file mode 100644 index 0000000..434aa7d --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/members/enums/Industry.java @@ -0,0 +1,10 @@ +package DiffLens.back_end.domain.members.enums; + +/** + * 업종 + */ +public enum Industry { + + IT, FINANCE, EDUCATION + +} diff --git a/src/main/java/DiffLens/back_end/domain/members/enums/Job.java b/src/main/java/DiffLens/back_end/domain/members/enums/Job.java new file mode 100644 index 0000000..833e9f7 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/members/enums/Job.java @@ -0,0 +1,10 @@ +package DiffLens.back_end.domain.members.enums; + +/** + * 직무 + */ +public enum Job { + + ETC + +} diff --git a/src/main/java/DiffLens/back_end/domain/panel/entity/Panel.java b/src/main/java/DiffLens/back_end/domain/panel/entity/Panel.java new file mode 100644 index 0000000..c99d2b3 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/panel/entity/Panel.java @@ -0,0 +1,66 @@ +package DiffLens.back_end.domain.panel.entity; + +import DiffLens.back_end.domain.search.enums.filters.Gender; +import jakarta.persistence.*; +import jakarta.validation.constraints.Min; +import lombok.*; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.util.List; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Panel { + + @Id + @Column(length = 50) + private String id; + + @JdbcTypeCode(SqlTypes.JSON) + @Column(nullable = false) + private Object rawData; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private Gender gender; + + @Column(nullable = false, length = 20) + private String ageGroup; + + @Column(nullable = false, length = 100) + private String residence; + + @Column(nullable = false, length = 10) + private String martialStatus; + + @Column(nullable = false) + @Min(0) + private Integer childrenCount; + + @Column(nullable = false, length = 50) + private String education; + + @Column(nullable = false, length = 200) + private String occupation; + + @JdbcTypeCode(SqlTypes.ARRAY) + @Column(nullable = false, columnDefinition = "text[] DEFAULT '{}'::text[]") + private List devices; + + @Column(nullable = false, columnDefinition = "TEXT") + private String profileSummary; + + @JdbcTypeCode(SqlTypes.VECTOR) + @Column(columnDefinition = "vector(4096)") + private float[] embedding; // float[] 써야한다고 함... + + @JdbcTypeCode(SqlTypes.ARRAY) + @Column(nullable = false, columnDefinition = "text[] DEFAULT '{}'::text[]") + private List hashTags; + + +} diff --git a/src/main/java/DiffLens/back_end/domain/search/entity/Filter.java b/src/main/java/DiffLens/back_end/domain/search/entity/Filter.java new file mode 100644 index 0000000..19cb53a --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/search/entity/Filter.java @@ -0,0 +1,21 @@ +package DiffLens.back_end.domain.search.entity; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Filter { + + @Id + private Long id; // 자동생성 X + + @Column(nullable = false, length = 50) + private String type; + + @Column(nullable = false, length = 100) + private String value; + +} diff --git a/src/main/java/DiffLens/back_end/domain/search/entity/SearchFilter.java b/src/main/java/DiffLens/back_end/domain/search/entity/SearchFilter.java new file mode 100644 index 0000000..dbbcdb1 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/search/entity/SearchFilter.java @@ -0,0 +1,31 @@ +package DiffLens.back_end.domain.search.entity; + +import DiffLens.back_end.global.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class SearchFilter extends BaseEntity { + + @Id // history의 id로 지정. 자동 X + private Long id; + + @JdbcTypeCode(SqlTypes.ARRAY) + @Column(nullable = false, columnDefinition = "bigint[] DEFAULT '{}'::bigint[]") + private List filters = new ArrayList<>(); + + @OneToOne(fetch = FetchType.LAZY) + @MapsId + @JoinColumn(name = "search_id") + private SearchHistory searchHistory; + +} diff --git a/src/main/java/DiffLens/back_end/domain/search/entity/SearchHistory.java b/src/main/java/DiffLens/back_end/domain/search/entity/SearchHistory.java new file mode 100644 index 0000000..90d02d2 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/search/entity/SearchHistory.java @@ -0,0 +1,40 @@ +package DiffLens.back_end.domain.search.entity; + +import DiffLens.back_end.domain.members.entity.Member; +import DiffLens.back_end.global.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.time.LocalDate; +import java.util.List; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class SearchHistory extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private LocalDate date; + + @Column(nullable = false, columnDefinition = "TEXT") + private String content; + + @JdbcTypeCode(SqlTypes.ARRAY) + @Column(nullable = false, columnDefinition = "text[] DEFAULT '{}'::text[]") + private List panelIds; + + // 연관관계 + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + +} diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/chart/CharType.java b/src/main/java/DiffLens/back_end/domain/search/enums/chart/ChartType.java similarity index 70% rename from src/main/java/DiffLens/back_end/domain/search/enums/chart/CharType.java rename to src/main/java/DiffLens/back_end/domain/search/enums/chart/ChartType.java index 4d2d499..d128da3 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/chart/CharType.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/chart/ChartType.java @@ -1,4 +1,4 @@ package DiffLens.back_end.domain.search.enums.chart; -public enum CharType { +public enum ChartType { } diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/AgeGroup.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/AgeGroup.java index 148de39..0469177 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/AgeGroup.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/AgeGroup.java @@ -5,16 +5,16 @@ @Getter @AllArgsConstructor -public enum AgeGroup { +public enum AgeGroup{ - TWENTY("20-29"), - THIRTY("30-39"), - FORTY("40-49"), - FIFTY("50-59"), - SIXTY_PLUS("60-69") + TWENTY(1L, "20-29"), + THIRTY(2L, "30-39"), + FORTY(3L, "40-49"), + FIFTY(4L, "50-59"), + SIXTY_PLUS(5L, "60-69") ; - // TODO : private final String key; + private final Long id; // 내부 시드 ID ( 상대적 ) private final String range; public static AgeGroup fromRange(String range) { diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/FilterKey.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/FilterKey.java new file mode 100644 index 0000000..57c4a79 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/FilterKey.java @@ -0,0 +1,25 @@ +package DiffLens.back_end.domain.search.enums.filters; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum FilterKey { + + AGE_GROUP(100L, "age_group", "연령대", AgeGroup.class), + CHILDREN(200L, "children", "자녀수", Children.class), + GENDER(300L, "gender", "성별", Gender.class), + MARTIAL_STATUS(400L, "martial_status", "결혼상태", MartialStatus.class), + OCCUPATION(500L, "occupation", "직업", Occupation.class), + RESIDENCE(600L, "residence", "거주지", Residence.class) + + // 추가예정 + ; + + private final Long baseId; // 각 그룹에 배정하는 시드 ID의 Base. Base + Enum.id -> DB의 ID로 저장 + private final String keyEn; + private final String keyKr; + private final Class> valueEnum; + +} diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Gender.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Gender.java index 3f33eaf..34d7720 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Gender.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Gender.java @@ -2,6 +2,6 @@ public enum Gender { - + MALE, FEMALE, NONE } diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Region.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Residence.java similarity index 70% rename from src/main/java/DiffLens/back_end/domain/search/enums/filters/Region.java rename to src/main/java/DiffLens/back_end/domain/search/enums/filters/Residence.java index e2a0d9f..0664164 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Region.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Residence.java @@ -1,4 +1,4 @@ package DiffLens.back_end.domain.search.enums.filters; -public enum Region { +public enum Residence { } From 27c3f2d09b1c99435c7927b2be001fbed0b592c1 Mon Sep 17 00:00:00 2001 From: junyong Date: Tue, 14 Oct 2025 14:39:54 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat=20:=20=EC=84=9C=EB=B2=84=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EC=8B=9C=20enum=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20db?= =?UTF-8?q?=EC=97=90=20=EC=A0=80=EC=9E=A5=ED=95=98=EB=8F=84=EB=A1=9D=20Fil?= =?UTF-8?q?terInitializer=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/search/dto/SearchRequestDTO.java | 3 + .../back_end/domain/search/entity/Filter.java | 1 + .../domain/search/enums/filters/AgeGroup.java | 14 +-- .../domain/search/enums/filters/Children.java | 11 ++ .../search/enums/filters/FilterKey.java | 7 ++ .../domain/search/enums/filters/Gender.java | 14 ++- .../search/enums/filters/MartialStatus.java | 11 ++ .../search/enums/filters/Occupation.java | 11 ++ .../search/enums/filters/Residence.java | 11 ++ .../search/repository/FilterRepository.java | 7 ++ .../global/util/data/FilterInitializer.java | 100 ++++++++++++++++++ 11 files changed, 176 insertions(+), 14 deletions(-) create mode 100644 src/main/java/DiffLens/back_end/domain/search/repository/FilterRepository.java create mode 100644 src/main/java/DiffLens/back_end/global/util/data/FilterInitializer.java diff --git a/src/main/java/DiffLens/back_end/domain/search/dto/SearchRequestDTO.java b/src/main/java/DiffLens/back_end/domain/search/dto/SearchRequestDTO.java index 00e9973..64f6c32 100644 --- a/src/main/java/DiffLens/back_end/domain/search/dto/SearchRequestDTO.java +++ b/src/main/java/DiffLens/back_end/domain/search/dto/SearchRequestDTO.java @@ -47,6 +47,9 @@ public static class SearchFilters{ private List martialStatus; // 결혼상태 private String children; private List occupation;// 직업 + + // TODO : 추후 필터 추가 예정... + } diff --git a/src/main/java/DiffLens/back_end/domain/search/entity/Filter.java b/src/main/java/DiffLens/back_end/domain/search/entity/Filter.java index 19cb53a..d3c5952 100644 --- a/src/main/java/DiffLens/back_end/domain/search/entity/Filter.java +++ b/src/main/java/DiffLens/back_end/domain/search/entity/Filter.java @@ -5,6 +5,7 @@ @Entity @Getter +@Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Filter { diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/AgeGroup.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/AgeGroup.java index 0469177..84dde6f 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/AgeGroup.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/AgeGroup.java @@ -15,18 +15,6 @@ public enum AgeGroup{ ; private final Long id; // 내부 시드 ID ( 상대적 ) - private final String range; - - public static AgeGroup fromRange(String range) { - for (AgeGroup group : values()) { - if (group.range.equals(range)) { - return group; - } - } - // TODO : 예외처리 하기 - throw new IllegalArgumentException("Unknown age range: " + range); - } - - + private final String value; } diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Children.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Children.java index e460604..e7dc918 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Children.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Children.java @@ -1,4 +1,15 @@ package DiffLens.back_end.domain.search.enums.filters; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor public enum Children { + + ; + + private final Long id; // 내부 시드 ID ( 상대적 ) + private final String value; + } diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/FilterKey.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/FilterKey.java index 57c4a79..e50bcde 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/FilterKey.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/FilterKey.java @@ -3,6 +3,9 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; +import java.util.List; + @Getter @AllArgsConstructor public enum FilterKey { @@ -22,4 +25,8 @@ public enum FilterKey { private final String keyKr; private final Class> valueEnum; + public static List getFilterList(){ + return Arrays.asList(FilterKey.values()); + } + } diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Gender.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Gender.java index 34d7720..e4103a2 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Gender.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Gender.java @@ -1,7 +1,19 @@ package DiffLens.back_end.domain.search.enums.filters; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor public enum Gender { - MALE, FEMALE, NONE + MALE(1L, "남자"), + FEMALE(2L, "여자"), + NONE(3L, "알수없음") + + ; + + private final Long id; // 내부 시드 ID ( 상대적 ) + private final String value; } diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/MartialStatus.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/MartialStatus.java index 5d88da5..7473491 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/MartialStatus.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/MartialStatus.java @@ -1,4 +1,15 @@ package DiffLens.back_end.domain.search.enums.filters; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor public enum MartialStatus { + + ; + + private final Long id; // 내부 시드 ID ( 상대적 ) + private final String value; + } diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Occupation.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Occupation.java index faee782..d55105b 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Occupation.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Occupation.java @@ -1,4 +1,15 @@ package DiffLens.back_end.domain.search.enums.filters; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor public enum Occupation { + + ; + + private final Long id; // 내부 시드 ID ( 상대적 ) + private final String value; + } diff --git a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Residence.java b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Residence.java index 0664164..07281ed 100644 --- a/src/main/java/DiffLens/back_end/domain/search/enums/filters/Residence.java +++ b/src/main/java/DiffLens/back_end/domain/search/enums/filters/Residence.java @@ -1,4 +1,15 @@ package DiffLens.back_end.domain.search.enums.filters; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor public enum Residence { + + ; + + private final Long id; // 내부 시드 ID ( 상대적 ) + private final String value; + } diff --git a/src/main/java/DiffLens/back_end/domain/search/repository/FilterRepository.java b/src/main/java/DiffLens/back_end/domain/search/repository/FilterRepository.java new file mode 100644 index 0000000..5b03604 --- /dev/null +++ b/src/main/java/DiffLens/back_end/domain/search/repository/FilterRepository.java @@ -0,0 +1,7 @@ +package DiffLens.back_end.domain.search.repository; + +import DiffLens.back_end.domain.search.entity.Filter; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface FilterRepository extends JpaRepository { +} diff --git a/src/main/java/DiffLens/back_end/global/util/data/FilterInitializer.java b/src/main/java/DiffLens/back_end/global/util/data/FilterInitializer.java new file mode 100644 index 0000000..7735071 --- /dev/null +++ b/src/main/java/DiffLens/back_end/global/util/data/FilterInitializer.java @@ -0,0 +1,100 @@ +package DiffLens.back_end.global.util.data; + +import DiffLens.back_end.domain.search.entity.Filter; +import DiffLens.back_end.domain.search.enums.filters.FilterKey; +import DiffLens.back_end.domain.search.repository.FilterRepository; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * 서버 시작 시 모든 FilterKey Enum 데이터를 DB Filter 테이블에 저장 + * 기존 데이터가 있어도 덮어쓰기 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class FilterInitializer { + + private final FilterRepository filterRepository; + + @PostConstruct + @Transactional + public void init() { + + log.info("[초기 필터 데이터 저장] 시작"); + + List filters = new ArrayList<>(); + + for (FilterKey filterKey : FilterKey.getFilterList()) { + filters.addAll(convertEnumToFilters(filterKey)); + } + + filterRepository.saveAll(filters); + + log.info("[초기 필터 데이터 저장] 종료"); + } + + /** + * FilterKey에 매핑된 Enum 값을 Filter 엔티티 리스트로 변환 + */ + private List convertEnumToFilters(FilterKey filterKey) { + List filters = new ArrayList<>(); + Class> enumClass = filterKey.getValueEnum(); + + try { + Enum[] enumValues = getEnumValues(enumClass); + + for (Enum enumValue : enumValues) { + filters.add(Filter.builder() + .id(filterKey.getBaseId() + getEnumId(enumValue)) + .type(filterKey.getKeyKr()) + .value(getEnumValue(enumValue)) + .build()); + } + + } catch (Exception e) { + throw new RuntimeException("Enum 초기화 실패: " + enumClass.getSimpleName(), e); + } + + return filters; + } + + /** + * Enum 클래스에서 values() 호출 + */ + private Enum[] getEnumValues(Class> enumClass) throws Exception { + Method valuesMethod = enumClass.getMethod("values"); + return (Enum[]) valuesMethod.invoke(null); + } + + /** + * Enum에서 getId() 호출 + */ + private Long getEnumId(Enum enumValue) { + try { + Method idMethod = enumValue.getClass().getMethod("getId"); + return (Long) idMethod.invoke(enumValue); + } catch (Exception e) { + throw new RuntimeException("Enum id 조회 실패: " + enumValue.name(), e); + } + } + + /** + * Enum에서 getValue() 호출 + */ + private String getEnumValue(Enum enumValue) { + try { + Method valueMethod = enumValue.getClass().getMethod("getValue"); + return (String) valueMethod.invoke(enumValue); + } catch (Exception e) { + throw new RuntimeException("Enum value 조회 실패: " + enumValue.name(), e); + } + } +}