From aa28209e92427a36b270a6c401c8e2e97dbef59f Mon Sep 17 00:00:00 2001 From: hwangsea <134906042+hwangsea@users.noreply.github.com> Date: Tue, 29 Oct 2024 04:46:01 +0900 Subject: [PATCH 1/3] 3-2 --- .gitignore | 3 + .../controller/CommentController.java | 23 +++++++ .../springhw32/controller/PostController.java | 35 +++++++++++ .../springhw32/controller/UserController.java | 20 ++++++- .../example/springhw32/dto/CommentDto.java | 9 +++ .../com/example/springhw32/dto/PostDto.java | 13 ++++ .../com/example/springhw32/dto/UserDto.java | 15 ++++- .../example/springhw32/entity/Comment.java | 18 ++++++ .../com/example/springhw32/entity/Post.java | 27 +++++++++ .../com/example/springhw32/entity/User.java | 22 ++++++- .../repository/CommentRepository.java | 9 ++- .../springhw32/repository/PostRepository.java | 10 +++- .../springhw32/repository/UserRepository.java | 11 +++- .../springhw32/service/CommentService.java | 47 +++++++++++++++ .../springhw32/service/PostService.java | 60 +++++++++++++++++++ .../springhw32/service/UserService.java | 40 +++++++++++++ src/main/resources/application.yml | 6 +- 17 files changed, 359 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index c2065bc..6ac14b0 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ out/ ### VS Code ### .vscode/ + +# .gitignore 파일에 추가 +application.yml \ No newline at end of file diff --git a/src/main/java/com/example/springhw32/controller/CommentController.java b/src/main/java/com/example/springhw32/controller/CommentController.java index 0ee065d..c6eeb05 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 +@RequestMapping("/posts/comments") +@RequiredArgsConstructor public class CommentController { + private final CommentService commentService; + + // 댓글 작성 + @PostMapping + public CommentDto createComment(@RequestBody CommentDto commentDto) { + return commentService.createComment(commentDto); // 댓글 생성 + } + + // 특정 게시물에 달린 모든 댓글 조회 + @GetMapping("/{postId}") + public List getAllCommentsByPostId(@PathVariable Long postId) { + return commentService.getAllCommentsByPostId(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..7a5883a 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 +@RequestMapping("/posts") +@RequiredArgsConstructor public class PostController { + private final PostService postService; + + // 글 작성 + @PostMapping + public PostDto createPost(@RequestBody PostDto postDto, @RequestParam Long userId) { + return postService.createPost(postDto, userId); + } + + // 최신순 글 조회 + @GetMapping + public List getPostsSortedByDate() { + return postService.getPostsSortedByDate(); + } + + // 작성자 글 조회 + @GetMapping("/{writer}") + public List getPostsByWriter(@PathVariable String writer) { + return postService.getPostsByWriter(writer); + } + + // 댓글 많은 순 글 조회 + @GetMapping("/comments") + public List getPostsSortedByComments() { + return postService.getPostsSortedByComments(); + } } diff --git a/src/main/java/com/example/springhw32/controller/UserController.java b/src/main/java/com/example/springhw32/controller/UserController.java index 3b321ac..3c88a7c 100644 --- a/src/main/java/com/example/springhw32/controller/UserController.java +++ b/src/main/java/com/example/springhw32/controller/UserController.java @@ -1,5 +1,23 @@ 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; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/users") public class UserController { -} + private final UserService userService; + + @PostMapping + public UserDto join(@ModelAttribute UserDto userDto) { + return userService.join(userDto); + } + +} \ No newline at end of file diff --git a/src/main/java/com/example/springhw32/dto/CommentDto.java b/src/main/java/com/example/springhw32/dto/CommentDto.java index a9d04fa..daa7d73 100644 --- a/src/main/java/com/example/springhw32/dto/CommentDto.java +++ b/src/main/java/com/example/springhw32/dto/CommentDto.java @@ -1,5 +1,14 @@ package com.example.springhw32.dto; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class CommentDto { + private Long postId; + + private String writer; + 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..8dc6afc 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; + +@Getter +@Setter public class PostDto { + private Long postId; + + private String title; + + private String content; + + private String writer; + 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..d3843de 100644 --- a/src/main/java/com/example/springhw32/dto/UserDto.java +++ b/src/main/java/com/example/springhw32/dto/UserDto.java @@ -1,5 +1,18 @@ package com.example.springhw32.dto; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor public class UserDto { -} + private String username; + + private String password; + + private String nickname; + +} \ No newline at end of file diff --git a/src/main/java/com/example/springhw32/entity/Comment.java b/src/main/java/com/example/springhw32/entity/Comment.java index be818a0..0441685 100644 --- a/src/main/java/com/example/springhw32/entity/Comment.java +++ b/src/main/java/com/example/springhw32/entity/Comment.java @@ -1,5 +1,23 @@ 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; + + private String content; + + private String writer; + + @ManyToOne + @JoinColumn(name = "post_id") + private Post post; } diff --git a/src/main/java/com/example/springhw32/entity/Post.java b/src/main/java/com/example/springhw32/entity/Post.java index 38b5e81..7cf9677 100644 --- a/src/main/java/com/example/springhw32/entity/Post.java +++ b/src/main/java/com/example/springhw32/entity/Post.java @@ -1,5 +1,32 @@ package com.example.springhw32.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter public class Post { + @Id + @GeneratedValue(strategy= GenerationType.AUTO) + private Long id; + + private String title; + + private String content; + + private String writer; + + private int commentCount; + + private LocalDateTime createdAt; + + private LocalDateTime updatedAt; } diff --git a/src/main/java/com/example/springhw32/entity/User.java b/src/main/java/com/example/springhw32/entity/User.java index 447989d..af06838 100644 --- a/src/main/java/com/example/springhw32/entity/User.java +++ b/src/main/java/com/example/springhw32/entity/User.java @@ -1,5 +1,25 @@ 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, unique = true) + private String username; + + @Column(nullable = false) + private String password; + + @Column(nullable = false, unique = true) + private String nickname; + +} \ No newline at end of file diff --git a/src/main/java/com/example/springhw32/repository/CommentRepository.java b/src/main/java/com/example/springhw32/repository/CommentRepository.java index 83dcd99..9607a7e 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.entity.Comment; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +public interface CommentRepository extends JpaRepository { + // 특정 게시물에 달린 모든 댓글 조회 + List findByPostId(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..9b75738 100644 --- a/src/main/java/com/example/springhw32/repository/PostRepository.java +++ b/src/main/java/com/example/springhw32/repository/PostRepository.java @@ -1,5 +1,13 @@ package com.example.springhw32.repository; -public interface PostRepository { +import com.example.springhw32.entity.Post; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +public interface PostRepository extends JpaRepository { + List findByWriter(String writer); + List findAllByOrderByCreatedAtDesc(); + 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..5208dc5 100644 --- a/src/main/java/com/example/springhw32/repository/UserRepository.java +++ b/src/main/java/com/example/springhw32/repository/UserRepository.java @@ -1,5 +1,14 @@ 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; + +@Repository +public interface UserRepository extends JpaRepository { + + boolean existsByUsername(String username); + + boolean existsByNickname(String nickname); } diff --git a/src/main/java/com/example/springhw32/service/CommentService.java b/src/main/java/com/example/springhw32/service/CommentService.java index ec0c937..ca8485a 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 jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor public class CommentService { + private final CommentRepository commentRepository; + private final PostRepository postRepository; + + // 댓글 작성 + @Transactional + public CommentDto createComment(CommentDto commentDto) { + Post post = postRepository.findById(commentDto.getPostId()) + .orElseThrow(() -> new IllegalArgumentException("Post not found")); + + Comment comment = new Comment(); + comment.setContent(commentDto.getContent()); + comment.setWriter(commentDto.getWriter()); + comment.setPost(post); + commentRepository.save(comment); + commentDto.setPostId(post.getId()); + return commentDto; + } + + // 특정 게시물에 달린 모든 댓글 조회 + public List getAllCommentsByPostId(Long postId) { + return commentRepository.findByPostId(postId).stream() + .map(comment -> mapToDto(comment, postId)) + .collect(Collectors.toList()); + } + + // Dto로 매핑 + private CommentDto mapToDto(Comment comment, Long postId) { + CommentDto dto = new CommentDto(); + dto.setPostId(postId); + dto.setContent(comment.getContent()); + dto.setWriter(comment.getWriter()); + return dto; + } } diff --git a/src/main/java/com/example/springhw32/service/PostService.java b/src/main/java/com/example/springhw32/service/PostService.java index b029d55..02396d9 100644 --- a/src/main/java/com/example/springhw32/service/PostService.java +++ b/src/main/java/com/example/springhw32/service/PostService.java @@ -1,5 +1,65 @@ package com.example.springhw32.service; +import com.example.springhw32.dto.PostDto; +import com.example.springhw32.entity.Post; +import com.example.springhw32.repository.PostRepository; +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 +@RequiredArgsConstructor public class PostService { + private final PostRepository postRepository; + + // 글 작성 + @Transactional + public PostDto createPost(PostDto postDto, Long userId) { + Post post = new Post(); + post.setTitle(postDto.getTitle()); + post.setContent(postDto.getContent()); + post.setWriter(postDto.getWriter()); + post.setCommentCount(0); + post.setCreatedAt(LocalDateTime.now()); + postRepository.save(post); + postDto.setPostId(post.getId()); + return postDto; + } + + // 최신순 글 조회 + public List getPostsSortedByDate() { + return postRepository.findAllByOrderByCreatedAtDesc().stream() + .map(this::mapToDto) + .collect(Collectors.toList()); + } + + // 작성자 글 조회 + public List getPostsByWriter(String writer) { + return postRepository.findByWriter(writer).stream() + .map(this::mapToDto) + .collect(Collectors.toList()); + } + + // 댓글 많은 순 조회 + public List getPostsSortedByComments() { + return postRepository.findAllByOrderByCommentCountDesc().stream() + .map(this::mapToDto) + .collect(Collectors.toList()); + } + + // Dto로 매핑 + private PostDto mapToDto(Post post) { + PostDto dto = new PostDto(); + dto.setPostId(post.getId()); + dto.setTitle(post.getTitle()); + dto.setContent(post.getContent()); + dto.setWriter(post.getWriter()); + dto.setCommentCount(post.getCommentCount()); + return dto; + } } diff --git a/src/main/java/com/example/springhw32/service/UserService.java b/src/main/java/com/example/springhw32/service/UserService.java index 8badccf..bacfb3b 100644 --- a/src/main/java/com/example/springhw32/service/UserService.java +++ b/src/main/java/com/example/springhw32/service/UserService.java @@ -1,5 +1,45 @@ package com.example.springhw32.service; +import com.example.springhw32.dto.UserDto; +import com.example.springhw32.entity.User; +import com.example.springhw32.repository.UserRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor public class UserService { + private final UserRepository userRepository; + + @Transactional + public UserDto join(UserDto userDto) { + + if (userDto.getUsername() == null || userDto.getUsername().isEmpty()) { + throw new RuntimeException("아이디를 입력해 주세요."); + } + if (userDto.getPassword() == null || userDto.getPassword().isEmpty()) { + throw new RuntimeException("비밀번호를 입력해 주세요."); + } + if (userDto.getNickname() == null || userDto.getNickname().isEmpty()) { + throw new RuntimeException("닉네임을 입력해 주세요."); + } + + if (userRepository.existsByUsername(userDto.getUsername())) { + throw new RuntimeException("아이디가 이미 존재합니다."); + } + if (userRepository.existsByNickname(userDto.getNickname())) { + throw new RuntimeException("닉네임이 이미 존재합니다."); + } + + User user = new User(); + user.setUsername(userDto.getUsername()); + user.setPassword(userDto.getPassword()); + user.setNickname(userDto.getNickname()); + + userRepository.save(user); + return userDto; + } + } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 9b78d0c..5127d0f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,8 +1,8 @@ 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/demo?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 + username: root + password: Gofla452! driver-class-name: com.mysql.cj.jdbc.Driver jpa: From 23e8b8e28c990d529f4144cc54e445cd2846182e Mon Sep 17 00:00:00 2001 From: hwangsea <134906042+hwangsea@users.noreply.github.com> Date: Sat, 16 Nov 2024 21:40:38 +0900 Subject: [PATCH 2/3] Refactor(All): Optimize code structure --- .../controller/CommentController.java | 8 ++--- .../springhw32/controller/PostController.java | 5 ++- .../springhw32/controller/UserController.java | 4 +++ .../example/springhw32/dto/CommentDto.java | 4 ++- .../com/example/springhw32/dto/PostDto.java | 8 ++++- .../example/springhw32/entity/Comment.java | 8 +++-- .../com/example/springhw32/entity/Post.java | 20 +++++------ .../repository/CommentRepository.java | 6 ++-- .../springhw32/repository/PostRepository.java | 2 +- .../springhw32/repository/UserRepository.java | 4 +++ .../springhw32/service/CommentService.java | 35 ++++++++++++------- .../springhw32/service/PostService.java | 30 +++++++++------- .../springhw32/service/UserService.java | 22 ++++++++---- src/main/resources/application.yml | 15 -------- 14 files changed, 99 insertions(+), 72 deletions(-) delete mode 100644 src/main/resources/application.yml diff --git a/src/main/java/com/example/springhw32/controller/CommentController.java b/src/main/java/com/example/springhw32/controller/CommentController.java index c6eeb05..a594498 100644 --- a/src/main/java/com/example/springhw32/controller/CommentController.java +++ b/src/main/java/com/example/springhw32/controller/CommentController.java @@ -15,14 +15,14 @@ public class CommentController { private final CommentService commentService; // 댓글 작성 - @PostMapping - public CommentDto createComment(@RequestBody CommentDto commentDto) { - return commentService.createComment(commentDto); // 댓글 생성 + @PostMapping("/{postId}") + public CommentDto createComment(@RequestBody CommentDto commentDto, @PathVariable Long postId) { + return commentService.createComment(commentDto, postId); } // 특정 게시물에 달린 모든 댓글 조회 @GetMapping("/{postId}") public List getAllCommentsByPostId(@PathVariable Long postId) { - return commentService.getAllCommentsByPostId(postId); // 댓글 목록 조회 + return commentService.getAllCommentsByPostId(postId); } } diff --git a/src/main/java/com/example/springhw32/controller/PostController.java b/src/main/java/com/example/springhw32/controller/PostController.java index 7a5883a..c0c38fa 100644 --- a/src/main/java/com/example/springhw32/controller/PostController.java +++ b/src/main/java/com/example/springhw32/controller/PostController.java @@ -16,10 +16,9 @@ public class PostController { // 글 작성 @PostMapping - public PostDto createPost(@RequestBody PostDto postDto, @RequestParam Long userId) { - return postService.createPost(postDto, userId); + public PostDto createPost(@RequestBody PostDto postDto, @RequestParam String writerNickname) { + return postService.createPost(postDto, writerNickname); } - // 최신순 글 조회 @GetMapping public List getPostsSortedByDate() { diff --git a/src/main/java/com/example/springhw32/controller/UserController.java b/src/main/java/com/example/springhw32/controller/UserController.java index 3c88a7c..54e80cb 100644 --- a/src/main/java/com/example/springhw32/controller/UserController.java +++ b/src/main/java/com/example/springhw32/controller/UserController.java @@ -20,4 +20,8 @@ public UserDto join(@ModelAttribute UserDto userDto) { return userService.join(userDto); } + @PostMapping("/login") + public String login(@ModelAttribute UserDto userDto) { + return userService.login(userDto); + } } \ No newline at end of file diff --git a/src/main/java/com/example/springhw32/dto/CommentDto.java b/src/main/java/com/example/springhw32/dto/CommentDto.java index daa7d73..39cc8af 100644 --- a/src/main/java/com/example/springhw32/dto/CommentDto.java +++ b/src/main/java/com/example/springhw32/dto/CommentDto.java @@ -6,9 +6,11 @@ @Getter @Setter public class CommentDto { + private Long commentId; + private Long postId; - private String writer; + private Long userId; 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 8dc6afc..41b7a4f 100644 --- a/src/main/java/com/example/springhw32/dto/PostDto.java +++ b/src/main/java/com/example/springhw32/dto/PostDto.java @@ -3,6 +3,8 @@ import lombok.Getter; import lombok.Setter; +import java.time.LocalDateTime; + @Getter @Setter public class PostDto { @@ -14,5 +16,9 @@ public class PostDto { private String writer; - private int commentCount; + private Long commentCount; + + private LocalDateTime createdAt; + + private LocalDateTime updatedAt; } diff --git a/src/main/java/com/example/springhw32/entity/Comment.java b/src/main/java/com/example/springhw32/entity/Comment.java index 0441685..2445f21 100644 --- a/src/main/java/com/example/springhw32/entity/Comment.java +++ b/src/main/java/com/example/springhw32/entity/Comment.java @@ -11,13 +11,15 @@ public class Comment { @Id @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; + private Long commentId; + @Column(nullable = false) private String content; - private String writer; + @ManyToOne + @JoinColumn(name = "userId", nullable = false) + private User user; @ManyToOne - @JoinColumn(name = "post_id") private Post post; } diff --git a/src/main/java/com/example/springhw32/entity/Post.java b/src/main/java/com/example/springhw32/entity/Post.java index 7cf9677..e3fb445 100644 --- a/src/main/java/com/example/springhw32/entity/Post.java +++ b/src/main/java/com/example/springhw32/entity/Post.java @@ -1,30 +1,30 @@ package com.example.springhw32.entity; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; -@Entity @Getter @Setter +@Entity public class Post { @Id - @GeneratedValue(strategy= GenerationType.AUTO) - private Long id; + @GeneratedValue(strategy = GenerationType.AUTO) + private Long postId; + @ManyToOne + private User user; + + @Column(nullable = false) private String title; + @Column(nullable = false) private String content; - private String writer; - - private int commentCount; + private Long commentCount = 0L; private LocalDateTime createdAt; diff --git a/src/main/java/com/example/springhw32/repository/CommentRepository.java b/src/main/java/com/example/springhw32/repository/CommentRepository.java index 9607a7e..8dea649 100644 --- a/src/main/java/com/example/springhw32/repository/CommentRepository.java +++ b/src/main/java/com/example/springhw32/repository/CommentRepository.java @@ -1,12 +1,12 @@ package com.example.springhw32.repository; import com.example.springhw32.entity.Comment; +import com.example.springhw32.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface CommentRepository extends JpaRepository { // 특정 게시물에 달린 모든 댓글 조회 - List findByPostId(Long postId); -} - + List findByPost_PostId(Long postId); +} \ No newline at end of file diff --git a/src/main/java/com/example/springhw32/repository/PostRepository.java b/src/main/java/com/example/springhw32/repository/PostRepository.java index 9b75738..93ccb18 100644 --- a/src/main/java/com/example/springhw32/repository/PostRepository.java +++ b/src/main/java/com/example/springhw32/repository/PostRepository.java @@ -6,7 +6,7 @@ import java.util.List; public interface PostRepository extends JpaRepository { - List findByWriter(String writer); + List findByUser_Nickname(String nickname); List findAllByOrderByCreatedAtDesc(); 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 5208dc5..8de1316 100644 --- a/src/main/java/com/example/springhw32/repository/UserRepository.java +++ b/src/main/java/com/example/springhw32/repository/UserRepository.java @@ -4,11 +4,15 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface UserRepository extends JpaRepository { + User findByUsername(String username); boolean existsByUsername(String username); boolean existsByNickname(String nickname); + Optional findByNickname(String nickname); } diff --git a/src/main/java/com/example/springhw32/service/CommentService.java b/src/main/java/com/example/springhw32/service/CommentService.java index ca8485a..b8b1df8 100644 --- a/src/main/java/com/example/springhw32/service/CommentService.java +++ b/src/main/java/com/example/springhw32/service/CommentService.java @@ -3,13 +3,16 @@ import com.example.springhw32.dto.CommentDto; import com.example.springhw32.entity.Comment; import com.example.springhw32.entity.Post; +import com.example.springhw32.entity.User; import com.example.springhw32.repository.CommentRepository; import com.example.springhw32.repository.PostRepository; +import com.example.springhw32.repository.UserRepository; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; +import java.util.NoSuchElementException; import java.util.stream.Collectors; @Service @@ -18,35 +21,41 @@ public class CommentService { private final CommentRepository commentRepository; private final PostRepository postRepository; + private final UserRepository userRepository; - // 댓글 작성 @Transactional - public CommentDto createComment(CommentDto commentDto) { - Post post = postRepository.findById(commentDto.getPostId()) - .orElseThrow(() -> new IllegalArgumentException("Post not found")); + public CommentDto createComment(CommentDto commentDto, Long postId) { + Post post = postRepository.findById(postId) + .orElseThrow(() -> new NoSuchElementException("Post not found")); + + User user = userRepository.findById(commentDto.getUserId()) + .orElseThrow(() -> new NoSuchElementException("User not found")); Comment comment = new Comment(); comment.setContent(commentDto.getContent()); - comment.setWriter(commentDto.getWriter()); + comment.setUser(user); comment.setPost(post); commentRepository.save(comment); - commentDto.setPostId(post.getId()); - return commentDto; + post.setCommentCount(post.getCommentCount() + 1L); + postRepository.save(post); + return mapToDto(comment); } + // 특정 게시물에 달린 모든 댓글 조회 public List getAllCommentsByPostId(Long postId) { - return commentRepository.findByPostId(postId).stream() - .map(comment -> mapToDto(comment, postId)) + return commentRepository.findByPost_PostId(postId).stream() + .map(this::mapToDto) .collect(Collectors.toList()); } - // Dto로 매핑 - private CommentDto mapToDto(Comment comment, Long postId) { + // Comment -> CommentDto 변환 + private CommentDto mapToDto(Comment comment) { CommentDto dto = new CommentDto(); - dto.setPostId(postId); + dto.setCommentId(comment.getCommentId()); + dto.setPostId(comment.getPost().getPostId()); + dto.setUserId(comment.getUser().getId()); dto.setContent(comment.getContent()); - dto.setWriter(comment.getWriter()); return dto; } } diff --git a/src/main/java/com/example/springhw32/service/PostService.java b/src/main/java/com/example/springhw32/service/PostService.java index 02396d9..9dd038a 100644 --- a/src/main/java/com/example/springhw32/service/PostService.java +++ b/src/main/java/com/example/springhw32/service/PostService.java @@ -2,10 +2,11 @@ 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; @@ -16,19 +17,22 @@ public class PostService { private final PostRepository postRepository; + private final UserRepository userRepository; // 글 작성 - @Transactional - public PostDto createPost(PostDto postDto, Long userId) { + public PostDto createPost(PostDto postDto, String writerNickname) { + User user = userRepository.findByNickname(writerNickname) + .orElseThrow(() -> new IllegalArgumentException("User not found")); + Post post = new Post(); + post.setUser(user); post.setTitle(postDto.getTitle()); post.setContent(postDto.getContent()); - post.setWriter(postDto.getWriter()); - post.setCommentCount(0); post.setCreatedAt(LocalDateTime.now()); + post.setUpdatedAt(LocalDateTime.now()); postRepository.save(post); - postDto.setPostId(post.getId()); - return postDto; + + return mapToDto(post); } // 최신순 글 조회 @@ -40,26 +44,28 @@ public List getPostsSortedByDate() { // 작성자 글 조회 public List getPostsByWriter(String writer) { - return postRepository.findByWriter(writer).stream() + return postRepository.findByUser_Nickname(writer).stream() .map(this::mapToDto) .collect(Collectors.toList()); } - // 댓글 많은 순 조회 + // 댓글 많은 순 글 조회 public List getPostsSortedByComments() { return postRepository.findAllByOrderByCommentCountDesc().stream() .map(this::mapToDto) .collect(Collectors.toList()); } - // Dto로 매핑 + // Post -> PostDto 변환 private PostDto mapToDto(Post post) { PostDto dto = new PostDto(); - dto.setPostId(post.getId()); + dto.setPostId(post.getPostId()); dto.setTitle(post.getTitle()); dto.setContent(post.getContent()); - dto.setWriter(post.getWriter()); + dto.setWriter(post.getUser().getNickname()); dto.setCommentCount(post.getCommentCount()); + dto.setCreatedAt(post.getCreatedAt()); + dto.setUpdatedAt(post.getUpdatedAt()); return dto; } } diff --git a/src/main/java/com/example/springhw32/service/UserService.java b/src/main/java/com/example/springhw32/service/UserService.java index bacfb3b..95291ff 100644 --- a/src/main/java/com/example/springhw32/service/UserService.java +++ b/src/main/java/com/example/springhw32/service/UserService.java @@ -7,6 +7,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.NoSuchElementException; + @Service @RequiredArgsConstructor public class UserService { @@ -16,14 +18,14 @@ public class UserService { @Transactional public UserDto join(UserDto userDto) { - if (userDto.getUsername() == null || userDto.getUsername().isEmpty()) { - throw new RuntimeException("아이디를 입력해 주세요."); + if (userDto.getUsername().isBlank()) { + throw new NoSuchElementException("아이디를 입력해 주세요."); } - if (userDto.getPassword() == null || userDto.getPassword().isEmpty()) { - throw new RuntimeException("비밀번호를 입력해 주세요."); + if (userDto.getPassword().isBlank()) { + throw new NoSuchElementException("비밀번호를 입력해 주세요."); } - if (userDto.getNickname() == null || userDto.getNickname().isEmpty()) { - throw new RuntimeException("닉네임을 입력해 주세요."); + if (userDto.getNickname().isBlank()) { + throw new NoSuchElementException("닉네임을 입력해 주세요."); } if (userRepository.existsByUsername(userDto.getUsername())) { @@ -42,4 +44,12 @@ public UserDto join(UserDto userDto) { return userDto; } + public String login(UserDto userDto) { + User user = userRepository.findByUsername(userDto.getUsername()); + if (user != null && user.getPassword().equals(userDto.getPassword())) { + return user.getNickname() + " 님, 환영합니다!!"; + } + return "아이디 및 비밀번호가 일치하지 않습니다."; + } + } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 5127d0f..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,15 +0,0 @@ -spring: - datasource: - url: jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 - username: root - password: Gofla452! - 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 From 0743524c3a4fa04be15f907a2f1bf34ca1aae8b5 Mon Sep 17 00:00:00 2001 From: hwangsea <134906042+hwangsea@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:47:45 +0900 Subject: [PATCH 3/3] Refactor(All): Optimize code structure --- .../com/example/springhw32/controller/PostController.java | 4 ++-- src/main/java/com/example/springhw32/dto/UserDto.java | 1 + src/main/java/com/example/springhw32/service/PostService.java | 4 ++-- src/main/java/com/example/springhw32/service/UserService.java | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/springhw32/controller/PostController.java b/src/main/java/com/example/springhw32/controller/PostController.java index c0c38fa..eea12e4 100644 --- a/src/main/java/com/example/springhw32/controller/PostController.java +++ b/src/main/java/com/example/springhw32/controller/PostController.java @@ -16,8 +16,8 @@ public class PostController { // 글 작성 @PostMapping - public PostDto createPost(@RequestBody PostDto postDto, @RequestParam String writerNickname) { - return postService.createPost(postDto, writerNickname); + public PostDto createPost(@RequestBody PostDto postDto, @RequestParam String writer) { + return postService.createPost(postDto, writer); } // 최신순 글 조회 @GetMapping diff --git a/src/main/java/com/example/springhw32/dto/UserDto.java b/src/main/java/com/example/springhw32/dto/UserDto.java index d3843de..bc5192d 100644 --- a/src/main/java/com/example/springhw32/dto/UserDto.java +++ b/src/main/java/com/example/springhw32/dto/UserDto.java @@ -8,6 +8,7 @@ @Setter @NoArgsConstructor public class UserDto { + private Long userId; private String username; diff --git a/src/main/java/com/example/springhw32/service/PostService.java b/src/main/java/com/example/springhw32/service/PostService.java index 9dd038a..98c2964 100644 --- a/src/main/java/com/example/springhw32/service/PostService.java +++ b/src/main/java/com/example/springhw32/service/PostService.java @@ -20,8 +20,8 @@ public class PostService { private final UserRepository userRepository; // 글 작성 - public PostDto createPost(PostDto postDto, String writerNickname) { - User user = userRepository.findByNickname(writerNickname) + public PostDto createPost(PostDto postDto, String writer) { + User user = userRepository.findByNickname(writer) .orElseThrow(() -> new IllegalArgumentException("User not found")); Post post = new Post(); diff --git a/src/main/java/com/example/springhw32/service/UserService.java b/src/main/java/com/example/springhw32/service/UserService.java index 95291ff..f8a0882 100644 --- a/src/main/java/com/example/springhw32/service/UserService.java +++ b/src/main/java/com/example/springhw32/service/UserService.java @@ -39,8 +39,9 @@ public UserDto join(UserDto userDto) { user.setUsername(userDto.getUsername()); user.setPassword(userDto.getPassword()); user.setNickname(userDto.getNickname()); - userRepository.save(user); + + userDto.setUserId(user.getId()); return userDto; }