[꼼꼼한 개발자] 꼼코더

23. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller의 리턴 타입(void 타입, String 타입, 객체 타입) 본문

Spring/코드로 배우는 스프링 웹 프로젝트

23. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller의 리턴 타입(void 타입, String 타입, 객체 타입)

꼼코더 2023. 1. 5. 01:34
반응형

👨🏻‍✈️ Controller의 리턴 타입

스프링 MVC 구조가 (기존) 상속, 인터페이스 → (변경) 어노테이션을 사용하는 방식으로 변경된 이후

가장 큰 변화중 하나는 리턴타입이 자유로워졌다는 점이다.

 

Controller의 메서드가 사용할 수 있는 리턴 타입은 아래와 같다.

  • String : jsp를 이용하는 경우 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용.
  • void : 호출하는 URL과 동일한 이름의 jsp를 의미.
  • VO, DTO 타입 : 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용.
  • ResponseEntity 타입 : response 할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용.
  • Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용.
  • HttpHeaders : 응답에 내용이 없이 Http 헤더 메세지만 전달하는 용도로 사용.

📭 void 타입

메서드의 리턴 타입을 void로 지정하면 일반적으로 해당 URL의 경로를 그대로 jsp 파일의 이름으로 사용한다.

 

리턴타입이 void인 경우 URL 경로 설정 코드 예시
리턴타입이 void인 경우 url 경로 설정 예시 이미지

 

💁🏻‍♂️ 결과

SampleController의 경로에 ex05()의 경로를 합쳐 호출 시 결과를 확인한다.

호출 : http://localhost:8080/sample/ex05

Spring MVC SampleController에서 /ex05 URL 호출 시 /WEB-INF/views/sample/ex05.jsp 파일을 찾지 못해 발생한 404 Not Found 에러 화면
404 발생

 

 

‘파일 [/WEB-INF/views/sample/ex05.jsp]을(를) 찾을 수 없습니다.’라는 에러는

servlet-context.xml의 아래 설정과 같이 맞물려 URL 경로를 View로 처리하기 때문에 생기는 결과이다.

Spring MVC에서 ViewResolver와 Bean 설정을 포함한 servlet-context.xml 구조
servlet-context.xml 속 내용

 

해결방법 

  • 뷰 페이지를 보여주려면 JSP를 경로에 맞게 만들기
  • 다른 경로 JSP를 쓰려면 메서드에서 return “viewName”
  • JSP를 아예 안 쓰고 JSON/데이터라면 @ResponseBody

💬 String 타입

String 타입은 상황에 따라 다른 화면을 보여줄 때 유용하게 사용한다.(if~else와 같은 처리가 필요한 상황)

String 타입은 현재 프로젝트의 경우 JSP 파일의 이름을 의미한다.

프로젝트 생성 시 기본으로 만들어진 HomeController의 코드를 보면 String을 반환 타입으로 사용하고 있다.

Spring MVC에서 리턴타입이 String인 컨트롤러 코드 예시
리턴타입이 string인 컨트롤러의 이미지

 

 

home() 메서드는 ‘home’이라는 문자열을 리턴했기 때문에 경로는 ‘/WEB-INF/views/home.jsp’가 된다.

String 타입에는 다음과 같은 특별한 키워드를 붙여서 사용할 수 있다.

  • redirect : 리다이렉트 방식으로 처리하는 경우
  • forward : 포워드 방식으로 처리하는 경우

🧱 객체 타입

Controller의 메서드 리턴 타입을 VO(Value Object)나 DTO(Data Transfer Object) 타입 등

복합적인 데이터가 들어간 객체 타입을 지정할 수 있다.

주로 JSON 데이터를 만들어 내는 용도로 사용한다.

 

👨🏻‍💻 pom.xml, Controller.java에 코드 추가

실습을 위해 jackson-databind 라이브러리를 pom.xml에 추가한다.

Maven pom.xml 파일에 라이브러리를 추가한 결과 화면
pom.xml에 라이브러리 추가
Spring MVC에서 리턴타입이 객체인 컨트롤러 코드 예시
리턴타입이 객체인 컨트롤러의 이미지

 

💁🏻‍♂️ 결과

호출 : http://localhost:8080/sample/ex06

스프링 MVC는 자동으로 브라우저에 JSON 타입으로 객체를 변환해서 전달하게 된다.

Spring MVC 컨트롤러가 객체를 반환한 뒤 브라우저 화면에 JSON으로 출력된 결과
MVC가 브라우저에게 객체 반환

개발자 도구를 통해 살펴보면 서버에서 전송하는 MIME타입이 ‘application/json’으로 확인된다.

 

브라우저 개발자 도구에서 응답 헤더를 확인하는 화면
브라우저 응답 헤더

 

 


 

💬 ResponseEntity 타입

Web을 다루다보면 HTTP 헤더를 다루는 경우가 있다.

스프링 MVC는 ResponseEntity를 통해 원하는 헤더 정보나 데이터를 전달할 수 있다.

 

👨🏻‍💻 Controller.java에 코드 추가

Spring MVC Controller.java에서 ResponseEntity와 HttpHeaders를 사용해 ex07 메서드에서 JSON 타입 헤더와 200 OK 상태 코드를 전송하는 코드 예시
Controller.java

 

ResponseEntity는 HttpHeaders 객체를 같이 전달할 수 있고

이를 통해서 원하는 HTTP 헤더 메시지를 가공하는 것이 가능하다.

ex07()의 경우 브라우저에는 JSON타입이라는 헤더 메시지와 200 OK라는 상태 코드를 전송한다.

 

💁🏻‍♂️ 결과

호출 : http://localhost:8080/sample/ex07

http://localhost:8080/sample/ex07 호출 결과로 브라우저에 표시된 JSON 응답과 200 OK 상태 코드 화면
호출 결과

 


 

🧹 최종 정리

  • Controller의 메서드가 사용할 수 있는 리턴 타입은 아래와 같다.
  • String : jsp를 이용하는 경우 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용.
  • void : 호출하는 URL과 동일한 이름의 jsp를 의미.
  • VO, DTO 타입 : 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용.
  • ResponseEntity 타입 : response 할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용.
  • Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용.
  • HttpHeaders : 응답에 내용이 없이 Http 헤더 메세지만 전달하는 용도로 사용.

 

 

위 내용은 코드로 배우는 스프링 웹 프로젝트 교재를 참고하여 작성되었습니다.

 

코드로 배우는 스프링 웹 프로젝트 - YES24

이 책은 Spring Framework(이하 스프링)를 사용해서 말 그대로 ‘웹 프로젝트’를 어떻게 진행하는지를 설명하는 책이다. 웹 프로젝트라고 거창하게 표현하지만, 좀 더 구체적으로는 스프링으로 웹

www.yes24.com