From d52243741cde426551741c8855f26a23d2fc0680 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 30 Jun 2025 12:10:59 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=EC=95=84=EC=B9=B4=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../archive/dto/ArchiveListDTO.java | 1 + .../archive/entity/ArchiveMember.java | 2 +- .../archive/repository/ArchiveRepository.java | 20 +++++++++++++++++++ .../archive/service/ArchiveService.java | 12 ++++++----- .../src/main/resources/application.yml | 5 +++++ 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveListDTO.java b/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveListDTO.java index 9e16f603..4169a64a 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveListDTO.java +++ b/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveListDTO.java @@ -18,6 +18,7 @@ public static class ArchiveSimpleDTO { private Long id; private String title; private String writerNickname; + private String writerProfileImg; // 작성자 프로필 이미지 추가 private String thumbnail; private int commentCount; private int view; // 조회수 추가 diff --git a/sequence_member/src/main/java/sequence/sequence_member/archive/entity/ArchiveMember.java b/sequence_member/src/main/java/sequence/sequence_member/archive/entity/ArchiveMember.java index 050935e8..f14bbe41 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/archive/entity/ArchiveMember.java +++ b/sequence_member/src/main/java/sequence/sequence_member/archive/entity/ArchiveMember.java @@ -43,7 +43,7 @@ public class ArchiveMember extends BaseTimeEntity { @JoinColumn(name = "archive_id") private Archive archive; - @Column(name = "profile_img") + @Column(name = "profile_img", columnDefinition = "TEXT") private String profileImg; // 멤버의 프로필 이미지 URL @Builder diff --git a/sequence_member/src/main/java/sequence/sequence_member/archive/repository/ArchiveRepository.java b/sequence_member/src/main/java/sequence/sequence_member/archive/repository/ArchiveRepository.java index dee37c01..c1d26631 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/archive/repository/ArchiveRepository.java +++ b/sequence_member/src/main/java/sequence/sequence_member/archive/repository/ArchiveRepository.java @@ -20,30 +20,50 @@ public interface ArchiveRepository extends JpaRepository { // 기본 조회 - 삭제되지 않은 아카이브만 Optional findByIdAndIsDeletedFalse(Long id); + // 작성자 정보를 함께 조회하는 최적화된 메서드 (FETCH JOIN 사용) + @Query("SELECT a FROM Archive a JOIN FETCH a.writer WHERE a.id = :id AND a.isDeleted = false") + Optional findByIdAndIsDeletedFalseWithWriter(@Param("id") Long id); + // 전체 목록 조회 - 삭제되지 않은 것만 Page findByIsDeletedFalse(Pageable pageable); // 상태별 조회 - 삭제되지 않은 것만 Page findByStatusAndIsDeletedFalse(Status status, Pageable pageable); + // 상태별 조회 - 작성자 정보 포함 (FETCH JOIN 사용) + @Query("SELECT a FROM Archive a JOIN FETCH a.writer WHERE a.status = :status AND a.isDeleted = false") + Page findByStatusAndIsDeletedFalseWithWriter(@Param("status") Status status, Pageable pageable); + // 카테고리별 조회 - 삭제되지 않은 것만 Page findByCategoryAndIsDeletedFalse(Category category, Pageable pageable); // 카테고리와 상태로 조회 - 삭제되지 않은 것만 Page findByCategoryAndStatusAndIsDeletedFalse(Category category, Status status, Pageable pageable); + // 카테고리와 상태로 조회 - 작성자 정보 포함 (FETCH JOIN 사용) + @Query("SELECT a FROM Archive a JOIN FETCH a.writer WHERE a.category = :category AND a.status = :status AND a.isDeleted = false") + Page findByCategoryAndStatusAndIsDeletedFalseWithWriter(@Param("category") Category category, @Param("status") Status status, Pageable pageable); + // 제목으로 검색 - 삭제되지 않은 것만 Page findByTitleContainingIgnoreCaseAndIsDeletedFalse(String title, Pageable pageable); // 제목으로 검색하고 상태로 필터링 - 삭제되지 않은 것만 Page findByTitleContainingIgnoreCaseAndStatusAndIsDeletedFalse(String title, Status status, Pageable pageable); + // 제목으로 검색하고 상태로 필터링 - 작성자 정보 포함 (FETCH JOIN 사용) + @Query("SELECT a FROM Archive a JOIN FETCH a.writer WHERE a.title LIKE %:title% AND a.status = :status AND a.isDeleted = false") + Page findByTitleContainingIgnoreCaseAndStatusAndIsDeletedFalseWithWriter(@Param("title") String title, @Param("status") Status status, Pageable pageable); + // 카테고리와 제목으로 검색 - 삭제되지 않은 것만 Page findByCategoryAndTitleContainingIgnoreCaseAndIsDeletedFalse(Category category, String title, Pageable pageable); // 카테고리와 제목으로 검색하고 상태로 필터링 - 삭제되지 않은 것만 Page findByCategoryAndTitleContainingIgnoreCaseAndStatusAndIsDeletedFalse(Category category, String title, Status status, Pageable pageable); + // 카테고리와 제목으로 검색하고 상태로 필터링 - 작성자 정보 포함 (FETCH JOIN 사용) + @Query("SELECT a FROM Archive a JOIN FETCH a.writer WHERE a.category = :category AND a.title LIKE %:title% AND a.status = :status AND a.isDeleted = false") + Page findByCategoryAndTitleContainingIgnoreCaseAndStatusAndIsDeletedFalseWithWriter(@Param("category") Category category, @Param("title") String title, @Param("status") Status status, Pageable pageable); + // 멤버 ID로 아카이브 검색 - 삭제되지 않은 것만 @Query("SELECT a FROM Archive a JOIN a.archiveMembers am WHERE am.member.id = :memberId AND a.isDeleted = false") Page findByMemberId(@Param("memberId") Long memberId, Pageable pageable); diff --git a/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java b/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java index 65f8e708..ba293831 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java +++ b/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java @@ -191,7 +191,7 @@ public ArchiveListDTO getAllArchives(int page, SortType sortType, String usernam } Pageable pageable = createPageableWithSort(page, sortType); - Page archivePage = archiveRepository.findByStatusAndIsDeletedFalse(Status.평가완료, pageable); + Page archivePage = archiveRepository.findByStatusAndIsDeletedFalseWithWriter(Status.평가완료, pageable); List archives = archivePage.getContent().stream() .map(archive -> { @@ -203,6 +203,7 @@ public ArchiveListDTO getAllArchives(int page, SortType sortType, String usernam .id(archive.getId()) .title(archive.getTitle()) .writerNickname(archive.getWriter().getNickname()) + .writerProfileImg(archive.getWriter().getProfileImg()) .thumbnail(archive.getThumbnail()) .commentCount(archive.getComments().size()) .view(archive.getView()) @@ -236,15 +237,15 @@ public ArchiveListDTO searchArchives( Page archivePage; if (category != null && keyword != null && !keyword.trim().isEmpty()) { - archivePage = archiveRepository.findByCategoryAndTitleContainingIgnoreCaseAndStatusAndIsDeletedFalse( + archivePage = archiveRepository.findByCategoryAndTitleContainingIgnoreCaseAndStatusAndIsDeletedFalseWithWriter( category, keyword.trim(), Status.평가완료, pageable); } else if (category != null) { - archivePage = archiveRepository.findByCategoryAndStatusAndIsDeletedFalse(category, Status.평가완료, pageable); + archivePage = archiveRepository.findByCategoryAndStatusAndIsDeletedFalseWithWriter(category, Status.평가완료, pageable); } else if (keyword != null && !keyword.trim().isEmpty()) { - archivePage = archiveRepository.findByTitleContainingIgnoreCaseAndStatusAndIsDeletedFalse( + archivePage = archiveRepository.findByTitleContainingIgnoreCaseAndStatusAndIsDeletedFalseWithWriter( keyword.trim(), Status.평가완료, pageable); } else { - archivePage = archiveRepository.findByStatusAndIsDeletedFalse(Status.평가완료, pageable); + archivePage = archiveRepository.findByStatusAndIsDeletedFalseWithWriter(Status.평가완료, pageable); } List archives = archivePage.getContent().stream() @@ -257,6 +258,7 @@ public ArchiveListDTO searchArchives( .id(archive.getId()) .title(archive.getTitle()) .writerNickname(archive.getWriter().getNickname()) + .writerProfileImg(archive.getWriter().getProfileImg()) .thumbnail(archive.getThumbnail()) .commentCount(archive.getComments().size()) .view(archive.getView()) diff --git a/sequence_member/src/main/resources/application.yml b/sequence_member/src/main/resources/application.yml index 8c46be70..b1c4aafe 100644 --- a/sequence_member/src/main/resources/application.yml +++ b/sequence_member/src/main/resources/application.yml @@ -84,6 +84,11 @@ management: endpoint: prometheus: enabled: true + health: + show-details: always + health: + mail: + enabled: false server: tomcat: mbeanregistry: From 60fecd53b033ba4efe6e42c6c6dfa30448a88b94 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 30 Jun 2025 12:18:35 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../archive/dto/ArchiveCommentOutputDTO.java | 1 + .../sequence_member/archive/service/ArchiveService.java | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveCommentOutputDTO.java b/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveCommentOutputDTO.java index 00a0a300..57dd92e4 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveCommentOutputDTO.java +++ b/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveCommentOutputDTO.java @@ -24,6 +24,7 @@ public class ArchiveCommentOutputDTO { public static class CommentDTO { private Long id; private String writer; + private String writerProfileImg; private String content; private boolean isDeleted; private LocalDateTime createdDateTime; diff --git a/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java b/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java index ba293831..25005eda 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java +++ b/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java @@ -289,6 +289,13 @@ private Pageable createPageableWithSort(int page, SortType sortType) { return PageRequest.of(page, 18, sort); } + // 댓글 작성자의 프로필 이미지를 가져오는 헬퍼 메서드 + private String getCommentWriterProfileImg(String writerNickname) { + return memberRepository.findByNickname(writerNickname) + .map(MemberEntity::getProfileImg) + .orElse("default.png"); // 기본 이미지 + } + // Archive 엔티티를 DTO로 변환 private ArchiveOutputDTO convertToDTO(Archive archive, String username, int viewCount) { List memberDTOs = archive.getArchiveMembers().stream() @@ -322,6 +329,7 @@ private ArchiveOutputDTO convertToDTO(Archive archive, String username, int view ArchiveCommentOutputDTO.CommentDTO parentDTO = ArchiveCommentOutputDTO.CommentDTO.builder() .id(parentComment.getId()) .writer(parentComment.getWriter()) + .writerProfileImg(getCommentWriterProfileImg(parentComment.getWriter())) .content(parentComment.isDeleted() ? "삭제된 댓글입니다." : parentComment.getContent()) .isDeleted(parentComment.isDeleted()) .createdDateTime(parentComment.getCreatedDateTime()) @@ -336,6 +344,7 @@ private ArchiveOutputDTO convertToDTO(Archive archive, String username, int view ArchiveCommentOutputDTO.CommentDTO childDTO = ArchiveCommentOutputDTO.CommentDTO.builder() .id(childComment.getId()) .writer(childComment.getWriter()) + .writerProfileImg(getCommentWriterProfileImg(childComment.getWriter())) .content(childComment.isDeleted() ? "삭제된 댓글입니다." : childComment.getContent()) .isDeleted(childComment.isDeleted()) .createdDateTime(childComment.getCreatedDateTime()) From dffc340372f361e3a6f08c8ea8f60836c1374548 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 30 Jun 2025 15:18:23 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=EC=95=84=EC=B9=B4=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EC=9E=91=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../archive/dto/ArchiveCommentOutputDTO.java | 4 ++-- .../sequence_member/archive/dto/ArchiveOutputDTO.java | 2 ++ .../archive/service/ArchiveService.java | 11 +++++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveCommentOutputDTO.java b/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveCommentOutputDTO.java index 57dd92e4..6e1cd749 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveCommentOutputDTO.java +++ b/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveCommentOutputDTO.java @@ -23,8 +23,8 @@ public class ArchiveCommentOutputDTO { @Builder public static class CommentDTO { private Long id; - private String writer; - private String writerProfileImg; + private String commentWriter; + private String commentWriterProfileImg; private String content; private boolean isDeleted; private LocalDateTime createdDateTime; diff --git a/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveOutputDTO.java b/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveOutputDTO.java index c8bfa36d..b15dca88 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveOutputDTO.java +++ b/sequence_member/src/main/java/sequence/sequence_member/archive/dto/ArchiveOutputDTO.java @@ -16,7 +16,9 @@ @AllArgsConstructor public class ArchiveOutputDTO { private Long id; + private String writerUsername; private String writerNickname; + private String writerProfileImg; private String title; private String description; private LocalDate startDate; diff --git a/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java b/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java index 25005eda..c66fe680 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java +++ b/sequence_member/src/main/java/sequence/sequence_member/archive/service/ArchiveService.java @@ -299,6 +299,7 @@ private String getCommentWriterProfileImg(String writerNickname) { // Archive 엔티티를 DTO로 변환 private ArchiveOutputDTO convertToDTO(Archive archive, String username, int viewCount) { List memberDTOs = archive.getArchiveMembers().stream() + .filter(archiveMember -> !archiveMember.getMember().getId().equals(archive.getWriter().getId())) .map(archiveMember -> ArchiveOutputDTO.ArchiveMemberDTO.builder() .username(archiveMember.getMember().getUsername()) .nickname(archiveMember.getMember().getNickname()) @@ -328,8 +329,8 @@ private ArchiveOutputDTO convertToDTO(Archive archive, String username, int view for (ArchiveComment parentComment : parentComments) { ArchiveCommentOutputDTO.CommentDTO parentDTO = ArchiveCommentOutputDTO.CommentDTO.builder() .id(parentComment.getId()) - .writer(parentComment.getWriter()) - .writerProfileImg(getCommentWriterProfileImg(parentComment.getWriter())) + .commentWriter(parentComment.getWriter()) + .commentWriterProfileImg(getCommentWriterProfileImg(parentComment.getWriter())) .content(parentComment.isDeleted() ? "삭제된 댓글입니다." : parentComment.getContent()) .isDeleted(parentComment.isDeleted()) .createdDateTime(parentComment.getCreatedDateTime()) @@ -343,8 +344,8 @@ private ArchiveOutputDTO convertToDTO(Archive archive, String username, int view for (ArchiveComment childComment : childComments) { ArchiveCommentOutputDTO.CommentDTO childDTO = ArchiveCommentOutputDTO.CommentDTO.builder() .id(childComment.getId()) - .writer(childComment.getWriter()) - .writerProfileImg(getCommentWriterProfileImg(childComment.getWriter())) + .commentWriter(childComment.getWriter()) + .commentWriterProfileImg(getCommentWriterProfileImg(childComment.getWriter())) .content(childComment.isDeleted() ? "삭제된 댓글입니다." : childComment.getContent()) .isDeleted(childComment.isDeleted()) .createdDateTime(childComment.getCreatedDateTime()) @@ -358,7 +359,9 @@ private ArchiveOutputDTO convertToDTO(Archive archive, String username, int view return ArchiveOutputDTO.builder() .id(archive.getId()) + .writerUsername(archive.getWriter().getUsername()) .writerNickname(archive.getWriter().getNickname()) + .writerProfileImg(archive.getWriter().getProfileImg()) .title(archive.getTitle()) .description(archive.getDescription()) .startDate(archive.getStartDate()) From bccd5adad6c51a6f45462a725ada0c5c30c03b46 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 30 Jun 2025 15:23:32 +0900 Subject: [PATCH 4/5] test --- .../sequence_member/member/entity/EducationEntity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sequence_member/src/main/java/sequence/sequence_member/member/entity/EducationEntity.java b/sequence_member/src/main/java/sequence/sequence_member/member/entity/EducationEntity.java index 6990e3ea..1182eca4 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/member/entity/EducationEntity.java +++ b/sequence_member/src/main/java/sequence/sequence_member/member/entity/EducationEntity.java @@ -2,7 +2,7 @@ import jakarta.persistence.*; import lombok.Data; - +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import sequence.sequence_member.global.enums.enums.Degree; import sequence.sequence_member.global.enums.enums.ProjectRole; @@ -18,6 +18,7 @@ @Entity @Data +@EqualsAndHashCode(callSuper = false) @Table(name="education") @NoArgsConstructor public class EducationEntity extends BaseTimeEntity { From f6353b6402f1c345d7aea3ffe12a65d9ec4c5bea Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 30 Jun 2025 15:24:37 +0900 Subject: [PATCH 5/5] application.yml roll back --- sequence_member/src/main/resources/application.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/sequence_member/src/main/resources/application.yml b/sequence_member/src/main/resources/application.yml index b1c4aafe..405312f2 100644 --- a/sequence_member/src/main/resources/application.yml +++ b/sequence_member/src/main/resources/application.yml @@ -84,11 +84,7 @@ management: endpoint: prometheus: enabled: true - health: - show-details: always - health: - mail: - enabled: false + server: tomcat: mbeanregistry: