Skip to content

Commit 400d2af

Browse files
committed
gemini+stt 브랜치에서 gemini+stt+board 분기 후 model, dto, repository 작성하여 first commit
1 parent bf95b75 commit 400d2af

8 files changed

Lines changed: 305 additions & 79 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.webservice.algorithmchef.dto.board;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
@Builder
12+
public class BoardCommentRequest {
13+
14+
// 댓글이 달릴 게시글 ID
15+
private Long postId;
16+
17+
// 부모 댓글 ID (대댓글일 경우 필수, 최상위 댓글이면 null)
18+
private Long parentCommentId;
19+
20+
// 댓글 내용
21+
private String content;
22+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.webservice.algorithmchef.dto.board;
2+
3+
import com.webservice.algorithmchef.model.BoardComment;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.time.LocalDateTime;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
@Getter
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
@Builder
17+
public class BoardCommentResponse {
18+
19+
private Long commentId;
20+
private Long postId;
21+
private Long userId; // 댓글 작성자 ID
22+
private String writerName; // 댓글 작성자 이름
23+
private Long parentCommentId; // 부모 댓글 ID (없으면 null)
24+
private int depth; // 대댓글 깊이 (0: 원댓글, 1: 대댓글 ...)
25+
private String content; // "삭제된 댓글입니다" 처리를 위해 필요
26+
private LocalDateTime createdAt;
27+
private LocalDateTime modifiedDate;
28+
private boolean isDeleted; // 프론트에서 "삭제됨" 표시 여부 판단용
29+
30+
// 자식 댓글(대댓글) 목록 - 계층형 구조 표현
31+
@Builder.Default
32+
private List<BoardCommentResponse> children = new ArrayList<>();
33+
34+
// Entity -> DTO 변환 편의 메서드
35+
public static BoardCommentResponse from(BoardComment comment, String writerName) {
36+
return BoardCommentResponse.builder()
37+
.commentId(comment.getCommentId())
38+
.postId(comment.getPost().getPostId())
39+
.userId(comment.getUser().getId())
40+
.writerName(writerName)
41+
.parentCommentId(comment.getParentComment() != null ? comment.getParentComment().getCommentId() : null)
42+
.depth(comment.getDepth())
43+
// 삭제된 댓글일 경우 내용을 변경해서 보낼 수도 있고, isDeleted 플래그만 보낼 수도 있음
44+
.content(comment.isDeleted() ? "삭제된 댓글입니다." : comment.getContent())
45+
.createdAt(comment.getCreatedAt())
46+
.modifiedDate(comment.getModifiedDate())
47+
.isDeleted(comment.isDeleted())
48+
.build();
49+
}
50+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.webservice.algorithmchef.dto.board;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
@Builder
12+
public class BoardPostRequest {
13+
14+
// 게시글 카테고리 (나눔, 질문 등)
15+
private String category;
16+
17+
// 게시글 제목
18+
private String title;
19+
20+
// 게시글 내용 (DB에서는 BLOB이지만, JSON 전송 시 String으로 처리)
21+
private String content;
22+
23+
// 참고: user_id는 보통 Controller에서 @AuthenticationPrincipal을 통해 주입받으므로 DTO에서 제외합니다.
24+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.webservice.algorithmchef.dto.board;
2+
3+
import com.webservice.algorithmchef.model.BoardPost;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.time.LocalDateTime;
10+
import java.util.List;
11+
12+
@Getter
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Builder
16+
public class BoardPostResponse {
17+
18+
private Long postId;
19+
private Long userId; // 작성자 식별자
20+
private String writerName; // 작성자 닉네임/이름 (User 테이블 조인 필요 시)
21+
private String category;
22+
private String title;
23+
private String content; // BLOB -> String 변환된 내용
24+
private LocalDateTime createdAt;
25+
private LocalDateTime modifiedDate;
26+
27+
// 해당 게시글에 달린 댓글 목록 (선택사항: 상세 조회 시 같이 내려줄 경우 필요)
28+
private List<BoardCommentResponse> comments;
29+
30+
// Entity -> DTO 변환 편의 메서드
31+
public static BoardPostResponse from(BoardPost post, String writerName, List<BoardCommentResponse> comments) {
32+
return BoardPostResponse.builder()
33+
.postId(post.getPostId())
34+
.userId(post.getUser().getId()) // User 객체에서 ID 추출 가정
35+
.writerName(writerName)
36+
.category(post.getCategory())
37+
.title(post.getTitle())
38+
.content(post.getContent()) // post.getContent()가 String을 반환한다고 가정
39+
.createdAt(post.getCreatedAt())
40+
.modifiedDate(post.getModifiedDate())
41+
.comments(comments)
42+
.build();
43+
}
44+
}
Lines changed: 60 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,81 @@
11
package com.webservice.algorithmchef.model;
22

3-
import java.time.LocalDateTime;
4-
import java.util.List;
5-
6-
import org.hibernate.annotations.ColumnDefault;
7-
import org.hibernate.annotations.CreationTimestamp;
8-
9-
import jakarta.persistence.Column;
10-
import jakarta.persistence.Entity;
11-
import jakarta.persistence.FetchType;
12-
import jakarta.persistence.GeneratedValue;
13-
import jakarta.persistence.GenerationType;
14-
import jakarta.persistence.Id;
15-
import jakarta.persistence.JoinColumn;
16-
import jakarta.persistence.Lob;
17-
import jakarta.persistence.ManyToOne;
18-
import jakarta.persistence.OneToMany;
3+
import jakarta.persistence.*;
194
import lombok.AllArgsConstructor;
205
import lombok.Builder;
216
import lombok.Getter;
227
import lombok.NoArgsConstructor;
23-
import lombok.Setter;
24-
import lombok.ToString;
8+
import org.hibernate.annotations.ColumnDefault;
9+
import org.hibernate.annotations.CreationTimestamp;
10+
import org.hibernate.annotations.UpdateTimestamp;
11+
12+
import java.time.LocalDateTime;
13+
import java.util.ArrayList;
14+
import java.util.List;
2515

2616
@Entity
27-
@AllArgsConstructor
17+
@Getter
2818
@NoArgsConstructor
19+
@AllArgsConstructor
2920
@Builder
30-
@Getter
31-
@Setter
32-
@ToString
21+
@Table(name = "board_comment")
3322
public class BoardComment {
3423

3524
@Id
3625
@GeneratedValue(strategy = GenerationType.IDENTITY)
37-
@Column(name="comment_id")
38-
private Long id;
39-
26+
@Column(name = "comment_id")
27+
private Long commentId;
28+
29+
// 댓글이 달린 게시글
30+
@ManyToOne(fetch = FetchType.LAZY)
31+
@JoinColumn(name = "post_id", nullable = false)
32+
private BoardPost post;
33+
34+
// 댓글 작성자 (제공해주신 User 엔티티와 연결)
4035
@ManyToOne(fetch = FetchType.LAZY)
41-
@JoinColumn(name = "user_id" ,nullable=false)
36+
@JoinColumn(name = "user_id", nullable = false)
4237
private User user;
43-
38+
39+
// 대댓글 기능을 위한 자기 참조 (부모 댓글)
40+
@ManyToOne(fetch = FetchType.LAZY)
41+
@JoinColumn(name = "parent_comment_id")
42+
private BoardComment parentComment;
43+
44+
// 대댓글 목록 (자식 댓글)
45+
@OneToMany(mappedBy = "parentComment", orphanRemoval = true)
46+
@Builder.Default
47+
private List<BoardComment> children = new ArrayList<>();
48+
49+
@Column(nullable = false)
50+
@ColumnDefault("0")
51+
private int depth;
52+
53+
@Lob
54+
@Column(nullable = false, columnDefinition = "LONGTEXT")
55+
private String content;
56+
57+
// 삭제 여부 (Soft Delete)
58+
@Column(nullable = false)
59+
@ColumnDefault("false")
60+
private boolean isDeleted;
61+
62+
// 생성 시간 (Hibernate)
4463
@CreationTimestamp
64+
@Column(name = "created_at", updatable = false)
4565
private LocalDateTime createdAt;
46-
66+
67+
// 수정 시간 (Hibernate)
68+
@UpdateTimestamp
69+
@Column(name = "modified_date")
4770
private LocalDateTime modifiedDate;
48-
49-
@Lob
50-
@Column(nullable=false)
51-
private String content;
5271

53-
@Column(columnDefinition = "boolean default false")
54-
private boolean isDeleted;
55-
56-
@ManyToOne(fetch = FetchType.LAZY)
57-
@JoinColumn(name = "post_id")
58-
private BoardPost post;
59-
60-
@ManyToOne(fetch = FetchType.LAZY)
61-
@JoinColumn(name = "parent_id")
62-
@ToString.Exclude
63-
private BoardComment parent;
64-
65-
@OneToMany(mappedBy = "parent")
66-
@ToString.Exclude
67-
private List<BoardComment> comments;
68-
69-
@ColumnDefault("0")
70-
private int depth;
72+
// 댓글 내용 수정
73+
public void updateContent(String content) {
74+
this.content = content;
75+
}
76+
77+
// 댓글 삭제 처리 (상태값 변경)
78+
public void changeIsDeleted(boolean isDeleted) {
79+
this.isDeleted = isDeleted;
80+
}
7181
}
Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,66 @@
11
package com.webservice.algorithmchef.model;
22

3-
import java.time.LocalDateTime;
4-
5-
import org.hibernate.annotations.CreationTimestamp;
6-
7-
import jakarta.persistence.Column;
8-
import jakarta.persistence.Entity;
9-
import jakarta.persistence.FetchType;
10-
import jakarta.persistence.GeneratedValue;
11-
import jakarta.persistence.GenerationType;
12-
import jakarta.persistence.Id;
13-
import jakarta.persistence.JoinColumn;
14-
import jakarta.persistence.Lob;
15-
import jakarta.persistence.ManyToOne;
3+
import com.webservice.algorithmchef.dto.board.BoardPostRequest;
4+
import jakarta.persistence.*;
165
import lombok.AllArgsConstructor;
176
import lombok.Builder;
187
import lombok.Getter;
198
import lombok.NoArgsConstructor;
20-
import lombok.Setter;
21-
import lombok.ToString;
9+
import org.hibernate.annotations.CreationTimestamp;
10+
import org.hibernate.annotations.UpdateTimestamp;
11+
12+
import java.time.LocalDateTime;
13+
import java.util.ArrayList;
14+
import java.util.List;
2215

2316
@Entity
24-
@AllArgsConstructor
17+
@Getter
2518
@NoArgsConstructor
19+
@AllArgsConstructor
2620
@Builder
27-
@Getter
28-
@Setter
29-
@ToString
21+
@Table(name = "board_post")
3022
public class BoardPost {
3123

3224
@Id
3325
@GeneratedValue(strategy = GenerationType.IDENTITY)
34-
@Column(name="post_id")
35-
private Long id;
36-
26+
@Column(name = "post_id")
27+
private Long postId;
28+
29+
// User와의 다대일 관계 (작성자)
3730
@ManyToOne(fetch = FetchType.LAZY)
38-
@JoinColumn(name="user_id")
31+
@JoinColumn(name = "user_id", nullable = false)
3932
private User user;
40-
33+
4134
@Column(nullable = false)
4235
private String category;
43-
36+
4437
@Column(nullable = false)
4538
private String title;
46-
39+
40+
// DB의 BLOB 타입에 대응. String으로 처리하되 대용량 데이터임을 명시
4741
@Lob
48-
@Column(nullable = false)
42+
@Column(nullable = false, columnDefinition = "LONGTEXT")
4943
private String content;
50-
44+
45+
// 게시글 삭제 시 댓글도 함께 삭제되도록 Cascade 설정
46+
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
47+
@Builder.Default
48+
private List<BoardComment> comments = new ArrayList<>();
49+
50+
// 생성 시간 (Hibernate)
5151
@CreationTimestamp
52+
@Column(name = "created_at", updatable = false)
5253
private LocalDateTime createdAt;
53-
54+
55+
// 수정 시간 (Hibernate)
56+
@UpdateTimestamp
57+
@Column(name = "modified_date")
5458
private LocalDateTime modifiedDate;
59+
60+
// 게시글 수정 메서드 (Dirty Checking 용)
61+
public void update(String title, String content, String category) {
62+
this.title = title;
63+
this.content = content;
64+
this.category = category;
65+
}
5566
}

0 commit comments

Comments
 (0)