Spring – 2부 – Spring MVC 구성 02

https://rogi221./144

Spring – 2부 – Spring MVC 구성 01

대부분의 서블릿 기반 프레임워크에서 사용하는 MVC(Model-View-Controller) 방식 데이터, 처리 및 화면 분리 방식 웹 Spring 및 Spring의 Model 2 방식 표현 MVC Spring Framework Core + F

rogi221.


데이터 전달자

컨트롤러 메서드를 개발할 때 모델 유형을 인수로 지정할 수 있습니다.

Model 객체가 존재하며 컨트롤러에서 생성된 데이터를 JSP로 전달하는 역할을 합니다.

이를 사용하여 JSP와 같은 보기로 전달해야 하는 데이터를 보낼 수 있습니다.

모델 유형이 메소드 매개변수에 지정되면 Spring은 특별히 모델 유형 객체를 생성하고 이를 메소드에 주입합니다.

@ModelAttribute 주석

예제 컨트롤러에 추가됨

// SampleController.java

... (생략) ...

	@GetMapping("/ex04")
	public String ex04(SampleDTO dto, int page) {
		
		log.info("dtd: " + dto);
		log.info("page: "+ page);
		
		return "/sample/ex04";
	}
}


views/sample/ex04.jsp 추가

ex04.jsp

// ex04.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> <h2>SAMPLEDTO ${ sampleDTO }</h2> <h2>PAGE ${page }</h2> </body> </html>

http://localhost:8080/sample/ex04?name=aaa&age=11&page=9



@ModelAttribute는 들어오는 매개변수를 강제로 모델에 입력하고 전달될 때 주석을 추가해야 합니다.

//SampleController.java

... (생략) ...

	@GetMapping("/ex04")
	public String ex04(SampleDTO dto,@ModelAttribute("page") int page) {
		
		log.info("dtd: " + dto);
		log.info("page: "+ page);
		
		return "/sample/ex04";
	}
}


컨트롤러 반환 유형

기존 상속과 인터페이스에서 어노테이션을 이용한 메소드로 변경 후 Spring MVC 구조의 가장 큰 변화 중 하나는 리턴 타입이 자유로워졌다는 점이다.

컨트롤러 메서드가 사용할 수 있는 반환 유형

  • String : jsp를 사용하는 경우 jsp 파일의 경로와 파일명을 나타내기 위해 사용한다.

  • void: 호출 URL과 이름이 같은 jsp를 나타냅니다.

  • VO, DTO 유형: 주로 JSON 유형 데이터를 생성하고 이를 최대한 활용하는 데 사용됩니다.

  • ResponseEntity 유형: 응답 시 Http 헤더 정보 및 내용을 처리하기 위해 사용
  • Model, ModelAndView: 모델에 데이터를 반환하거나 화면을 지정하는 데 사용(최근 많이 사용하지 않음)
  • HttpHeaders: 응답에 내용이 없는 Http 헤더 메시지만 전달하는 데 사용됩니다.

중공 형

// SampleController.java

... (생략) ...

@GetMapping("/ex05")
	public void ex05() {
		log.info("/ex05........");
	}


views/sample/ex05.jsp 파일을 넣으면 에러가 나지 않습니다.


문자열 유형

void 유형 외에도 가장 일반적으로 사용되는 유형은 String 유형입니다.

String 타입은 상황에 따라 다른 화면을 보여줘야 할 때 유용합니다.

String 유형은 일반적으로 현재 프로젝트의 JSP 파일 이름을 나타냅니다.

개체 유형

컨트롤러 메소드의 리턴 타입은 VO(Value Object)나 DTO(Data Transfer Object) 타입과 같이 복잡한 데이터를 포함하는 객체 타입으로 지정할 수 있는데, 이때 주로 JSON 데이터 생성에 사용된다.

Jackson -databind 라이브러리가 pom.xml에 추가됨

// pom.xml
	
    ... (생략) ...
	
    // 추가
	<dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-databind</artifactId>
         <version>2.9.4</version>
      </dependency>

SampleController의 일부

// SampleController.java

... (생략) ...


// 추가
@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


응답엔티티 유형

// SampleController.java

	... (생략) ...
    
    // 추가
	@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


파일 업로드 처리

pom.xml에 commons-fileupload 라이브러리 추가

// pom.xml

... (생략) ...

// 추가
	<dependency>
         <groupId>commons-fileupload</groupId>
         <artifactId>commons-fileupload</artifactId>
         <version>1.3.3</version>
      </dependency>

라이브러리 추가 후 C드라이브 아래에 upload/tmp라는 임시 업로드 파일 폴더를 생성합니다.


servlet-context.xml의 일부

// servlet-context.xml

... (생략) ...

<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> <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>

SampleController.java에 추가

// SampleController.java

... (생략) ...

	@GetMapping("/exUpload")
	public void exUpload() {
		log.info("/exUpload........");
	}
}

exUpload.jsp


// 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>

SampleController의 일부를 추가합니다.

// SampleController.java

... (생략) ...

	@PostMapping("/exUploadPost")
	public void exUploadPost(ArrayList<MultipartFile> files) {
		
		files.forEach(file -> {
			log.info("-------------------------------------");
			log.info("name: " + file.getOriginalFilename());
			log.info("size: " + file.getSize());
		});
	}

Spring MVC에서는 같은 이름의 파라미터가 여러 개 있을 경우 배열로 취급할 수 있으므로 파라미터를 배열 형태의 MultipartFile로 작성한다.

실제로 파일을 업로드하면 아래와 같은 결과를 볼 수 있습니다.

현재 설정은 최대 파일 크기가 2MB이므로 그보다 작은 파일을 지정하고 업로드를 테스트하십시오.

>>>>>방향