Skip to content

Commit 9ccd6ac

Browse files
ayoung-dev7zrv
andauthored
feat: community-comment 생성 기능 (#67)
* test(community): communityComment 생성 기능 테스트 작성 * feat(community): communityComment Entity, Repository 추가 * feat(community): communityComment 생성 RequestDto, Usecase 추가 및 Service 구현 * refactor(community): CommunityBoardRepository 네이밍 변경 * refactor(community): community board/comment 폴더 구조 변경 * chore(community): 불필요한 import 및 public 키워드 제거 * Feature/36 s3 이미지 업로드 기능 구현 (#66) * feat: 이미지 업로드 기능 구현 - aws s3 연동을 위한 의존성 추가 - 환경변수 추가 - S3 연결을 위한 config 클래스 구현 - 서비스 레이어에 이미지 업로드 기능 구현 - 업로드 실패 예외와 예외 메세지 추 - test.yml에 테스트에 필요한 환경변수 추가 - 테스트 코드 작성및 검증 완료 * chore: 환경변수 추가 - cicd workflow 에 이미지 업로드 관련 환경변수 추가 - appication.yml에 이미지 업로드 관련 환경변수 이름 변경 * feat: 이미지 파일 검증 기능 구현 - 이미지 크기를 8MB로 제한 - 이미지의 크기 초과를 검증하는 기능 구현 - 이미지의 확장자명을 검증하는 기능 구현 - 이미지 업로드시 검증 기능들을 수행하도록 수정 - 전역 예외처리 핸들러에 이미지 업로드 예외 추가 - 예외 메세지 추가 - 테스트 코드 작성및 검증 완 * fix: 코드 리뷰 사항 반영 - BASE_URL을 S3_BASE_URL라는 더 명시적인 이름으로 변경 - ImageUploadUtils private 생성자의 예외처리 메세지를 ExceptionMessage에 등록하여 사용하도록 수정 - 이미지 업로드 메서드의 내부 기능을 메서드로 추출하여 가독성 향상 - ImageUploadUtils의 일부 기능의 접근 제어자를 private으로 수정 - 테스트 코드의 when, then을 더 명확하게 분 * test(community): 커뮤니티 댓글 생성 테스트 추가 - repository 테스트에 findById 테스트 추가 - service 테스트에 대댓글 예외 테스트 추가 * chore(community): 소문자로 네이밍 변경 * fix(community): 커뮤니티 댓글 생성 requestDto 수정 - parentCommentId Dto 필드로 수정 * feat(community): 커뮤니티 댓글 생성 예외 처리 및 메세지 추가 * refactor(community): 코드 리뷰 사항 반영 - ServiceTest 오타 수정 - validateParentCommentExists 메서드 추출 * test(community): communityComment 생성 기능 테스트 작성 * feat(community): communityComment Entity, Repository 추가 * feat(community): communityComment 생성 RequestDto, Usecase 추가 및 Service 구현 * refactor(community): CommunityBoardRepository 네이밍 변경 * refactor(community): community board/comment 폴더 구조 변경 * chore(community): 불필요한 import 및 public 키워드 제거 * test(community): 커뮤니티 댓글 생성 테스트 추가 - repository 테스트에 findById 테스트 추가 - service 테스트에 대댓글 예외 테스트 추가 * chore(community): 소문자로 네이밍 변경 * fix(community): 커뮤니티 댓글 생성 requestDto 수정 - parentCommentId Dto 필드로 수정 * feat(community): 커뮤니티 댓글 생성 예외 처리 및 메세지 추가 * refactor(community): 코드 리뷰 사항 반영 - ServiceTest 오타 수정 - validateParentCommentExists 메서드 추출 * feat(community): 커뮤니티 댓글 존재 여부 메서드 및 테스트 추가 * chore(community): 불필요한 import 제거 --------- Co-authored-by: seojin Yoon <[email protected]>
1 parent 0be3598 commit 9ccd6ac

27 files changed

+440
-62
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.somemore.community.domain;
2+
3+
import com.somemore.global.common.BaseEntity;
4+
import jakarta.persistence.*;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.util.UUID;
10+
11+
import static lombok.AccessLevel.PROTECTED;
12+
13+
14+
@Getter
15+
@NoArgsConstructor(access = PROTECTED)
16+
@Entity
17+
@Table(name = "community_comment")
18+
public class CommunityComment extends BaseEntity {
19+
20+
@Id
21+
@GeneratedValue(strategy = GenerationType.IDENTITY)
22+
@Column(name = "id", nullable = false)
23+
private Long id;
24+
25+
@Column(name = "writer_id", nullable = false, length = 16)
26+
private UUID writerId;
27+
28+
@Lob
29+
@Column(name = "content", nullable = false)
30+
private String content;
31+
32+
@Column(name = "parent_comment_id")
33+
private Long parentCommentId;
34+
35+
@Builder
36+
public CommunityComment(UUID writerId, String content, Long parentCommentId) {
37+
this.writerId = writerId;
38+
this.content = content;
39+
this.parentCommentId = parentCommentId;
40+
}
41+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.somemore.community.dto.request;
2+
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
5+
import com.somemore.community.domain.CommunityComment;
6+
import io.swagger.v3.oas.annotations.media.Schema;
7+
import jakarta.annotation.Nullable;
8+
import jakarta.validation.constraints.NotBlank;
9+
import lombok.Builder;
10+
11+
import java.util.UUID;
12+
13+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
14+
@Builder
15+
public record CommunityCommentCreateRequestDto(
16+
@Schema(description = "커뮤니티 댓글 내용", example = "저도 함께 하고 싶습니다.")
17+
@NotBlank(message = "댓글 내용은 필수 값입니다.")
18+
String content,
19+
@Schema(description = "부모 댓글의 ID", example = "1234", nullable = true)
20+
@Nullable
21+
Long parentCommentId
22+
) {
23+
public CommunityComment toEntity(UUID writerId) {
24+
return CommunityComment.builder()
25+
.writerId(writerId)
26+
.content(content)
27+
.parentCommentId(parentCommentId)
28+
.build();
29+
}
30+
}

src/main/java/com/somemore/community/repository/CommunityBoardJpaRepository.java renamed to src/main/java/com/somemore/community/repository/board/CommunityBoardJpaRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.somemore.community.repository;
1+
package com.somemore.community.repository.board;
22

33
import com.somemore.community.domain.CommunityBoard;
44
import org.springframework.data.jpa.repository.JpaRepository;

src/main/java/com/somemore/community/repository/CommunityBoardRepository.java renamed to src/main/java/com/somemore/community/repository/board/CommunityBoardRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.somemore.community.repository;
1+
package com.somemore.community.repository.board;
22

33
import com.somemore.community.domain.CommunityBoard;
44
import com.somemore.community.domain.CommunityBoardView;

src/main/java/com/somemore/community/repository/CommunityRepositoryImpl.java renamed to src/main/java/com/somemore/community/repository/board/CommunityBoardRepositoryImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.somemore.community.repository;
1+
package com.somemore.community.repository.board;
22

33
import com.querydsl.core.types.Projections;
44
import com.querydsl.jpa.impl.JPAQuery;
@@ -16,7 +16,7 @@
1616

1717
@RequiredArgsConstructor
1818
@Repository
19-
public class CommunityRepositoryImpl implements CommunityBoardRepository {
19+
public class CommunityBoardRepositoryImpl implements CommunityBoardRepository {
2020

2121
private final JPAQueryFactory queryFactory;
2222
private final CommunityBoardJpaRepository communityBoardJpaRepository;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.somemore.community.repository.comment;
2+
3+
import com.somemore.community.domain.CommunityComment;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface CommunityCommentJpaRepository extends JpaRepository<CommunityComment, Long> {
7+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.somemore.community.repository.comment;
2+
3+
import com.somemore.community.domain.CommunityComment;
4+
5+
import java.util.Optional;
6+
7+
public interface CommunityCommentRepository {
8+
CommunityComment save(CommunityComment communityComment);
9+
Optional<CommunityComment> findById(Long id);
10+
boolean existsById(Long id);
11+
void deleteAllInBatch();
12+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.somemore.community.repository.comment;
2+
3+
import com.querydsl.jpa.impl.JPAQueryFactory;
4+
import com.somemore.community.domain.CommunityComment;
5+
import com.somemore.community.domain.QCommunityComment;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.stereotype.Repository;
8+
9+
import java.util.Optional;
10+
11+
@RequiredArgsConstructor
12+
@Repository
13+
public class CommunityCommentRepositoryImpl implements CommunityCommentRepository {
14+
15+
private final JPAQueryFactory queryFactory;
16+
private final CommunityCommentJpaRepository communityCommentJpaRepository;
17+
18+
@Override
19+
public CommunityComment save(CommunityComment communityComment) {
20+
return communityCommentJpaRepository.save(communityComment);
21+
}
22+
23+
@Override
24+
public Optional<CommunityComment> findById(Long id) {
25+
QCommunityComment communityComment = QCommunityComment.communityComment;
26+
27+
return Optional.ofNullable(queryFactory
28+
.selectFrom(communityComment)
29+
.where(communityComment.id.eq(id)
30+
.and(communityComment.deleted.eq(false)))
31+
.fetchOne());
32+
}
33+
34+
@Override
35+
public boolean existsById(Long id) {
36+
QCommunityComment communityComment = QCommunityComment.communityComment;
37+
38+
return queryFactory
39+
.selectOne()
40+
.from(communityComment)
41+
.where(communityComment.id.eq(id)
42+
.and(communityComment.deleted.eq(false)))
43+
.fetchFirst() != null;
44+
}
45+
46+
@Override
47+
public void deleteAllInBatch() { communityCommentJpaRepository.deleteAllInBatch(); }
48+
}

src/main/java/com/somemore/community/service/CommunityBoardQueryService.java renamed to src/main/java/com/somemore/community/service/board/CommunityBoardQueryService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
package com.somemore.community.service;
1+
package com.somemore.community.service.board;
22

33
import com.somemore.community.domain.CommunityBoard;
44
import com.somemore.community.domain.CommunityBoardView;
55
import com.somemore.community.dto.response.CommunityBoardGetDetailResponseDto;
66
import com.somemore.community.dto.response.CommunityBoardGetResponseDto;
7-
import com.somemore.community.repository.CommunityBoardRepository;
8-
import com.somemore.community.usecase.CommunityBoardQueryUseCase;
7+
import com.somemore.community.repository.board.CommunityBoardRepository;
8+
import com.somemore.community.usecase.board.CommunityBoardQueryUseCase;
99
import com.somemore.global.exception.BadRequestException;
1010
import lombok.RequiredArgsConstructor;
1111
import org.springframework.stereotype.Service;

src/main/java/com/somemore/community/service/CreateCommunityBoardService.java renamed to src/main/java/com/somemore/community/service/board/CreateCommunityBoardService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
package com.somemore.community.service;
1+
package com.somemore.community.service.board;
22

33
import com.somemore.community.domain.CommunityBoard;
44
import com.somemore.community.dto.request.CommunityBoardCreateRequestDto;
5-
import com.somemore.community.repository.CommunityBoardRepository;
6-
import com.somemore.community.usecase.CreateCommunityBoardUseCase;
5+
import com.somemore.community.repository.board.CommunityBoardRepository;
6+
import com.somemore.community.usecase.board.CreateCommunityBoardUseCase;
77
import lombok.RequiredArgsConstructor;
88
import org.springframework.stereotype.Service;
99
import org.springframework.transaction.annotation.Transactional;

0 commit comments

Comments
 (0)