Skip to content

Commit c209ba7

Browse files
authored
Refactor: board 도메인 구조 및 엔티티 개선 (#212) (#233)
* Rename: test/../board 구조 개선 * Rename: board 도메인 구조 개선 * Ref: 엔티티 개선 * Ref: 데이터 중복 삽입 방지 * Chore: 테스트 프로파일 공통 설정
1 parent 26c0526 commit c209ba7

File tree

50 files changed

+460
-274
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+460
-274
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,5 @@ dependencies {
8484

8585
tasks.withType<Test> {
8686
useJUnitPlatform()
87+
systemProperty("spring.profiles.active", "test")
8788
}

src/main/java/com/back/domain/board/comment/controller/CommentController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.domain.board.comment.controller;
22

3+
import com.back.domain.board.comment.controller.docs.CommentControllerDocs;
34
import com.back.domain.board.comment.dto.CommentListResponse;
45
import com.back.domain.board.comment.dto.CommentRequest;
56
import com.back.domain.board.comment.dto.CommentResponse;

src/main/java/com/back/domain/board/comment/controller/CommentLikeController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.domain.board.comment.controller;
22

3+
import com.back.domain.board.comment.controller.docs.CommentLikeControllerDocs;
34
import com.back.domain.board.comment.dto.CommentLikeResponse;
45
import com.back.domain.board.comment.service.CommentLikeService;
56
import com.back.global.common.dto.RsData;

src/main/java/com/back/domain/board/comment/controller/CommentControllerDocs.java renamed to src/main/java/com/back/domain/board/comment/controller/docs/CommentControllerDocs.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.back.domain.board.comment.controller;
1+
package com.back.domain.board.comment.controller.docs;
22

33
import com.back.domain.board.comment.dto.CommentListResponse;
44
import com.back.domain.board.comment.dto.CommentRequest;

src/main/java/com/back/domain/board/comment/controller/CommentLikeControllerDocs.java renamed to src/main/java/com/back/domain/board/comment/controller/docs/CommentLikeControllerDocs.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.back.domain.board.comment.controller;
1+
package com.back.domain.board.comment.controller.docs;
22

33
import com.back.domain.board.comment.dto.CommentLikeResponse;
44
import com.back.global.common.dto.RsData;

src/main/java/com/back/domain/board/comment/entity/Comment.java

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,63 +9,80 @@
99

1010
import java.util.ArrayList;
1111
import java.util.List;
12+
import java.util.Objects;
1213

1314
@Entity
1415
@Getter
1516
@NoArgsConstructor
1617
public class Comment extends BaseEntity {
1718
@ManyToOne(fetch = FetchType.LAZY)
18-
@JoinColumn(name = "post_id")
19+
@JoinColumn(name = "post_id", nullable = false)
1920
private Post post;
2021

2122
@ManyToOne(fetch = FetchType.LAZY)
22-
@JoinColumn(name = "user_id")
23+
@JoinColumn(name = "user_id", nullable = false)
2324
private User user;
2425

26+
@Column(nullable = false, columnDefinition = "TEXT")
2527
private String content;
2628

27-
// TODO: 추후 CommentRepositoryImpl#getCommentsByPostId 로직 개선 필요, ERD에도 반영할 것
2829
@Column(nullable = false)
2930
private Long likeCount = 0L;
3031

31-
// 해당 댓글의 부모 댓글
3232
@ManyToOne(fetch = FetchType.LAZY)
3333
@JoinColumn(name = "parent_comment_id")
3434
private Comment parent;
3535

36-
// 해당 댓글에 달린 대댓글 목록
3736
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
3837
private List<Comment> children = new ArrayList<>();
3938

4039
@OneToMany(mappedBy = "comment", cascade = CascadeType.ALL, orphanRemoval = true)
4140
private List<CommentLike> commentLikes = new ArrayList<>();
4241

4342
// -------------------- 생성자 --------------------
44-
public Comment(Post post, User user, String content) {
45-
this.post = post;
46-
this.user = user;
47-
this.content = content;
48-
}
49-
5043
public Comment(Post post, User user, String content, Comment parent) {
5144
this.post = post;
5245
this.user = user;
5346
this.content = content;
5447
this.parent = parent;
48+
post.addComment(this);
49+
user.addComment(this);
50+
}
51+
52+
// -------------------- 정적 팩토리 메서드 --------------------
53+
/** 루트 댓글 생성 */
54+
public static Comment createRoot(Post post, User user, String content) {
55+
return new Comment(post, user, content, null);
56+
}
57+
58+
/** 대댓글 생성 */
59+
public static Comment createChild(Post post, User user, String content, Comment parent) {
60+
Comment comment = new Comment(post, user, content, parent);
61+
parent.getChildren().add(comment);
62+
return comment;
63+
}
64+
65+
// -------------------- 연관관계 편의 메서드 --------------------
66+
public void addLike(CommentLike like) {
67+
this.commentLikes.add(like);
68+
}
69+
70+
public void removeLike(CommentLike like) {
71+
this.commentLikes.remove(like);
5572
}
5673

5774
// -------------------- 비즈니스 메서드 --------------------
58-
// 댓글 업데이트
75+
/** 댓글 내용 수정 */
5976
public void update(String content) {
6077
this.content = content;
6178
}
6279

63-
// 좋아요 수 증가
80+
/** 좋아요 수 증가 */
6481
public void increaseLikeCount() {
6582
this.likeCount++;
6683
}
6784

68-
// 좋아요 수 감소
85+
/** 좋아요 수 감소 */
6986
public void decreaseLikeCount() {
7087
if (this.likeCount > 0) {
7188
this.likeCount--;

src/main/java/com/back/domain/board/comment/entity/CommentLike.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,31 @@
22

33
import com.back.domain.user.entity.User;
44
import com.back.global.entity.BaseEntity;
5-
import jakarta.persistence.Entity;
6-
import jakarta.persistence.FetchType;
7-
import jakarta.persistence.JoinColumn;
8-
import jakarta.persistence.ManyToOne;
5+
import jakarta.persistence.*;
96
import lombok.AllArgsConstructor;
107
import lombok.Getter;
118
import lombok.NoArgsConstructor;
129

1310
@Entity
1411
@Getter
1512
@NoArgsConstructor
16-
@AllArgsConstructor
13+
@Table(
14+
uniqueConstraints = @UniqueConstraint(columnNames = {"comment_id", "user_id"})
15+
)
1716
public class CommentLike extends BaseEntity {
1817
@ManyToOne(fetch = FetchType.LAZY)
19-
@JoinColumn(name = "comment_id")
18+
@JoinColumn(name = "comment_id", nullable = false)
2019
private Comment comment;
2120

2221
@ManyToOne(fetch = FetchType.LAZY)
23-
@JoinColumn(name = "user_id")
22+
@JoinColumn(name = "user_id", nullable = false)
2423
private User user;
24+
25+
// -------------------- 생성자 --------------------
26+
public CommentLike(Comment comment, User user) {
27+
this.comment = comment;
28+
this.user = user;
29+
comment.addLike(this);
30+
user.addCommentLike(this);
31+
}
2532
}

src/main/java/com/back/domain/board/comment/repository/CommentLikeRepository.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package com.back.domain.board.comment.repository;
22

33
import com.back.domain.board.comment.entity.CommentLike;
4+
import com.back.domain.board.comment.repository.custom.CommentLikeRepositoryCustom;
45
import org.springframework.data.jpa.repository.JpaRepository;
5-
import org.springframework.data.jpa.repository.Query;
6-
import org.springframework.data.repository.query.Param;
76
import org.springframework.stereotype.Repository;
87

9-
import java.util.Collection;
10-
import java.util.List;
118
import java.util.Optional;
129

1310
@Repository

src/main/java/com/back/domain/board/comment/repository/CommentRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.back.domain.board.comment.repository;
22

33
import com.back.domain.board.comment.entity.Comment;
4+
import com.back.domain.board.comment.repository.custom.CommentRepositoryCustom;
45
import org.springframework.data.jpa.repository.JpaRepository;
56
import org.springframework.stereotype.Repository;
67

src/main/java/com/back/domain/board/comment/repository/CommentLikeRepositoryCustom.java renamed to src/main/java/com/back/domain/board/comment/repository/custom/CommentLikeRepositoryCustom.java

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

33
import java.util.Collection;
44
import java.util.List;

0 commit comments

Comments
 (0)