diff --git a/.gitignore b/.gitignore index c2065bc..a04fa92 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ bin/ *.iws *.iml *.ipr +*.yml out/ !**/src/main/**/out/ !**/src/test/**/out/ diff --git a/src/main/java/com/example/springhw32/controller/CommentController.java b/src/main/java/com/example/springhw32/controller/CommentController.java index 0ee065d..6cf81a9 100644 --- a/src/main/java/com/example/springhw32/controller/CommentController.java +++ b/src/main/java/com/example/springhw32/controller/CommentController.java @@ -1,5 +1,34 @@ 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.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RequestMapping("/posts/comments") +@RestController +@RequiredArgsConstructor public class CommentController { + private final CommentService commentService; + + // 댓글 작성 + @PostMapping + public CommentDto createComment(@ModelAttribute CommentDto commentDto, @RequestParam Long postId) { + return commentService.createComment(commentDto, postId); + } + + // 특정 게시물에 달린 모든 댓글 조회 + @GetMapping("/{postId}") + public List findAllByPostId(@PathVariable Long postId) { + return commentService.findAllByPostId(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..06fd209 100644 --- a/src/main/java/com/example/springhw32/controller/PostController.java +++ b/src/main/java/com/example/springhw32/controller/PostController.java @@ -1,5 +1,44 @@ 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.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RequestMapping("/posts") +@RestController +@RequiredArgsConstructor public class PostController { + private final PostService postService; + + // 글 작성 + @PostMapping + public PostDto createPost(@ModelAttribute PostDto postDto, Long userId) { + return postService.createPost(postDto, userId); + } + + // 최신순 글 조회 + @GetMapping + public List finaAllByCreatedAtDesc() { + return postService.finaAllByCreatedAtDesc(); + } + + // 작성자 글 조회 + @GetMapping("/{writer}") + public List findAllByUsername(@PathVariable("writer") String username) { + return postService.findAllByUsername(username); + } + // 댓글 많은 순 글 조회 + @GetMapping("/comments") + public List findAllByOrderByCommentCountDesc() { + return postService.findAllByOrderByCommentCountDesc(); + } } diff --git a/src/main/java/com/example/springhw32/controller/UserController.java b/src/main/java/com/example/springhw32/controller/UserController.java index 3b321ac..bfe4671 100644 --- a/src/main/java/com/example/springhw32/controller/UserController.java +++ b/src/main/java/com/example/springhw32/controller/UserController.java @@ -1,5 +1,24 @@ 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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequestMapping("/users") +@RestController +@RequiredArgsConstructor public class UserController { + private final UserService userService; + + // 회원가입 + @PostMapping + 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..2c525ee 100644 --- a/src/main/java/com/example/springhw32/dto/CommentDto.java +++ b/src/main/java/com/example/springhw32/dto/CommentDto.java @@ -1,5 +1,11 @@ package com.example.springhw32.dto; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class CommentDto { + private String content; } diff --git a/src/main/java/com/example/springhw32/dto/PostDto.java b/src/main/java/com/example/springhw32/dto/PostDto.java index cde1eda..b67f5d0 100644 --- a/src/main/java/com/example/springhw32/dto/PostDto.java +++ b/src/main/java/com/example/springhw32/dto/PostDto.java @@ -1,5 +1,20 @@ 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 Long commentCount; + + private LocalDateTime createdAt; + } 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..0d3184d 100644 --- a/src/main/java/com/example/springhw32/entity/Comment.java +++ b/src/main/java/com/example/springhw32/entity/Comment.java @@ -1,5 +1,28 @@ package com.example.springhw32.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; + +@Getter +@Setter +@Entity public class Comment { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long CommentId; + + @ManyToOne + private Post post; + + @NonNull + private String content; + + } diff --git a/src/main/java/com/example/springhw32/entity/Post.java b/src/main/java/com/example/springhw32/entity/Post.java index 38b5e81..2d3b00f 100644 --- a/src/main/java/com/example/springhw32/entity/Post.java +++ b/src/main/java/com/example/springhw32/entity/Post.java @@ -1,5 +1,38 @@ package com.example.springhw32.entity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity public class Post { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long postId; + + @ManyToOne + private User user; + + @Column(nullable = false) + private String title; + + @Column(nullable = false) + private String content; + + @Column(nullable = false) + private Long commentCount = 0L; + + @Column(nullable = false) + private LocalDateTime createdAt; + } diff --git a/src/main/java/com/example/springhw32/entity/User.java b/src/main/java/com/example/springhw32/entity/User.java index 447989d..8b80fca 100644 --- a/src/main/java/com/example/springhw32/entity/User.java +++ b/src/main/java/com/example/springhw32/entity/User.java @@ -1,5 +1,27 @@ package com.example.springhw32.entity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; + +@Getter +@Setter +@Entity public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(unique = true, 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..6f12be3 100644 --- a/src/main/java/com/example/springhw32/repository/CommentRepository.java +++ b/src/main/java/com/example/springhw32/repository/CommentRepository.java @@ -1,5 +1,13 @@ package com.example.springhw32.repository; -public interface CommentRepository { +import com.example.springhw32.entity.Comment; +import com.example.springhw32.entity.Post; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface CommentRepository extends JpaRepository { + List findAllByPost_PostId(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..df6cffa 100644 --- a/src/main/java/com/example/springhw32/repository/PostRepository.java +++ b/src/main/java/com/example/springhw32/repository/PostRepository.java @@ -1,5 +1,17 @@ package com.example.springhw32.repository; -public interface PostRepository { +import com.example.springhw32.dto.PostDto; +import com.example.springhw32.entity.Post; +import org.hibernate.boot.archive.internal.JarProtocolArchiveDescriptor; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface PostRepository extends JpaRepository { + + List findAllByOrderByCreatedAtDesc(); + List findAllByUser_Username(String username); + 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..3e96a38 100644 --- a/src/main/java/com/example/springhw32/repository/UserRepository.java +++ b/src/main/java/com/example/springhw32/repository/UserRepository.java @@ -1,5 +1,13 @@ package com.example.springhw32.repository; -public interface UserRepository { +import com.example.springhw32.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + + +@Repository +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..db80a2c 100644 --- a/src/main/java/com/example/springhw32/service/CommentService.java +++ b/src/main/java/com/example/springhw32/service/CommentService.java @@ -1,5 +1,52 @@ package com.example.springhw32.service; +import com.example.springhw32.dto.CommentDto; +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 org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Transactional +@RequiredArgsConstructor public class CommentService { + private final PostRepository postRepository; + private final CommentRepository commentRepository; + + public CommentDto createComment(CommentDto commentDto, Long postId){ + Post post = postRepository.findById(postId).orElseThrow(); + + Comment comment = new Comment(); + comment.setContent(commentDto.getContent()); + comment.setPost(post); + commentRepository.save(comment); + + // 댓글 수 증가 + post.setCommentCount(post.getCommentCount() + 1L); + postRepository.save(post); + + return commentDto; + } + + public List findAllByPostId(Long postId){ + return commentRepository.findAllByPost_PostId(postId).stream() + .map(this::convertToCommentDto) + .collect(Collectors.toList()); + } + + + public CommentDto convertToCommentDto(Comment comment) { + CommentDto commentDto = new CommentDto(); + + commentDto.setContent(comment.getContent()); + + 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..29cb18d 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 org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Transactional +@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(); + + Post post = new Post(); + post.setUser(user); + post.setTitle(postDto.getTitle()); + post.setContent(postDto.getContent()); + post.setCreatedAt(LocalDateTime.now()); + postRepository.save(post); + + return postDto; + } + + public List finaAllByCreatedAtDesc(){ + return postRepository.findAllByOrderByCreatedAtDesc().stream() + .map(this::convertToPostDto) + .collect(Collectors.toList()); + } + + public List findAllByUsername(String username) { + return postRepository.findAllByUser_Username(username).stream() + .map(this::convertToPostDto) + .collect(Collectors.toList()); + } + + public List findAllByOrderByCommentCountDesc() { + return postRepository.findAllByOrderByCommentCountDesc().stream() + .map(this::convertToPostDto) + .collect(Collectors.toList()); + } + + public PostDto convertToPostDto(Post post) { + PostDto postDto = new PostDto(); + + postDto.setTitle(post.getTitle()); + postDto.setContent(post.getContent()); + postDto.setCommentCount(post.getCommentCount()); + postDto.setCreatedAt(post.getCreatedAt()); + + 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..d4059b9 100644 --- a/src/main/java/com/example/springhw32/service/UserService.java +++ b/src/main/java/com/example/springhw32/service/UserService.java @@ -1,5 +1,26 @@ 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; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor public class UserService { + private final UserRepository userRepository; + + public UserDto join(UserDto userDto) { + User newUser = new User(); + newUser.setUsername(userDto.getUsername()); + newUser.setPassword(userDto.getPassword()); + + userRepository.save(newUser); + return userDto; + } + } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 9b78d0c..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,15 +0,0 @@ -spring: - datasource: - url: jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 - username: your_username - password: your_password - driver-class-name: com.mysql.cj.jdbc.Driver - - jpa: - hibernate: - ddl-auto: create - show-sql: true - properties: - hibernate: - format_sql: true - dialect: org.hibernate.dialect.MySQL8Dialect \ No newline at end of file