어노테이션 들여다보기 - 1

YJS·2023년 9월 8일
0

Spring Boot 탐구

목록 보기
2/11

😖문제 상황

생각 없이 기존의 구조를 따라서 코딩을 하다보니 각 어노테이션이 어떤 의미를 가지고 있고 어떤 차이점이 있는지 전혀 모르고 사용하고 있었다. 단순하게 api를 하나 더 추가했는데 아예 해당 api의 컨트롤러로 요청이 들어오지 않는 상황이 발생했다.

문제 코드 )

// controller
@ResponseBody
@GetMapping("/logs")
public List<LogResponse> getLogs() throws IOException{
	return logService.loadLogs();
}

🤓문제 해결 과정

step1. 디버깅을 통해 어느 함수에서 문제가 발생하는지 확인했다. (컨트롤러 자체를 들어오지 않는 것으로 확인)

step2. 다른 컨트롤러에서 해당 api를 작성해서 요청이 컨트롤러로 들어오는지 확인했다.(컨트롤러로 해당 요청이 잘 들어와서 break point에 걸리는 것을 확인)

step3. 컨트롤러의 세팅 자체를 확인했다.

🧐문제의 원인 파악

문제의 원인은 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을 도입한 것이다.

profile
우당탕탕 개발 일기

0개의 댓글