diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 6ad76ef..0f1b0f8 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -51,6 +51,7 @@ jobs: # 새 컨테이너 실행 sudo docker run -d \ --name hyetaek-on \ + --restart unless-stopped \ --env SPRING_PROFILES_ACTIVE=prod,s3Bucket \ --env-file ${{ secrets.EC2_TARGET_PATH }}/.env \ --network hyetaekon-network \ diff --git a/src/main/java/com/hyetaekon/hyetaekon/answer/entity/Answer.java b/src/main/java/com/hyetaekon/hyetaekon/answer/entity/Answer.java index 2523fc3..da5fa35 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/answer/entity/Answer.java +++ b/src/main/java/com/hyetaekon/hyetaekon/answer/entity/Answer.java @@ -17,7 +17,14 @@ @Builder @NoArgsConstructor @AllArgsConstructor -@Table(name = "answer") +@Table(name = "answer", indexes = { + @Index(name = "idx_answer_post_id_selected_createdAt", columnList = "post_id, selected DESC, createdAt DESC"), // 주요 조회 및 정렬 + @Index(name = "idx_answer_post_id", columnList = "post_id"), + @Index(name = "idx_answer_user_id", columnList = "user_id"), + @Index(name = "idx_answer_post_id_deleted_at", columnList = "post_id, deletedAt"), // 삭제된 답변 조회 + @Index(name = "idx_answer_post_id_suspend_at", columnList = "post_id, suspendAt") // 정지된 답변 조회 + } +) @EntityListeners(AuditingEntityListener.class) public class Answer { @Id diff --git a/src/main/java/com/hyetaekon/hyetaekon/bookmark/entity/Bookmark.java b/src/main/java/com/hyetaekon/hyetaekon/bookmark/entity/Bookmark.java index d0ccaeb..c596d22 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/bookmark/entity/Bookmark.java +++ b/src/main/java/com/hyetaekon/hyetaekon/bookmark/entity/Bookmark.java @@ -16,6 +16,10 @@ @Builder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor +@Table(name = "bookmark", indexes = { + @Index(name = "idx_bookmark_user_public_service", columnList = "user_id, public_service_id", unique = true), // 주요 조회 조건 및 중복 방지 + @Index(name = "idx_bookmark_public_service_id", columnList = "public_service_id") // 서비스기준 북마크 목록 조회 +}) public class Bookmark extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/hyetaekon/hyetaekon/comment/entity/Comment.java b/src/main/java/com/hyetaekon/hyetaekon/comment/entity/Comment.java index 43c6486..12ffe83 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/comment/entity/Comment.java +++ b/src/main/java/com/hyetaekon/hyetaekon/comment/entity/Comment.java @@ -16,7 +16,13 @@ @Builder @NoArgsConstructor @AllArgsConstructor -@Table(name = "comments") +@Table(name = "comments", indexes = { + @Index(name = "idx_comment_post_parent_created", columnList = "post_id, parentId, createdAt"), // 주요 댓글/대댓글 조회 및 정렬 + @Index(name = "idx_comment_post_id", columnList = "post_id"), + @Index(name = "idx_comment_user_id", columnList = "user_id"), + @Index(name = "idx_comment_post_id_deleted_at", columnList = "post_id, deletedAt"), // 삭제된 댓글 조회 + @Index(name = "idx_comment_post_id_suspend_at", columnList = "post_id, suspendAt") // 정지된 댓글 조회 +}) @EntityListeners(AuditingEntityListener.class) public class Comment { @Id diff --git a/src/main/java/com/hyetaekon/hyetaekon/post/entity/Post.java b/src/main/java/com/hyetaekon/hyetaekon/post/entity/Post.java index 1be58ae..6529c28 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/post/entity/Post.java +++ b/src/main/java/com/hyetaekon/hyetaekon/post/entity/Post.java @@ -21,7 +21,16 @@ @Builder @NoArgsConstructor @AllArgsConstructor -@Table(name = "post") +@Table(name = "post", indexes = { + // 가장 빈번한 정렬/필터 조합 고려 + @Index(name = "idx_post_deleted_at_created_at", columnList = "deletedAt, createdAt DESC"), + // 타입별 조회 및 정렬 + @Index(name = "idx_post_deleted_at_post_type_created_at", columnList = "deletedAt, postType, createdAt DESC"), + // 사용자별 게시글 조회 및 정렬 + @Index(name = "idx_post_user_id_deleted_at_created_at", columnList = "user_id, deletedAt, createdAt DESC"), + @Index(name = "idx_post_deleted_at_title", columnList = "deletedAt, title"), // 좋아용한 게시글 + @Index(name = "idx_post_suspend_at_created_at", columnList = "suspendAt, createdAt DESC") // 정지된 게시글 +}) @EntityListeners(AuditingEntityListener.class) public class Post { @@ -124,6 +133,15 @@ public void suspend() { this.suspendAt = LocalDateTime.now(); } + public String getDisplayTitle() { + if (this.deletedAt != null) { + return "사용자가 삭제한 게시글입니다."; + } else if (this.suspendAt != null) { + return "관리자에 의해 삭제된 게시글입니다."; + } + return title; + } + public String getDisplayContent() { if (this.deletedAt != null) { return "사용자가 삭제한 게시글입니다."; diff --git a/src/main/java/com/hyetaekon/hyetaekon/post/entity/PostImage.java b/src/main/java/com/hyetaekon/hyetaekon/post/entity/PostImage.java index b8ae7d1..c95ebb0 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/post/entity/PostImage.java +++ b/src/main/java/com/hyetaekon/hyetaekon/post/entity/PostImage.java @@ -9,6 +9,9 @@ @Getter @Setter @Builder +@Table(name = "post_image", indexes = { + @Index(name = "idx_post_image_post_id_deleted_at", columnList = "post_id, deletedAt") +}) @NoArgsConstructor @AllArgsConstructor public class PostImage { diff --git a/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java b/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java index 7c696ef..5fae470 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java +++ b/src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java @@ -16,6 +16,7 @@ public interface PostMapper { // ✅ 게시글 목록용 DTO 변환 @Mapping(source = "id", target = "postId") @Mapping(source = "user.nickname", target = "nickName") + @Mapping(target = "title", expression = "java(post.getDisplayTitle())") @Mapping(source = "postType.koreanName", target = "postType") @Mapping(source = "recommendCnt", target = "recommendCnt") @Mapping(source = "user.id", target = "userId") // 🔥 추가 @@ -24,6 +25,7 @@ public interface PostMapper { // ✅ 마이페이지용 게시글 DTO @Mapping(source = "id", target = "postId") @Mapping(source = "user.nickname", target = "nickName") + @Mapping(target = "title", expression = "java(post.getDisplayTitle())") @Mapping(target = "content", expression = "java(post.getDisplayContent())") MyPostListResponseDto toMyPostListDto(Post post); @@ -37,6 +39,7 @@ public interface PostMapper { @Mapping(source = "id", target = "postId") @Mapping(source = "user.id", target = "userId") @Mapping(source = "user.nickname", target = "nickName") + @Mapping(target = "title", expression = "java(post.getDisplayTitle())") @Mapping(target = "content", expression = "java(post.getDisplayContent())") @Mapping(source = "postType.koreanName", target = "postType") @Mapping(target = "recommended", constant = "false") diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/BusinessType.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/BusinessType.java index 831b383..2219e07 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/BusinessType.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/BusinessType.java @@ -9,7 +9,10 @@ @Builder @NoArgsConstructor @AllArgsConstructor -@Table(name = "business_type") +@Table(name = "business_type", indexes = { + @Index(name = "idx_business_type_public_service_id", columnList = "public_service_id"), + @Index(name = "idx_business_type_enum_public_service_id", columnList = "business_type_enum, public_service_id") +}) public class BusinessType { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/FamilyType.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/FamilyType.java index cd198e9..5b2e22f 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/FamilyType.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/FamilyType.java @@ -9,7 +9,10 @@ @Builder @NoArgsConstructor @AllArgsConstructor -@Table(name = "family_type") +@Table(name = "family_type", indexes = { + @Index(name = "idx_family_type_public_service_id", columnList = "public_service_id"), + @Index(name = "idx_family_type_enum_public_service_id", columnList = "family_type_enum, public_service_id") +}) public class FamilyType { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/Occupation.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/Occupation.java index db43a76..44c7031 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/Occupation.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/Occupation.java @@ -9,7 +9,10 @@ @Builder @NoArgsConstructor @AllArgsConstructor -@Table(name = "occupation") +@Table(name = "occupation", indexes = { + @Index(name = "idx_occupation_public_service_id", columnList = "public_service_id"), + @Index(name = "idx_occupation_enum_public_service_id", columnList = "occupation_enum, public_service_id") +}) public class Occupation { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/PublicService.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/PublicService.java index 6bdbb99..a7f1c72 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/PublicService.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/PublicService.java @@ -14,6 +14,11 @@ @Builder @NoArgsConstructor @AllArgsConstructor +@Table(name = "public_service", indexes = { + @Index(name = "idx_publicservice_bookmark_cnt", columnList = "bookmark_cnt DESC"), + @Index(name = "idx_publicservice_service_category", columnList = "service_category"), + @Index(name = "idx_publicservice_views", columnList = "views") +}) public class PublicService { @Id private String id; @@ -23,7 +28,7 @@ public class PublicService { // 서비스 분야 - 카테고리 + 해시태그 @Enumerated(EnumType.STRING) - @Column(name = "public_category", nullable = false) + @Column(name = "service_category", nullable = false) private ServiceCategory serviceCategory; // 서비스 분야 @Column(name = "summary_purpose", columnDefinition = "TEXT") diff --git a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/SpecialGroup.java b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/SpecialGroup.java index c720ae8..d3286ec 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/SpecialGroup.java +++ b/src/main/java/com/hyetaekon/hyetaekon/publicservice/entity/SpecialGroup.java @@ -9,7 +9,10 @@ @Builder @NoArgsConstructor @AllArgsConstructor -@Table(name = "special_group") +@Table(name = "special_group", indexes = { + @Index(name = "idx_special_group_public_service_id", columnList = "public_service_id"), + @Index(name = "idx_special_group_enum_public_service_id", columnList = "special_group_enum, public_service_id") +}) public class SpecialGroup { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/hyetaekon/hyetaekon/recommend/entity/Recommend.java b/src/main/java/com/hyetaekon/hyetaekon/recommend/entity/Recommend.java index 8fc9ef8..ab1dcef 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/recommend/entity/Recommend.java +++ b/src/main/java/com/hyetaekon/hyetaekon/recommend/entity/Recommend.java @@ -16,6 +16,10 @@ @Builder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor +@Table(name = "recommend", indexes = { + @Index(name = "idx_recommend_user_post", columnList = "user_id, post_id", unique = true), // 주요 조회 조건 및 중복 방지 + @Index(name = "idx_recommend_post_id", columnList = "post_id") // 게시글기준 좋아요 목록 조회 +}) public class Recommend extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/entity/User.java b/src/main/java/com/hyetaekon/hyetaekon/user/entity/User.java index 390c657..c17f6dd 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/user/entity/User.java +++ b/src/main/java/com/hyetaekon/hyetaekon/user/entity/User.java @@ -17,6 +17,14 @@ @Builder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor +@Table(name = "user", uniqueConstraints = { + @UniqueConstraint(name = "up_user_real_id_deleted_at", columnNames = {"real_id", "deleted_at"}), +}, indexes = { + @Index(name = "idx_user_real_id_deleted_at", columnList = "real_id, deletedAt"), + @Index(name = "idx_user_nickname_deleted_at", columnList = "nickname, deletedAt"), + @Index(name = "idx_user_deleted_at_suspend_end_at", columnList = "deletedAt, suspendEndAt"), + @Index(name = "idx_user_created_at", columnList = "createdAt DESC") +}) public class User { @Id diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/entity/UserReport.java b/src/main/java/com/hyetaekon/hyetaekon/user/entity/UserReport.java index 9f9c66d..e636da2 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/user/entity/UserReport.java +++ b/src/main/java/com/hyetaekon/hyetaekon/user/entity/UserReport.java @@ -11,6 +11,13 @@ @Builder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor +@Table(name = "user_report", + indexes = { + @Index(name = "idx_user_report_status_created_at", columnList = "status, createdAt DESC"), + @Index(name = "idx_user_report_reporter_id", columnList = "reporter_id"), + @Index(name = "idx_user_report_reported_id", columnList = "reported_id") + } +) public class UserReport { @Id diff --git a/src/main/java/com/hyetaekon/hyetaekon/userInterest/entity/UserInterest.java b/src/main/java/com/hyetaekon/hyetaekon/userInterest/entity/UserInterest.java index b7ace16..965a8bf 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/userInterest/entity/UserInterest.java +++ b/src/main/java/com/hyetaekon/hyetaekon/userInterest/entity/UserInterest.java @@ -12,6 +12,9 @@ @NoArgsConstructor @Getter @Builder +@Table(name = "user_interest", indexes = { + @Index(name = "idx_interest", columnList = "interest") +}) public class UserInterest { @Id @GeneratedValue(strategy = GenerationType.IDENTITY)