본문 바로가기

BackEnd/Spring

[코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 2

728x90
반응형

https://bobo12.tistory.com/290

 

[코드로 배우는 스프링 웹 프로젝트] ch06 스프링 MVC Controller 1

1. 스프링 MVC 이용시 Controller의 특징 ▷ HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현 ▷ 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능 ▷ GET, POST

bobo12.tistory.com

 

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, 객체 타입, 파일 업로드 등을 이용해서 화면 또는 콘솔창에 나타낼 수 있었습니다.

 

다음은 예외처리에 대해서 알아볼게요!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

728x90
반응형