[Spring] Spring MVC의 Controller #02 Return Type
Controller의 메소드가 사용할 수 있는 리턴 타입은 주로 다음과 같다
- String : jsp를 이용하는 경우 jsp 파일의 경로와 파일 이름을 나타내기 위해서 사용
- void : 호출하는 URL과 동일한 이름의 jsp 의미
- VO,DTO 타입 : 주로 JSON 타입의 데이터를 만들어 반환하는 용도로 사용
- ResponseEntity 타입 : response 할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용
- Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용
- HttpHeaders : 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용
void 타입
메소드의 리턴 타입을 void로 지정하는 경우 일반적인 경우에 해당 URL의 경로를 그대로 jsp 파일의 이름으로 사용하게 된다.
1
2
3
4
|
@GetMapping("/ex05")
public void ex05() {
log.info("/ex05..............");
}
|
cs |
브라우저에서 SampleController의 경로에 ex05()의 경로를 합쳐 호출하면 위와 같은 화면이 뜬다. servlet-context.xml에 등록되어 있는 View Resolver에 의해 URL 경로를 View로 처리하기 때문에 생기는 결과이다.
String 타입
일반적으로 String 타입은 jsp 파일의 경로와 이름으로 작성한다. redirec 또는 forward 키워드를 붙여 다른 방식으로 사용할 수도 있다.
객체 타입
Controller의 메소드 리턴 타입을 VO(Value Object)나 DTO(Data Transfer Object) 타입 등 복합적인 데이터가 들어간 객체 타입으로 지정할 수 있는데, 이 경우는 주로 JSON 데이터를 만들어 내는 용도로 사용한다. 이를 위해 jackson-databind 라이브러리를 pom.xml에 추가한다.
1
2
3
4
5
6
7
|
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<!-- JSON 객체를 사용하기 위한 라이브러리 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
|
cs |
SampleController에는 아래와 같은 메소드를 생성한다.
1
2
3
4
5
6
7
8
9
10
11
|
@GetMapping("/ex06")
public @ResponseBody SampleDTO ex06() {
log.info("/ex06..........");
SampleDTO dto = new SampleDTO();
dto.setAge(10);
dto.setName("홍길동");
return dto;
}
|
cs |
스프링 MVC는 자동으로 부라우저에 JSON 타입으로 객체를 변환해서 전달한다.
개발자 도구로 살펴보면 서버에서 전송하는 MIME 타입이 'application/json'으로 처리된 것을 볼 수 있다.
@ResponseEntity 타입
Web을 다루다 보면 HTTP 프로토콜의 헤더를 다루는 경우가 종종 있다. ResponseEntity를 통해 원하는 헤더 정보나 데이터를 전달할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// ResponseEntity 타입 반환
// HTTP 프로토콜 헤더 정보나 데이터를 전달할 수 있다.
@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);
}
|
cs |
ResponseEntity는 HttpHeaders 객체를 같이 전달할 수 있고, 이를 통해 원하는 HTTP 헤더 메세지를 가공하는 것이 가능하다. ex07()의 경우 브라우저에 JSON 타입이라는 헤더 메세지와 200 OK라는 상태 코드를 전송한다.
파일 업로드 처리
파일 업로드를 하기 위해서는 전달되는 파일 데이터를 분석해야 하는데, 이를 위해서 Servlet 3.0 전까지는 commons의 파일 업로드를 이용하거나 cos.jar 등을 이용해 처리를 해 왔다. Serlvet 3.0 이후(Tomcat 7.0)에는 기본적으로 업로드되는 파일을 처리할 수 있는 기능이 추가되어 있어 추가적인 라이브러리를 필요로 하지 않는다.
그러나 'Spring Legacy Project'로 생성되는 프로젝트의 경우 Servlet 2.5를 기준으로 생성되어 3.0 이후에 지원되는 설정을 사용하기 어렵다. 예제로는 일반적으로 많이 사용하는 commons-fileupload를 이용한다.
1
2
3
4
5
6
|
<!-- 파일업로드를 위한 라이브러리 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
|
cs |
pom.xml에 위와 같은 라이브러리를 추가하고 파일이 임시로 업로드될 폴더를 C 드라이브 아래 upload/tmp로 작성한다.
servlet-context.xml은 스프링 MVC의 특정한 객체(빈)을 설정해 파일을 처리한다. 파일 업로드의 경우에는 반드시 id 속성값을 multipartResolver로 정확하게 지정해준다.
1
2
3
4
5
6
7
8
9
10
|
<!-- 파일 업로드를 위해 multipartResolver Bean 등록 -->
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value="utf-8"></beans:property>
<!-- 1024 * 1024 * 10 bytes 10MB -->
<beans:property name="maxUploadSize" value="104857560"></beans:property>
<!-- 1024 * 1024 * 2 bytes 2MB -->
<beans:property name="maxUploadSizePerFile" value="2097152"></beans:property>
<beans:property name="uploadTempDir" value="file:/C:/upload.tmp"></beans:property>
<beans:property name="maxInMemorySize" value="104857560"></beans:property>
</beans:bean>
|
cs |
maxUploadSize : 한 번에 Request로 전달될 수 있는 최대 크기
maxUploadSizePerFile : 하나의 파일 최대 크기
maxInMemorySize : 메모리상에서 유지하는 최대의 크기 (만일 이 크기 이상의 데이터는 uploadTempDir에 임시 파일 형태로 보관됨.)
uploadTempDir : 절대 경로를 이용하려면 URI 형태로 제공해야 하기 떄문에 file:/로 시작
defaultEncoding : 업로드하는 파일의 이름이 한글인 경우 깨지는 문제 처리
위와 같은 화면을 만들었고, exUpload.jsp의 action 속성값은 '/sample/exUploadPost'로 작성했다.
1
2
3
4
5
6
7
8
|
@PostMapping("/exUploadPost")
public void exUploadPost(ArrayList<MultipartFile> files) {
files.forEach(file -> {
log.info("name : " + file.getOriginalFilename());
log.info("size : " + file.getSize());
});
}
|
cs |
스프링 MVC는 전달되는 파라미터가 동일한 이름으로 여러 개 존재하면 배열로 처리가 가능하므로 파라미터를 MultipartFile의 배열 타입으로 작성했다. 파일을 업로드 해보면 아래와 같은 결과를 얻는데, 현재 설정은 한 파일의 최대 크기가 2MB이므로 그보다 작은 크기의 파일을 지정해 업로드를 테스트한다.