Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[12기 황경훈] 5주차 과제 - Spring 테스트 작성하기 #33

Merged
merged 2 commits into from
Apr 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ repositories {

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'

developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Expand Down
16 changes: 15 additions & 1 deletion src/main/java/kr/megaptera/assignment/AssignmentApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,26 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication
public class AssignmentApplication {

public static void main(String[] args) {
SpringApplication.run(AssignmentApplication.class, args);
}

@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry
.addMapping("/**")
.allowedMethods("GET", "POST", "PATCH", "DELETE", "OPTIONS")
.allowedOrigins("*");
}
};
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@
package kr.megaptera.assignment.application;

import kr.megaptera.assignment.dtos.CommentCreateRequestDto;
import kr.megaptera.assignment.dtos.CommentResponseDto;
import kr.megaptera.assignment.repository.CommentRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class CreateCommentService {
private final CommentRepository commentRepository;

public CommentResponseDto createComment(CommentCreateRequestDto request){
return CommentResponseDto.of(commentRepository.save(request.toEntity()));
}
}

Original file line number Diff line number Diff line change
@@ -1,4 +1,17 @@
package kr.megaptera.assignment.application;

import kr.megaptera.assignment.dtos.PostCreateRequestDto;
import kr.megaptera.assignment.dtos.PostResponseDto;
import kr.megaptera.assignment.repository.PostRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class CreatePostService {
private final PostRepository postRepository;
public PostResponseDto createPost(PostCreateRequestDto request) {
var post = postRepository.save(request.toEntity());
return PostResponseDto.of(post);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
package kr.megaptera.assignment.application;

import kr.megaptera.assignment.dtos.CommentResponseDto;
import kr.megaptera.assignment.repository.CommentRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class DeleteCommentService {
private final CommentRepository commentRepository;
public CommentResponseDto deleteComment(String commentId) {
return CommentResponseDto.of(commentRepository.delete(commentId));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
package kr.megaptera.assignment.application;

import kr.megaptera.assignment.dtos.PostResponseDto;
import kr.megaptera.assignment.repository.PostRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class DeletePostService {
private final PostRepository postRepository;
public PostResponseDto deletePost(String id) {
return PostResponseDto.of(postRepository.delete(id));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
package kr.megaptera.assignment.application;

import kr.megaptera.assignment.dtos.CommentResponseDto;
import kr.megaptera.assignment.repository.CommentRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class GetCommentsService {
private final CommentRepository commentRepository;

public List<CommentResponseDto> getCommentList(String postId) {
return commentRepository.findAll(postId).stream().map(CommentResponseDto::of).toList();
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,21 @@
package kr.megaptera.assignment.application;

import kr.megaptera.assignment.dtos.PostResponseDto;
import kr.megaptera.assignment.repository.PostRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class GetPostService {
private final PostRepository postRepository;
public List<PostResponseDto> getList() {
return postRepository.findAll().stream().map(PostResponseDto::of).toList();
}

public PostResponseDto detail(String id) {
return PostResponseDto.of(postRepository.findPostById(id));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
package kr.megaptera.assignment.application;

import kr.megaptera.assignment.dtos.CommentResponseDto;
import kr.megaptera.assignment.dtos.CommentUpdateRequestDto;
import kr.megaptera.assignment.dtos.RequestUpdate;
import kr.megaptera.assignment.models.Comment;
import kr.megaptera.assignment.models.Post;
import kr.megaptera.assignment.repository.CommentRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UpdateCommentService {
private final CommentRepository commentRepository;

public CommentResponseDto update(String commentId, RequestUpdate<Comment> request) {
var comment = commentRepository.find(commentId);
request.update(comment);
return CommentResponseDto.of(commentRepository.save(comment));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
package kr.megaptera.assignment.application;

import kr.megaptera.assignment.dtos.PostResponseDto;
import kr.megaptera.assignment.dtos.RequestUpdate;
import kr.megaptera.assignment.models.Post;
import kr.megaptera.assignment.repository.PostRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UpdatePostService {
private final PostRepository postRepository;

public PostResponseDto updatePost(String id,RequestUpdate<Post> request){
var post = postRepository.findPostById(id);
request.update(post);
return PostResponseDto.of(postRepository.save(post));
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,57 @@
package kr.megaptera.assignment.controllers;

import kr.megaptera.assignment.application.CreateCommentService;
import kr.megaptera.assignment.application.DeleteCommentService;
import kr.megaptera.assignment.application.GetCommentsService;
import kr.megaptera.assignment.application.UpdateCommentService;
import kr.megaptera.assignment.dtos.CommentCreateRequestDto;
import kr.megaptera.assignment.dtos.CommentResponseDto;
import kr.megaptera.assignment.dtos.CommentUpdateRequestDto;
import kr.megaptera.assignment.exceptions.CommentNotFound;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/comments")
@RequiredArgsConstructor
public class CommentController {
private final GetCommentsService getCommentsService;
private final CreateCommentService createCommentService;
private final UpdateCommentService updateCommentService;
private final DeleteCommentService deleteCommentService;
@GetMapping
public List<CommentResponseDto> detail(@RequestParam String postId) {
return getCommentsService.getCommentList(postId);
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public CommentResponseDto create(@RequestParam String postId,
@RequestBody CommentCreateRequestDto request) {
request.setPostId(postId);
return createCommentService.createComment(request);

}

@PatchMapping("/{id}")
public CommentResponseDto update(@PathVariable String id,
@RequestBody CommentUpdateRequestDto commentUpdateDto) {
return updateCommentService.update(id, commentUpdateDto);

}

@DeleteMapping("/{id}")
public CommentResponseDto delete(@PathVariable String id) {
return deleteCommentService.deleteComment(id);
}


@ExceptionHandler(CommentNotFound.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String postNotFound() {
return "댓글을 찾을 수 없습니다.";
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,56 @@
package kr.megaptera.assignment.controllers;

import kr.megaptera.assignment.application.CreatePostService;
import kr.megaptera.assignment.application.DeletePostService;
import kr.megaptera.assignment.application.GetPostService;
import kr.megaptera.assignment.application.UpdatePostService;
import kr.megaptera.assignment.dtos.PostCreateRequestDto;
import kr.megaptera.assignment.dtos.PostResponseDto;
import kr.megaptera.assignment.dtos.PostUpdateRequestDto;
import kr.megaptera.assignment.exceptions.PostNotFound;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/posts")
@RequiredArgsConstructor
public class PostController {
private final UpdatePostService updatePostService;
private final GetPostService getPostService;
private final CreatePostService createPostService;
private final DeletePostService deletePostService;
@GetMapping
public List<PostResponseDto> getList(){
return getPostService.getList();
}

@GetMapping("/{id}")
public PostResponseDto detail(@PathVariable("id")String id){
return getPostService.detail(id);
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public PostResponseDto create(@RequestBody PostCreateRequestDto request){
return createPostService.createPost(request);
}

@PatchMapping("/{id}")
public PostResponseDto updatePost(@PathVariable("id") String id,@RequestBody PostUpdateRequestDto request){
return updatePostService.updatePost(id,request);
}
@DeleteMapping("/{id}")
public PostResponseDto deletePost(@PathVariable("id")String id){
return deletePostService.deletePost(id);
}

@ExceptionHandler(PostNotFound.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String postNotFound() {
return "게시물을 찾을 수 없습니다";
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package kr.megaptera.assignment.dtos;

import kr.megaptera.assignment.models.Comment;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class CommentCreateRequestDto {
private String postId;
private String author;
private String content;

public Comment toEntity(){
return new Comment(null,postId,author,content);
}

public void setPostId(String postId) {
this.postId = postId;
}
}
18 changes: 18 additions & 0 deletions src/main/java/kr/megaptera/assignment/dtos/CommentResponseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package kr.megaptera.assignment.dtos;

import kr.megaptera.assignment.models.Comment;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class CommentResponseDto {
private String id;
private String author;
private String content;

public static CommentResponseDto of(Comment comment){
return new CommentResponseDto(comment.getId(),comment.getAuthor(),comment.getContent());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package kr.megaptera.assignment.dtos;

import kr.megaptera.assignment.models.Comment;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class CommentUpdateRequestDto implements RequestUpdate<Comment> {
private String content;

@Override
public void update(Comment entity) {
entity.update(content);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package kr.megaptera.assignment.dtos;

import kr.megaptera.assignment.models.Post;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class PostCreateRequestDto {
private String title;
private String content;
private String author;

public Post toEntity(){
return new Post(null,title,content,author);
}
}
Loading
Loading