개발 블로그
article thumbnail
Published 2023. 4. 20. 09:30
[TIL] DAY 17 항해99

오늘 겪은 문제

오늘은 페어와 함께 스프링부트로 간단한 인증/인가가 적용된 CRUD 게시판을 만드는 작업을 했다. 팀원이 작성했던 Lv1 코드를 기반으로 기능을 추가하기로 했는데 그 과정에서 예상치 못한 에러를 만났다.

 

 

시도해본 방법

1. 서비스 단 디버깅

회원가입 기능을 추가하는 과정에 위와 같은 에러를 만났다. 회원가입 과정은 Lv1 에서 했던 것과 별반 다를바 없이 클라이언트로부터 데이터를 입력 받고, 컨트롤러에서 이를 서비스에 넘긴 후, 서비스에서는 내부 로직에 따라 처리하고 DB에 저장한 후 그 결과를 컨트롤러에게 반환한다.

 

컨트롤러는 반환받은 결과를 클라이언트에게 전달하는 것으로 회원가입이 마무리가 된다.

 

컨트롤러는 단순히 데이터를 받고, 전달하는 역할을 수행하기에 서비스 단에서 문제가 있을 거라고 생각했다.

그래서 서비스 단에서 브레이크포인트를 걸고 디버깅을 해봤다.

 

하지만 서비스 단에서는 아무런 문제 없이 컨트롤러 쪽으로 데이터를 넘겨주고 있었다.

 

 

해결 방법

이 에러의 의미를 찾아보니 html 소스코드를 제대로 찾아가지 못 해서 Error resolving template 이라는 말이 나온 것이다. 그런데 우리는 html 은 사용하지 않고 postman 으로 서버 쪽의 기능만을 테스트 하고 있어서 대체 이런 에러가 왜 나오는 거지? 싶었다.

 

계속해서 서치를 이어가던 중 Controller 와 RestController 의 차이에 대해서 알게 되었고 팀원의 코드에 어노테이션이

@RestController 가 아니라 @Controller 로 달려있었기에 발생한 문제였다.

 

그래서 @Controller 어노테이션을 @RestController 로 바꿔줌으로써 문제를 해결할 수 있었다.

 

 

 

알게된 점

이번 에러를 해결하는 과정을 통해서 Controller 어노테이션과 RestController 어노테이션의 차이를 알게 되었다.

 

먼저, Controller 어노테이션은 그 자체만으로는 '뷰'를 반환할 수 있는 기능을 하는 녀석이다. '뷰'란 jsp 파일이나 html 파일 등과 같이 실제 화면에 보이는 영역을 의미한다.

 

출처 : https://mangkyu.tistory.com/49

 

이와 같이 동작하는데 오늘 겪은 문제는 결국 컨트롤러가 서비스로 데이터를 넘겨 작업을 다 마친 후 View Name 을 반환하고 이 View Name 을 기반으로 View Resolver 쪽에서 해석하고 알맞는 템플릿을 Dispatcher 에게 전달하면 이것이 클라이언트에게 반환되는 방식이다.

 

하지만 우리 코드에서 반환하고 있던 것은 View Name이 아니라 어떠한 ResponseEntity 였기에 문제가 발생한 것이다.

 

 

반면, RestController는 뷰가 아니라 '데이터'를 반환하는 기능을 할 수 있다.

그래서 우리가 ResponseEntity 를 반환하려면 Controller가 아닌 RestController 를 사용해야 하는 것이다.

 

물론 Controller 를 사용하면서도 뷰가 아니라 데이터를 반환하는 방법도 있는데 바로 @ResponseBody 어노테이션이다.

컨트롤러 내부 메서드 중 데이터를 반환하고 싶은 경우 메서드 반환 타입 앞에 @ResponseBody 어노테이션을 붙이면 데이터를 반환할 수 있게 된다.

 

그래서 정리하자면 

@Controller 는 '뷰'만 반환할 수 있다.
@Controller 로 데이터도 반환하고 싶다면 @ResponseBody 를 이용해야 한다.

@RestController 는 @Controller + @ResponseBody 로 @RestController 어노테이션만 붙여도 데이터를 반환할 수 있다.

'항해99' 카테고리의 다른 글

[TIL] DAY 22  (0) 2023.04.24
[WIL] 항해 3주차  (0) 2023.04.23
[TIL] DAY 16  (0) 2023.04.18
[TIL] DAY 15  (1) 2023.04.18
[WIL] 항해 2주차  (0) 2023.04.17
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!