From a9b4b12a11e6f0d5ab1b6d11038bb48fb79174aa Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Tue, 1 Apr 2025 17:54:58 +0900 Subject: [PATCH 01/42] =?UTF-8?q?feat:=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 요구사항 필드 추가 - 게시글에 포함된 댓글도 조회 가능해야 하기 때문에 양방향 매핑 설정 --- .../sparta/board/domain/entity/Comment.java | 40 +++++++++++++++++ .../io/sparta/board/domain/entity/Post.java | 44 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/main/java/io/sparta/board/domain/entity/Comment.java create mode 100644 src/main/java/io/sparta/board/domain/entity/Post.java diff --git a/src/main/java/io/sparta/board/domain/entity/Comment.java b/src/main/java/io/sparta/board/domain/entity/Comment.java new file mode 100644 index 0000000..d26d78d --- /dev/null +++ b/src/main/java/io/sparta/board/domain/entity/Comment.java @@ -0,0 +1,40 @@ +package io.sparta.board.domain.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Table(name = "p_comment") +@Getter +@NoArgsConstructor +public class Comment { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "comment_id") + private UUID id; + + @Column(columnDefinition = "TEXT", nullable = false) + private String content; + + @Column(nullable = false) + private boolean deleted = false; + + @CreatedDate + @Column(name = "created_at", updatable = false, nullable = false) + private LocalDateTime createdAt; + + @LastModifiedDate + @Column(name = "updated_at", nullable = false) + private LocalDateTime updatedAt; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id") + private Post post; +} diff --git a/src/main/java/io/sparta/board/domain/entity/Post.java b/src/main/java/io/sparta/board/domain/entity/Post.java new file mode 100644 index 0000000..7640b8e --- /dev/null +++ b/src/main/java/io/sparta/board/domain/entity/Post.java @@ -0,0 +1,44 @@ +package io.sparta.board.domain.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Entity +@Table(name = "p_post") +@Getter +@NoArgsConstructor +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "post_id") + private UUID id; + + @Column(length = 100, nullable = false) + private String title; + + @Column(columnDefinition = "TEXT", nullable = false) + private String content; + + @Column(nullable = false) + private boolean deleted = false; + + @CreatedDate + @Column(name = "created_at", updatable = false, nullable = false) + private LocalDateTime createdAt; + + @LastModifiedDate + @Column(name = "updated_at", nullable = false) + private LocalDateTime updatedAt; + + @OneToMany(mappedBy = "post", cascade = CascadeType.PERSIST) + private List commentList = new ArrayList<>(); +} From cc22b0ab8778c3b6d3c4518eec8c76f73b6b915e Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Tue, 1 Apr 2025 17:59:23 +0900 Subject: [PATCH 02/42] =?UTF-8?q?chore:=20PostgreSQL=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build.gradle에 의존성 추가 - yml 설정 추가 - @EnableJpaAuditing 추가 --- build.gradle | 1 + src/main/java/io/sparta/board/BoardApplication.java | 2 ++ src/main/resources/application.yml | 10 ++++++---- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 8803149..4b568cc 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ repositories { } dependencies { + runtimeOnly 'org.postgresql:postgresql' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' diff --git a/src/main/java/io/sparta/board/BoardApplication.java b/src/main/java/io/sparta/board/BoardApplication.java index 2b72c52..66a156a 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 { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 856d19e..89eea72 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -3,12 +3,14 @@ spring: name: board datasource: - hikari.jdbc-url: jdbc:h2:mem:test_db; - username: sa - password: + url: jdbc:postgresql://localhost:5432/board + driver-class-name: org.postgresql.Driver + username: postgres + password: hello12 jpa: - hibernate.ddl-auto: create + hibernate: + ddl-auto: create show-sql: true properties: hibernate: From f6e35f5cf9f2e437246d7b50d21183229d2a797f Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Tue, 1 Apr 2025 21:02:48 +0900 Subject: [PATCH 03/42] =?UTF-8?q?feat:=20post=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=EC=97=90=20builder,=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - jpa auditing 어노테이션 추가 --- .../io/sparta/board/domain/entity/Post.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/io/sparta/board/domain/entity/Post.java b/src/main/java/io/sparta/board/domain/entity/Post.java index 7640b8e..87b9c27 100644 --- a/src/main/java/io/sparta/board/domain/entity/Post.java +++ b/src/main/java/io/sparta/board/domain/entity/Post.java @@ -1,10 +1,12 @@ package io.sparta.board.domain.entity; import jakarta.persistence.*; +import lombok.Builder; 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; import java.time.LocalDateTime; import java.util.ArrayList; @@ -12,6 +14,7 @@ import java.util.UUID; @Entity +@EntityListeners(AuditingEntityListener.class) @Table(name = "p_post") @Getter @NoArgsConstructor @@ -41,4 +44,18 @@ public class Post { @OneToMany(mappedBy = "post", cascade = CascadeType.PERSIST) private List commentList = new ArrayList<>(); + + @Builder + public Post(String title, String content) { + this.title = title; + this.content = content; + } + + public static Post create(String title, String content) { + Post post = Post.builder() + .title(title) + .content(content) + .build(); + return post; + } } From d88a923e2c1e1446915f6d704d33ccc7c2652cc2 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Tue, 1 Apr 2025 21:05:59 +0900 Subject: [PATCH 04/42] =?UTF-8?q?feat:=20dto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - responseDto : 응답 dto 필드값 설정 (id, title, content) - requestDto : 요청 dto 필드값 설정, entity 변환 메서드 추가 --- .../dto/request/PostCreateRequestDto.java | 24 +++++++++++++++++++ .../dto/response/PostCreateResponseDto.java | 18 ++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/dto/request/PostCreateRequestDto.java create mode 100644 src/main/java/io/sparta/board/application/dto/response/PostCreateResponseDto.java diff --git a/src/main/java/io/sparta/board/application/dto/request/PostCreateRequestDto.java b/src/main/java/io/sparta/board/application/dto/request/PostCreateRequestDto.java new file mode 100644 index 0000000..4cfffe3 --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/request/PostCreateRequestDto.java @@ -0,0 +1,24 @@ +package io.sparta.board.application.dto.request; + +import io.sparta.board.domain.entity.Post; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PostCreateRequestDto { + private String title; + private String content; + + public Post toEntity() { + return Post.create( + title, + content + ); + } + +} diff --git a/src/main/java/io/sparta/board/application/dto/response/PostCreateResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/PostCreateResponseDto.java new file mode 100644 index 0000000..83557e1 --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/response/PostCreateResponseDto.java @@ -0,0 +1,18 @@ +package io.sparta.board.application.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PostCreateResponseDto { + private UUID id; + private String title; + private String content; +} From c088e700fe00a18e74f42f9bcc73184e46c69e97 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Tue, 1 Apr 2025 21:07:46 +0900 Subject: [PATCH 05/42] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=ED=8C=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 요청값을 엔티티로 변환 후 DB 저장 - 매퍼파일에서 다시 dto로 변환 후 반환 --- .../application/dto/mapper/PostMapper.java | 15 +++++++++++ .../application/service/PostService.java | 26 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java create mode 100644 src/main/java/io/sparta/board/application/service/PostService.java diff --git a/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java new file mode 100644 index 0000000..632294e --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java @@ -0,0 +1,15 @@ +package io.sparta.board.application.dto.mapper; + +import io.sparta.board.application.dto.response.PostCreateResponseDto; +import io.sparta.board.domain.entity.Post; + +public class PostMapper { + + public static PostCreateResponseDto toPostCreateResponseDto(Post post) { + return PostCreateResponseDto.builder() + .id(post.getId()) + .title(post.getTitle()) + .content(post.getContent()) + .build(); + } +} 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..6d8369c --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/PostService.java @@ -0,0 +1,26 @@ +package io.sparta.board.application.service; + +import io.sparta.board.application.dto.mapper.PostMapper; +import io.sparta.board.application.dto.request.PostCreateRequestDto; +import io.sparta.board.application.dto.response.PostCreateResponseDto; +import io.sparta.board.domain.entity.Post; +import io.sparta.board.domain.repository.PostRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class PostService { + + private final PostRepository postRepository; + + @Transactional + public PostCreateResponseDto createPost(PostCreateRequestDto request){ + Post post = request.toEntity(); + Post savedPost = postRepository.save(post); + PostCreateResponseDto response = PostMapper.toPostCreateResponseDto(savedPost); + + return response; + } +} From 06665caf68363ae6bc15340b543ad6d031d6d556 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Tue, 1 Apr 2025 21:11:23 +0900 Subject: [PATCH 06/42] =?UTF-8?q?feat:=20repository=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PostJpaRepository, PostRepository, PostRepositoryImpl를 분리해서 4계층 아키텍쳐에 맞게 분리 --- .../domain/repository/PostRepository.java | 8 ++++++++ .../repository/PostJpaRepository.java | 10 ++++++++++ .../repository/PostRepositoryImpl.java | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 src/main/java/io/sparta/board/domain/repository/PostRepository.java create mode 100644 src/main/java/io/sparta/board/infrastructure/repository/PostJpaRepository.java create mode 100644 src/main/java/io/sparta/board/infrastructure/repository/PostRepositoryImpl.java diff --git a/src/main/java/io/sparta/board/domain/repository/PostRepository.java b/src/main/java/io/sparta/board/domain/repository/PostRepository.java new file mode 100644 index 0000000..03f0d05 --- /dev/null +++ b/src/main/java/io/sparta/board/domain/repository/PostRepository.java @@ -0,0 +1,8 @@ +package io.sparta.board.domain.repository; + +import io.sparta.board.domain.entity.Post; + +public interface PostRepository { + + Post save(Post post); +} diff --git a/src/main/java/io/sparta/board/infrastructure/repository/PostJpaRepository.java b/src/main/java/io/sparta/board/infrastructure/repository/PostJpaRepository.java new file mode 100644 index 0000000..1f5608b --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/repository/PostJpaRepository.java @@ -0,0 +1,10 @@ +package io.sparta.board.infrastructure.repository; + +import io.sparta.board.domain.entity.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface PostJpaRepository extends JpaRepository { + +} diff --git a/src/main/java/io/sparta/board/infrastructure/repository/PostRepositoryImpl.java b/src/main/java/io/sparta/board/infrastructure/repository/PostRepositoryImpl.java new file mode 100644 index 0000000..cc895cf --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/repository/PostRepositoryImpl.java @@ -0,0 +1,18 @@ +package io.sparta.board.infrastructure.repository; + +import io.sparta.board.domain.entity.Post; +import io.sparta.board.domain.repository.PostRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class PostRepositoryImpl implements PostRepository { + + private final PostJpaRepository postJpaRepository; + + @Override + public Post save(Post post) { + return postJpaRepository.save(post); + } +} From 30d7d36016fc07a692d84a86e73ca590b9074cb2 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Tue, 1 Apr 2025 21:13:06 +0900 Subject: [PATCH 07/42] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - controller에 엔트포인트 추가 --- .../board/presentation/PostController.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/io/sparta/board/presentation/PostController.java diff --git a/src/main/java/io/sparta/board/presentation/PostController.java b/src/main/java/io/sparta/board/presentation/PostController.java new file mode 100644 index 0000000..3c26dc2 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/PostController.java @@ -0,0 +1,26 @@ +package io.sparta.board.presentation; + +import io.sparta.board.application.dto.request.PostCreateRequestDto; +import io.sparta.board.application.dto.response.PostCreateResponseDto; +import io.sparta.board.application.service.PostService; +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 +@RequiredArgsConstructor +@RequestMapping("/api/boards") +public class PostController { + + private final PostService postService; + + @PostMapping + public ResponseEntity createPost( + @RequestBody PostCreateRequestDto request) { + PostCreateResponseDto response = postService.createPost(request); + return ResponseEntity.ok(response); + } +} From 2ff4c8ac372f72dd6baa44a01a092c741039aea8 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Tue, 1 Apr 2025 21:13:52 +0900 Subject: [PATCH 08/42] =?UTF-8?q?test:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20api=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - http client test 완료 --- src/test/resources/test/CreatePostClient.http | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/test/resources/test/CreatePostClient.http diff --git a/src/test/resources/test/CreatePostClient.http b/src/test/resources/test/CreatePostClient.http new file mode 100644 index 0000000..4adb49b --- /dev/null +++ b/src/test/resources/test/CreatePostClient.http @@ -0,0 +1,11 @@ +### 1. 게시물 생성 +POST http://localhost:8080/api/boards +Authorization: Bearer jwt_token_string +Content-Type: application/json + +{ + "title": "게시물 제목입니다.", + "content": "게시물 내용입니다." +} + +### \ No newline at end of file From a70aa1f4db27755e9efaca71cb5f41a5d989ddfe Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Tue, 1 Apr 2025 23:58:08 +0900 Subject: [PATCH 09/42] =?UTF-8?q?feat:=20comment=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=EC=97=90=20builder,=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - jpa auditing 어노테이션 추가 --- .../io/sparta/board/domain/entity/Comment.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/io/sparta/board/domain/entity/Comment.java b/src/main/java/io/sparta/board/domain/entity/Comment.java index d26d78d..9887242 100644 --- a/src/main/java/io/sparta/board/domain/entity/Comment.java +++ b/src/main/java/io/sparta/board/domain/entity/Comment.java @@ -1,15 +1,18 @@ package io.sparta.board.domain.entity; import jakarta.persistence.*; +import lombok.Builder; 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; import java.time.LocalDateTime; import java.util.UUID; @Entity +@EntityListeners(AuditingEntityListener.class) @Table(name = "p_comment") @Getter @NoArgsConstructor @@ -37,4 +40,17 @@ public class Comment { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id") private Post post; + + @Builder + public Comment(String content, Post post){ + this.content = content; + this.post = post; + } + + public static Comment create(String content, Post post) { + return Comment.builder() + .content(content) + .post(post) + .build(); + } } From 92034305db5cf401724ad18e651545ba84304727 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:05:31 +0900 Subject: [PATCH 10/42] =?UTF-8?q?feat:=20dto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - responseDto : 응답 dto 필드값 설정 - requestDto : 요청 필드값 설정 및 엔티티로 변환 메서드 추가 --- .../dto/request/CommentCreateRequestDto.java | 20 +++++++++++++++++++ .../response/CommentCreateResponseDto.java | 18 +++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/dto/request/CommentCreateRequestDto.java create mode 100644 src/main/java/io/sparta/board/application/dto/response/CommentCreateResponseDto.java diff --git a/src/main/java/io/sparta/board/application/dto/request/CommentCreateRequestDto.java b/src/main/java/io/sparta/board/application/dto/request/CommentCreateRequestDto.java new file mode 100644 index 0000000..76de54b --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/request/CommentCreateRequestDto.java @@ -0,0 +1,20 @@ +package io.sparta.board.application.dto.request; + +import io.sparta.board.domain.entity.Comment; +import io.sparta.board.domain.entity.Post; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CommentCreateRequestDto { + private String content; + + public Comment toEntity(Post post) { + return Comment.create(content, post); + } +} diff --git a/src/main/java/io/sparta/board/application/dto/response/CommentCreateResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/CommentCreateResponseDto.java new file mode 100644 index 0000000..73c29ac --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/response/CommentCreateResponseDto.java @@ -0,0 +1,18 @@ +package io.sparta.board.application.dto.response; + +import io.sparta.board.domain.entity.Post; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CommentCreateResponseDto { + private UUID id; + private String content; +} From 0096693afe9c5116af5d43cca5ceb4718cb911c2 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:08:54 +0900 Subject: [PATCH 11/42] =?UTF-8?q?feat:=20=EB=8C=93=EA=B8=80=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - post의 아이디를 받아와서 db에서 찾은 뒤, comment의 요청dto를 엔티티로 변환하는 과정에 넘겨줌 - comment의 db에 저장 (post의 id값 포함) --- .../application/service/CommentService.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/service/CommentService.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..196df55 --- /dev/null +++ b/src/main/java/io/sparta/board/application/service/CommentService.java @@ -0,0 +1,34 @@ +package io.sparta.board.application.service; + +import io.sparta.board.application.dto.mapper.CommentMapper; +import io.sparta.board.application.dto.request.CommentCreateRequestDto; +import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.domain.entity.Comment; +import io.sparta.board.domain.entity.Post; +import io.sparta.board.domain.repository.CommentRepository; +import io.sparta.board.domain.repository.PostRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class CommentService { + + private final PostRepository postRepository; + private final CommentRepository commentRepository; + + @Transactional + public CommentCreateResponseDto createComment(UUID id, CommentCreateRequestDto request){ + Post post = postRepository.findByPostId(id); + + Comment comment = request.toEntity(post); + Comment savedComment = commentRepository.save(comment); + + CommentCreateResponseDto response = CommentMapper.toCommentCreateResponseDto(savedComment); + + return response; + } +} From 025a6abfcf6c6a27bcdcdd802be6cd4a3711fba4 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:09:52 +0900 Subject: [PATCH 12/42] =?UTF-8?q?feat:=20comment=20-=20repository=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 4계층 아키텍쳐에 맞게 분리 --- .../domain/repository/CommentRepository.java | 8 ++++++++ .../repository/CommentRepositoryImpl.java | 17 +++++++++++++++++ .../repository/jpa/CommentJpaRepository.java | 9 +++++++++ 3 files changed, 34 insertions(+) create mode 100644 src/main/java/io/sparta/board/domain/repository/CommentRepository.java create mode 100644 src/main/java/io/sparta/board/infrastructure/repository/CommentRepositoryImpl.java create mode 100644 src/main/java/io/sparta/board/infrastructure/repository/jpa/CommentJpaRepository.java diff --git a/src/main/java/io/sparta/board/domain/repository/CommentRepository.java b/src/main/java/io/sparta/board/domain/repository/CommentRepository.java new file mode 100644 index 0000000..e6b3d73 --- /dev/null +++ b/src/main/java/io/sparta/board/domain/repository/CommentRepository.java @@ -0,0 +1,8 @@ +package io.sparta.board.domain.repository; + +import io.sparta.board.domain.entity.Comment; + +public interface CommentRepository { + + Comment save(Comment comment); +} diff --git a/src/main/java/io/sparta/board/infrastructure/repository/CommentRepositoryImpl.java b/src/main/java/io/sparta/board/infrastructure/repository/CommentRepositoryImpl.java new file mode 100644 index 0000000..7f88f2e --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/repository/CommentRepositoryImpl.java @@ -0,0 +1,17 @@ +package io.sparta.board.infrastructure.repository; + +import io.sparta.board.domain.entity.Comment; +import io.sparta.board.domain.repository.CommentRepository; +import io.sparta.board.infrastructure.repository.jpa.CommentJpaRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class CommentRepositoryImpl implements CommentRepository { + + private final CommentJpaRepository commentJpaRepository; + + @Override + public Comment save(Comment comment) {return commentJpaRepository.save(comment);} +} diff --git a/src/main/java/io/sparta/board/infrastructure/repository/jpa/CommentJpaRepository.java b/src/main/java/io/sparta/board/infrastructure/repository/jpa/CommentJpaRepository.java new file mode 100644 index 0000000..ba74ec1 --- /dev/null +++ b/src/main/java/io/sparta/board/infrastructure/repository/jpa/CommentJpaRepository.java @@ -0,0 +1,9 @@ +package io.sparta.board.infrastructure.repository.jpa; + +import io.sparta.board.domain.entity.Comment; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface CommentJpaRepository extends JpaRepository { +} From 314b6f83df9a6e880b83860d12f7f7e87cbfd908 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:11:42 +0900 Subject: [PATCH 13/42] =?UTF-8?q?feat:=20comment=20-=20dto=20=EB=B3=80?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 엔티티를 dto로 변환 후 반환 --- .../application/dto/mapper/CommentMapper.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java diff --git a/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java b/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java new file mode 100644 index 0000000..4fbaa87 --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java @@ -0,0 +1,14 @@ +package io.sparta.board.application.dto.mapper; + +import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.domain.entity.Comment; + +public class CommentMapper { + + public static CommentCreateResponseDto toCommentCreateResponseDto(Comment comment){ + return CommentCreateResponseDto.builder() + .id(comment.getId()) + .content(comment.getContent()) + .build(); + } +} From 20deaa69c6662d6644293b08806849a914d651d7 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:12:20 +0900 Subject: [PATCH 14/42] =?UTF-8?q?feat:=20comment=20=EC=83=9D=EC=84=B1=20ap?= =?UTF-8?q?i=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - comment 엔트포인트 추가 --- .../board/presentation/CommentController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/io/sparta/board/presentation/CommentController.java diff --git a/src/main/java/io/sparta/board/presentation/CommentController.java b/src/main/java/io/sparta/board/presentation/CommentController.java new file mode 100644 index 0000000..7878ee1 --- /dev/null +++ b/src/main/java/io/sparta/board/presentation/CommentController.java @@ -0,0 +1,27 @@ +package io.sparta.board.presentation; + +import io.sparta.board.application.dto.request.CommentCreateRequestDto; +import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.service.CommentService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/comments") +public class CommentController { + + private final CommentService commentService; + + @PostMapping("/boards/{id}/comments") + public ResponseEntity createComment( + @PathVariable UUID id, + @RequestBody CommentCreateRequestDto request){ + + CommentCreateResponseDto response = commentService.createComment(id, request); + return ResponseEntity.ok(response); + } +} From ea05a66a14e829002551ba6b9913f9992a2821e8 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:12:57 +0900 Subject: [PATCH 15/42] =?UTF-8?q?test:=20comment=20=EC=83=9D=EC=84=B1=20ap?= =?UTF-8?q?i=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - http client test 완료 --- src/test/resources/test/CreateCommentClient.http | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/test/resources/test/CreateCommentClient.http diff --git a/src/test/resources/test/CreateCommentClient.http b/src/test/resources/test/CreateCommentClient.http new file mode 100644 index 0000000..04b35fd --- /dev/null +++ b/src/test/resources/test/CreateCommentClient.http @@ -0,0 +1,10 @@ +### 1. 댓글 생성 +POST http://localhost:8080/api/comments/boards/4b1da82c-f2e5-4778-8be7-4533d5c6390a/comments +Authorization: Bearer jwt_token_string +Content-Type: application/json + +{ + "content": "댓글입니다3" +} + +### \ No newline at end of file From de1471d4b6dc6e8f84f7b89a063a8d03519d2e9b Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:15:16 +0900 Subject: [PATCH 16/42] =?UTF-8?q?feat:=20comment=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20db=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - findByPostId를 하여 comment 생성에 값 추가 --- .../io/sparta/board/domain/repository/PostRepository.java | 4 ++++ .../board/infrastructure/repository/PostRepositoryImpl.java | 6 ++++++ .../repository/{ => jpa}/PostJpaRepository.java | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) rename src/main/java/io/sparta/board/infrastructure/repository/{ => jpa}/PostJpaRepository.java (78%) diff --git a/src/main/java/io/sparta/board/domain/repository/PostRepository.java b/src/main/java/io/sparta/board/domain/repository/PostRepository.java index 03f0d05..bf87a13 100644 --- a/src/main/java/io/sparta/board/domain/repository/PostRepository.java +++ b/src/main/java/io/sparta/board/domain/repository/PostRepository.java @@ -2,7 +2,11 @@ import io.sparta.board.domain.entity.Post; +import java.util.UUID; + public interface PostRepository { Post save(Post post); + + Post findByPostId(UUID id); } diff --git a/src/main/java/io/sparta/board/infrastructure/repository/PostRepositoryImpl.java b/src/main/java/io/sparta/board/infrastructure/repository/PostRepositoryImpl.java index cc895cf..7ef422d 100644 --- a/src/main/java/io/sparta/board/infrastructure/repository/PostRepositoryImpl.java +++ b/src/main/java/io/sparta/board/infrastructure/repository/PostRepositoryImpl.java @@ -2,9 +2,12 @@ import io.sparta.board.domain.entity.Post; import io.sparta.board.domain.repository.PostRepository; +import io.sparta.board.infrastructure.repository.jpa.PostJpaRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.UUID; + @Repository @RequiredArgsConstructor public class PostRepositoryImpl implements PostRepository { @@ -15,4 +18,7 @@ public class PostRepositoryImpl implements PostRepository { public Post save(Post post) { return postJpaRepository.save(post); } + + @Override + public Post findByPostId(UUID id){return postJpaRepository.findById(id).orElse(null);} } diff --git a/src/main/java/io/sparta/board/infrastructure/repository/PostJpaRepository.java b/src/main/java/io/sparta/board/infrastructure/repository/jpa/PostJpaRepository.java similarity index 78% rename from src/main/java/io/sparta/board/infrastructure/repository/PostJpaRepository.java rename to src/main/java/io/sparta/board/infrastructure/repository/jpa/PostJpaRepository.java index 1f5608b..5d58cd4 100644 --- a/src/main/java/io/sparta/board/infrastructure/repository/PostJpaRepository.java +++ b/src/main/java/io/sparta/board/infrastructure/repository/jpa/PostJpaRepository.java @@ -1,4 +1,4 @@ -package io.sparta.board.infrastructure.repository; +package io.sparta.board.infrastructure.repository.jpa; import io.sparta.board.domain.entity.Post; import org.springframework.data.jpa.repository.JpaRepository; From a7aeab35bbb9ce5e012221d72dede0dc204a222b Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:42:34 +0900 Subject: [PATCH 17/42] =?UTF-8?q?feat:=20Post=20=EB=8B=A8=EA=B1=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 게시글 조회 엔드포인트 추가 --- .../board/presentation/PostController.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/sparta/board/presentation/PostController.java b/src/main/java/io/sparta/board/presentation/PostController.java index 3c26dc2..9988e70 100644 --- a/src/main/java/io/sparta/board/presentation/PostController.java +++ b/src/main/java/io/sparta/board/presentation/PostController.java @@ -2,13 +2,13 @@ import io.sparta.board.application.dto.request.PostCreateRequestDto; import io.sparta.board.application.dto.response.PostCreateResponseDto; +import io.sparta.board.application.dto.response.PostGetResponseDto; import io.sparta.board.application.service.PostService; 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; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; @RestController @RequiredArgsConstructor @@ -23,4 +23,12 @@ public ResponseEntity createPost( PostCreateResponseDto response = postService.createPost(request); return ResponseEntity.ok(response); } + + @GetMapping("/{id}") + public ResponseEntity GetPost( + @PathVariable UUID id){ + + PostGetResponseDto response = postService.getDetailPost(id); + return ResponseEntity.ok(response); + } } From ee161aa885cae14d6b6bbbb123846832e849b9e0 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:45:29 +0900 Subject: [PATCH 18/42] =?UTF-8?q?feat:=20dto=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A7=A4=ED=95=91=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 응답 dto 필드 (id, title, content, createdAt, commentList) - PostMapper : dto로 변환 메서드 추가 - 엔티티를 응답 dto로 변환 - commentList도 dto로 응답 (엔티티가 노출되면 안됨) - commentResponse도 dto로 변환 --- .../application/dto/mapper/PostMapper.java | 30 +++++++++++++++++++ .../dto/response/CommentResponseDto.java | 19 ++++++++++++ .../dto/response/PostGetResponseDto.java | 23 ++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/dto/response/CommentResponseDto.java create mode 100644 src/main/java/io/sparta/board/application/dto/response/PostGetResponseDto.java diff --git a/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java index 632294e..6c4f88d 100644 --- a/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java +++ b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java @@ -1,8 +1,14 @@ package io.sparta.board.application.dto.mapper; +import io.sparta.board.application.dto.response.CommentResponseDto; import io.sparta.board.application.dto.response.PostCreateResponseDto; +import io.sparta.board.application.dto.response.PostGetResponseDto; +import io.sparta.board.domain.entity.Comment; import io.sparta.board.domain.entity.Post; +import java.util.List; +import java.util.stream.Collectors; + public class PostMapper { public static PostCreateResponseDto toPostCreateResponseDto(Post post) { @@ -12,4 +18,28 @@ public static PostCreateResponseDto toPostCreateResponseDto(Post post) { .content(post.getContent()) .build(); } + + public static PostGetResponseDto toPostGetResponseDto(Post post) { + return PostGetResponseDto.builder() + .id(post.getId()) + .title(post.getTitle()) + .content(post.getContent()) + .createdAt(post.getCreatedAt()) + .commentList(toCommentResponseList(post.getCommentList())) + .build(); + } + + private static List toCommentResponseList(List commentList) { + return commentList.stream() + .map(PostMapper::toCommentResponse) + .collect(Collectors.toList()); + } + + private static CommentResponseDto toCommentResponse(Comment comment) { + return CommentResponseDto.builder() + .id(comment.getId()) + .content(comment.getContent()) + .createdAt(comment.getCreatedAt()) + .build(); + } } diff --git a/src/main/java/io/sparta/board/application/dto/response/CommentResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/CommentResponseDto.java new file mode 100644 index 0000000..50d2e41 --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/response/CommentResponseDto.java @@ -0,0 +1,19 @@ +package io.sparta.board.application.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CommentResponseDto { + private UUID id; + private String content; + private LocalDateTime createdAt; +} diff --git a/src/main/java/io/sparta/board/application/dto/response/PostGetResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/PostGetResponseDto.java new file mode 100644 index 0000000..e8348e1 --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/response/PostGetResponseDto.java @@ -0,0 +1,23 @@ +package io.sparta.board.application.dto.response; + +import io.sparta.board.domain.entity.Comment; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PostGetResponseDto { + private UUID id; + private String title; + private String content; + private LocalDateTime createdAt; + private List commentList; +} From 0eb1897b75fd094a759b25c0480491a88a979995 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:46:26 +0900 Subject: [PATCH 19/42] =?UTF-8?q?feat:=20post=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 삭제된 게시글은 조회 불가 > 예외처리 --- .../board/application/service/PostService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 6d8369c..a3d7122 100644 --- a/src/main/java/io/sparta/board/application/service/PostService.java +++ b/src/main/java/io/sparta/board/application/service/PostService.java @@ -3,12 +3,15 @@ import io.sparta.board.application.dto.mapper.PostMapper; import io.sparta.board.application.dto.request.PostCreateRequestDto; import io.sparta.board.application.dto.response.PostCreateResponseDto; +import io.sparta.board.application.dto.response.PostGetResponseDto; import io.sparta.board.domain.entity.Post; import io.sparta.board.domain.repository.PostRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; + @Service @RequiredArgsConstructor public class PostService { @@ -23,4 +26,16 @@ public PostCreateResponseDto createPost(PostCreateRequestDto request){ return response; } + + @Transactional(readOnly = true) + public PostGetResponseDto getDetailPost(UUID id){ + + Post post = postRepository.findByPostId(id); + + if(post.isDeleted()){ + throw new IllegalArgumentException("삭제된 게시글입니다."); + } + + return PostMapper.toPostGetResponseDto(post); + } } From 0f1fdf854809aacd4af9510a35762de5e805f8d7 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 00:46:59 +0900 Subject: [PATCH 20/42] =?UTF-8?q?test:=20post=20=EC=A1=B0=ED=9A=8C=20api?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - http client test 완료 --- src/test/resources/test/CreatePostClient.http | 11 ----------- src/test/resources/test/PostClient.http | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 11 deletions(-) delete mode 100644 src/test/resources/test/CreatePostClient.http create mode 100644 src/test/resources/test/PostClient.http diff --git a/src/test/resources/test/CreatePostClient.http b/src/test/resources/test/CreatePostClient.http deleted file mode 100644 index 4adb49b..0000000 --- a/src/test/resources/test/CreatePostClient.http +++ /dev/null @@ -1,11 +0,0 @@ -### 1. 게시물 생성 -POST http://localhost:8080/api/boards -Authorization: Bearer jwt_token_string -Content-Type: application/json - -{ - "title": "게시물 제목입니다.", - "content": "게시물 내용입니다." -} - -### \ No newline at end of file diff --git a/src/test/resources/test/PostClient.http b/src/test/resources/test/PostClient.http new file mode 100644 index 0000000..cbe1d79 --- /dev/null +++ b/src/test/resources/test/PostClient.http @@ -0,0 +1,14 @@ +### 1. 게시물 생성 +POST http://localhost:8080/api/boards +Authorization: Bearer jwt_token_string +Content-Type: application/json + +{ + "title": "게시물 제목입니다2.", + "content": "게시물 내용입니다2." +} + +### 2. 게시물 단건 조회 +GET http://localhost:8080/api/boards/4b1da82c-f2e5-4778-8be7-4533d5c6390a +Authorization: Bearer jwt_token_string +Content-Type: application/json \ No newline at end of file From da07e0f3f1c8d895544493245c257b3908fc5088 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 01:27:26 +0900 Subject: [PATCH 21/42] =?UTF-8?q?feat:=20post=20=EC=88=98=EC=A0=95=20api?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 게시물 수정 엔드포인트 추가 --- .../io/sparta/board/presentation/PostController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/io/sparta/board/presentation/PostController.java b/src/main/java/io/sparta/board/presentation/PostController.java index 9988e70..fce3593 100644 --- a/src/main/java/io/sparta/board/presentation/PostController.java +++ b/src/main/java/io/sparta/board/presentation/PostController.java @@ -3,6 +3,8 @@ import io.sparta.board.application.dto.request.PostCreateRequestDto; import io.sparta.board.application.dto.response.PostCreateResponseDto; import io.sparta.board.application.dto.response.PostGetResponseDto; +import io.sparta.board.application.dto.response.comment.PostUpdateRequestDto; +import io.sparta.board.application.dto.response.post.PostUpdateResponseDto; import io.sparta.board.application.service.PostService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -31,4 +33,12 @@ public ResponseEntity GetPost( PostGetResponseDto response = postService.getDetailPost(id); return ResponseEntity.ok(response); } + + @PutMapping("/{id}/update") + public ResponseEntity updatePost( + @PathVariable UUID id, + @RequestBody PostUpdateRequestDto request){ + PostUpdateResponseDto response = postService.updatePost(id, request); + return ResponseEntity.ok(response); + } } From 760c8565cc5cb749cc26605acf19eb661209c455 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 01:32:34 +0900 Subject: [PATCH 22/42] =?UTF-8?q?feat:=20post=20=EC=88=98=EC=A0=95=20-=20?= =?UTF-8?q?=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - post 엔티티 내 update 메서드 추가 - 삭제된 게시글 수정 불가 예외처리 - jpa 더티체킹으로 인해 자동으로 수정사항이 업데이트됨 --- .../board/application/service/PostService.java | 16 +++++++++++++++- .../java/io/sparta/board/domain/entity/Post.java | 5 +++++ 2 files changed, 20 insertions(+), 1 deletion(-) 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 a3d7122..4d8e96b 100644 --- a/src/main/java/io/sparta/board/application/service/PostService.java +++ b/src/main/java/io/sparta/board/application/service/PostService.java @@ -4,6 +4,8 @@ import io.sparta.board.application.dto.request.PostCreateRequestDto; import io.sparta.board.application.dto.response.PostCreateResponseDto; import io.sparta.board.application.dto.response.PostGetResponseDto; +import io.sparta.board.application.dto.response.comment.PostUpdateRequestDto; +import io.sparta.board.application.dto.response.post.PostUpdateResponseDto; import io.sparta.board.domain.entity.Post; import io.sparta.board.domain.repository.PostRepository; import lombok.RequiredArgsConstructor; @@ -29,7 +31,6 @@ public PostCreateResponseDto createPost(PostCreateRequestDto request){ @Transactional(readOnly = true) public PostGetResponseDto getDetailPost(UUID id){ - Post post = postRepository.findByPostId(id); if(post.isDeleted()){ @@ -38,4 +39,17 @@ public PostGetResponseDto getDetailPost(UUID id){ return PostMapper.toPostGetResponseDto(post); } + + @Transactional + public PostUpdateResponseDto updatePost(UUID id, PostUpdateRequestDto request){ + Post post = postRepository.findByPostId(id); + + if(post.isDeleted()){ + throw new IllegalArgumentException("삭제된 게시글 입니다."); + } + + post.update(request.getTitle(), request.getContent()); + + return PostMapper.toPostUpdateResponseDto(post); + } } diff --git a/src/main/java/io/sparta/board/domain/entity/Post.java b/src/main/java/io/sparta/board/domain/entity/Post.java index 87b9c27..c3aeaaf 100644 --- a/src/main/java/io/sparta/board/domain/entity/Post.java +++ b/src/main/java/io/sparta/board/domain/entity/Post.java @@ -58,4 +58,9 @@ public static Post create(String title, String content) { .build(); return post; } + + public void update(String title, String content) { + this.title = title; + this.content = content; + } } From 746b3f0b42ffb5467106954a4d5b7ebb6566a562 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 01:33:33 +0900 Subject: [PATCH 23/42] =?UTF-8?q?feat:=20post=20=EC=88=98=EC=A0=95=20-=20d?= =?UTF-8?q?to=20=EB=B0=8F=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 응답, 요청 dto 필드 : title, content - PostMapper : 엔티티를 dto로 변환 --- .../application/dto/mapper/PostMapper.java | 8 ++++++++ .../response/comment/PostUpdateRequestDto.java | 17 +++++++++++++++++ .../response/post/PostUpdateResponseDto.java | 15 +++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/dto/response/comment/PostUpdateRequestDto.java create mode 100644 src/main/java/io/sparta/board/application/dto/response/post/PostUpdateResponseDto.java diff --git a/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java index 6c4f88d..2d0e732 100644 --- a/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java +++ b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java @@ -3,6 +3,7 @@ import io.sparta.board.application.dto.response.CommentResponseDto; import io.sparta.board.application.dto.response.PostCreateResponseDto; import io.sparta.board.application.dto.response.PostGetResponseDto; +import io.sparta.board.application.dto.response.post.PostUpdateResponseDto; import io.sparta.board.domain.entity.Comment; import io.sparta.board.domain.entity.Post; @@ -42,4 +43,11 @@ private static CommentResponseDto toCommentResponse(Comment comment) { .createdAt(comment.getCreatedAt()) .build(); } + + public static PostUpdateResponseDto toPostUpdateResponseDto(Post post) { + return PostUpdateResponseDto.builder() + .title(post.getTitle()) + .content(post.getContent()) + .build(); + } } diff --git a/src/main/java/io/sparta/board/application/dto/response/comment/PostUpdateRequestDto.java b/src/main/java/io/sparta/board/application/dto/response/comment/PostUpdateRequestDto.java new file mode 100644 index 0000000..a06a6fc --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/response/comment/PostUpdateRequestDto.java @@ -0,0 +1,17 @@ +package io.sparta.board.application.dto.response.comment; + +import io.sparta.board.domain.entity.Post; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PostUpdateRequestDto { + private String title; + private String content; + +} diff --git a/src/main/java/io/sparta/board/application/dto/response/post/PostUpdateResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/post/PostUpdateResponseDto.java new file mode 100644 index 0000000..10fa347 --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/response/post/PostUpdateResponseDto.java @@ -0,0 +1,15 @@ +package io.sparta.board.application.dto.response.post; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PostUpdateResponseDto { + private String title; + private String content; +} From 959f6016371c57a8c2bc62eaa177c758c927bb07 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 01:36:03 +0900 Subject: [PATCH 24/42] =?UTF-8?q?test:=20post=20=EC=88=98=EC=A0=95=20api?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - http client test --- src/test/resources/test/PostClient.http | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/test/resources/test/PostClient.http b/src/test/resources/test/PostClient.http index cbe1d79..505208d 100644 --- a/src/test/resources/test/PostClient.http +++ b/src/test/resources/test/PostClient.http @@ -11,4 +11,14 @@ Content-Type: application/json ### 2. 게시물 단건 조회 GET http://localhost:8080/api/boards/4b1da82c-f2e5-4778-8be7-4533d5c6390a Authorization: Bearer jwt_token_string -Content-Type: application/json \ No newline at end of file +Content-Type: application/json + +### 3. 게시물 수정 +PUT http://localhost:8080/api/boards/4b1da82c-f2e5-4778-8be7-4533d5c6390a/update +Authorization: Bearer jwt_token_string +Content-Type: application/json + +{ + "title": "게시물 제목 수정완2", + "content": "게시물 내용 수정완2" +} \ No newline at end of file From 25fc50cc6ff7ad0e50bbb41874dea79c1de136a5 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 01:56:45 +0900 Subject: [PATCH 25/42] =?UTF-8?q?feat:=20comment=20=EC=88=98=EC=A0=95=20ap?= =?UTF-8?q?i=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 댓글 수정 엔트포인트 추가 --- .../sparta/board/presentation/CommentController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/io/sparta/board/presentation/CommentController.java b/src/main/java/io/sparta/board/presentation/CommentController.java index 7878ee1..47e420c 100644 --- a/src/main/java/io/sparta/board/presentation/CommentController.java +++ b/src/main/java/io/sparta/board/presentation/CommentController.java @@ -1,7 +1,9 @@ package io.sparta.board.presentation; import io.sparta.board.application.dto.request.CommentCreateRequestDto; +import io.sparta.board.application.dto.request.comment.CommentUpdateRequestDto; import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.dto.response.comment.CommentUpdateResponseDto; import io.sparta.board.application.service.CommentService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -24,4 +26,12 @@ public ResponseEntity createComment( CommentCreateResponseDto response = commentService.createComment(id, request); return ResponseEntity.ok(response); } + + @PutMapping("/{id}/updateComment") + public ResponseEntity updateComment( + @PathVariable UUID id, + @RequestBody CommentUpdateRequestDto request){ + CommentUpdateResponseDto response = commentService.updateComment(id, request); + return ResponseEntity.ok(response); + } } From bfcda2ffbde5015d8d5387e9c01a942149f3c767 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 01:58:11 +0900 Subject: [PATCH 26/42] =?UTF-8?q?feat:=20comment=20=EC=88=98=EC=A0=95=20-?= =?UTF-8?q?=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - comment 엔티티 내 update 메서드 추가 - 삭제된 댓글 수정 불가 예외 처리 - jpa 더티체킹으로 인해 자동으로 수정됨 --- .../board/application/service/CommentService.java | 15 +++++++++++++++ .../io/sparta/board/domain/entity/Comment.java | 4 ++++ 2 files changed, 19 insertions(+) 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 196df55..dbcda16 100644 --- a/src/main/java/io/sparta/board/application/service/CommentService.java +++ b/src/main/java/io/sparta/board/application/service/CommentService.java @@ -2,7 +2,9 @@ import io.sparta.board.application.dto.mapper.CommentMapper; import io.sparta.board.application.dto.request.CommentCreateRequestDto; +import io.sparta.board.application.dto.request.comment.CommentUpdateRequestDto; import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.dto.response.comment.CommentUpdateResponseDto; import io.sparta.board.domain.entity.Comment; import io.sparta.board.domain.entity.Post; import io.sparta.board.domain.repository.CommentRepository; @@ -31,4 +33,17 @@ public CommentCreateResponseDto createComment(UUID id, CommentCreateRequestDto r return response; } + + @Transactional + public CommentUpdateResponseDto updateComment(UUID id, CommentUpdateRequestDto request) { + Comment comment = commentRepository.findById(id); + + if(comment.isDeleted()){ + throw new IllegalArgumentException("삭제된 댓글입니다."); + } + + comment.update(request.getContent()); + + return CommentMapper.toCommentUpdateResponseDto(comment); + } } diff --git a/src/main/java/io/sparta/board/domain/entity/Comment.java b/src/main/java/io/sparta/board/domain/entity/Comment.java index 9887242..8c79fad 100644 --- a/src/main/java/io/sparta/board/domain/entity/Comment.java +++ b/src/main/java/io/sparta/board/domain/entity/Comment.java @@ -53,4 +53,8 @@ public static Comment create(String content, Post post) { .post(post) .build(); } + + public void update(String content) { + this.content = content; + } } From 83682464aecd9c210022effcc28aa848b3cc943d Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 01:59:18 +0900 Subject: [PATCH 27/42] =?UTF-8?q?feat:=20comment=20=EC=88=98=EC=A0=95=20-?= =?UTF-8?q?=20dto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - comment 필드만 수정 가능 --- .../request/comment/CommentUpdateRequestDto.java | 14 ++++++++++++++ .../response/comment/CommentUpdateResponseDto.java | 14 ++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/dto/request/comment/CommentUpdateRequestDto.java create mode 100644 src/main/java/io/sparta/board/application/dto/response/comment/CommentUpdateResponseDto.java diff --git a/src/main/java/io/sparta/board/application/dto/request/comment/CommentUpdateRequestDto.java b/src/main/java/io/sparta/board/application/dto/request/comment/CommentUpdateRequestDto.java new file mode 100644 index 0000000..f5468ea --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/request/comment/CommentUpdateRequestDto.java @@ -0,0 +1,14 @@ +package io.sparta.board.application.dto.request.comment; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CommentUpdateRequestDto { + private String content; +} diff --git a/src/main/java/io/sparta/board/application/dto/response/comment/CommentUpdateResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/comment/CommentUpdateResponseDto.java new file mode 100644 index 0000000..28b324f --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/response/comment/CommentUpdateResponseDto.java @@ -0,0 +1,14 @@ +package io.sparta.board.application.dto.response.comment; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CommentUpdateResponseDto { + private String content; +} From 56932d4b41de2d69e927b61bdc4edab792969674 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:00:52 +0900 Subject: [PATCH 28/42] =?UTF-8?q?feat:=20comment=20=EC=88=98=EC=A0=95=20-?= =?UTF-8?q?=20repository=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20findById=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - db에서 commentId 가져오는 로직 추가 --- .../io/sparta/board/domain/repository/CommentRepository.java | 4 ++++ .../infrastructure/repository/CommentRepositoryImpl.java | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/io/sparta/board/domain/repository/CommentRepository.java b/src/main/java/io/sparta/board/domain/repository/CommentRepository.java index e6b3d73..3e964d1 100644 --- a/src/main/java/io/sparta/board/domain/repository/CommentRepository.java +++ b/src/main/java/io/sparta/board/domain/repository/CommentRepository.java @@ -2,7 +2,11 @@ import io.sparta.board.domain.entity.Comment; +import java.util.UUID; + public interface CommentRepository { Comment save(Comment comment); + + Comment findById(UUID id); } diff --git a/src/main/java/io/sparta/board/infrastructure/repository/CommentRepositoryImpl.java b/src/main/java/io/sparta/board/infrastructure/repository/CommentRepositoryImpl.java index 7f88f2e..f566686 100644 --- a/src/main/java/io/sparta/board/infrastructure/repository/CommentRepositoryImpl.java +++ b/src/main/java/io/sparta/board/infrastructure/repository/CommentRepositoryImpl.java @@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.UUID; + @Repository @RequiredArgsConstructor public class CommentRepositoryImpl implements CommentRepository { @@ -14,4 +16,7 @@ public class CommentRepositoryImpl implements CommentRepository { @Override public Comment save(Comment comment) {return commentJpaRepository.save(comment);} + + @Override + public Comment findById(UUID id){return commentJpaRepository.findById(id).orElse(null);} } From 615c982689cf82aeb7c65ae26415e9b37ab265b8 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:01:24 +0900 Subject: [PATCH 29/42] =?UTF-8?q?feat:=20comment=20=EC=88=98=EC=A0=95=20-?= =?UTF-8?q?=20dto=20=EB=B3=80=ED=99=98=EC=9E=91=EC=97=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 엔티티를 dto로 변환 로직 추가 --- .../sparta/board/application/dto/mapper/CommentMapper.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java b/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java index 4fbaa87..9f72550 100644 --- a/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java +++ b/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java @@ -1,6 +1,7 @@ package io.sparta.board.application.dto.mapper; import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.dto.response.comment.CommentUpdateResponseDto; import io.sparta.board.domain.entity.Comment; public class CommentMapper { @@ -11,4 +12,10 @@ public static CommentCreateResponseDto toCommentCreateResponseDto(Comment commen .content(comment.getContent()) .build(); } + + public static CommentUpdateResponseDto toCommentUpdateResponseDto(Comment comment){ + return CommentUpdateResponseDto.builder() + .content(comment.getContent()) + .build(); + } } From 3cb8f9294369718bb4143dfa893ed7bfac0dc064 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:02:00 +0900 Subject: [PATCH 30/42] =?UTF-8?q?test:=20comment=20=EC=88=98=EC=A0=95=20ap?= =?UTF-8?q?i=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - http client test 완료 --- src/test/resources/test/CommentClient.http | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/resources/test/CommentClient.http diff --git a/src/test/resources/test/CommentClient.http b/src/test/resources/test/CommentClient.http new file mode 100644 index 0000000..26b26c1 --- /dev/null +++ b/src/test/resources/test/CommentClient.http @@ -0,0 +1,17 @@ +### 1. 댓글 생성 +POST http://localhost:8080/api/comments/boards/e7e659cb-415a-4c9d-82d3-4851d2d46cad/comments +Authorization: Bearer jwt_token_string +Content-Type: application/json + +{ + "content": "댓글입니다2" +} + +### 2. 댓글 수정 +PUT http://localhost:8080/api/comments/1d55b553-62b4-47cf-a9b8-7684f87b57e0/updateComment +Authorization: Bearer jwt_token_string +Content-Type: application/json + +{ + "content": "댓글수정완" +} \ No newline at end of file From b99e1c2daccca896eeeca1b372e5d26906b2b0fb Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:26:25 +0900 Subject: [PATCH 31/42] =?UTF-8?q?feat:=20post=20=EC=82=AD=EC=A0=9C=20api?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 엔드포인트 추가 --- .../io/sparta/board/presentation/PostController.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/sparta/board/presentation/PostController.java b/src/main/java/io/sparta/board/presentation/PostController.java index fce3593..3239d22 100644 --- a/src/main/java/io/sparta/board/presentation/PostController.java +++ b/src/main/java/io/sparta/board/presentation/PostController.java @@ -3,7 +3,8 @@ import io.sparta.board.application.dto.request.PostCreateRequestDto; import io.sparta.board.application.dto.response.PostCreateResponseDto; import io.sparta.board.application.dto.response.PostGetResponseDto; -import io.sparta.board.application.dto.response.comment.PostUpdateRequestDto; +import io.sparta.board.application.dto.request.post.PostUpdateRequestDto; +import io.sparta.board.application.dto.response.post.PostDeleteResponseDto; import io.sparta.board.application.dto.response.post.PostUpdateResponseDto; import io.sparta.board.application.service.PostService; import lombok.RequiredArgsConstructor; @@ -41,4 +42,11 @@ public ResponseEntity updatePost( PostUpdateResponseDto response = postService.updatePost(id, request); return ResponseEntity.ok(response); } + + @DeleteMapping("/{id}") + public ResponseEntity deletePost( + @PathVariable UUID id){ + PostDeleteResponseDto response = postService.deletePost(id); + return ResponseEntity.ok(response); + } } From 924839fe4fa6f1ab1ba346a317202dab83d5b389 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:28:15 +0900 Subject: [PATCH 32/42] =?UTF-8?q?feat:=20post=20=EC=82=AD=EC=A0=9C=20-=20?= =?UTF-8?q?=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 엔티티 클래스에 softDelete 메서드 추가 - 이미 삭제된 게시물 삭제 불가 예외처리 --- .../board/application/service/PostService.java | 16 +++++++++++++++- .../java/io/sparta/board/domain/entity/Post.java | 4 ++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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 4d8e96b..5d9dcbe 100644 --- a/src/main/java/io/sparta/board/application/service/PostService.java +++ b/src/main/java/io/sparta/board/application/service/PostService.java @@ -4,7 +4,8 @@ import io.sparta.board.application.dto.request.PostCreateRequestDto; import io.sparta.board.application.dto.response.PostCreateResponseDto; import io.sparta.board.application.dto.response.PostGetResponseDto; -import io.sparta.board.application.dto.response.comment.PostUpdateRequestDto; +import io.sparta.board.application.dto.request.post.PostUpdateRequestDto; +import io.sparta.board.application.dto.response.post.PostDeleteResponseDto; import io.sparta.board.application.dto.response.post.PostUpdateResponseDto; import io.sparta.board.domain.entity.Post; import io.sparta.board.domain.repository.PostRepository; @@ -52,4 +53,17 @@ public PostUpdateResponseDto updatePost(UUID id, PostUpdateRequestDto request){ return PostMapper.toPostUpdateResponseDto(post); } + + @Transactional + public PostDeleteResponseDto deletePost(UUID id){ + Post post = postRepository.findByPostId(id); + + if(post.isDeleted()){ + throw new IllegalArgumentException("삭제된 게시글 입니다."); + } + + post.softDelete(); + + return PostMapper.toPostDeleteResponseDto(post); + } } diff --git a/src/main/java/io/sparta/board/domain/entity/Post.java b/src/main/java/io/sparta/board/domain/entity/Post.java index c3aeaaf..1e11763 100644 --- a/src/main/java/io/sparta/board/domain/entity/Post.java +++ b/src/main/java/io/sparta/board/domain/entity/Post.java @@ -63,4 +63,8 @@ public void update(String title, String content) { this.title = title; this.content = content; } + + public void softDelete() { + this.deleted = true; + } } From 156ae6f4c4faf7ae0e96b9ffdc18184ff331aea7 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:28:53 +0900 Subject: [PATCH 33/42] =?UTF-8?q?feat:=20post=20=EC=82=AD=EC=A0=9C=20-=20d?= =?UTF-8?q?to=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 엔티티를 응답 dto로 변환 --- .../board/application/dto/mapper/PostMapper.java | 7 +++++++ .../dto/response/post/PostDeleteResponseDto.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/dto/response/post/PostDeleteResponseDto.java diff --git a/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java index 2d0e732..e0e1e0f 100644 --- a/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java +++ b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java @@ -3,6 +3,7 @@ import io.sparta.board.application.dto.response.CommentResponseDto; import io.sparta.board.application.dto.response.PostCreateResponseDto; import io.sparta.board.application.dto.response.PostGetResponseDto; +import io.sparta.board.application.dto.response.post.PostDeleteResponseDto; import io.sparta.board.application.dto.response.post.PostUpdateResponseDto; import io.sparta.board.domain.entity.Comment; import io.sparta.board.domain.entity.Post; @@ -50,4 +51,10 @@ public static PostUpdateResponseDto toPostUpdateResponseDto(Post post) { .content(post.getContent()) .build(); } + + public static PostDeleteResponseDto toPostDeleteResponseDto(Post post) { + return PostDeleteResponseDto.builder() + .id(post.getId()) + .build(); + } } diff --git a/src/main/java/io/sparta/board/application/dto/response/post/PostDeleteResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/post/PostDeleteResponseDto.java new file mode 100644 index 0000000..5fa4a53 --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/response/post/PostDeleteResponseDto.java @@ -0,0 +1,16 @@ +package io.sparta.board.application.dto.response.post; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PostDeleteResponseDto { + private UUID id; +} From b5a2185f289b8ff3ebb139ccd17ff25b20c5f27b Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:29:20 +0900 Subject: [PATCH 34/42] =?UTF-8?q?test:=20post=20=EC=82=AD=EC=A0=9C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - http client test 완료 --- src/test/resources/test/PostClient.http | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/resources/test/PostClient.http b/src/test/resources/test/PostClient.http index 505208d..ad795da 100644 --- a/src/test/resources/test/PostClient.http +++ b/src/test/resources/test/PostClient.http @@ -21,4 +21,9 @@ Content-Type: application/json { "title": "게시물 제목 수정완2", "content": "게시물 내용 수정완2" -} \ No newline at end of file +} + +### 4. 게시물 삭제 +DELETE http://localhost:8080/api/boards/4b1da82c-f2e5-4778-8be7-4533d5c6390a +Authorization: Bearer jwt_token_string +Content-Type: application/json From f60330359e972849a2314ed46571577c7bc3a7ca Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:40:50 +0900 Subject: [PATCH 35/42] =?UTF-8?q?feat:=20comment=20=EC=82=AD=EC=A0=9C=20ap?= =?UTF-8?q?i=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 엔드 포인트 추가 --- .../io/sparta/board/presentation/CommentController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/io/sparta/board/presentation/CommentController.java b/src/main/java/io/sparta/board/presentation/CommentController.java index 47e420c..133438b 100644 --- a/src/main/java/io/sparta/board/presentation/CommentController.java +++ b/src/main/java/io/sparta/board/presentation/CommentController.java @@ -3,6 +3,7 @@ import io.sparta.board.application.dto.request.CommentCreateRequestDto; import io.sparta.board.application.dto.request.comment.CommentUpdateRequestDto; import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.dto.response.comment.CommentDeleteResponseDto; import io.sparta.board.application.dto.response.comment.CommentUpdateResponseDto; import io.sparta.board.application.service.CommentService; import lombok.RequiredArgsConstructor; @@ -34,4 +35,11 @@ public ResponseEntity updateComment( CommentUpdateResponseDto response = commentService.updateComment(id, request); return ResponseEntity.ok(response); } + + @DeleteMapping("/{id}") + public ResponseEntity deleteComment( + @PathVariable UUID id){ + CommentDeleteResponseDto response = commentService.deleteComment(id); + return ResponseEntity.ok(response); + } } From 4d6ff09da56b970e79227447270544bc53cfec3b Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:41:56 +0900 Subject: [PATCH 36/42] =?UTF-8?q?feat:=20comment=20=EC=82=AD=EC=A0=9C=20ap?= =?UTF-8?q?i=20-=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - comment 엔티티 클래스에 softDelete 메서드 추가 - 이미 삭제된 댓글 예외 처리 - jpa 더티체킹으로 인해 자동 수정 반영 --- .../board/application/service/CommentService.java | 13 +++++++++++++ .../java/io/sparta/board/domain/entity/Comment.java | 4 ++++ 2 files changed, 17 insertions(+) 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 dbcda16..894eb32 100644 --- a/src/main/java/io/sparta/board/application/service/CommentService.java +++ b/src/main/java/io/sparta/board/application/service/CommentService.java @@ -4,6 +4,7 @@ import io.sparta.board.application.dto.request.CommentCreateRequestDto; import io.sparta.board.application.dto.request.comment.CommentUpdateRequestDto; import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.dto.response.comment.CommentDeleteResponseDto; import io.sparta.board.application.dto.response.comment.CommentUpdateResponseDto; import io.sparta.board.domain.entity.Comment; import io.sparta.board.domain.entity.Post; @@ -46,4 +47,16 @@ public CommentUpdateResponseDto updateComment(UUID id, CommentUpdateRequestDto r return CommentMapper.toCommentUpdateResponseDto(comment); } + + @Transactional + public CommentDeleteResponseDto deleteComment(UUID id) { + Comment comment = commentRepository.findById(id); + if(comment.isDeleted()){ + throw new IllegalArgumentException("삭제된 댓글입니다."); + } + + comment.softDelete(); + + return CommentMapper.toCommentDeleteResponseDto(comment); + } } diff --git a/src/main/java/io/sparta/board/domain/entity/Comment.java b/src/main/java/io/sparta/board/domain/entity/Comment.java index 8c79fad..0a4bed2 100644 --- a/src/main/java/io/sparta/board/domain/entity/Comment.java +++ b/src/main/java/io/sparta/board/domain/entity/Comment.java @@ -57,4 +57,8 @@ public static Comment create(String content, Post post) { public void update(String content) { this.content = content; } + + public void softDelete() { + this.deleted = true; + } } From 9ae0de24a309acedf77e8dfe997a5b2550e5e141 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:42:56 +0900 Subject: [PATCH 37/42] =?UTF-8?q?feat:=20comment=20=EC=82=AD=EC=A0=9C=20ap?= =?UTF-8?q?i=20-=20dto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 응답 dto 필드 추가 - CommentMapper : 엔티티를 dto로 변환 --- .../application/dto/mapper/CommentMapper.java | 7 +++++++ .../comment/CommentDeleteResponseDto.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/main/java/io/sparta/board/application/dto/response/comment/CommentDeleteResponseDto.java diff --git a/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java b/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java index 9f72550..5dbd924 100644 --- a/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java +++ b/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java @@ -1,6 +1,7 @@ package io.sparta.board.application.dto.mapper; import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.dto.response.comment.CommentDeleteResponseDto; import io.sparta.board.application.dto.response.comment.CommentUpdateResponseDto; import io.sparta.board.domain.entity.Comment; @@ -18,4 +19,10 @@ public static CommentUpdateResponseDto toCommentUpdateResponseDto(Comment commen .content(comment.getContent()) .build(); } + + public static CommentDeleteResponseDto toCommentDeleteResponseDto(Comment comment){ + return CommentDeleteResponseDto.builder() + .id(comment.getId()) + .build(); + } } diff --git a/src/main/java/io/sparta/board/application/dto/response/comment/CommentDeleteResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/comment/CommentDeleteResponseDto.java new file mode 100644 index 0000000..e48d415 --- /dev/null +++ b/src/main/java/io/sparta/board/application/dto/response/comment/CommentDeleteResponseDto.java @@ -0,0 +1,16 @@ +package io.sparta.board.application.dto.response.comment; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CommentDeleteResponseDto { + private UUID id; +} From 541ebd4e9096b2520c36cb6d1983f060bae096b6 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:45:02 +0900 Subject: [PATCH 38/42] =?UTF-8?q?test:=20comment=20=EC=82=AD=EC=A0=9C=20ap?= =?UTF-8?q?i=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - http client test 완료 --- src/test/resources/test/CommentClient.http | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/resources/test/CommentClient.http b/src/test/resources/test/CommentClient.http index 26b26c1..1c71da9 100644 --- a/src/test/resources/test/CommentClient.http +++ b/src/test/resources/test/CommentClient.http @@ -14,4 +14,9 @@ Content-Type: application/json { "content": "댓글수정완" -} \ No newline at end of file +} + +### 3. 댓글 삭제 +DELETE http://localhost:8080/api/comments/c4ed3a63-9481-42af-9ba5-bdbd89aa581b +Authorization: Bearer jwt_token_string +Content-Type: application/json \ No newline at end of file From 1798560280aad46aa673d13ae7c76b309c374014 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 02:48:38 +0900 Subject: [PATCH 39/42] =?UTF-8?q?refactor:=20dto=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dto를 comment와 post로 분리 --- .../sparta/board/application/dto/mapper/CommentMapper.java | 2 +- .../io/sparta/board/application/dto/mapper/PostMapper.java | 6 +++--- .../dto/request/{ => comment}/CommentCreateRequestDto.java | 2 +- .../dto/request/{ => post}/PostCreateRequestDto.java | 2 +- .../comment => request/post}/PostUpdateRequestDto.java | 3 +-- .../response/{ => comment}/CommentCreateResponseDto.java | 3 +-- .../dto/response/{ => comment}/CommentResponseDto.java | 2 +- .../dto/response/{ => post}/PostCreateResponseDto.java | 2 +- .../dto/response/{ => post}/PostGetResponseDto.java | 4 ++-- .../io/sparta/board/application/service/CommentService.java | 4 ++-- .../io/sparta/board/application/service/PostService.java | 6 +++--- .../io/sparta/board/presentation/CommentController.java | 4 ++-- .../java/io/sparta/board/presentation/PostController.java | 6 +++--- 13 files changed, 22 insertions(+), 24 deletions(-) rename src/main/java/io/sparta/board/application/dto/request/{ => comment}/CommentCreateRequestDto.java (88%) rename src/main/java/io/sparta/board/application/dto/request/{ => post}/PostCreateRequestDto.java (88%) rename src/main/java/io/sparta/board/application/dto/{response/comment => request/post}/PostUpdateRequestDto.java (72%) rename src/main/java/io/sparta/board/application/dto/response/{ => comment}/CommentCreateResponseDto.java (75%) rename src/main/java/io/sparta/board/application/dto/response/{ => comment}/CommentResponseDto.java (85%) rename src/main/java/io/sparta/board/application/dto/response/{ => post}/PostCreateResponseDto.java (84%) rename src/main/java/io/sparta/board/application/dto/response/{ => post}/PostGetResponseDto.java (77%) diff --git a/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java b/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java index 5dbd924..1bc0632 100644 --- a/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java +++ b/src/main/java/io/sparta/board/application/dto/mapper/CommentMapper.java @@ -1,6 +1,6 @@ package io.sparta.board.application.dto.mapper; -import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.dto.response.comment.CommentCreateResponseDto; import io.sparta.board.application.dto.response.comment.CommentDeleteResponseDto; import io.sparta.board.application.dto.response.comment.CommentUpdateResponseDto; import io.sparta.board.domain.entity.Comment; diff --git a/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java index e0e1e0f..ddb3571 100644 --- a/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java +++ b/src/main/java/io/sparta/board/application/dto/mapper/PostMapper.java @@ -1,8 +1,8 @@ package io.sparta.board.application.dto.mapper; -import io.sparta.board.application.dto.response.CommentResponseDto; -import io.sparta.board.application.dto.response.PostCreateResponseDto; -import io.sparta.board.application.dto.response.PostGetResponseDto; +import io.sparta.board.application.dto.response.comment.CommentResponseDto; +import io.sparta.board.application.dto.response.post.PostCreateResponseDto; +import io.sparta.board.application.dto.response.post.PostGetResponseDto; import io.sparta.board.application.dto.response.post.PostDeleteResponseDto; import io.sparta.board.application.dto.response.post.PostUpdateResponseDto; import io.sparta.board.domain.entity.Comment; diff --git a/src/main/java/io/sparta/board/application/dto/request/CommentCreateRequestDto.java b/src/main/java/io/sparta/board/application/dto/request/comment/CommentCreateRequestDto.java similarity index 88% rename from src/main/java/io/sparta/board/application/dto/request/CommentCreateRequestDto.java rename to src/main/java/io/sparta/board/application/dto/request/comment/CommentCreateRequestDto.java index 76de54b..5803b30 100644 --- a/src/main/java/io/sparta/board/application/dto/request/CommentCreateRequestDto.java +++ b/src/main/java/io/sparta/board/application/dto/request/comment/CommentCreateRequestDto.java @@ -1,4 +1,4 @@ -package io.sparta.board.application.dto.request; +package io.sparta.board.application.dto.request.comment; import io.sparta.board.domain.entity.Comment; import io.sparta.board.domain.entity.Post; diff --git a/src/main/java/io/sparta/board/application/dto/request/PostCreateRequestDto.java b/src/main/java/io/sparta/board/application/dto/request/post/PostCreateRequestDto.java similarity index 88% rename from src/main/java/io/sparta/board/application/dto/request/PostCreateRequestDto.java rename to src/main/java/io/sparta/board/application/dto/request/post/PostCreateRequestDto.java index 4cfffe3..4644457 100644 --- a/src/main/java/io/sparta/board/application/dto/request/PostCreateRequestDto.java +++ b/src/main/java/io/sparta/board/application/dto/request/post/PostCreateRequestDto.java @@ -1,4 +1,4 @@ -package io.sparta.board.application.dto.request; +package io.sparta.board.application.dto.request.post; import io.sparta.board.domain.entity.Post; import lombok.AllArgsConstructor; diff --git a/src/main/java/io/sparta/board/application/dto/response/comment/PostUpdateRequestDto.java b/src/main/java/io/sparta/board/application/dto/request/post/PostUpdateRequestDto.java similarity index 72% rename from src/main/java/io/sparta/board/application/dto/response/comment/PostUpdateRequestDto.java rename to src/main/java/io/sparta/board/application/dto/request/post/PostUpdateRequestDto.java index a06a6fc..3e29ff3 100644 --- a/src/main/java/io/sparta/board/application/dto/response/comment/PostUpdateRequestDto.java +++ b/src/main/java/io/sparta/board/application/dto/request/post/PostUpdateRequestDto.java @@ -1,6 +1,5 @@ -package io.sparta.board.application.dto.response.comment; +package io.sparta.board.application.dto.request.post; -import io.sparta.board.domain.entity.Post; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/io/sparta/board/application/dto/response/CommentCreateResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/comment/CommentCreateResponseDto.java similarity index 75% rename from src/main/java/io/sparta/board/application/dto/response/CommentCreateResponseDto.java rename to src/main/java/io/sparta/board/application/dto/response/comment/CommentCreateResponseDto.java index 73c29ac..733b999 100644 --- a/src/main/java/io/sparta/board/application/dto/response/CommentCreateResponseDto.java +++ b/src/main/java/io/sparta/board/application/dto/response/comment/CommentCreateResponseDto.java @@ -1,6 +1,5 @@ -package io.sparta.board.application.dto.response; +package io.sparta.board.application.dto.response.comment; -import io.sparta.board.domain.entity.Post; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/io/sparta/board/application/dto/response/CommentResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/comment/CommentResponseDto.java similarity index 85% rename from src/main/java/io/sparta/board/application/dto/response/CommentResponseDto.java rename to src/main/java/io/sparta/board/application/dto/response/comment/CommentResponseDto.java index 50d2e41..b2d698e 100644 --- a/src/main/java/io/sparta/board/application/dto/response/CommentResponseDto.java +++ b/src/main/java/io/sparta/board/application/dto/response/comment/CommentResponseDto.java @@ -1,4 +1,4 @@ -package io.sparta.board.application.dto.response; +package io.sparta.board.application.dto.response.comment; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/io/sparta/board/application/dto/response/PostCreateResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/post/PostCreateResponseDto.java similarity index 84% rename from src/main/java/io/sparta/board/application/dto/response/PostCreateResponseDto.java rename to src/main/java/io/sparta/board/application/dto/response/post/PostCreateResponseDto.java index 83557e1..a792c24 100644 --- a/src/main/java/io/sparta/board/application/dto/response/PostCreateResponseDto.java +++ b/src/main/java/io/sparta/board/application/dto/response/post/PostCreateResponseDto.java @@ -1,4 +1,4 @@ -package io.sparta.board.application.dto.response; +package io.sparta.board.application.dto.response.post; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/io/sparta/board/application/dto/response/PostGetResponseDto.java b/src/main/java/io/sparta/board/application/dto/response/post/PostGetResponseDto.java similarity index 77% rename from src/main/java/io/sparta/board/application/dto/response/PostGetResponseDto.java rename to src/main/java/io/sparta/board/application/dto/response/post/PostGetResponseDto.java index e8348e1..5c19dee 100644 --- a/src/main/java/io/sparta/board/application/dto/response/PostGetResponseDto.java +++ b/src/main/java/io/sparta/board/application/dto/response/post/PostGetResponseDto.java @@ -1,6 +1,6 @@ -package io.sparta.board.application.dto.response; +package io.sparta.board.application.dto.response.post; -import io.sparta.board.domain.entity.Comment; +import io.sparta.board.application.dto.response.comment.CommentResponseDto; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; 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 894eb32..836cfa9 100644 --- a/src/main/java/io/sparta/board/application/service/CommentService.java +++ b/src/main/java/io/sparta/board/application/service/CommentService.java @@ -1,9 +1,9 @@ package io.sparta.board.application.service; import io.sparta.board.application.dto.mapper.CommentMapper; -import io.sparta.board.application.dto.request.CommentCreateRequestDto; +import io.sparta.board.application.dto.request.comment.CommentCreateRequestDto; import io.sparta.board.application.dto.request.comment.CommentUpdateRequestDto; -import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.dto.response.comment.CommentCreateResponseDto; import io.sparta.board.application.dto.response.comment.CommentDeleteResponseDto; import io.sparta.board.application.dto.response.comment.CommentUpdateResponseDto; import io.sparta.board.domain.entity.Comment; 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 5d9dcbe..b6dc2da 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,9 @@ package io.sparta.board.application.service; import io.sparta.board.application.dto.mapper.PostMapper; -import io.sparta.board.application.dto.request.PostCreateRequestDto; -import io.sparta.board.application.dto.response.PostCreateResponseDto; -import io.sparta.board.application.dto.response.PostGetResponseDto; +import io.sparta.board.application.dto.request.post.PostCreateRequestDto; +import io.sparta.board.application.dto.response.post.PostCreateResponseDto; +import io.sparta.board.application.dto.response.post.PostGetResponseDto; import io.sparta.board.application.dto.request.post.PostUpdateRequestDto; import io.sparta.board.application.dto.response.post.PostDeleteResponseDto; import io.sparta.board.application.dto.response.post.PostUpdateResponseDto; diff --git a/src/main/java/io/sparta/board/presentation/CommentController.java b/src/main/java/io/sparta/board/presentation/CommentController.java index 133438b..a4eda26 100644 --- a/src/main/java/io/sparta/board/presentation/CommentController.java +++ b/src/main/java/io/sparta/board/presentation/CommentController.java @@ -1,8 +1,8 @@ package io.sparta.board.presentation; -import io.sparta.board.application.dto.request.CommentCreateRequestDto; +import io.sparta.board.application.dto.request.comment.CommentCreateRequestDto; import io.sparta.board.application.dto.request.comment.CommentUpdateRequestDto; -import io.sparta.board.application.dto.response.CommentCreateResponseDto; +import io.sparta.board.application.dto.response.comment.CommentCreateResponseDto; import io.sparta.board.application.dto.response.comment.CommentDeleteResponseDto; import io.sparta.board.application.dto.response.comment.CommentUpdateResponseDto; import io.sparta.board.application.service.CommentService; diff --git a/src/main/java/io/sparta/board/presentation/PostController.java b/src/main/java/io/sparta/board/presentation/PostController.java index 3239d22..510af0b 100644 --- a/src/main/java/io/sparta/board/presentation/PostController.java +++ b/src/main/java/io/sparta/board/presentation/PostController.java @@ -1,8 +1,8 @@ package io.sparta.board.presentation; -import io.sparta.board.application.dto.request.PostCreateRequestDto; -import io.sparta.board.application.dto.response.PostCreateResponseDto; -import io.sparta.board.application.dto.response.PostGetResponseDto; +import io.sparta.board.application.dto.request.post.PostCreateRequestDto; +import io.sparta.board.application.dto.response.post.PostCreateResponseDto; +import io.sparta.board.application.dto.response.post.PostGetResponseDto; import io.sparta.board.application.dto.request.post.PostUpdateRequestDto; import io.sparta.board.application.dto.response.post.PostDeleteResponseDto; import io.sparta.board.application.dto.response.post.PostUpdateResponseDto; From dd10536ff57e7534a3644f1561ce10cd6a81a808 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 14:41:49 +0900 Subject: [PATCH 40/42] =?UTF-8?q?chore:=20yml=20ddl-auto=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - create > update 수정 --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 89eea72..7222c38 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -10,7 +10,7 @@ spring: jpa: hibernate: - ddl-auto: create + ddl-auto: update show-sql: true properties: hibernate: From 8332d4719a030dbbf1315b4be9631b7f08c1cd68 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 14:58:06 +0900 Subject: [PATCH 41/42] =?UTF-8?q?fix:=20http=20client=20test=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/test/CreateCommentClient.http | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/test/resources/test/CreateCommentClient.http diff --git a/src/test/resources/test/CreateCommentClient.http b/src/test/resources/test/CreateCommentClient.http deleted file mode 100644 index 04b35fd..0000000 --- a/src/test/resources/test/CreateCommentClient.http +++ /dev/null @@ -1,10 +0,0 @@ -### 1. 댓글 생성 -POST http://localhost:8080/api/comments/boards/4b1da82c-f2e5-4778-8be7-4533d5c6390a/comments -Authorization: Bearer jwt_token_string -Content-Type: application/json - -{ - "content": "댓글입니다3" -} - -### \ No newline at end of file From e975f0a8d52dbb97897ec141bb78d32f8c560a08 Mon Sep 17 00:00:00 2001 From: dowon0113 Date: Wed, 2 Apr 2025 15:35:06 +0900 Subject: [PATCH 42/42] =?UTF-8?q?docs:=20README.md=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..4841b4f --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +## TODO List +- [x] 게시글 작성 API 구현 + - [x] controller, dto, repository 생성 + - [x] 비즈니스 로직 구현 + - [x] 제목, 내용 not null + - [x] 게시글 일자 자동 기록 + +- [x] 게시글 수정 API 구현 + - [x] controller, dto, repository 생성 + - [x] 비즈니스 로직 구현 (삭제된 게시글 예외처리) + - [x] 제목과 내용만 수정 가능 + - [x] 게시글 수정 일자 자동 기록 + +- [x] 게시글 삭제 API 구현 + - [x] controller, dto, repository 생성 + - [ ] 삭제 시 게시글과 함께 해당 게시글의 모든 댓글도 삭제 처리 + - [x] 삭제 후 복구 불가능 + - [x] 게시글 삭제 시 삭제 상태에 대한 변경만 처리(soft-delete) + +- [x] 게시글 단건 조회 API 구현 + - [x] controller, dto, repository 생성 + - [x] 비즈니스 로직 구현 (삭제된 게시글 예외처리) + - [x] 게시글에 포함된 모든 댓글 목록 조회 + - [ ] 게시글에 댓글 목록 페이징 처리 + - [x] 삭제된 데이터는 조회 불가 + +- [x] 댓글 등록 API 구현 + - [x] controller, dto, repository 생성 + - [x] 비즈니스 로직 구현 + - [x] 댓글 내용 not null + - [x] 댓글 등록 일자 자동 기록 + +- [x] 댓글 수정 API 구현 + - [x] controller, dto, repository 생성 + - [x] 비즈니스 로직 구현 (삭제된 댓글 예외처리) + - [x] 댓글 내용만 수정 가능 + - [x] 댓글 수정 일자 자동 기록 + +- [x] 댓글 삭제 API 구현 + - [x] controller, dto, repository 생성 + - [x] 비즈니스 로직 구현 (삭제된 댓글 예외처리) + - [x] 삭제 후 복구 불가능 + - [x] 댓글 삭제 시 삭제 상태에 대한 변경만 처리(soft-delete) + +## 추후 학습 & 이해가지 않는 부분 +- [ ] 조회된 게시글에 댓글만 페이징 처리 학습 필요 +- [ ] 게시글이 삭제 메서드에 댓글 삭제 로직 추가 필요 +- [ ] QueryDsl 내부 동작 원리 이해 필요 \ No newline at end of file