https://bobo12.tistory.com/290
5. Controller 리턴 타입
▷ 스프링 MVC 구조가 기존의 상속과 인터페이스에서 어노테이션을 사용하는 방식으로 변한 후 리턴 타입이 자유로워짐
◎ Controller 메소드가 사용할 수 있는 리턴 타입
1. String : jsp를 이용하는 경우에 jsp 파일의 경로와 파일이름을 나타내기 위해 사용
2. void : 호출하는 URL과 동일한 이름의 jsp
3. VO, DTO 타입 : 주로 JSON 타입의 데이터를 만들어 반환
4. ResponseEntity 타입 : response할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용
5. Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우 사용(최근 사용 안함)
6. HttpHeaders : 응답 내용 없이 Http 헤더 메시지만 전달하는 용도
(1) void 타입
▷ 메서드의 리턴 타입을 void로 지정하는 경우 일반적인 경우에는 해당 URL의 경로를 그대로 jsp 파일의 이름으로 사용
◎ SampleController.java 수정
...(생략)... @GetMapping("/ex05") public void ex05() { log.info("/ex05........."); } }
http://localhost:8080/sample/ex05
위의 경로 입력시 아래와 같이 출력됩니다.
'/WEB-INF/views/sample/ex05.jsp' 가 존재하지 않아서 생기는 문제
servlet-context.xml의 아래 설정과 같이 맞물려 URL 경로를 View로 처리하기 때문에 생기는 결과입니다.
(2) String 타입
▷ void와 더불어 가장 많이 사용하는 타입
▷ 상황에 따라 다른 화면을 보여줄 필요가 있을 경우 유용하게 사용
▷ 프로젝트 생성 시 기본으로 만들어진 HomeController의 코드를 보면 String을 반환 타입으로 사용
◎ ex01 → src/main/java → org.codehows.controller → HomeController.java
@RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); model.addAttribute("serverTime", formattedDate ); return "home"; }
home() 메소드는 'home'이라는 문자열을 리턴했기 떄문에 경로는 '/WEB-INF/views/home.jsp' 경로가 됨
String 타입에는 다음과 같은 특별한 키워드를 붙혀 사용할 수 있음
▷ redirect : 리다이렉트 방식으로 처리하는 경우
▷ forward : 포워드 방식으로 처리하는 경우
(3) 객체 타입
▷ Controller 메소드 리턴 타입을 VO(Value Object)나 DTO(Data Transfer Object) 타입 등 복합적인 데이터가 들어간 객체 타입으로 지정할 수 있음, JSON 데이터를 만들어 내는 용도로 사용
◎ pom.xml에 추가(jackson-databind 라이브러리)
...(생략)... <!-- 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; } }
http://localhost:8080/sample/ex06
위의 주소를 입력하면 아래와 같은 화면이 나타나는 것을 확인할 수 있습니다.
여기서 만약 실행되지 않을경우 프로젝트 → Maven → update project를 하면 실행되는 것을 볼 수 있습니다.
(404 에러 발생시)
(4) 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); } }
http://localhost:8080/sample/ex07
위의 주소를 입력하면 아래와 같은 화면이 나타나는 것을 확인할 수 있습니다.
여기서 개발자모드(F12) 후 새로고침(F5)를 누르면 브라우저에는 JSON 타입이라는 헤더 메시지와 200 OK라는 상태 코드를 전송합니다.
(5) 파일 업로드 처리
▷ Controller의 많은 작업은 스프링 MVC를 통해 처리하므로 개발자는 자신이 해야 하는 역할에만 집중해서 코드 작성 가능
▷ 파일 업로드를 위해서는 전달되는 파일 데이터를 분석해야 함
▷ Servlet 3.0(Tomcat 7.0) 이후 기본적으로 업로드되는 파일을 처리할 수 있는 기능이 있음
▷ 'Spring Legacy Project'로 생성되는 프로젝트는 Servlet 2.5 기준으로 생성되믈 3.0 이후 지원되는 설정을 사용하기 어려움
◎ pom.xml 라이브러리 추가(commons-fileupload 라이브러리)
...(생략)... <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ...(생략)...
파일이 임시로 업로드될 폴더를 C드라이브 아래 upload/tmp로 작성
◎ servlet-context.xml 설정
...(생략)... <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <beans:property name="defaultEncoding" value="utf-8"></beans:property> <beans:property name="maxUploadSize" value="104857560"></beans:property> <beans:property name="maxUploadSizePerFile" value="2097152"></beans:property> <beans:property name="uploadTempDir" value="file:/C:/upload/tmp"></beans:property> <beans:property name="maxInMemorySize" value="10485756"></beans:property> </beans:bean> </beans:beans>
◎ SampleController 메소드 추가(exUpload)
...(생략)... @GetMapping("/exUpload") public void exUpload () { log.info("/exUpload........."); } }
◎ src/main/webpp/WEB-INF/views/sample → exUpload.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html" charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="/sample/exUploadPost" method="post" enctype="multipart/form-data"> <div><input type='file' name='files'></div> <div><input type='file' name='files'></div> <div><input type='file' name='files'></div> <div><input type='file' name='files'></div> <div><input type='file' name='files'></div> <div><input type='submit'></div> </form> </body> </html>
http://localhost:8080/sample/exUpload
위의 주소를 입력하면 아래와 같은 화면이 나타나는 것을 확인할 수 있고 파일을 선택할 수 있습니다.
아래는 파일들을 임의로 선택한 것입니다.
◎ SampleController 메소드 추가(exUploadPost)
...(생략)... @PostMapping("/exUploadPost") public void exUploadPost(ArrayList<MultipartFile> files) { files.forEach(file -> { log.info("----------------------------------"); log.info("name:" + file.getOriginalFilename()); log.info("size:" + file.getSize()); }); } }
제출하면 아래와 같은 콘솔 창이 나타납니다.
http://localhost:8080/sample/exUploadPost 는 아무 내용도 없기 때문에 아래와 같은 화면이 나타납니다.
Controller 리턴 타입에 대해 알아보았습니다.
return을 사용하지 않아도 되는 void, return이 필요한 String, 객체 타입, 파일 업로드 등을 이용해서 화면 또는 콘솔창에 나타낼 수 있었습니다.
다음은 예외처리에 대해서 알아볼게요!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Spring' 카테고리의 다른 글
[코드로 배우는 스프링 웹 프로젝트] ch07 스프링 MVC 프로젝트 기본 구성 (0) | 2023.03.27 |
---|---|
[코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 3(Controller Exception) (0) | 2023.03.27 |
[코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 1 (0) | 2023.03.26 |
[코드로 배우는 스프링 웹 프로젝트] ch05 스프링 MVC 기본 구조 (0) | 2023.03.26 |
[코드로 배우는 스프링 웹 프로젝트] ch04 MyBatis와 스프링 연동 2( log4jdbc-log4j2) (0) | 2023.03.26 |