Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/io/sparta/board/BoardApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing

public class BoardApplication {


public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/io/sparta/board/common/BaseEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.sparta.board.common;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import java.time.LocalDateTime;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {

@CreatedDate
@Column(name = "create_at", nullable = false, updatable = false)
private LocalDateTime createdAt;

@LastModifiedDate
@Column(name = "updated_at", nullable = false)
private LocalDateTime updatedAt;

}
44 changes: 44 additions & 0 deletions src/main/java/io/sparta/board/controller/CommentController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package io.sparta.board.controller;


import io.sparta.board.dto.CommentRequestDto;
import io.sparta.board.entity.Comment;
import io.sparta.board.service.CommentService;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/comments")
public class CommentController {

private final CommentService commentService;

@PostMapping("/post/{postId}")
public ResponseEntity<UUID> createComment(@PathVariable UUID postId, @RequestBody
CommentRequestDto requestDto) {
UUID commentId = commentService.createComment(postId, requestDto);
return ResponseEntity.ok(commentId);
}

@PutMapping("/{commentId}")
public ResponseEntity<Void> updateComment(@PathVariable UUID commentId, @RequestBody CommentRequestDto requestDto) {
commentService.updateComment(commentId, requestDto);
return ResponseEntity.ok().build();
}

@DeleteMapping("/{commentId}")
public ResponseEntity<Void> deleteComment(@PathVariable UUID commentId) {
commentService.deleteComment(commentId);
return ResponseEntity.ok().build();
}

}
50 changes: 50 additions & 0 deletions src/main/java/io/sparta/board/controller/PostController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package io.sparta.board.controller;


import io.sparta.board.dto.PostRequestDto;
import io.sparta.board.dto.PostResponseDto;
import io.sparta.board.entity.Post;
import io.sparta.board.service.PostService;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/posts")
public class PostController {

private final PostService postService;

@PostMapping
public ResponseEntity<UUID> createPost(@RequestBody PostRequestDto requestDto) {
UUID postId = postService.createPost(requestDto);
return ResponseEntity.ok(postId);
}

@GetMapping("/{postId}")
public ResponseEntity<PostResponseDto> getPost(@PathVariable UUID postId) {
return ResponseEntity.ok(postService.getPost(postId));
}

@PutMapping("/{postId}")
public ResponseEntity<Void> updatePost(@PathVariable UUID postId, @RequestBody PostRequestDto requestDto) {
postService.updatePost(postId, requestDto);
return ResponseEntity.ok().build();
}

@DeleteMapping("/{postId}")
public ResponseEntity<Void> deletePost(@PathVariable UUID postId) {
postService.deletePost(postId);
return ResponseEntity.ok().build();
}

}
9 changes: 9 additions & 0 deletions src/main/java/io/sparta/board/dto/CommentRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.sparta.board.dto;

import lombok.Getter;

@Getter
public class CommentRequestDto {
private String content;

}
27 changes: 27 additions & 0 deletions src/main/java/io/sparta/board/dto/CommentResponseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.sparta.board.dto;


import io.sparta.board.entity.Comment;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class CommentResponseDto {
private UUID id;
private String content;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;

public static CommentResponseDto fromEntity(Comment comment) {
return CommentResponseDto.builder()
.id(comment.getId())
.content(comment.getContent())
.createdAt(comment.getCreatedAt())
.updatedAt(comment.getUpdatedAt())
.build();
}

}
14 changes: 14 additions & 0 deletions src/main/java/io/sparta/board/dto/PostRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.sparta.board.dto;


import lombok.Getter;

@Getter
public class PostRequestDto {
private String title;
private String content;

}



19 changes: 19 additions & 0 deletions src/main/java/io/sparta/board/dto/PostResponseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.sparta.board.dto;

import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class PostResponseDto {
private UUID id;
private String title;
private String content;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private List<CommentResponseDto> comments;

}
59 changes: 59 additions & 0 deletions src/main/java/io/sparta/board/entity/Comment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package io.sparta.board.entity;


import io.sparta.board.common.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.util.UUID;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Entity
@Table(name = "p_comment")
public class Comment extends BaseEntity {

@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(columnDefinition = "uuid", updatable = false)
private UUID id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id",nullable = false)
private Post post;

@Column(nullable = false, columnDefinition = "TEXT")
private String content;

@Column(nullable = false)
private boolean deleted = false;

// 비지니스 로직
public void update(String content) {
this.content = content;
}

public void softDelete() {
this.deleted = true;
}

// 연관관계 편의 메서드
public void setPost(Post post) {
this.post = post;
}

}
77 changes: 77 additions & 0 deletions src/main/java/io/sparta/board/entity/Post.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package io.sparta.board.entity;

import io.sparta.board.common.BaseEntity;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import org.hibernate.annotations.GenericGenerator;


import java.util.ArrayList;
import java.util.List;
import java.util.UUID;


@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Entity
@Table(name = "p_post")
public class Post extends BaseEntity {

@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column(columnDefinition = "uuid", updatable = false)
private UUID id;

@Column(nullable = false, length = 100)
private String title;

@Column(nullable = false,columnDefinition = "TEXT")
private String content;

@Column(nullable = false)
@Builder.Default
private boolean deleted = false;

@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
private List<Comment> comments = new ArrayList<>();

// 편의 메서드 (댓글 연관관계 관리용)


public void addComment(Comment comment) {
comments.add(comment);
comment.setPost(this);
}

// 비지니스 로직
public void update(String title, String content){
this.title = title;
this.content = content;
}

public void softDelete() {
this.deleted = true;
comments.forEach(Comment::softDelete); // 댓글도 함께 soft-delete
}



}
15 changes: 15 additions & 0 deletions src/main/java/io/sparta/board/repository/CommentRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.sparta.board.repository;

import io.sparta.board.entity.Comment;
import io.sparta.board.entity.Post;
import java.util.List;
import java.util.UUID;

import org.springframework.data.jpa.repository.JpaRepository;

public interface CommentRepository extends JpaRepository<Comment, UUID> {

// 해당 게시글에 달린 삭제되지 않은 댓글 목록
List<Comment> findByPostAndDeletedFalse(Post post);

}
19 changes: 19 additions & 0 deletions src/main/java/io/sparta/board/repository/PostRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.sparta.board.repository;

// 게시글, 댓글,저장 / 조회/ 삭제가 가능한 Repository 만들기
// soft-delete 처리된 데이터는 제외하고 조회하기

import io.sparta.board.entity.Post;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PostRepository extends JpaRepository<Post, UUID>
{

// 삭제되지 않은 게시글만 조회
Optional<Post> findByIdAndDeletedFalse(UUID id);

List<Post> findAllByDeletedFalse();
}
Loading