From 0cb36425ce20861284fef8e4c76a30f34905fcf7 Mon Sep 17 00:00:00 2001 From: Kim na young Date: Sun, 27 Oct 2024 23:41:12 +0900 Subject: [PATCH 1/3] hw3-2 --- .../controller/CommentController.java | 23 +++++++ .../springhw32/controller/PostController.java | 35 +++++++++++ .../springhw32/controller/UserController.java | 15 +++++ .../example/springhw32/dto/CommentDto.java | 7 +++ .../com/example/springhw32/dto/PostDto.java | 13 ++++ .../com/example/springhw32/dto/UserDto.java | 9 +++ .../example/springhw32/entity/Comment.java | 17 ++++++ .../com/example/springhw32/entity/Post.java | 26 ++++++++ .../com/example/springhw32/entity/User.java | 17 ++++++ .../repository/CommentRepository.java | 9 ++- .../springhw32/repository/PostRepository.java | 13 +++- .../springhw32/repository/UserRepository.java | 5 +- .../springhw32/service/CommentService.java | 46 ++++++++++++++ .../springhw32/service/PostService.java | 61 +++++++++++++++++++ .../springhw32/service/UserService.java | 19 ++++++ src/main/resources/application.yml | 8 +-- 16 files changed, 316 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/springhw32/controller/CommentController.java b/src/main/java/com/example/springhw32/controller/CommentController.java index 0ee065d..42a756a 100644 --- a/src/main/java/com/example/springhw32/controller/CommentController.java +++ b/src/main/java/com/example/springhw32/controller/CommentController.java @@ -1,5 +1,28 @@ package com.example.springhw32.controller; +import com.example.springhw32.dto.CommentDto; +import com.example.springhw32.service.CommentService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/posts") public class CommentController { + private final CommentService commentService; + + // 댓글 작성 + @PostMapping("/comments") + public CommentDto addComment(@ModelAttribute CommentDto commentDto, @RequestParam Long postId) { + return commentService.addComment(commentDto, postId); + } + + // 특정 게시물에 달린 모든 댓글 조회 + @GetMapping("/comments/{postId}") + public List getAllComments(@PathVariable Long postId) { + return commentService.getAllComments(postId); + } } diff --git a/src/main/java/com/example/springhw32/controller/PostController.java b/src/main/java/com/example/springhw32/controller/PostController.java index 317774b..ddc2cbd 100644 --- a/src/main/java/com/example/springhw32/controller/PostController.java +++ b/src/main/java/com/example/springhw32/controller/PostController.java @@ -1,5 +1,40 @@ package com.example.springhw32.controller; +import com.example.springhw32.dto.PostDto; +import com.example.springhw32.service.PostService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/posts") public class PostController { + private final PostService postService; + + // 글 등록 + @PostMapping + public PostDto createPost(@ModelAttribute PostDto postDto, Long userId) { + return postService.createPost(postDto, userId); + } + + // 최신순으로 글 조회 + @GetMapping + public List findAllPostsByOrderByPostedAtDesc() { + return postService.findAllPostsByOrderByPostedAtDesc(); + } + + // 작성자 글 조회 + @GetMapping("/{writer}") + public List findAllPostsByWriter(@PathVariable("writer") Long userId) { + return postService.findAllPostsByUserId(userId); + } + + // 댓글 많은 순으로 글 조회 + @GetMapping("/comments") + public List findAllPostsByOrderByCommentCountDesc() { + return postService.findAllPostsByOrderByCommentCountDesc(); + } } diff --git a/src/main/java/com/example/springhw32/controller/UserController.java b/src/main/java/com/example/springhw32/controller/UserController.java index 3b321ac..6c048fb 100644 --- a/src/main/java/com/example/springhw32/controller/UserController.java +++ b/src/main/java/com/example/springhw32/controller/UserController.java @@ -1,5 +1,20 @@ package com.example.springhw32.controller; +import com.example.springhw32.dto.UserDto; +import com.example.springhw32.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor public class UserController { + private final UserService userService; + + @PostMapping("/users") + public UserDto join(@ModelAttribute UserDto userDto) { + return userService.join(userDto); + } } diff --git a/src/main/java/com/example/springhw32/dto/CommentDto.java b/src/main/java/com/example/springhw32/dto/CommentDto.java index a9d04fa..00f8115 100644 --- a/src/main/java/com/example/springhw32/dto/CommentDto.java +++ b/src/main/java/com/example/springhw32/dto/CommentDto.java @@ -1,5 +1,12 @@ package com.example.springhw32.dto; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class CommentDto { + private String comment; + } diff --git a/src/main/java/com/example/springhw32/dto/PostDto.java b/src/main/java/com/example/springhw32/dto/PostDto.java index cde1eda..7048396 100644 --- a/src/main/java/com/example/springhw32/dto/PostDto.java +++ b/src/main/java/com/example/springhw32/dto/PostDto.java @@ -1,5 +1,18 @@ package com.example.springhw32.dto; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter public class PostDto { + private String title; + + private String content; + + private int commentCount; + } diff --git a/src/main/java/com/example/springhw32/dto/UserDto.java b/src/main/java/com/example/springhw32/dto/UserDto.java index cbbbe2e..18119bc 100644 --- a/src/main/java/com/example/springhw32/dto/UserDto.java +++ b/src/main/java/com/example/springhw32/dto/UserDto.java @@ -1,5 +1,14 @@ package com.example.springhw32.dto; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class UserDto { + private String username; + + private String password; + } diff --git a/src/main/java/com/example/springhw32/entity/Comment.java b/src/main/java/com/example/springhw32/entity/Comment.java index be818a0..27f85ad 100644 --- a/src/main/java/com/example/springhw32/entity/Comment.java +++ b/src/main/java/com/example/springhw32/entity/Comment.java @@ -1,5 +1,22 @@ package com.example.springhw32.entity; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter public class Comment { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + @ManyToOne + private Post post; + + @Column(nullable = false) + private String comment; + } diff --git a/src/main/java/com/example/springhw32/entity/Post.java b/src/main/java/com/example/springhw32/entity/Post.java index 38b5e81..69971f7 100644 --- a/src/main/java/com/example/springhw32/entity/Post.java +++ b/src/main/java/com/example/springhw32/entity/Post.java @@ -1,5 +1,31 @@ package com.example.springhw32.entity; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter public class Post { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @ManyToOne + private User user; + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String content; + + private int commentCount; + + private LocalDateTime postedAt; + } diff --git a/src/main/java/com/example/springhw32/entity/User.java b/src/main/java/com/example/springhw32/entity/User.java index 447989d..b8ff4db 100644 --- a/src/main/java/com/example/springhw32/entity/User.java +++ b/src/main/java/com/example/springhw32/entity/User.java @@ -1,5 +1,22 @@ package com.example.springhw32.entity; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false) + private String username; + + @Column(nullable = false) + private String password; + } diff --git a/src/main/java/com/example/springhw32/repository/CommentRepository.java b/src/main/java/com/example/springhw32/repository/CommentRepository.java index 83dcd99..10fe4a8 100644 --- a/src/main/java/com/example/springhw32/repository/CommentRepository.java +++ b/src/main/java/com/example/springhw32/repository/CommentRepository.java @@ -1,5 +1,12 @@ package com.example.springhw32.repository; -public interface CommentRepository { +import com.example.springhw32.dto.CommentDto; +import com.example.springhw32.entity.Comment; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +public interface CommentRepository extends JpaRepository { + + List findAllByPostId(Long postId); } diff --git a/src/main/java/com/example/springhw32/repository/PostRepository.java b/src/main/java/com/example/springhw32/repository/PostRepository.java index 14b8546..0b49996 100644 --- a/src/main/java/com/example/springhw32/repository/PostRepository.java +++ b/src/main/java/com/example/springhw32/repository/PostRepository.java @@ -1,5 +1,16 @@ package com.example.springhw32.repository; -public interface PostRepository { +import com.example.springhw32.dto.PostDto; +import com.example.springhw32.entity.Post; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +public interface PostRepository extends JpaRepository { + + List findAllByOrderByPostedAtDesc(); + + List findAllByUserId(Long userId); + + List findAllByOrderByCommentCountDesc(); } diff --git a/src/main/java/com/example/springhw32/repository/UserRepository.java b/src/main/java/com/example/springhw32/repository/UserRepository.java index 877a215..c5d6d62 100644 --- a/src/main/java/com/example/springhw32/repository/UserRepository.java +++ b/src/main/java/com/example/springhw32/repository/UserRepository.java @@ -1,5 +1,8 @@ package com.example.springhw32.repository; -public interface UserRepository { +import com.example.springhw32.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { } diff --git a/src/main/java/com/example/springhw32/service/CommentService.java b/src/main/java/com/example/springhw32/service/CommentService.java index ec0c937..e630c06 100644 --- a/src/main/java/com/example/springhw32/service/CommentService.java +++ b/src/main/java/com/example/springhw32/service/CommentService.java @@ -1,5 +1,51 @@ package com.example.springhw32.service; +import com.example.springhw32.dto.CommentDto; +import com.example.springhw32.dto.PostDto; +import com.example.springhw32.entity.Comment; +import com.example.springhw32.entity.Post; +import com.example.springhw32.repository.CommentRepository; +import com.example.springhw32.repository.PostRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor public class CommentService { + private final CommentRepository commentRepository; + private final PostRepository postRepository; + + // 댓글 작성 + public CommentDto addComment(CommentDto commentDto, Long postId) { + Post post = postRepository.findById(postId).orElseThrow(NullPointerException::new); + + Comment comment = new Comment(); + comment.setComment(commentDto.getComment()); + comment.setPost(post); + commentRepository.save(comment); + + post.setCommentCount(post.getCommentCount() + 1); + postRepository.save(post); + + return commentDto; + } + + // 특정 게시글에 작성된 댓글 조회 + public List getAllComments(Long postId) { + return commentRepository.findAllByPostId(postId).stream() + .map(this::convertToDto) + .collect(Collectors.toList()); + } + + // Entity -> Dto + private CommentDto convertToDto(Comment comment) { + CommentDto commentDto = new CommentDto(); + commentDto.setComment(comment.getComment()); + return commentDto; + } } diff --git a/src/main/java/com/example/springhw32/service/PostService.java b/src/main/java/com/example/springhw32/service/PostService.java index b029d55..42a563d 100644 --- a/src/main/java/com/example/springhw32/service/PostService.java +++ b/src/main/java/com/example/springhw32/service/PostService.java @@ -1,5 +1,66 @@ package com.example.springhw32.service; +import com.example.springhw32.dto.PostDto; +import com.example.springhw32.entity.Post; +import com.example.springhw32.entity.User; +import com.example.springhw32.repository.PostRepository; +import com.example.springhw32.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor public class PostService { + private final PostRepository postRepository; + private final UserRepository userRepository; + + // 글 작성 + public PostDto createPost(PostDto postDto, Long userId) { + User user = userRepository.findById(userId).orElseThrow(NullPointerException::new); + + Post post = new Post(); + post.setTitle(postDto.getTitle()); + post.setContent(postDto.getContent()); + post.setCommentCount(0); + post.setPostedAt(LocalDateTime.now()); + post.setUser(user); + postRepository.save(post); + + return postDto; + } + + // 최신순으로 글 조회 + public List findAllPostsByOrderByPostedAtDesc() { + return postRepository.findAllByOrderByPostedAtDesc().stream() + .map(this::convertToDto) + .collect(Collectors.toList()); + } + + // 특정 회원이 작성한 글 조회 + public List findAllPostsByUserId(Long userId) { + return postRepository.findAllByUserId(userId).stream() + .map(this::convertToDto) + .collect(Collectors.toList()); + } + + // 댓글 많은 순으로 정렬 조회 + public List findAllPostsByOrderByCommentCountDesc() { + return postRepository.findAllByOrderByCommentCountDesc().stream() + .map(this::convertToDto) + .collect(Collectors.toList()); + } + + // Entity -> Dto + private PostDto convertToDto(Post post) { + PostDto postDto = new PostDto(); + postDto.setTitle(post.getTitle()); + postDto.setContent(post.getContent()); + postDto.setCommentCount(post.getCommentCount()); + return postDto; + } } diff --git a/src/main/java/com/example/springhw32/service/UserService.java b/src/main/java/com/example/springhw32/service/UserService.java index 8badccf..e9261ef 100644 --- a/src/main/java/com/example/springhw32/service/UserService.java +++ b/src/main/java/com/example/springhw32/service/UserService.java @@ -1,5 +1,24 @@ package com.example.springhw32.service; +import com.example.springhw32.dto.UserDto; +import com.example.springhw32.entity.User; +import com.example.springhw32.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor public class UserService { + private final UserRepository userRepository; + + // 회원가입 + public UserDto join(UserDto userDto) { + User user = new User(); + user.setUsername(userDto.getUsername()); + user.setPassword(userDto.getPassword()); + userRepository.save(user); + + return userDto; + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 9b78d0c..d2044e0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,13 +1,13 @@ spring: datasource: - url: jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 - username: your_username - password: your_password + url: jdbc:mysql://localhost:3306/spring_study?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 + username: root + password: kimna04! driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: - ddl-auto: create + ddl-auto: update show-sql: true properties: hibernate: From 6d8f77d576aa126ae3f849b2e032afb8288465dd Mon Sep 17 00:00:00 2001 From: Kim na young Date: Sun, 27 Oct 2024 23:43:55 +0900 Subject: [PATCH 2/3] hw3-2 --- .../java/com/example/springhw32/controller/UserController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/example/springhw32/controller/UserController.java b/src/main/java/com/example/springhw32/controller/UserController.java index 6c048fb..c75b3cc 100644 --- a/src/main/java/com/example/springhw32/controller/UserController.java +++ b/src/main/java/com/example/springhw32/controller/UserController.java @@ -13,6 +13,7 @@ public class UserController { private final UserService userService; + // 회원 가입 @PostMapping("/users") public UserDto join(@ModelAttribute UserDto userDto) { return userService.join(userDto); From 150ae76fad19aa137a9d5f0a0eeeb2a8f57c1047 Mon Sep 17 00:00:00 2001 From: Kim na young Date: Tue, 29 Oct 2024 11:44:37 +0900 Subject: [PATCH 3/3] hw3-2-1 --- src/main/resources/application.yml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 src/main/resources/application.yml diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index d2044e0..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,15 +0,0 @@ -spring: - datasource: - url: jdbc:mysql://localhost:3306/spring_study?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 - username: root - password: kimna04! - driver-class-name: com.mysql.cj.jdbc.Driver - - jpa: - hibernate: - ddl-auto: update - show-sql: true - properties: - hibernate: - format_sql: true - dialect: org.hibernate.dialect.MySQL8Dialect \ No newline at end of file