Controller의 리턴 타입
스프링 MVC의 구조가 기존의 상속과 인터페이스에서 어노테이션을 사용하는 방식으로 변한 이후에 가장 큰 변화 중 하나는 리턴 타입이 자유로워 졌다는 점입니다.
- String : jsp를 이용하는 경우에는 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용
- void : 호출하는 URL과 동일한 이름의 jsp를 의미
- VO, DTO 타입 : 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용(추가적인 라이브러리 필요)
- ResponseEntity 타입 : response할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용(추가적인 라이브러리 필요)
- Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용(최근에는 사용X)
- HttpHeaders : 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용
void 타입
메서드의 리턴 타입을 void로 지정하는 경우 일반적인 경우에는 해당 URL의 경로를 그대로 jsp 파일의 이름으로 사용하게 됩니다.
▶ SampleController의 일부
@GetMapping("/ex05")
public void ex05() {
log.info("/ex05........");
}
브라우저에서 SampleController의 경로에 ex05()의 경로를 합쳐 '/sample/ex05'를 호출하면 다음과 같은 결과가 나옵니다.
에러 메시지를 자세히 보면 에러 메시지의 원인이 'WEB-INF/views/sample/ex05.jsp'가 존재하지 않아서 생기는 문제라는 것을 볼 수 있습니다. 이것은 servlet-context.xml의 아래 설정과 같이 맞물려 URL 경로를 View로 처리하기 때문에 생기는 결과입니다.
String 타입
String 타입은 상황에 따라 다른 화면을 보여줄 필요가 있을 경우에 유용하게 사용합니다.(if ~ else와 같은 처리가 필요한 상황) 일반적으로 String 타입은 현재 프로젝트의 경우 JSP 파일의 이름을 의미합니다. 프로젝트 생성 시 기본으로 만들어진 HomeController의 코드를 보면 String을 반환 타입으로 사용하는 것을 볼 수 있습니다.
home() 메서드는 'home'이라는 문자열을 리턴했기 때문에 경로는 '/WEB-INF/views/home.jsp'경로가 됩니다.
String 타입에는 다음과 같은 특별한 키워드를 붙여서 사용할 수 있습니다.
- redirect : 리다이렉트 방식으로 처리하는 경우
- forward : 포워드 방식으로 처리하는 경우
객체 타입
Controller의 메서드 리턴 타입을 VO(Value Object)나 DTO(Data Transfer Object) 타입 등 복합적인 데이터가 들어간 객체 타입으로 지정할 수 있는데, 이 경우는 주로 JSON 데이터를 만들어내는 용도로 사용합니다.
우선 이를 위해서는 jackson-databind 라이브러리를 pom.xml에 추가합니다.
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/2.15.3
SampleController에는 아래와 같은 메서드를 생성합니다.
@GetMapping("/ex06")
public @ResponseBody SampleDTO ex06() {
log.info("/ex06..........");
SampleDTO dto = new SampleDTO();
dto.setAge(10);
dto.setName("홍길동");
return dto;
}
스프링 MVC는 자동으로 브라우저에 JSON 타입으로 객체를 변환해서 전달하게 됩니다.
개발자 도구를 통해서 살펴보면 서버에서 전송하는 MIME 타입이 'application/json'으로 처리되는 것을 볼 수 있습니다. 만일Jackson-databind 라이브러리가 포함되지 않았다면 다음과 같은 에러 화면을 보게 됩니다. 스프링 MVC는 리턴 타입에 맞게 데이터를 변환해 주는 역할을 지정할 수 있는데 기본적으로 JSON은처리가 되므로 별도의 설정이 필요하지 않습니다.
ResponseEntity 타입
Web을 다루다 보면 HTTP 프로토콜의 헤더를 다루는 경우도 종종 있습니다. 스프링 MVC의 사상은 HttpServletRequest나 HttpServletResponse를 직접 핸들링하지 않아도 이런 작업이 가능하도록 작성되었기 때문에 이러한 처리를 위해 ResponseEntity를통해서 원하는 헤더 정보나 데이터를 전달할 수 있습니다.
▶ SampleController의 일부
@GetMapping("/ex07")
public ResponseEntity<String> ex07() {
log.info("/ex07..........");
// {"name": "홍길동"}
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라는 상태 코드를 전송합니다.
'Back-end > Spring Web Project' 카테고리의 다른 글
[Spring Web Project] 스프링 MVC의 Controller(4) - Controller의 예외 처리 (0) | 2023.11.24 |
---|---|
[Spring Web Project] 스프링 MVC의 Controller(3) - 파일 업로드 처리 (0) | 2023.11.24 |
[Spring Web Project] 스프링 MVC의 Controller(1) - Controller의 파라미터 (1) | 2023.11.21 |
[Spring Web Project] 스프링 MVC의 기본 구조 (0) | 2023.11.21 |
MyBatis와 스프링 연동(2) - Mapper XML 설정 (0) | 2023.11.15 |