본문 바로가기
쿤즈 Dev/Spring Boot

[Spring Boot] 간단한 API 만들어서 테스트 해보기(feat. @Controller vs @RestController)

by Koonz:) 2022. 2. 18.
728x90

지난 포스팅에서 스프링 부트 프로젝트를 생성하고 Run 하여 Whitelabel이 나오는 화면까지 확인해 보았습니다.

2022.02.16 - [쿤즈 Dev/Spring Boot] - [Spring Boot] 간단하게 웹 프로젝트 개발 시작하기

 

[Spring Boot] 간단하게 웹 프로젝트 개발 시작하기

웹 프로젝트를 만드는 방법이 아주 쉬워졌습니다. 바로 Spring Boot 덕분인 것 같아요. 예전에는 뭐 하나 설정하려면 복잡하고 어려운 부분들이 많았지만 지금은 프레임워크 하나로 모든 세팅이 끝

koonsland.tistory.com

이렇게 해서 만든 프로젝트에서 이제부터 살을 조금씩 붙여 나갈 볼 예정인데요. 이번에는 내가 만든 프로젝트가 정말 화면에 정상적으로 나오는지 확인해 보기 위해서 API를 하나 만들어 볼 예정입니다.

이번 포스팅에서는 간단히 API를 만드는 방법을 알아볼게요.


API를 만들기 위한 컨트롤러(@Controller @RestController)

우선 컨트롤러의 역할부터 아셔야 합니다. 우선 스프링부터 전에 Spring MVC의 이해가 필요합니다. MVC는 Model, View, Controller의 약어로 웹 개발을 하기 위해서 비지니스 로직들을 분리시켜서 각자 해야 할 일들에 대한 구분을 해놓은 것입니다. 비즈니스 로직을 분리하여 개발하는 장점이 있습니다.

출처 : https://docs.spring.io/spring-framework/docs/current/reference/html/web.html

이때 Controller는 View와 Model 사이에서 비지니스 로직들을 담당하는 부분입니다. 따라서 이용자로부터 데이터를 받아서 모델로 넘기고 저장하고, 조회하여 다시 뷰로 전달하는 역할을 모두 컨트롤러에서 담당하게 됩니다. 그리고 컨트롤러에서 접근 가능한 API(웹 주소)를 매핑시켜서 진입점을 만들어 줄 수 있습니다.


컨트롤러 만들어보기

그럼 바로 컨트롤러 하나를 만들어 보도록 하겠습니다. 두 가지를 만들어 볼 건데요. 첫 번째는 @Controller를 이용하고 두 번째는 @RestController를 만들어 볼 예정입니다. 이 둘의 차이는 아래에서 말씀드릴게요.


먼저 @Controller 를 사용한 예입니다.

클래스 이름은 GreetingController 입니다. 그리고 이 클리스 상단에 @Controller 어노테이션을 붙였습니다.

package com.koonsland.board;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class GreetingController {

    @GetMapping("/greeting")
    public String greeting() {
        return "greeting";
    }
}

이렇게 어노테이션을 붙이는 것만으로 이 클래스는 컨트롤러 클래스임을 알려주는 것입니다. 여기에 greeting() 메서드를 하나 만들어 주었는데요. 다시 이 메서드 위에 @GetMapping("/greeting")이라는 어노테이션을 붙여주었습니다.

이는 HTTP Method를 나타내는 것으로 Get Method 이고 주소는 /greeting을 매핑시켜주는 거예요. 여기서 @Controller의 역할은 View로 내려보내는 것이기 때문에 return 값은 페이지 주소가 됩니다. 즉 저는 greeting.html이라는 파일이 templates에 있어요. 즉, URL 주소에 /greeting을 호출하면 greeting.html 페이지가 내려갑니다.


두 번째는 @RestController 입니다.

동일한 소스로 RestController 어노테이션을 붙여볼게요.

package com.koonsland.board;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    @GetMapping("/greeting")
    public String greeting() {
        return "greeting";
    }
}

변한 것은 @Controller에서 @RestController로 변경만 했습니다. 결과는 어떨까요?

greeting이라는 문자열이 결괏값으로 내려왔습니다. 여기서 알 수 있는 사실은 @Controller는 뷰 페이지를, @RestController는 데이터를 전송한다는 것입니다. 그럼 @Controller에서 데이터를 내려줄 방법은 없을까요? 있습니다! 아래와 같이 어노테이션 하나를 추가해주면 됩니다.

package com.koonsland.board;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class GreetingController {

    @GetMapping("/greeting")
    @ResponseBody
    public String greeting() {
        return "greeting";
    }
}

즉, @RestController는 @Controller + @ResponseBody라는 사실도 알 수 있습니다. 추측을 해봤으니 실제로 확인을 해봐야겠죠? 각각 인터페이스를 확인해 볼게요.

예상한 대로 @ResponseBody의 차이가 있습니다. 그래서 페이지를 보여줄 때는 @Controller를 사용하고 RestAPI와 같은 API를 설계하고 만들 때에는 @RestController를 사용합니다.


이번 포스팅에서는 간단하게 웹 API를 만들어 보았습니다. 그리고 추가적으로 @Controller와 @RestController는 어떤 차이점이 있는지 알아보았어요. 굉장히 쉽고 간단한 내용이지만 스프링 부트는 @(어노테이션) 하나로 많은 것들을 해결하다 보니 이런 사소한 부분들도 알아두시는 것이 좋습니다. 도움이 되셨으면 합니다. 이상입니다.

댓글