Controller의 리턴타입
- 스프링 MVC의 구조가 기존의 상속과 인터페이스에서 어노테이션을 사용하는 방식으로변한 이후에 가장 큰 변화 중 하나는 리턴 타입이 자유로워 졌다는 점입니다.
Controller의 메서드가 사용할 수 있는 리턴 타입
- String : jsp를 이용하는 경우에는 jsp파일의 경로와 파일이름을 나타내기 위해서 사용합니다.
- void : 호출하는 URL과 동일한 이름의 jsp를 의미합니다.
- VO,DTO 타입 : 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용합니다.
- ResponseEntity 타입 : response 할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용합니다.
- Model,ModelAndView : Model로 데이터를 반환하거나 화면까지 지정하는 경우에 사용합니다.
(최근에는 많이 사용하지 않습니다.)
- HttpHeaders : 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용합니다.
void 타입
- 메서드의 리턴 타입을 void로 지정하는 경우 일반적인 경우에는 해당 URL의 경로를 그대로 jsp파일의 이름으로 사용하게 됩니다.
@GetMapping("/ex05")
public void ex05(){
log.info("/ex05....");
}
servlet.context.xml
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
- /WEB-INF/views/ = prefix(접두사)
- .jsp = suffix(접미사)
- Ex) /WEB-INF/view/ex05.jsp
String 타입
- String타입은 상황에 따라 다른 화면을 보여줄 필요가 있을때 유용하게 사용합니다.(if~else같은 처리가 필요할때)
- 일반적으로 String 타입은 현재 프로젝트의 경우 JSP파일의 이름 또는 HTML파일의 이름을 의미합니다.)
- String 타입에는 다음과 같은 특별한 키워드를 붙여서 사용이 가능합니다.
-redirect: 리다이렉트 방식을 처리하는 경우
-forword : 포워드 방식으로 처리하는 경우
객체 타입
- Controller의 메서드 타입을 VO(Value Object)나 DTO(Data Transfer Object)타입 등 복합적인 데이터가 들어간 객체 타입으로 지정할 수 있습니다.
- 이경우는 주로 JSON 데이터를 만들어 내는 용도로 사용합니다.
- 이를 위해서는 jackson-databind 라이브러리를 pom.xml에 추가합니다.
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
- SampleController에는 아래와 같이 사용할 수 있습니다.
@GetMapping("/ex06")
public @ResponseBody SampleDTO ex06() {
log.info("/ex06.....");
SampleDTO dto =new SampleDTO();
dto.setAge(10);
dto.setName("홍길동");
return dto;
}
ResponseEntity 타입
- Web을 다루다 보면 HTTP 프로토콜의 헤더를 다루는 경우도 종종 있습니다.
- 스프링 MVC의 사상은 HttpServletRequest나 HttpServletResponse를 직접 핸들링 하지 않아도 이런 작업이 가능하도록 작성 되었기 때문에 이러한 처리를 위해 ResponseEntity를 통해서 원하는 헤더 정보나 데이터를 처리할 수 있습니다.
@GetMapping("/ex07")
public ResponseEntity<String>ex07(){
log.info("/ex07.....");
String msg= "{\"name\": \"홍길동\"}";
HttpHeaders header =new HttpHeaders();
header.add("Content-Type", "application/json;charset=UTF-8");
return new ResponseEntity<>(msg,header,HttpStatus.OK);
}
- ResponseEntity는 HttpHeaders 객체를 같이 전달할 수 있고, 이를 통해서 원하는 HTTP 헤더 메시지를 가공하는 것이 가능합니다.
- ex07() 같은 경우 브라우저에는 JSON타입이라는 헤더 메시지와 200 OK 라는 상태 코드를 전송합니다.