[스프링부트로 API 만들기] 기능을 수행해주는 서비스

황상일·2021년 1월 2일
0

앞에서 컨트롤러를 만드는 방법을 확인해 보았다. 이번시간에는 서비스 클래스에 대한 이야기를 해보겠다. 앞에서 MVC는 이야기를 했지만 갑자기 Service가 튀어나와서 당황했을 것이다. 하지만 설명을 들어보면 왜 사용되는 건지 이해가 될 것이다.

서비스

서비스는 해당 도메인의 순수한 비즈니스 로직을 수행하는 레이어이다. 첫장에서 말한POJO를 만들어서 온전히 비즈니스 로직만들 작성하는 클래스인 것이다. 규모가 작거나 초창기 프로젝트라면 기능을 컨트롤러에서 작성해도 큰 영향이 없다. 하지만 점점 기능을 추가해 가면서 순수한 기능 처리 이외의 코드가 들어서기 시작하면서 가독성이 심하게 좋지 않아질 것이다. 또한 다른 컨트롤러에서 같은 기능이 사용될수도 있기 때문에 서비스를 쓰는것이 좋다.

구현해보기

서비스 클래스 만들기

서비스 클래스를 만드는 것은 어렵지 않다. @Service어노테이션을 클래스에 선언하기만 하면 된다.

@Service
public class PostService {
    public void getPosts(Long page) {

    }

    public void getPost(long postId) {

    }

    public void addPost(String title, String body) {

    }

    public void updatePost(long postId, String title, String body) {

    }

    public void deletePost(long postId) {

    }
}

컨트롤러 클래스에 의존성 주입하여 호출하기

이제 스프링의 특징 중 하나인 의존성 주입(DI)를 할 것이다. Controller클래스의 생성자에 서비스 객체를 매개변수로 받아 생성되도록 하면 된다. lombok을 사용하면 아래와 같이 클래스에 @RequiredArgsConstructor를 선언해주고 private final로 서비스를 선언하면 된다.
이렇게 의존성을 주입하였으면 컨트롤러에서 상황에 맞도록 호출하면 된다.

@RestController
@RequestMapping("/posts")
@RequiredArgsConstructor
public class PostController {

    private final PostService postService;

    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    public String getPosts(
            @RequestParam Long page
    ){
        this.postService.getPosts(page);
        return "posts";
    }


    @GetMapping("/{postId}")
    @ResponseStatus(HttpStatus.OK)
    public String getPost(
            @PathVariable long postId
    ){
        this.postService.getPost(postId);
        return "post";
    }


    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public String addPost(
            @RequestBody updatePostRequest updatePostRequest
    ){
        this.postService.addPost(updatePostRequest.getTitle(), updatePostRequest.getBody());
        return "post added";
    }

    @PutMapping("/{postId}")
    @ResponseStatus(HttpStatus.OK)
    public String updatePost(
            @PathVariable long postId,
            @RequestBody updatePostRequest updatePostRequest
    ){
        this.postService.updatePost(postId, updatePostRequest.getTitle(), updatePostRequest.getBody());
        return "post updated";
    }

    @DeleteMapping("/{postId}")
    @ResponseStatus(HttpStatus.OK)
    public String deletePost(
            @PathVariable long postId
    ){
        this.postService.deletePost(postId);
        return "post deleted";
    }
}

현재까지의 패키지 구조

마무리

지금까지 컨트롤러와 서비스를 만들어서API의 껍데기를 만들었다. 이제 핵심인 데이터를 조작하는 Model을 알아보자.

profile
받은만큼 나눠주자

0개의 댓글