생각 없이 기존의 구조를 따라서 코딩을 하다보니 각 어노테이션이 어떤 의미를 가지고 있고 어떤 차이점이 있는지 전혀 모르고 사용하고 있었다. 단순하게 api를 하나 더 추가했는데 아예 해당 api의 컨트롤러로 요청이 들어오지 않는 상황이 발생했다.
문제 코드 )
// controller
@ResponseBody
@GetMapping("/logs")
public List<LogResponse> getLogs() throws IOException{
return logService.loadLogs();
}
문제의 원인은 controller 클래스의 어노테이션에 있었다. 해당 컨트롤러는 다른 컨트롤러들과 다르게 @controller어노테이션이 붙어 있었다. 그동안의 작업한 다른 컨트롤러들은 모두 @RestController 어노테이션을 사용하고 있었다.
@Controller
@RequiredArgsController
public class EnviromentController {
}
그렇다면 두 어노테이션의 차이는 무엇일까?
@RestController 속성
Spring MVC의 @RestController은 @Controller와 @ResponseBody의 조합입니다.
Spring 프레임 워크에서 RESTful 웹 서비스를 보다 쉽게 개발할 수 있도록 Spring 4.0에서 추가되었습니다.
근본적인 차이점은 @Controller의 역할은 Model 객체를 만들어 데이터를 담고 View를 찾는 것이지만, @RestController는 단순히 객체만을 반환하고 객체 데이터는 JSON 또는 XML 형식으로 HTTP 응답에 담아서 전송한다는 것이다.
물론 @Controller와 @ResponseBody를 사용하여 만들 수 있지만 이러한 방식은 RESTful 웹서비스의 기본 동작이기 때문에 Spring은 @Controller와 @ResponseBody의 동작을 조합한 @RestController을 도입한 것이다.