1. 그냥 궁금증 >> 성능이슈?
문득 졸업작품 프로젝트를 진행함에 있어, 관리자 페이지를 분업하는 과정에서 의문점이 생겼다.
' 내가 기존에 만들었던 방식과 동료가 만든 방식이 달랐다 -> 전체 게시물을 출력하는 메소드'
반환되는 데이터는 비슷하게 출력이 되는데, 뭐가 다를까? + 성능에 대해서 어떤 것이 우위에 있을까? 라는 생각이 들었다.
3번의 실험을 해보았다
1. 기존에 사용한 방식
전체를 조회할 때 List를 이용해 List에 다 담아 dto를 반환하고, controlle단에서 출력
2. querydsl을 이용하는 방식
3. 1번과 service로직은 동일하나 controller단에서 기존에 만들어 놓은 MultiResult라는 클래스를 이용해서 반환하는 방식
결과는 걸리는 시간이 2 3 1 순서였다. 데이터를 확인해보면 body 부분에 실리는 데이터에서 큰 차이를 볼 수 있었다.
왜지????????왜????????????????? 이렇게 시간이 차이가 나는 것일까?... 답을 찾을 수가 없다.. 현재로써는...
위 내용을 공부하던도중 또 우연히 RestController와 ResponseEntity에 대해 정보를 더 습득하게 되었다.
백엔드를 공부하면 할수록 확장해서 학습이 되는 것 같다.
이부분은 나중에 더 알게된다면 꼭 짚고 넘어가야겠다
(쿼리 확인 해봤는데 쿼리 qsl이 쿼리가 한방 더 나감+ 그리고 논리적으로 모순인데 일단 쿼리 dsl을 제외한 두 경우가 동일한 서비스 로직에서 나온다는점 (당연히 쿼리가 같을 수 밖에), 그럼 컨트롤러 단에서 성능차이가 조금 있다는 뜻인데...)
이 부분에 대해 튜터님께 따로 문의하였고 일단 이렇게 왜? 라는 질문을 갖는 자세에 대해 칭찬해주셨음
같이 궁금해 하셨고 꼭 결과를 말씀해달라고 했는데...
2. RestController
우선 RestController vs Controller
보통 Spring MVC Controller와 Restful Controller로 구분되는데 가장 큰 차이점은 아무래도 HTTP Response Body가 생성되는 방식에 있다. (MVC는 View 기술을 사용하고, Restful은 객체 데이터만 반환하면 끝.)
@Controller
보면 주로 MVC의 컨트롤러인 @Cotroller는 View를 반환하기 위해 사용하며, 클라이언트에서에서 url 형식으로 web service를요청(request)하면, 그 요청은 Handler Mapping과 그 type을 찾은 DispatcherServlet에 의해 인터셉트 된다. 그래서 그 요청은 Controller에 의해 처리되고 응답은 DispatcherServlet으로 리턴되고, DispatcherServlet는 view로 디스패치 된다.
물론 여기서도 @ResponseBody 어노테이션을 사용하면 View를 리턴하지 않고 컨트롤러에서 직접 데이터를 반환할 수있다. 메소드에 @ResponseBody 어노테이션을 사용하면 Spring에서 값을 변환(MessageConverter에서 변환)해 HTTP Response에 자동으로 쓰며, Controller의 클래스의 각 메소드에는 @ResponseBody 어노테이션이 있어야 한다
@RestController
일단 RestController는 @Controller + @ResponseBody가 합쳐진 것이다. (동작또한 위 그림과 같음)
주로 Json 형태의 객체 데이터를 반환할 때 많이 사용하는데, 데이터를 응답으로 하는 Rest Api를 개발할 떄 주로 사용하고 ResponseEntity로 감싸서 반환한다.
여기서 ResponseEntity는 개발자가 직접 결과 데이터와 HTTP 상태를 제어할 수 있는 클래스로 404, 500 error 같은 HTTP 상태 코드를 전송하고 싶은 데이터와 함께 전송할 수있기에 세밀한 제어가 필요할 때 사용한다.
비록 @Controll - @ResponseBody보다는 번거롭지만 추가적인 작업이 가능하고, 데이터를 명시할 때 HTTP 헤더에 타입을 명시해야 한다.
참고 블로그 : https://doing7.tistory.com/11
https://highcode.tistory.com/24
https://devmoony.tistory.com/103
'스프링 > Spring-boot' 카테고리의 다른 글
A-Z Query dsl 학습하기 그리고 이해하기 (0) | 2023.01.31 |
---|