오늘은 PostController을 postService과 PostRepository로 분리하는 삼계층 분리 작업을 진행하였다.
예시로 내가 Controller를 분리하는 작업이다.
완성되있는 postController이다.
package com.example.post.controller;
import com.example.post.dto.JDBCRepository;
import com.example.post.dto.PostRepository;
import com.example.post.entity.Post;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
@RestController
@RequestMapping("/api")
public class PostController {
private final JDBCRepository<Post, Long> postRepository;
public PostController(JDBCRepository<Post, Long> postRepository) {
this.postRepository = postRepository;
}
// 전체 게시글 목록 조회 API
@GetMapping("/posts")
public List<Post> getAllPosts() {
return postRepository.getAllPosts();
}
// 게시글 작성 API
@PostMapping("/posts")
public Post createPost(@RequestBody Post post) {
post.setDate(LocalDateTime.now());
return postRepository.createPost(post);
}
// 선택한 게시글 조회 API
@GetMapping("/{postId}")
public ResponseEntity<Post> getPostById(@PathVariable Long postId) {
Post post = postRepository.getPostById(postId);
if (post != null) {
return ResponseEntity.ok(post);
} else {
return ResponseEntity.notFound().build();
}
}
// 선택한 게시글 수정 API
@PutMapping("/posts/{postId}")
public ResponseEntity<Post> updatePost(@PathVariable Long postId, @RequestBody Post updatedPost) {
Post post = postRepository.getPostById(postId);
if (post != null) {
if (post.getPassword().equals(updatedPost.getPassword())) {
post.setTitle(updatedPost.getTitle());
post.setAuthor(updatedPost.getAuthor());
post.setContent(updatedPost.getContent());
if (postRepository.updatePost(post)) {
return ResponseEntity.ok(post);
} else {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
} else {
return ResponseEntity.notFound().build();
}
}
// 선택한 게시글 삭제 API
@DeleteMapping("/posts/{postId}")
public ResponseEntity<String> deletePost(@PathVariable Long postId, @RequestParam String password) {
Post post = postRepository.getPostById(postId);
if (post != null) {
if (post.getPassword().equals(password)) {
if (postRepository.deletePost(postId, password)) {
return ResponseEntity.ok("게시글이 성공적으로 삭제되었습니다.");
} else {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
} else {
return ResponseEntity.notFound().build();
}
}
}
코드가 복잡하게 되어있다.
이걸 postService로 클래스를 분리하는 작업을 진행할것이다.
우선 postService를 생성한후
예시로 getPostById를 분리하려면
// 선택한 게시글 조회 API
@GetMapping("/{postId}")
public ResponseEntity<Post> getPostById(@PathVariable Long postId) {
Post post = postRepository.getPostById(postId);
if (post != null) {
return ResponseEntity.ok(post);
} else {
return ResponseEntity.notFound().build();
}
}
이 아닌
// 선택한 게시글 조회 API
@GetMapping("/{postId}")
public ResponseEntity<Post> getPostById(@PathVariable Long postId) {
postService postService = new postService(postRepository);
return postService.getPostById(postId);
}
로 진행한다. postService를 새로 객체로 생성해서 그것을 리턴을 해주는 방식이고 인자로 postId를 반환하고 있으니 그것을 적어준다음 진행한다.
그리고 return postService.getPostById에서 getPostById가 경고가 뜰텐데 postService에서 생성자가 없기에 클릭하고 마우스를 대면 생성자를 생성할 것인지에 대해서 뜬다. 그것을 클릭하면 자동으로 생성자를 postService클래스에 생성해준다.
그리고 postService로 이동하여 생성된 생성자에서 controller에서 있던 코드를 생성된 생성자 안에 붙여놓기를 한다.
그러면 완성된 코드는 이렇다
public ResponseEntity<Post> getPostById(Long postId) {
Post post = postRepository.getPostById(postId);
if (post != null) {
return ResponseEntity.ok(post);
} else {
return ResponseEntity.notFound().build();
}
}
그러면 깔끔하게 분리되어 실행도 잘되는 모습을 볼수있다.
왜 클래스를 분리하여 이런 작업을 진행하냐면 controll클래스 하나에 모든 코드를 입력하고 나면 나중에 봤을때 코드가 복잡하게 보여질뿐만 더러 어떤코드가 어떤 작업을 진행하는지 모를때가 있을수 있다. 그래서 HTTP요청을 받아주는 역할인 controll와 sql같은 데이터작업을 진행하는 클래스인 Repository와 그에 맞춰 서비스 작업을 진행하는 service클래스로 분리하여 가독성이 좋게 하는 역할을 하는것이다.
'Spring' 카테고리의 다른 글
| SMTP 구현을 통해 회원가입 이메일 인증 기능 구현 (0) | 2023.07.05 |
|---|---|
| Spring Security,JWT,REST 내용정리 (0) | 2023.06.26 |
| JWT 내용정리 (0) | 2023.06.19 |
| IOC/DI에 대해서 (0) | 2023.06.15 |
| 스프링 프로젝트를 처음 시작하며 (0) | 2023.06.12 |