From 491b1605f28a0cbad8329336d3518289b56497eb Mon Sep 17 00:00:00 2001 From: syn Date: Wed, 2 Apr 2025 01:00:14 +0900 Subject: [PATCH 01/12] =?UTF-8?q?[feat]to=20do=20list=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- to do list.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 to do list.md diff --git a/to do list.md b/to do list.md new file mode 100644 index 0000000..eae88ec --- /dev/null +++ b/to do list.md @@ -0,0 +1,34 @@ +### ** to do list ** +* [x] 기본작업 + * [x] 포크받아와서 셋팅 + * [x] 엔티티 생성 + * [x] 엔티티 연관관계 생성 + * [x] jpa 리포지토리 생성 + +* [ ] 게시글 작성 + * 게시글 제목, 내용필수 + * [ ] dto 작성 + * [ ] 컨트롤러 작성 + * [ ] 서비스, jpa 메서드 작성 +* [ ] 게시글 수정 + * 제목, 내용만 수정가능 + * [ ] dto 작성 + * [ ] 엔티티에 update 메서드 추가 + * [ ] 컨트롤러 작성 + * [ ] 서비스 작성 +* [ ] 게시글 삭제 + * 삭제 시 게시글과 함께 해당 게시글의 모든 댓글도 삭제 처리 +* [ ] 게시글 단건 조회 + * 게시글에 포함된 모든 댓글목록 조회 + +* [ ] 댓글조회 +* [ ] 댓글수정 +* [ ] 댓글삭제 +* [ ] softdelete + * 삭제후 복구 불가능?? + * 삭제된 데이터는 조회 불가능 +* [ ] 작성일, 수정날짜 자동기록(베이스엔티티) +* [ ] 댓글 목록 페이징 처리 + +### ** 작업과정 ** + fatchtype.lazy -> 또 까먹음.. 다시 확인할것. \ No newline at end of file From 1d7f73336fc47fa8d9795ebccb0765a290b79593 Mon Sep 17 00:00:00 2001 From: syn Date: Wed, 2 Apr 2025 01:00:52 +0900 Subject: [PATCH 02/12] =?UTF-8?q?[feat]=20comment,=20post=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/sparta/board/model/entity/Comment.java | 37 ++++++++++++++++++ .../io/sparta/board/model/entity/Post.java | 38 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/main/java/io/sparta/board/model/entity/Comment.java create mode 100644 src/main/java/io/sparta/board/model/entity/Post.java diff --git a/src/main/java/io/sparta/board/model/entity/Comment.java b/src/main/java/io/sparta/board/model/entity/Comment.java new file mode 100644 index 0000000..29dd0e5 --- /dev/null +++ b/src/main/java/io/sparta/board/model/entity/Comment.java @@ -0,0 +1,37 @@ +package io.sparta.board.model.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import java.util.UUID; +import lombok.Getter; + +@Getter +@Table(name = "p_comment") +@Entity +public class Comment { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "id", nullable = false) + private UUID commentId; + + @Column(nullable = false) + String content; + + @Column(nullable = false) + boolean deleted; + + @ManyToOne(fetch = FetchType.LAZY ) + @JoinColumn(name = "post_id", nullable = false) + private Post post; + + + +} diff --git a/src/main/java/io/sparta/board/model/entity/Post.java b/src/main/java/io/sparta/board/model/entity/Post.java new file mode 100644 index 0000000..62b90bf --- /dev/null +++ b/src/main/java/io/sparta/board/model/entity/Post.java @@ -0,0 +1,38 @@ +package io.sparta.board.model.entity; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.List; +import java.util.UUID; +import lombok.Getter; + +@Getter +@Entity +@Table(name = "p_post") +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "id", nullable = false) + private UUID postId; + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String content; + + @Column(nullable = false) + private Boolean deleted; + + @OneToMany(mappedBy = "post", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) + private List comments; + + +} From 218efc4231697767772988b8681213da93b10346 Mon Sep 17 00:00:00 2001 From: syn Date: Wed, 2 Apr 2025 01:01:23 +0900 Subject: [PATCH 03/12] =?UTF-8?q?[feat]=20=EB=A0=88=ED=8F=AC=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=83=9D=EC=84=B1,=20jpa=EB=A0=88?= =?UTF-8?q?=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/repository/JPACommentRepository.java | 9 +++++++++ .../infrastructure/repository/JPAPostRepository.java | 8 ++++++++ .../sparta/board/model/repository/CommentRepository.java | 4 ++++ .../io/sparta/board/model/repository/PostRepository.java | 5 +++++ 4 files changed, 26 insertions(+) create mode 100644 src/main/java/io/sparta/board/infrastructure/repository/JPACommentRepository.java create mode 100644 src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java create mode 100644 src/main/java/io/sparta/board/model/repository/CommentRepository.java create mode 100644 src/main/java/io/sparta/board/model/repository/PostRepository.java diff --git a/src/main/java/io/sparta/board/infrastructure/repository/JPACommentRepository.java b/src/main/java/io/sparta/board/infrastructure/repository/JPACommentRepository.java new file mode 100644 index 0000000..6eadeb6 --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/repository/JPACommentRepository.java @@ -0,0 +1,9 @@ +package io.sparta.board.infrastructure.repository; + +import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.repository.CommentRepository; +import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface JPACommentRepository extends JpaRepository, CommentRepository { +} diff --git a/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java b/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java new file mode 100644 index 0000000..0143d91 --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java @@ -0,0 +1,8 @@ +package io.sparta.board.infrastructure.repository; + +import io.sparta.board.model.entity.Post; +import io.sparta.board.model.repository.PostRepository; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface JPAPostRepository extends JpaRepository , PostRepository { +} diff --git a/src/main/java/io/sparta/board/model/repository/CommentRepository.java b/src/main/java/io/sparta/board/model/repository/CommentRepository.java new file mode 100644 index 0000000..80ee3e8 --- /dev/null +++ b/src/main/java/io/sparta/board/model/repository/CommentRepository.java @@ -0,0 +1,4 @@ +package io.sparta.board.model.repository; + +public interface CommentRepository { +} diff --git a/src/main/java/io/sparta/board/model/repository/PostRepository.java b/src/main/java/io/sparta/board/model/repository/PostRepository.java new file mode 100644 index 0000000..96547ca --- /dev/null +++ b/src/main/java/io/sparta/board/model/repository/PostRepository.java @@ -0,0 +1,5 @@ +package io.sparta.board.model.repository; + +public interface PostRepository { + +} From 2c49ff0ad1684968cae45b0207949aaf2d07f87b Mon Sep 17 00:00:00 2001 From: syn Date: Wed, 2 Apr 2025 11:56:12 +0900 Subject: [PATCH 04/12] =?UTF-8?q?[feat]=20Post=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/PostService.java | 14 ++++++ .../application/service/PostServiceImpl.java | 35 ++++++++++++++ .../repository/JPAPostRepository.java | 4 +- .../io/sparta/board/model/entity/Post.java | 11 +++++ .../model/repository/PostRepository.java | 3 ++ .../controller/PostController.java | 47 +++++++++++++++++++ .../dto/request/CreatePostRequestDto.java | 11 +++++ .../dto/response/CreatePostResponseDto.java | 16 +++++++ .../board/presentation/mapper/PostMapper.java | 29 ++++++++++++ src/test/test.http | 8 ++++ 10 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/sparta/board/application/service/PostService.java create mode 100644 src/main/java/io/sparta/board/application/service/PostServiceImpl.java create mode 100644 src/main/java/io/sparta/board/presentation/controller/PostController.java create mode 100644 src/main/java/io/sparta/board/presentation/dto/request/CreatePostRequestDto.java create mode 100644 src/main/java/io/sparta/board/presentation/dto/response/CreatePostResponseDto.java create mode 100644 src/main/java/io/sparta/board/presentation/mapper/PostMapper.java create mode 100644 src/test/test.http diff --git a/src/main/java/io/sparta/board/application/service/PostService.java b/src/main/java/io/sparta/board/application/service/PostService.java new file mode 100644 index 0000000..f0443db --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/PostService.java @@ -0,0 +1,14 @@ +package io.sparta.board.application.service; + +import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; +import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; + +public interface PostService { + + CreatePostResponseDto createPost(CreatePostRequestDto requestDto); + + UpdatePostResponseDto updatePost(UpdatePostRequestDto requestDto); + +} diff --git a/src/main/java/io/sparta/board/application/service/PostServiceImpl.java b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java new file mode 100644 index 0000000..3ea388d --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java @@ -0,0 +1,35 @@ +package io.sparta.board.application.service; + +import io.sparta.board.model.entity.Post; +import io.sparta.board.model.repository.PostRepository; +import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; +import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +import io.sparta.board.presentation.mapper.PostMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class PostServiceImpl implements PostService { + + private final PostRepository postRepository; + + @Override + public CreatePostResponseDto createPost(CreatePostRequestDto requestDto) { + //dto 로 엔티티 만들기 + Post post = PostMapper.createPostRequestDtotoEntity(requestDto); + //save + postRepository.save(post); + + return PostMapper.entityToCreatePostresponseDto(post); + } + + @Override + public UpdatePostResponseDto updatePost(UpdatePostRequestDto requestDto) { + return null; + } +} diff --git a/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java b/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java index 0143d91..0ed43f9 100644 --- a/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java +++ b/src/main/java/io/sparta/board/infrastructure/repository/JPAPostRepository.java @@ -2,7 +2,9 @@ import io.sparta.board.model.entity.Post; import io.sparta.board.model.repository.PostRepository; +import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; -public interface JPAPostRepository extends JpaRepository , PostRepository { +public interface JPAPostRepository extends JpaRepository , PostRepository { + } diff --git a/src/main/java/io/sparta/board/model/entity/Post.java b/src/main/java/io/sparta/board/model/entity/Post.java index 62b90bf..a062ae5 100644 --- a/src/main/java/io/sparta/board/model/entity/Post.java +++ b/src/main/java/io/sparta/board/model/entity/Post.java @@ -10,11 +10,15 @@ import jakarta.persistence.Table; import java.util.List; import java.util.UUID; +import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @Entity @Table(name = "p_post") +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Post { @Id @@ -34,5 +38,12 @@ public class Post { @OneToMany(mappedBy = "post", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private List comments; + @Builder + public Post(String title, String content, Boolean deleted, List comments) { + this.title = title; + this.content = content; + this.deleted = deleted; + this.comments = comments; + } } diff --git a/src/main/java/io/sparta/board/model/repository/PostRepository.java b/src/main/java/io/sparta/board/model/repository/PostRepository.java index 96547ca..6900984 100644 --- a/src/main/java/io/sparta/board/model/repository/PostRepository.java +++ b/src/main/java/io/sparta/board/model/repository/PostRepository.java @@ -1,5 +1,8 @@ package io.sparta.board.model.repository; +import io.sparta.board.model.entity.Post; + public interface PostRepository { + Post save(Post post); } diff --git a/src/main/java/io/sparta/board/presentation/controller/PostController.java b/src/main/java/io/sparta/board/presentation/controller/PostController.java new file mode 100644 index 0000000..d4196c8 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/controller/PostController.java @@ -0,0 +1,47 @@ +package io.sparta.board.presentation.controller; + +import io.sparta.board.application.service.PostService; +import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; +import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +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") +@RequiredArgsConstructor +public class PostController { + private final PostService postService; + //게시글 작성 + @PostMapping + public ResponseEntity createPost(@RequestBody CreatePostRequestDto requestDto) { + CreatePostResponseDto responseDto = postService.createPost(requestDto); + + return ResponseEntity.ok(responseDto); + } + + //게시글 수정 + @PatchMapping + public void updatePost(@RequestBody UpdatePostRequestDto requestDto) { + + } + + + //[ ] 게시글 작성 + // 게시글 제목, 내용필수 + //* [ ] dto 작성 + // [ ] 컨트롤러 작성 + // [ ] 서비스, jpa 메서드 작성 +//[ ] 게시글 수정 + // 제목, 내용만 수정가능 + // [ ] dto 작성 + // [ ] 엔티티에 update 메서드 추가 + // [ ] 컨트롤러 작성 + // [ ] 서비스 작성 + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/request/CreatePostRequestDto.java b/src/main/java/io/sparta/board/presentation/dto/request/CreatePostRequestDto.java new file mode 100644 index 0000000..2189392 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/request/CreatePostRequestDto.java @@ -0,0 +1,11 @@ +package io.sparta.board.presentation.dto.request; + +import lombok.Getter; + +@Getter +public class CreatePostRequestDto { + + private String title; + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/response/CreatePostResponseDto.java b/src/main/java/io/sparta/board/presentation/dto/response/CreatePostResponseDto.java new file mode 100644 index 0000000..1720a22 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/response/CreatePostResponseDto.java @@ -0,0 +1,16 @@ +package io.sparta.board.presentation.dto.response; + +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class CreatePostResponseDto { + + private UUID postId; + private String title; + private String content; + + +} diff --git a/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java new file mode 100644 index 0000000..fb84ba1 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java @@ -0,0 +1,29 @@ +package io.sparta.board.presentation.mapper; + +import io.sparta.board.model.entity.Post; +import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.response.CreatePostResponseDto; + +public class PostMapper { + + public static Post createPostRequestDtotoEntity(CreatePostRequestDto requestDto) { + + Post post = Post.builder() + .title(requestDto.getTitle()) + .content(requestDto.getContent()) + .deleted(false) + .build(); + return post; + } + + public static CreatePostResponseDto entityToCreatePostresponseDto(Post post) { + CreatePostResponseDto responseDto = CreatePostResponseDto.builder() + .postId(post.getPostId()) + .title(post.getTitle()) + .content(post.getContent()) + .build(); + return responseDto; + } + + +} diff --git a/src/test/test.http b/src/test/test.http new file mode 100644 index 0000000..7fdc52f --- /dev/null +++ b/src/test/test.http @@ -0,0 +1,8 @@ +### +POST http://localhost:8080/api +Content-Type: application/json + +{ + "title": "test", + "content": "testtest" +} \ No newline at end of file From 61b5425f6d52acaca42dab55f7d9c36ed2fc0500 Mon Sep 17 00:00:00 2001 From: syn Date: Wed, 2 Apr 2025 12:46:57 +0900 Subject: [PATCH 05/12] =?UTF-8?q?[feat]=20Post=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/PostService.java | 3 ++- .../application/service/PostServiceImpl.java | 13 ++++++++-- .../sparta/board/exception/ExceptionCode.java | 18 +++++++++++++ .../io/sparta/board/model/entity/Post.java | 6 +++++ .../model/repository/PostRepository.java | 3 +++ .../controller/PostController.java | 25 ++++++------------- .../dto/request/UpdatePostRequestDto.java | 11 ++++++++ .../dto/response/UpdatePostResponseDto.java | 15 +++++++++++ .../board/presentation/mapper/PostMapper.java | 13 ++++++++++ src/test/test.http | 9 +++++++ 10 files changed, 96 insertions(+), 20 deletions(-) create mode 100644 src/main/java/io/sparta/board/exception/ExceptionCode.java create mode 100644 src/main/java/io/sparta/board/presentation/dto/request/UpdatePostRequestDto.java create mode 100644 src/main/java/io/sparta/board/presentation/dto/response/UpdatePostResponseDto.java diff --git a/src/main/java/io/sparta/board/application/service/PostService.java b/src/main/java/io/sparta/board/application/service/PostService.java index f0443db..234636d 100644 --- a/src/main/java/io/sparta/board/application/service/PostService.java +++ b/src/main/java/io/sparta/board/application/service/PostService.java @@ -4,11 +4,12 @@ import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; import io.sparta.board.presentation.dto.response.CreatePostResponseDto; import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +import java.util.UUID; public interface PostService { CreatePostResponseDto createPost(CreatePostRequestDto requestDto); - UpdatePostResponseDto updatePost(UpdatePostRequestDto requestDto); + UpdatePostResponseDto updatePost(UUID postId, UpdatePostRequestDto requestDto); } diff --git a/src/main/java/io/sparta/board/application/service/PostServiceImpl.java b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java index 3ea388d..0dd2f65 100644 --- a/src/main/java/io/sparta/board/application/service/PostServiceImpl.java +++ b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java @@ -1,5 +1,7 @@ package io.sparta.board.application.service; +import io.sparta.board.exception.CustomException; +import io.sparta.board.exception.ExceptionCode; import io.sparta.board.model.entity.Post; import io.sparta.board.model.repository.PostRepository; import io.sparta.board.presentation.dto.response.CreatePostResponseDto; @@ -7,7 +9,9 @@ import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; import io.sparta.board.presentation.mapper.PostMapper; +import java.util.UUID; import lombok.RequiredArgsConstructor; +import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,7 +33,12 @@ public CreatePostResponseDto createPost(CreatePostRequestDto requestDto) { } @Override - public UpdatePostResponseDto updatePost(UpdatePostRequestDto requestDto) { - return null; + public UpdatePostResponseDto updatePost(UUID postId, UpdatePostRequestDto requestDto) { + //id로 포스트 값 찾기 + Post post = postRepository.findById(postId).orElseThrow(() -> new CustomException( + ExceptionCode.POST_NOT_FOUND)); + post.update(requestDto); + UpdatePostResponseDto responseDto = PostMapper.entityToUpdatePostResponseDto(post); + return responseDto; } } diff --git a/src/main/java/io/sparta/board/exception/ExceptionCode.java b/src/main/java/io/sparta/board/exception/ExceptionCode.java new file mode 100644 index 0000000..43d2779 --- /dev/null +++ b/src/main/java/io/sparta/board/exception/ExceptionCode.java @@ -0,0 +1,18 @@ +package io.sparta.board.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum ExceptionCode { + + POST_NOT_FOUND(HttpStatus.NOT_FOUND, "게시글을 찾을 수 없음", 4000); + + + private final HttpStatus httpStatus; + private final String message; + private final Integer code; + +} diff --git a/src/main/java/io/sparta/board/model/entity/Post.java b/src/main/java/io/sparta/board/model/entity/Post.java index a062ae5..aa0692e 100644 --- a/src/main/java/io/sparta/board/model/entity/Post.java +++ b/src/main/java/io/sparta/board/model/entity/Post.java @@ -1,5 +1,6 @@ package io.sparta.board.model.entity; +import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -46,4 +47,9 @@ public Post(String title, String content, Boolean deleted, List comment this.comments = comments; } + + public void update(UpdatePostRequestDto requestDto) { + this.title = requestDto.getTitle(); + this.content = requestDto.getContent(); + } } diff --git a/src/main/java/io/sparta/board/model/repository/PostRepository.java b/src/main/java/io/sparta/board/model/repository/PostRepository.java index 6900984..cbd752b 100644 --- a/src/main/java/io/sparta/board/model/repository/PostRepository.java +++ b/src/main/java/io/sparta/board/model/repository/PostRepository.java @@ -1,8 +1,11 @@ package io.sparta.board.model.repository; import io.sparta.board.model.entity.Post; +import java.util.Optional; +import java.util.UUID; public interface PostRepository { Post save(Post post); + Optional findById(UUID id); } diff --git a/src/main/java/io/sparta/board/presentation/controller/PostController.java b/src/main/java/io/sparta/board/presentation/controller/PostController.java index d4196c8..a1f0083 100644 --- a/src/main/java/io/sparta/board/presentation/controller/PostController.java +++ b/src/main/java/io/sparta/board/presentation/controller/PostController.java @@ -4,12 +4,16 @@ import io.sparta.board.presentation.dto.request.CreatePostRequestDto; import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +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.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @@ -21,27 +25,14 @@ public class PostController { @PostMapping public ResponseEntity createPost(@RequestBody CreatePostRequestDto requestDto) { CreatePostResponseDto responseDto = postService.createPost(requestDto); - return ResponseEntity.ok(responseDto); } //게시글 수정 - @PatchMapping - public void updatePost(@RequestBody UpdatePostRequestDto requestDto) { - + @PatchMapping("/{postId}") + public ResponseEntity updatePost(@PathVariable UUID postId, @RequestBody UpdatePostRequestDto requestDto) { + UpdatePostResponseDto responseDto = postService.updatePost(postId, requestDto); + return ResponseEntity.ok(responseDto); } - - //[ ] 게시글 작성 - // 게시글 제목, 내용필수 - //* [ ] dto 작성 - // [ ] 컨트롤러 작성 - // [ ] 서비스, jpa 메서드 작성 -//[ ] 게시글 수정 - // 제목, 내용만 수정가능 - // [ ] dto 작성 - // [ ] 엔티티에 update 메서드 추가 - // [ ] 컨트롤러 작성 - // [ ] 서비스 작성 - } diff --git a/src/main/java/io/sparta/board/presentation/dto/request/UpdatePostRequestDto.java b/src/main/java/io/sparta/board/presentation/dto/request/UpdatePostRequestDto.java new file mode 100644 index 0000000..751814d --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/request/UpdatePostRequestDto.java @@ -0,0 +1,11 @@ +package io.sparta.board.presentation.dto.request; + +import lombok.Getter; + +@Getter +public class UpdatePostRequestDto { + + private String title; + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/response/UpdatePostResponseDto.java b/src/main/java/io/sparta/board/presentation/dto/response/UpdatePostResponseDto.java new file mode 100644 index 0000000..8d18c9a --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/response/UpdatePostResponseDto.java @@ -0,0 +1,15 @@ +package io.sparta.board.presentation.dto.response; + +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class UpdatePostResponseDto { + + private UUID postId; + private String title; + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java index fb84ba1..3d50ea1 100644 --- a/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java +++ b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java @@ -2,10 +2,21 @@ import io.sparta.board.model.entity.Post; import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; public class PostMapper { + public static UpdatePostResponseDto entityToUpdatePostResponseDto(Post post) { + UpdatePostResponseDto responseDto = UpdatePostResponseDto.builder() + .postId(post.getPostId()) + .title(post.getTitle()) + .content(post.getContent()) + .build(); + return responseDto; + } + public static Post createPostRequestDtotoEntity(CreatePostRequestDto requestDto) { Post post = Post.builder() @@ -26,4 +37,6 @@ public static CreatePostResponseDto entityToCreatePostresponseDto(Post post) { } + + } diff --git a/src/test/test.http b/src/test/test.http index 7fdc52f..123a94d 100644 --- a/src/test/test.http +++ b/src/test/test.http @@ -5,4 +5,13 @@ Content-Type: application/json { "title": "test", "content": "testtest" +} + +### +PATCH http://localhost:8080/api/3ca5d761-e84f-4ee3-bc6b-87184133cfa4 +Content-Type: application/json + +{ + "title": "test1", + "content": "testtest1" } \ No newline at end of file From 2d70323adc75dc261cfa6a4b7dacd8b634adf951 Mon Sep 17 00:00:00 2001 From: syn Date: Wed, 2 Apr 2025 14:43:28 +0900 Subject: [PATCH 06/12] =?UTF-8?q?[feat]=20Comment=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CommentService.java | 10 ++++++ .../service/CommentServiceImpl.java | 26 +++++++++++++++ .../io/sparta/board/model/entity/Comment.java | 9 ++++- .../model/repository/CommentRepository.java | 4 +++ .../controller/CommentController.java | 33 +++++++++++++++++++ .../controller/PostController.java | 2 +- .../dto/request/CreateCommentRequestDto.java | 10 ++++++ .../response/CreateCommentResponseDto.java | 15 +++++++++ .../presentation/mapper/CommentMapper.java | 32 ++++++++++++++++++ 9 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/sparta/board/application/service/CommentService.java create mode 100644 src/main/java/io/sparta/board/application/service/CommentServiceImpl.java create mode 100644 src/main/java/io/sparta/board/presentation/controller/CommentController.java create mode 100644 src/main/java/io/sparta/board/presentation/dto/request/CreateCommentRequestDto.java create mode 100644 src/main/java/io/sparta/board/presentation/dto/response/CreateCommentResponseDto.java create mode 100644 src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java diff --git a/src/main/java/io/sparta/board/application/service/CommentService.java b/src/main/java/io/sparta/board/application/service/CommentService.java new file mode 100644 index 0000000..89d50a8 --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/CommentService.java @@ -0,0 +1,10 @@ +package io.sparta.board.application.service; + +import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; + +public interface CommentService { + + CreateCommentResponseDto createComment(CreateCommentRequestDto RequestDto); + +} diff --git a/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java new file mode 100644 index 0000000..e1ed3b1 --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java @@ -0,0 +1,26 @@ +package io.sparta.board.application.service; + +import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.repository.CommentRepository; +import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; +import io.sparta.board.presentation.mapper.CommentMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class CommentServiceImpl extends CommentService { + private final CommentRepository commentRepository; + + + @Override + public CreateCommentResponseDto createComment(CreateCommentRequestDto RequestDto) { + Comment comment = CommentMapper.createCommentRequestDtoToEntity(RequestDto); + commentRepository.save(comment); + CreateCommentResponseDto responseDto = CommentMapper.entityToCreateCommentresponseDto(comment); + return responseDto; + } +} diff --git a/src/main/java/io/sparta/board/model/entity/Comment.java b/src/main/java/io/sparta/board/model/entity/Comment.java index 29dd0e5..7445336 100644 --- a/src/main/java/io/sparta/board/model/entity/Comment.java +++ b/src/main/java/io/sparta/board/model/entity/Comment.java @@ -10,11 +10,15 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import java.util.UUID; +import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @Table(name = "p_comment") @Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Comment { @Id @@ -32,6 +36,9 @@ public class Comment { @JoinColumn(name = "post_id", nullable = false) private Post post; - + @Builder + public Comment(String content) { + this.content = content; + } } diff --git a/src/main/java/io/sparta/board/model/repository/CommentRepository.java b/src/main/java/io/sparta/board/model/repository/CommentRepository.java index 80ee3e8..0bd8997 100644 --- a/src/main/java/io/sparta/board/model/repository/CommentRepository.java +++ b/src/main/java/io/sparta/board/model/repository/CommentRepository.java @@ -1,4 +1,8 @@ package io.sparta.board.model.repository; +import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.entity.Post; + public interface CommentRepository { + Comment save(Comment comment); } diff --git a/src/main/java/io/sparta/board/presentation/controller/CommentController.java b/src/main/java/io/sparta/board/presentation/controller/CommentController.java new file mode 100644 index 0000000..0f6ecc7 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/controller/CommentController.java @@ -0,0 +1,33 @@ +package io.sparta.board.presentation.controller; + +import io.sparta.board.application.service.CommentService; +import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; +import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/comment") +public class CommentController { + + private final CommentService commentService; + //댓글생성 + @PostMapping + public ResponseEntity CreateComment(CreateCommentRequestDto requestDto) { + CreateCommentResponseDto responseDto = commentService.createComment(requestDto); + return ResponseEntity.ok(responseDto); + } + + //댓글수정 + @PatchMapping + public void updateComment(UpdateCommentRequestDto requestDto) { + + } + +} diff --git a/src/main/java/io/sparta/board/presentation/controller/PostController.java b/src/main/java/io/sparta/board/presentation/controller/PostController.java index a1f0083..42f9cf9 100644 --- a/src/main/java/io/sparta/board/presentation/controller/PostController.java +++ b/src/main/java/io/sparta/board/presentation/controller/PostController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/api") +@RequestMapping("/api/post") @RequiredArgsConstructor public class PostController { private final PostService postService; diff --git a/src/main/java/io/sparta/board/presentation/dto/request/CreateCommentRequestDto.java b/src/main/java/io/sparta/board/presentation/dto/request/CreateCommentRequestDto.java new file mode 100644 index 0000000..46e28ba --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/request/CreateCommentRequestDto.java @@ -0,0 +1,10 @@ +package io.sparta.board.presentation.dto.request; + +import lombok.Getter; + +@Getter +public class CreateCommentRequestDto { + + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/dto/response/CreateCommentResponseDto.java b/src/main/java/io/sparta/board/presentation/dto/response/CreateCommentResponseDto.java new file mode 100644 index 0000000..a34b358 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/response/CreateCommentResponseDto.java @@ -0,0 +1,15 @@ +package io.sparta.board.presentation.dto.response; + +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class CreateCommentResponseDto { + + private UUID commentId; + private String content; + + +} diff --git a/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java new file mode 100644 index 0000000..53b96a5 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java @@ -0,0 +1,32 @@ +package io.sparta.board.presentation.mapper; + +import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.entity.Post; +import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.request.CreatePostRequestDto; +import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; +import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; + +public class CommentMapper { + + + public static Comment createCommentRequestDtoToEntity(CreateCommentRequestDto requestDto) { + Comment comment = Comment.builder() + .content(requestDto.getContent()) + .build(); + return comment; + } + + public static CreateCommentResponseDto entityToCreateCommentresponseDto(Comment comment) { + CreateCommentResponseDto responseDto = CreateCommentResponseDto.builder() + .commentId(comment.getCommentId()) + .content(comment.getContent()) + .build(); + return responseDto; + } + + + + +} From 714749252e6e63aea6174af2884562ad406d1599 Mon Sep 17 00:00:00 2001 From: syn Date: Wed, 2 Apr 2025 15:12:58 +0900 Subject: [PATCH 07/12] =?UTF-8?q?[feat]=20Comment=20=EC=83=9D=EC=84=B1,=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CommentService.java | 4 ++++ .../service/CommentServiceImpl.java | 16 ++++++++++--- .../application/service/PostServiceImpl.java | 1 - .../sparta/board/exception/ExceptionCode.java | 3 ++- .../io/sparta/board/model/entity/Comment.java | 8 +++---- .../model/repository/CommentRepository.java | 4 +++- .../controller/CommentController.java | 10 +++++--- .../dto/request/UpdateCommentRequestDto.java | 10 ++++++++ .../presentation/mapper/CommentMapper.java | 1 + src/test/test.http | 23 +++++++++++++++++-- 10 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 src/main/java/io/sparta/board/presentation/dto/request/UpdateCommentRequestDto.java diff --git a/src/main/java/io/sparta/board/application/service/CommentService.java b/src/main/java/io/sparta/board/application/service/CommentService.java index 89d50a8..326a4e7 100644 --- a/src/main/java/io/sparta/board/application/service/CommentService.java +++ b/src/main/java/io/sparta/board/application/service/CommentService.java @@ -1,10 +1,14 @@ package io.sparta.board.application.service; import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; +import java.util.UUID; public interface CommentService { CreateCommentResponseDto createComment(CreateCommentRequestDto RequestDto); + Void updateComment(UUID commentId, UpdateCommentRequestDto RequestDto); + } diff --git a/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java index e1ed3b1..9db1594 100644 --- a/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java +++ b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java @@ -1,10 +1,14 @@ package io.sparta.board.application.service; +import io.sparta.board.exception.CustomException; +import io.sparta.board.exception.ExceptionCode; import io.sparta.board.model.entity.Comment; import io.sparta.board.model.repository.CommentRepository; import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; +import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; import io.sparta.board.presentation.mapper.CommentMapper; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,7 +16,7 @@ @Service @RequiredArgsConstructor @Transactional -public class CommentServiceImpl extends CommentService { +public class CommentServiceImpl implements CommentService { private final CommentRepository commentRepository; @@ -20,7 +24,13 @@ public class CommentServiceImpl extends CommentService { public CreateCommentResponseDto createComment(CreateCommentRequestDto RequestDto) { Comment comment = CommentMapper.createCommentRequestDtoToEntity(RequestDto); commentRepository.save(comment); - CreateCommentResponseDto responseDto = CommentMapper.entityToCreateCommentresponseDto(comment); - return responseDto; + return CommentMapper.entityToCreateCommentresponseDto(comment); + } + + @Override + public Void updateComment(UUID commentId, UpdateCommentRequestDto RequestDto) { + Comment comment = commentRepository.findById(commentId).orElseThrow(() -> new CustomException( + ExceptionCode.COMMENT_NOT_FOUND)); + return null; } } diff --git a/src/main/java/io/sparta/board/application/service/PostServiceImpl.java b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java index 0dd2f65..01665c0 100644 --- a/src/main/java/io/sparta/board/application/service/PostServiceImpl.java +++ b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java @@ -28,7 +28,6 @@ public CreatePostResponseDto createPost(CreatePostRequestDto requestDto) { Post post = PostMapper.createPostRequestDtotoEntity(requestDto); //save postRepository.save(post); - return PostMapper.entityToCreatePostresponseDto(post); } diff --git a/src/main/java/io/sparta/board/exception/ExceptionCode.java b/src/main/java/io/sparta/board/exception/ExceptionCode.java index 43d2779..31a04a6 100644 --- a/src/main/java/io/sparta/board/exception/ExceptionCode.java +++ b/src/main/java/io/sparta/board/exception/ExceptionCode.java @@ -8,7 +8,8 @@ @AllArgsConstructor public enum ExceptionCode { - POST_NOT_FOUND(HttpStatus.NOT_FOUND, "게시글을 찾을 수 없음", 4000); + POST_NOT_FOUND(HttpStatus.NOT_FOUND, "게시글을 찾을 수 없음", 4000), + COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "댓글을 찾을 수 없음", 401); private final HttpStatus httpStatus; diff --git a/src/main/java/io/sparta/board/model/entity/Comment.java b/src/main/java/io/sparta/board/model/entity/Comment.java index 7445336..dcf2930 100644 --- a/src/main/java/io/sparta/board/model/entity/Comment.java +++ b/src/main/java/io/sparta/board/model/entity/Comment.java @@ -27,18 +27,18 @@ public class Comment { private UUID commentId; @Column(nullable = false) - String content; + private String content; @Column(nullable = false) - boolean deleted; + private boolean deleted; @ManyToOne(fetch = FetchType.LAZY ) @JoinColumn(name = "post_id", nullable = false) private Post post; @Builder - public Comment(String content) { + public Comment(String content, boolean deleted) { this.content = content; + this.deleted = deleted; } - } diff --git a/src/main/java/io/sparta/board/model/repository/CommentRepository.java b/src/main/java/io/sparta/board/model/repository/CommentRepository.java index 0bd8997..5579633 100644 --- a/src/main/java/io/sparta/board/model/repository/CommentRepository.java +++ b/src/main/java/io/sparta/board/model/repository/CommentRepository.java @@ -1,8 +1,10 @@ package io.sparta.board.model.repository; import io.sparta.board.model.entity.Comment; -import io.sparta.board.model.entity.Post; +import java.util.Optional; +import java.util.UUID; public interface CommentRepository { Comment save(Comment comment); + Optional findById(UUID id); } diff --git a/src/main/java/io/sparta/board/presentation/controller/CommentController.java b/src/main/java/io/sparta/board/presentation/controller/CommentController.java index 0f6ecc7..4fa7120 100644 --- a/src/main/java/io/sparta/board/presentation/controller/CommentController.java +++ b/src/main/java/io/sparta/board/presentation/controller/CommentController.java @@ -4,10 +4,13 @@ import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; +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; @@ -25,9 +28,10 @@ public ResponseEntity CreateComment(CreateCommentReque } //댓글수정 - @PatchMapping - public void updateComment(UpdateCommentRequestDto requestDto) { - + @PatchMapping("/{commentId}") + public ResponseEntity updateComment(@PathVariable UUID commentId, @RequestBody UpdateCommentRequestDto requestDto) { + Void response = commentService.updateComment(commentId, requestDto); + return ResponseEntity.ok(response); } } diff --git a/src/main/java/io/sparta/board/presentation/dto/request/UpdateCommentRequestDto.java b/src/main/java/io/sparta/board/presentation/dto/request/UpdateCommentRequestDto.java new file mode 100644 index 0000000..c73eb54 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/request/UpdateCommentRequestDto.java @@ -0,0 +1,10 @@ +package io.sparta.board.presentation.dto.request; + +import lombok.Getter; + +@Getter +public class UpdateCommentRequestDto { + + private String content; + +} diff --git a/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java index 53b96a5..d231e92 100644 --- a/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java +++ b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java @@ -14,6 +14,7 @@ public class CommentMapper { public static Comment createCommentRequestDtoToEntity(CreateCommentRequestDto requestDto) { Comment comment = Comment.builder() .content(requestDto.getContent()) + .deleted(false) .build(); return comment; } diff --git a/src/test/test.http b/src/test/test.http index 123a94d..710c32d 100644 --- a/src/test/test.http +++ b/src/test/test.http @@ -1,5 +1,5 @@ ### -POST http://localhost:8080/api +POST http://localhost:8080/api/post Content-Type: application/json { @@ -8,7 +8,26 @@ Content-Type: application/json } ### -PATCH http://localhost:8080/api/3ca5d761-e84f-4ee3-bc6b-87184133cfa4 +PATCH http://localhost:8080/api/post/bf99e99e-e826-46f5-a558-b0976f831df1 +Content-Type: application/json + +{ + "title": "test1", + "content": "testtest1" +} + + + +### +POST http://localhost:8080/api/comment +Content-Type: application/json + +{ + "content": "testtest2" +} + +### +PATCH http://localhost:8080/api/comment/3ca5d761-e84f-4ee3-bc6b-87184133cfa4 Content-Type: application/json { From 32cc904a72e2845c349dbb3a196e80b18a5b8b21 Mon Sep 17 00:00:00 2001 From: syn Date: Wed, 2 Apr 2025 16:00:11 +0900 Subject: [PATCH 08/12] =?UTF-8?q?[feat]=20Comment=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/sparta/board/BoardApplication.java | 3 ++ .../application/service/CommentService.java | 2 ++ .../service/CommentServiceImpl.java | 12 ++++++- .../sparta/board/model/entity/BaseEntity.java | 35 +++++++++++++++++++ .../io/sparta/board/model/entity/Comment.java | 18 ++++++---- .../io/sparta/board/model/entity/Post.java | 13 +++---- .../controller/CommentController.java | 6 ++++ .../presentation/mapper/CommentMapper.java | 1 - .../board/presentation/mapper/PostMapper.java | 1 - 9 files changed, 73 insertions(+), 18 deletions(-) create mode 100644 src/main/java/io/sparta/board/model/entity/BaseEntity.java diff --git a/src/main/java/io/sparta/board/BoardApplication.java b/src/main/java/io/sparta/board/BoardApplication.java index 2b72c52..29be426 100644 --- a/src/main/java/io/sparta/board/BoardApplication.java +++ b/src/main/java/io/sparta/board/BoardApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +@EnableJpaAuditing @SpringBootApplication public class BoardApplication { @@ -11,3 +13,4 @@ public static void main(String[] args) { } } + diff --git a/src/main/java/io/sparta/board/application/service/CommentService.java b/src/main/java/io/sparta/board/application/service/CommentService.java index 326a4e7..3ffedbe 100644 --- a/src/main/java/io/sparta/board/application/service/CommentService.java +++ b/src/main/java/io/sparta/board/application/service/CommentService.java @@ -11,4 +11,6 @@ public interface CommentService { Void updateComment(UUID commentId, UpdateCommentRequestDto RequestDto); + Void deleteComment(UUID commentId); + } diff --git a/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java index 9db1594..c2448e1 100644 --- a/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java +++ b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java @@ -28,9 +28,19 @@ public CreateCommentResponseDto createComment(CreateCommentRequestDto RequestDto } @Override - public Void updateComment(UUID commentId, UpdateCommentRequestDto RequestDto) { + public Void updateComment(UUID commentId, UpdateCommentRequestDto requestDto) { Comment comment = commentRepository.findById(commentId).orElseThrow(() -> new CustomException( ExceptionCode.COMMENT_NOT_FOUND)); + comment.update(requestDto); + return null; + } + + @Override + public Void deleteComment(UUID commentId) { + Comment comment = commentRepository.findById(commentId).orElseThrow(() -> new CustomException( + ExceptionCode.COMMENT_NOT_FOUND)); + comment.delete(true); + return null; } } diff --git a/src/main/java/io/sparta/board/model/entity/BaseEntity.java b/src/main/java/io/sparta/board/model/entity/BaseEntity.java new file mode 100644 index 0000000..da5b4f1 --- /dev/null +++ b/src/main/java/io/sparta/board/model/entity/BaseEntity.java @@ -0,0 +1,35 @@ +package io.sparta.board.model.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Getter +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class BaseEntity implements Serializable { + + @CreatedDate + @Column(updatable = false) + private LocalDateTime createdAt; + + @LastModifiedDate + private LocalDateTime updatedAt; + + @Column(updatable = false) + private boolean deleted; + + public void delete(boolean deleted) { + this.deleted = deleted; + } + protected BaseEntity() { + } +} diff --git a/src/main/java/io/sparta/board/model/entity/Comment.java b/src/main/java/io/sparta/board/model/entity/Comment.java index dcf2930..9754e13 100644 --- a/src/main/java/io/sparta/board/model/entity/Comment.java +++ b/src/main/java/io/sparta/board/model/entity/Comment.java @@ -1,5 +1,6 @@ package io.sparta.board.model.entity; +import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -19,26 +20,29 @@ @Table(name = "p_comment") @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Comment { +public class Comment extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.UUID) @Column(name = "id", nullable = false) private UUID commentId; - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "TEXT") private String content; - @Column(nullable = false) - private boolean deleted; - @ManyToOne(fetch = FetchType.LAZY ) @JoinColumn(name = "post_id", nullable = false) private Post post; @Builder - public Comment(String content, boolean deleted) { + public Comment(String content) { this.content = content; - this.deleted = deleted; } + + public void update(UpdateCommentRequestDto requestDto) { + this.content = requestDto.getContent(); + } + + + } diff --git a/src/main/java/io/sparta/board/model/entity/Post.java b/src/main/java/io/sparta/board/model/entity/Post.java index aa0692e..5857811 100644 --- a/src/main/java/io/sparta/board/model/entity/Post.java +++ b/src/main/java/io/sparta/board/model/entity/Post.java @@ -20,7 +20,7 @@ @Entity @Table(name = "p_post") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Post { +public class Post extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.UUID) @@ -30,26 +30,23 @@ public class Post { @Column(nullable = false) private String title; - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "TEXT") private String content; - @Column(nullable = false) - private Boolean deleted; - @OneToMany(mappedBy = "post", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private List comments; @Builder - public Post(String title, String content, Boolean deleted, List comments) { + public Post(boolean deleted, String title, String content, List comments) { this.title = title; this.content = content; - this.deleted = deleted; this.comments = comments; } - public void update(UpdatePostRequestDto requestDto) { this.title = requestDto.getTitle(); this.content = requestDto.getContent(); } + + } diff --git a/src/main/java/io/sparta/board/presentation/controller/CommentController.java b/src/main/java/io/sparta/board/presentation/controller/CommentController.java index 4fa7120..9870045 100644 --- a/src/main/java/io/sparta/board/presentation/controller/CommentController.java +++ b/src/main/java/io/sparta/board/presentation/controller/CommentController.java @@ -34,4 +34,10 @@ public ResponseEntity updateComment(@PathVariable UUID commentId, @Request return ResponseEntity.ok(response); } + //댓글삭제 + public ResponseEntity deleteComment(@PathVariable UUID commentId) { + Void response = commentService.deleteComment(commentId); + return ResponseEntity.ok(response); + } + } diff --git a/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java index d231e92..53b96a5 100644 --- a/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java +++ b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java @@ -14,7 +14,6 @@ public class CommentMapper { public static Comment createCommentRequestDtoToEntity(CreateCommentRequestDto requestDto) { Comment comment = Comment.builder() .content(requestDto.getContent()) - .deleted(false) .build(); return comment; } diff --git a/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java index 3d50ea1..2ba2589 100644 --- a/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java +++ b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java @@ -22,7 +22,6 @@ public static Post createPostRequestDtotoEntity(CreatePostRequestDto requestDto) Post post = Post.builder() .title(requestDto.getTitle()) .content(requestDto.getContent()) - .deleted(false) .build(); return post; } From 5dd7982783c69f710a1b9a313d697316cd888de3 Mon Sep 17 00:00:00 2001 From: syn Date: Fri, 4 Apr 2025 09:38:47 +0900 Subject: [PATCH 09/12] =?UTF-8?q?[feat]=20BaseEntity=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/sparta/board/model/entity/BaseEntity.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/sparta/board/model/entity/BaseEntity.java b/src/main/java/io/sparta/board/model/entity/BaseEntity.java index da5b4f1..1c09735 100644 --- a/src/main/java/io/sparta/board/model/entity/BaseEntity.java +++ b/src/main/java/io/sparta/board/model/entity/BaseEntity.java @@ -6,6 +6,9 @@ import java.io.Serializable; import java.time.LocalDateTime; import lombok.Getter; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.SQLRestriction; +import org.hibernate.annotations.Where; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; @@ -24,12 +27,6 @@ public abstract class BaseEntity implements Serializable { @LastModifiedDate private LocalDateTime updatedAt; - @Column(updatable = false) - private boolean deleted; - - public void delete(boolean deleted) { - this.deleted = deleted; - } protected BaseEntity() { } } From c8701cb6d12f982ae89bf300af16decd54bae0a9 Mon Sep 17 00:00:00 2001 From: syn Date: Fri, 4 Apr 2025 09:39:18 +0900 Subject: [PATCH 10/12] =?UTF-8?q?[feat]=20=EB=8C=93=EA=B8=80=EC=83=9D?= =?UTF-8?q?=EC=84=B1/=EC=82=AD=EC=A0=9C=20=EC=9D=BC=EB=B6=80=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/controller/CommentController.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/sparta/board/presentation/controller/CommentController.java b/src/main/java/io/sparta/board/presentation/controller/CommentController.java index 9870045..9f978f7 100644 --- a/src/main/java/io/sparta/board/presentation/controller/CommentController.java +++ b/src/main/java/io/sparta/board/presentation/controller/CommentController.java @@ -7,6 +7,7 @@ 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.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -21,9 +22,9 @@ public class CommentController { private final CommentService commentService; //댓글생성 - @PostMapping - public ResponseEntity CreateComment(CreateCommentRequestDto requestDto) { - CreateCommentResponseDto responseDto = commentService.createComment(requestDto); + @PostMapping("/{postId}") + public ResponseEntity CreateComment(@PathVariable UUID postId, @RequestBody CreateCommentRequestDto requestDto) { + CreateCommentResponseDto responseDto = commentService.createComment(postId, requestDto); return ResponseEntity.ok(responseDto); } @@ -35,9 +36,12 @@ public ResponseEntity updateComment(@PathVariable UUID commentId, @Request } //댓글삭제 + @DeleteMapping("/{commentId}") public ResponseEntity deleteComment(@PathVariable UUID commentId) { Void response = commentService.deleteComment(commentId); return ResponseEntity.ok(response); } + + } From 6a518a1fb6c741c6dacbd9d90b44b09fca690596 Mon Sep 17 00:00:00 2001 From: syn Date: Fri, 4 Apr 2025 09:40:23 +0900 Subject: [PATCH 11/12] =?UTF-8?q?[feat]=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=8B=A8=EA=B1=B4=EC=A1=B0=ED=9A=8C=20commentdto=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sparta/board/presentation/dto/CommentDto.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/io/sparta/board/presentation/dto/CommentDto.java diff --git a/src/main/java/io/sparta/board/presentation/dto/CommentDto.java b/src/main/java/io/sparta/board/presentation/dto/CommentDto.java new file mode 100644 index 0000000..7995ceb --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/CommentDto.java @@ -0,0 +1,15 @@ +package io.sparta.board.presentation.dto; + +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class CommentDto { + + private UUID commentId; + private String content; + + +} From 141ec3a0dbd60dbfac90c0f0c6cbc72dcfb5e74e Mon Sep 17 00:00:00 2001 From: syn Date: Fri, 4 Apr 2025 09:41:36 +0900 Subject: [PATCH 12/12] =?UTF-8?q?[feat]=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=8B=A8=EA=B1=B4=EC=A1=B0=ED=9A=8C=20,=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=20=EC=82=AD=EC=A0=9C=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CommentService.java | 2 +- .../service/CommentServiceImpl.java | 12 ++++--- .../application/service/PostService.java | 6 ++++ .../application/service/PostServiceImpl.java | 34 ++++++++++++++++++- .../io/sparta/board/model/entity/Comment.java | 16 ++++++++- .../io/sparta/board/model/entity/Post.java | 16 ++++++++- .../model/repository/CommentRepository.java | 6 ++++ .../model/repository/PostRepository.java | 3 ++ .../controller/PostController.java | 17 ++++++++++ .../dto/response/GetPostResponseDto.java | 16 +++++++++ .../presentation/mapper/CommentMapper.java | 16 +++++---- .../board/presentation/mapper/PostMapper.java | 15 ++++++-- src/test/test.http | 24 +++++++++---- 13 files changed, 160 insertions(+), 23 deletions(-) create mode 100644 src/main/java/io/sparta/board/presentation/dto/response/GetPostResponseDto.java diff --git a/src/main/java/io/sparta/board/application/service/CommentService.java b/src/main/java/io/sparta/board/application/service/CommentService.java index 3ffedbe..4b713ea 100644 --- a/src/main/java/io/sparta/board/application/service/CommentService.java +++ b/src/main/java/io/sparta/board/application/service/CommentService.java @@ -7,7 +7,7 @@ public interface CommentService { - CreateCommentResponseDto createComment(CreateCommentRequestDto RequestDto); + CreateCommentResponseDto createComment(UUID postId, CreateCommentRequestDto RequestDto); Void updateComment(UUID commentId, UpdateCommentRequestDto RequestDto); diff --git a/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java index c2448e1..4a83415 100644 --- a/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java +++ b/src/main/java/io/sparta/board/application/service/CommentServiceImpl.java @@ -3,7 +3,9 @@ import io.sparta.board.exception.CustomException; import io.sparta.board.exception.ExceptionCode; import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.entity.Post; import io.sparta.board.model.repository.CommentRepository; +import io.sparta.board.model.repository.PostRepository; import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; import io.sparta.board.presentation.dto.request.UpdateCommentRequestDto; import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; @@ -18,11 +20,14 @@ @Transactional public class CommentServiceImpl implements CommentService { private final CommentRepository commentRepository; + private final PostRepository postRepository; @Override - public CreateCommentResponseDto createComment(CreateCommentRequestDto RequestDto) { - Comment comment = CommentMapper.createCommentRequestDtoToEntity(RequestDto); + public CreateCommentResponseDto createComment(UUID postid, CreateCommentRequestDto RequestDto) { + Post post = postRepository.findById(postid).orElseThrow(() -> new CustomException( + ExceptionCode.POST_NOT_FOUND)); + Comment comment = CommentMapper.createCommentRequestDtoToEntity(post, RequestDto); commentRepository.save(comment); return CommentMapper.entityToCreateCommentresponseDto(comment); } @@ -39,8 +44,7 @@ public Void updateComment(UUID commentId, UpdateCommentRequestDto requestDto) { public Void deleteComment(UUID commentId) { Comment comment = commentRepository.findById(commentId).orElseThrow(() -> new CustomException( ExceptionCode.COMMENT_NOT_FOUND)); - comment.delete(true); - + comment.softDelete(); return null; } } diff --git a/src/main/java/io/sparta/board/application/service/PostService.java b/src/main/java/io/sparta/board/application/service/PostService.java index 234636d..4567cd1 100644 --- a/src/main/java/io/sparta/board/application/service/PostService.java +++ b/src/main/java/io/sparta/board/application/service/PostService.java @@ -1,9 +1,12 @@ package io.sparta.board.application.service; +import io.sparta.board.model.entity.Comment; import io.sparta.board.presentation.dto.request.CreatePostRequestDto; import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.GetPostResponseDto; import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +import java.util.List; import java.util.UUID; public interface PostService { @@ -12,4 +15,7 @@ public interface PostService { UpdatePostResponseDto updatePost(UUID postId, UpdatePostRequestDto requestDto); + Void deletePost(UUID postId); + + GetPostResponseDto getPost(UUID postId); } diff --git a/src/main/java/io/sparta/board/application/service/PostServiceImpl.java b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java index 01665c0..ea384d8 100644 --- a/src/main/java/io/sparta/board/application/service/PostServiceImpl.java +++ b/src/main/java/io/sparta/board/application/service/PostServiceImpl.java @@ -2,16 +2,22 @@ import io.sparta.board.exception.CustomException; import io.sparta.board.exception.ExceptionCode; +import io.sparta.board.model.entity.Comment; import io.sparta.board.model.entity.Post; +import io.sparta.board.model.repository.CommentRepository; import io.sparta.board.model.repository.PostRepository; +import io.sparta.board.presentation.dto.CommentDto; import io.sparta.board.presentation.dto.response.CreatePostResponseDto; import io.sparta.board.presentation.dto.request.CreatePostRequestDto; import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; +import io.sparta.board.presentation.dto.response.GetPostResponseDto; import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +import io.sparta.board.presentation.mapper.CommentMapper; import io.sparta.board.presentation.mapper.PostMapper; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; -import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,6 +27,7 @@ public class PostServiceImpl implements PostService { private final PostRepository postRepository; + private final CommentRepository commentRepository; @Override public CreatePostResponseDto createPost(CreatePostRequestDto requestDto) { @@ -40,4 +47,29 @@ public UpdatePostResponseDto updatePost(UUID postId, UpdatePostRequestDto reques UpdatePostResponseDto responseDto = PostMapper.entityToUpdatePostResponseDto(post); return responseDto; } + + @Override + public Void deletePost(UUID postId) { + Post post = postRepository.findById(postId).orElseThrow(() -> new CustomException( + ExceptionCode.POST_NOT_FOUND)); + post.softDelete(); + return null; + } + + @Override + public GetPostResponseDto getPost(UUID postId) { + Post post = postRepository.findById(postId).orElseThrow(() -> new CustomException( + ExceptionCode.POST_NOT_FOUND)); + + List comments = commentRepository.findByPost(post); + + List commentDtos = new ArrayList<>(); + for (Comment comment : comments) { + CommentDto commentDto = CommentMapper.entityToCommentDto(comment); + commentDtos.add(commentDto); + } + return PostMapper.entityToGetPostResponseDto(post, commentDtos); + } + + } diff --git a/src/main/java/io/sparta/board/model/entity/Comment.java b/src/main/java/io/sparta/board/model/entity/Comment.java index 9754e13..8018f2f 100644 --- a/src/main/java/io/sparta/board/model/entity/Comment.java +++ b/src/main/java/io/sparta/board/model/entity/Comment.java @@ -15,11 +15,15 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; @Getter @Table(name = "p_comment") @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) +@Where(clause= "deleted=false") +@SQLDelete(sql = "UPDATE p_comment SET deleted=true WHERE id") public class Comment extends BaseEntity { @Id @@ -34,9 +38,13 @@ public class Comment extends BaseEntity { @JoinColumn(name = "post_id", nullable = false) private Post post; + @Column(nullable = false) + private boolean deleted; + @Builder - public Comment(String content) { + public Comment(String content, Post post) { this.content = content; + this.post = post; } public void update(UpdateCommentRequestDto requestDto) { @@ -44,5 +52,11 @@ public void update(UpdateCommentRequestDto requestDto) { } + void setDeleted(boolean deleted) { + this.deleted = deleted; + } + public void softDelete() { + this.deleted = true; + } } diff --git a/src/main/java/io/sparta/board/model/entity/Post.java b/src/main/java/io/sparta/board/model/entity/Post.java index 5857811..e777e0d 100644 --- a/src/main/java/io/sparta/board/model/entity/Post.java +++ b/src/main/java/io/sparta/board/model/entity/Post.java @@ -15,10 +15,14 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; @Getter @Entity @Table(name = "p_post") +@SQLDelete(sql = "UPDATE p_post SET deleted=true WHERE id") +@Where(clause= "deleted=false") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Post extends BaseEntity { @@ -27,7 +31,7 @@ public class Post extends BaseEntity { @Column(name = "id", nullable = false) private UUID postId; - @Column(nullable = false) + @Column(nullable = false, length = 100) private String title; @Column(nullable = false, columnDefinition = "TEXT") @@ -36,6 +40,9 @@ public class Post extends BaseEntity { @OneToMany(mappedBy = "post", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private List comments; + @Column(nullable = false) + private boolean deleted; + @Builder public Post(boolean deleted, String title, String content, List comments) { this.title = title; @@ -48,5 +55,12 @@ public void update(UpdatePostRequestDto requestDto) { this.content = requestDto.getContent(); } + public void softDelete() { + this.deleted = true; + for (Comment c : comments) { + c.setDeleted(true); + } + } + } diff --git a/src/main/java/io/sparta/board/model/repository/CommentRepository.java b/src/main/java/io/sparta/board/model/repository/CommentRepository.java index 5579633..a6fe42a 100644 --- a/src/main/java/io/sparta/board/model/repository/CommentRepository.java +++ b/src/main/java/io/sparta/board/model/repository/CommentRepository.java @@ -1,10 +1,16 @@ package io.sparta.board.model.repository; import io.sparta.board.model.entity.Comment; +import io.sparta.board.model.entity.Post; +import java.util.List; import java.util.Optional; import java.util.UUID; public interface CommentRepository { + Comment save(Comment comment); + Optional findById(UUID id); + + List findByPost(Post post); } diff --git a/src/main/java/io/sparta/board/model/repository/PostRepository.java b/src/main/java/io/sparta/board/model/repository/PostRepository.java index cbd752b..5d8b664 100644 --- a/src/main/java/io/sparta/board/model/repository/PostRepository.java +++ b/src/main/java/io/sparta/board/model/repository/PostRepository.java @@ -5,7 +5,10 @@ import java.util.UUID; public interface PostRepository { + + Post save(Post post); + Optional findById(UUID id); } diff --git a/src/main/java/io/sparta/board/presentation/controller/PostController.java b/src/main/java/io/sparta/board/presentation/controller/PostController.java index 42f9cf9..bc83a6a 100644 --- a/src/main/java/io/sparta/board/presentation/controller/PostController.java +++ b/src/main/java/io/sparta/board/presentation/controller/PostController.java @@ -4,10 +4,13 @@ import io.sparta.board.presentation.dto.request.CreatePostRequestDto; import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.GetPostResponseDto; import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; 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.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -35,4 +38,18 @@ public ResponseEntity updatePost(@PathVariable UUID postI return ResponseEntity.ok(responseDto); } + //게시글 삭제 + @DeleteMapping("/{postId}") + public ResponseEntity deletePost(@PathVariable UUID postId) { + Void response = postService.deletePost(postId); + return ResponseEntity.ok(response); + } + + //게시글 조회 + 댓글조회 + @GetMapping("/{postId}") + public ResponseEntity getPost(@PathVariable UUID postId){ + GetPostResponseDto responseDto = postService.getPost(postId); + return ResponseEntity.ok(responseDto); + } + } diff --git a/src/main/java/io/sparta/board/presentation/dto/response/GetPostResponseDto.java b/src/main/java/io/sparta/board/presentation/dto/response/GetPostResponseDto.java new file mode 100644 index 0000000..13734c9 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/dto/response/GetPostResponseDto.java @@ -0,0 +1,16 @@ +package io.sparta.board.presentation.dto.response; + +import io.sparta.board.presentation.dto.CommentDto; +import java.util.List; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class GetPostResponseDto { + private UUID postId; + private String title; + private String content; + private List comments; +} diff --git a/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java index 53b96a5..26fdc91 100644 --- a/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java +++ b/src/main/java/io/sparta/board/presentation/mapper/CommentMapper.java @@ -2,17 +2,16 @@ import io.sparta.board.model.entity.Comment; import io.sparta.board.model.entity.Post; +import io.sparta.board.presentation.dto.CommentDto; import io.sparta.board.presentation.dto.request.CreateCommentRequestDto; -import io.sparta.board.presentation.dto.request.CreatePostRequestDto; import io.sparta.board.presentation.dto.response.CreateCommentResponseDto; -import io.sparta.board.presentation.dto.response.CreatePostResponseDto; -import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; public class CommentMapper { - public static Comment createCommentRequestDtoToEntity(CreateCommentRequestDto requestDto) { + public static Comment createCommentRequestDtoToEntity(Post post, CreateCommentRequestDto requestDto) { Comment comment = Comment.builder() + .post(post) .content(requestDto.getContent()) .build(); return comment; @@ -27,6 +26,11 @@ public static CreateCommentResponseDto entityToCreateCommentresponseDto(Comment } - - + public static CommentDto entityToCommentDto(Comment comment) { + CommentDto commentDto = CommentDto.builder() + .commentId(comment.getCommentId()) + .content(comment.getContent()) + .build(); + return commentDto; + } } diff --git a/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java index 2ba2589..ecaa0d4 100644 --- a/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java +++ b/src/main/java/io/sparta/board/presentation/mapper/PostMapper.java @@ -1,10 +1,12 @@ package io.sparta.board.presentation.mapper; import io.sparta.board.model.entity.Post; +import io.sparta.board.presentation.dto.CommentDto; import io.sparta.board.presentation.dto.request.CreatePostRequestDto; -import io.sparta.board.presentation.dto.request.UpdatePostRequestDto; import io.sparta.board.presentation.dto.response.CreatePostResponseDto; +import io.sparta.board.presentation.dto.response.GetPostResponseDto; import io.sparta.board.presentation.dto.response.UpdatePostResponseDto; +import java.util.List; public class PostMapper { @@ -35,7 +37,16 @@ public static CreatePostResponseDto entityToCreatePostresponseDto(Post post) { return responseDto; } - + public static GetPostResponseDto entityToGetPostResponseDto(Post post, + List commentDtos) { + GetPostResponseDto responseDto = GetPostResponseDto.builder() + .postId(post.getPostId()) + .title(post.getTitle()) + .content(post.getContent()) + .comments(commentDtos) + .build(); + return responseDto; + } } diff --git a/src/test/test.http b/src/test/test.http index 710c32d..37561fc 100644 --- a/src/test/test.http +++ b/src/test/test.http @@ -8,7 +8,7 @@ Content-Type: application/json } ### -PATCH http://localhost:8080/api/post/bf99e99e-e826-46f5-a558-b0976f831df1 +PATCH http://localhost:8080/api/post/f8ddfd86-e3cf-412f-98f6-ae4f1c631ada Content-Type: application/json { @@ -16,21 +16,31 @@ Content-Type: application/json "content": "testtest1" } +### +DELETE http://localhost:8080/api/post/1664236b-6901-4956-b76f-7e36c7f66755 +Content-Type: + +### +GET http://localhost:8080/api/post/2ff3779e-58c0-497c-bdf6-e32f92d23c57 +Content-Type: +###----- ### -POST http://localhost:8080/api/comment +POST http://localhost:8080/api/comment/1664236b-6901-4956-b76f-7e36c7f66755 Content-Type: application/json { - "content": "testtest2" + "content": "testtest3" } ### -PATCH http://localhost:8080/api/comment/3ca5d761-e84f-4ee3-bc6b-87184133cfa4 +PATCH http://localhost:8080/api/comment/0cdbc30c-0741-4a0d-bc41-6faacdd09bbf Content-Type: application/json { - "title": "test1", - "content": "testtest1" -} \ No newline at end of file + "content": "testtesttest" +} + +### +DELETE http://localhost:8080/api/comment/8377beed-02b9-418b-b920-adda8146ab81 \ No newline at end of file