diff --git a/README.md b/README.md new file mode 100644 index 0000000..00f0580 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +## TODO List +- [o] 게시글 생성 API 구현 +- [o] 게시글 수정 API 구현 + -[ ] 존재하지 않는 게시글 수정 요청 시 예외 처리 + -[o] 게시글 수정 서비스 구현 +- [ ] 게시글 삭제 API 구현 + - [ ] 게시글 삭제 시 예외 케이스 구현 + - [ ] 게시글이 이미 삭제된 경우 예외 처리 + - [ ] 존재하지 않는 게시글 삭제 요청 시 예외 처리 + - [ ] 게시글 삭제 서비스 구현 +- [ ] 게시글 조회 API 구현 + - [ ] 존재하지 않는 게시글 조회 요청 시 예외 처리 + - [ ] 게시글 조회 서비스 구현 +- -------------------------------------------------------------- +- [ ] 댓글 생성 API 구현 +- [ ] 댓글 수정 API 구현 + -[ ] 존재하지 않는 댓글 수정 요청 시 예외 처리 + -[ ] 댓글 수정 서비스 구현 +- [ ] 댓글 삭제 API 구현 + - [ ] 댓글 삭제 시 예외 케이스 구현 + - [ ] 댓글이 이미 삭제된 경우 예외 처리 + - [ ] 존재하지 않는 댓글 삭제 요청 시 예외 처리 + - [ ] 댓글 삭제 서비스 구현 +- [ ] 댓글 조회 API 구현 + - [ ] 존재하지 않는 댓글 조회 요청 시 예외 처리 + - [ ] 댓글 조회 서비스 구현 +... +--- + +## 구현 시 어렵거나 이해가 되지 않는 부분 +- 수정시에 수정 메서드를 어디에 구현해야 할지 모르겠다 +- +- \ No newline at end of file diff --git a/src/main/java/io/sparta/board/BoardApplication.java b/src/main/java/io/sparta/board/BoardApplication.java index 2b72c52..09f7ee1 100644 --- a/src/main/java/io/sparta/board/BoardApplication.java +++ b/src/main/java/io/sparta/board/BoardApplication.java @@ -2,8 +2,10 @@ 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) { diff --git a/src/main/java/io/sparta/board/application/CommentService.java b/src/main/java/io/sparta/board/application/CommentService.java new file mode 100644 index 0000000..1faf852 --- /dev/null +++ b/src/main/java/io/sparta/board/application/CommentService.java @@ -0,0 +1,20 @@ +package io.sparta.board.application; + +import io.sparta.board.domain.Comment; +import io.sparta.board.infrastructure.CommentRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class CommentService { + + private final CommentRepository commentRepository; + + public void save(Comment comment) { + + commentRepository.save(comment); + } +} diff --git a/src/main/java/io/sparta/board/application/PostService.java b/src/main/java/io/sparta/board/application/PostService.java new file mode 100644 index 0000000..9303bfc --- /dev/null +++ b/src/main/java/io/sparta/board/application/PostService.java @@ -0,0 +1,36 @@ +package io.sparta.board.application; + +import io.sparta.board.domain.Post; +import io.sparta.board.infrastructure.PostRepository; +import io.sparta.board.presentaion.PostRequestDto; +import io.sparta.board.presentaion.PostResponseDto; +import jakarta.transaction.Transactional; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Transactional +public class PostService { + + private final PostRepository postRepository; + + public PostResponseDto save(PostRequestDto postRequestDto) { + + Post post = new Post( + postRequestDto.getTitle(), + postRequestDto.getContent() + ); + postRepository.save(post); + return new PostResponseDto(post); + } + + public PostResponseDto updatePost(UUID postid, PostRequestDto postRequestDto) { + Post post = postRepository.findById(postid).orElse(null); + post.update(postRequestDto.getTitle(), postRequestDto.getContent()); + + postRepository.save(post); + return new PostResponseDto(post); + } +} diff --git a/src/main/java/io/sparta/board/domain/Comment.java b/src/main/java/io/sparta/board/domain/Comment.java new file mode 100644 index 0000000..bf0832c --- /dev/null +++ b/src/main/java/io/sparta/board/domain/Comment.java @@ -0,0 +1,49 @@ +package io.sparta.board.domain; + + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Entity +@Getter +@NoArgsConstructor +@AllArgsConstructor +@EntityListeners(AuditingEntityListener.class) +@Table(name="p_comment") +public class Comment { + + @Id + @Column(nullable = false) + private UUID id; + + @Column(nullable = false) + private UUID post_id; + + @Column(nullable = false) + private String content; + + @Column(nullable = false) + private Boolean deleted; + + @CreatedDate + @Column(nullable = false , updatable = false) + @Temporal(TemporalType.TIMESTAMP) + private LocalDateTime created_at; + + @CreatedDate + @Column(nullable = false , updatable = false) + @Temporal(TemporalType.TIMESTAMP) + private LocalDateTime updated_at; +} diff --git a/src/main/java/io/sparta/board/domain/Post.java b/src/main/java/io/sparta/board/domain/Post.java new file mode 100644 index 0000000..a91bbfe --- /dev/null +++ b/src/main/java/io/sparta/board/domain/Post.java @@ -0,0 +1,55 @@ +package io.sparta.board.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Entity +@Getter +@NoArgsConstructor +@AllArgsConstructor +@EntityListeners(AuditingEntityListener.class) +@Table(name="p_post") +public class Post { + + @Id + @GeneratedValue + @Column(nullable = false) + private UUID id; + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String content; + + private Boolean deleted; + + @CreatedDate + @Column(nullable = false , updatable = false) + private LocalDateTime created_at; + + @LastModifiedDate + @Column + private LocalDateTime updated_at; + + public Post(String title, String content) { + this.title = title; + this.content = content; + } + public void update(String title, String content) { + this.title = title; + this.content = content; + } +} diff --git a/src/main/java/io/sparta/board/infrastructure/CommentRepository.java b/src/main/java/io/sparta/board/infrastructure/CommentRepository.java new file mode 100644 index 0000000..4039937 --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/CommentRepository.java @@ -0,0 +1,9 @@ +package io.sparta.board.infrastructure; + +import io.sparta.board.domain.Comment; +import java.util.UUID; +import org.springframework.data.repository.CrudRepository; + +public interface CommentRepository extends CrudRepository { + +} diff --git a/src/main/java/io/sparta/board/infrastructure/PostRepository.java b/src/main/java/io/sparta/board/infrastructure/PostRepository.java new file mode 100644 index 0000000..d665aa4 --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/PostRepository.java @@ -0,0 +1,10 @@ +package io.sparta.board.infrastructure; + +import io.sparta.board.domain.Post; +import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostRepository extends JpaRepository { + + +} diff --git a/src/main/java/io/sparta/board/presentaion/CommentController.java b/src/main/java/io/sparta/board/presentaion/CommentController.java new file mode 100644 index 0000000..b04a872 --- /dev/null +++ b/src/main/java/io/sparta/board/presentaion/CommentController.java @@ -0,0 +1,26 @@ +package io.sparta.board.presentaion; + +import io.sparta.board.application.CommentService; +import io.sparta.board.domain.Comment; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/comment") +@RequiredArgsConstructor +public class CommentController { + + private final CommentService commentService; + + //댓글 생성 + @PostMapping("/create") + public ResponseEntity createComment(@RequestBody Comment comment) { + + commentService.save(comment); + return ResponseEntity.ok("생성"); + } +} diff --git a/src/main/java/io/sparta/board/presentaion/CommentRequestDto.java b/src/main/java/io/sparta/board/presentaion/CommentRequestDto.java new file mode 100644 index 0000000..dfe9a0e --- /dev/null +++ b/src/main/java/io/sparta/board/presentaion/CommentRequestDto.java @@ -0,0 +1,5 @@ +package io.sparta.board.presentaion; + +public class CommentRequestDto { + +} diff --git a/src/main/java/io/sparta/board/presentaion/PostController.java b/src/main/java/io/sparta/board/presentaion/PostController.java new file mode 100644 index 0000000..3f3223f --- /dev/null +++ b/src/main/java/io/sparta/board/presentaion/PostController.java @@ -0,0 +1,39 @@ +package io.sparta.board.presentaion; + +import io.sparta.board.application.PostService; +import io.sparta.board.domain.Post; +import io.sparta.board.infrastructure.PostRepository; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/post") +@RequiredArgsConstructor +public class PostController { + + private final PostService postService; + private final PostRepository postRepository; + + //게시글 생성 + @PostMapping("/create") + public ResponseEntity post(@RequestBody PostRequestDto postRequestDto) { + + postService.save(postRequestDto); + + return ResponseEntity.ok(postService.save(postRequestDto)); + } + + @PatchMapping("/{post_id}") + public ResponseEntity updatePost(@PathVariable("post_id") UUID id,@RequestBody PostRequestDto postRequestDto) { + postService.updatePost(id,postRequestDto); + + return ResponseEntity.ok(postService.updatePost(id,postRequestDto)); + } +} diff --git a/src/main/java/io/sparta/board/presentaion/PostRequestDto.java b/src/main/java/io/sparta/board/presentaion/PostRequestDto.java new file mode 100644 index 0000000..4cb36d0 --- /dev/null +++ b/src/main/java/io/sparta/board/presentaion/PostRequestDto.java @@ -0,0 +1,12 @@ +package io.sparta.board.presentaion; + +import lombok.Getter; + +@Getter +public class PostRequestDto { + + private String title; + + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentaion/PostResponseDto.java b/src/main/java/io/sparta/board/presentaion/PostResponseDto.java new file mode 100644 index 0000000..bf6d4aa --- /dev/null +++ b/src/main/java/io/sparta/board/presentaion/PostResponseDto.java @@ -0,0 +1,43 @@ +package io.sparta.board.presentaion; + +import io.sparta.board.domain.Post; +import jakarta.persistence.Column; +import jakarta.persistence.Id; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +@Getter +@NoArgsConstructor +public class PostResponseDto { + + @Id + private UUID id; + + private String title; + + private String content; + + private Boolean deleted; + + @CreatedDate + @Column(nullable = false , updatable = false) + private LocalDateTime created_at; + + @LastModifiedDate + @Column + private LocalDateTime updated_at; + + public PostResponseDto(Post post) { + this.id = post.getId(); + this.title = post.getTitle(); + this.content = post.getContent(); + this.deleted = post.getDeleted(); + this.created_at = post.getCreated_at(); + this.updated_at = post.getUpdated_at(); + } +}