Service 계층을 따로 만들어 ApiController를 더 간단한 코드로 리팩터링하기
서비스 계층을 만들어서 서비스와 컨트롤러의 역할을 분리하면 코드가 깔끔해지고 유지보수가 쉬워진다.
@Service
@Slf4j
public class ArticleService {
@Autowired
ArticleRepository articleRepository;
@Service : 서비스 계층임을 알리는 어노테이션@Slf4j : 로그 사용시 필요한 어노테이션@Autowired 로 리파지터리 의존성 주입public class ArticleApiController {
@Autowired
private ArticleService articleService;
ArticleService 객체 주입으로 수정 @GetMapping("/api/articles")
public List<Article> index() {
return articleService.index();
}
@GetMapping("/api/articles/{id}")
public Article show(@PathVariable Long id) {
return articleService.show(id);
}
public List<Article> index() {
return articleRepository.findAll();
}
public Article show(Long id) {
return articleRepository.findById(id).orElse(null);
}
@PostMapping("/api/articles")
public ResponseEntity<Article> create(@RequestBody ArticleForm dto) {
Article created = articleService.create(dto);
return (created != null) ?
ResponseEntity.status(HttpStatus.OK).body(created) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
}
public Article create(ArticleForm dto) {
Article article = dto.toEntity();
if(article.getId() != null) {
return null;
}
return articleRepository.save(article);
}
article.getId()!=null) null을 반환 @PatchMapping("/api/articles/{id}")
public ResponseEntity<Article> update(@PathVariable Long id, @RequestBody ArticleForm dto) {
Article updated = articleService.update(id, dto);
return (updated != null) ?
ResponseEntity.status(HttpStatus.OK).body(updated) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
}
public Article update(Long id, ArticleForm dto) {
Article article = dto.toEntity();
log.info("id: {}, article: {}", id, article.toString());
Article target = articleRepository.findById(id).orElse(null);
if(target == null || id != article.getId()) {
log.info("잘못된 요청! id: {}, article: {}", id, article.toString());
return null;
}
target.patch(article);
Article updated = articleRepository.save(target);
return updated;
}
@DeleteMapping("/api/articles/{id}")
public ResponseEntity<Article> delete(@PathVariable Long id) {
Article deleted = articleService.delete(id);
return (deleted != null) ?
ResponseEntity.status(HttpStatus.NO_CONTENT).build() :
ResponseEntity.status(HttpStatus.BAD_REQUEST).build() ;
}
public Article delete(Long id) {
Article target = articleRepository.findById(id).orElse(null);
if(target == null) return null;
articleRepository.delete(target);
return target;
}