📝Controller의 파라미터
@Controller - 해당 클래스의 인스턴스를 스프링의 빈으로 등록하고 컨트롤러로 사용
@RequestMapping - 특정한 URI에 대한 처리를 해당 컨트롤러나 메서드에서 처리
- 스프링 4.3 이전에는 @RequestMapping(method = 'get' ) 방식으로 사용
- 스프링 4.3이후에는 @GetMapping, @PostMapping등으로 간단히 표현
📌Model이라는 데이터 전달자
- Model 객체는 JSP에 컨트롤러에서 생선된 데이터를 담아서 전달하는 역할을 하는 존재
- 모델 2 방식에서 사용하는 request.setAttribute()와 유사한 역할
- 과거에는 ModelAndView
- Model에 담는 데이터 => 파라미터가 아니라.. 다른 곳에서 발생한 데이터를 담기 위한 용기
Public String home(Model model){
model.Attribute("serverTime",new java.util.Date());
return "home";
}
@ModelAttribute
- 컨트롤러에서 메서드의 파라미터는 기본자료형을 제외한 객체형 타입은 다시 화면으로 전달
- @ModelAttribute는 명시적으로 화면에 전달되도록 지정
@GetMapping("/ex04")
public String ex04(SampleDTO dto, @ModelAttribute("aaaa") int page){
//modelAttribute를 사용하면 원하는 이름으로 호출가능
log.info("dto:"+ dto);
log.info("aaaa:"+ page);
return "/sample/ex04";
}
<h2>SAMPLEDTO ${sampleDTO}</h2>
<h2>PAGE ${page}</h2>
📌RedirectAttribute
- 화면에 한번만 전달되는 파라미터를 처리하는 용도
- 내부적으로 HttpSession객체에 담아서 한번만 사용되고, 폐기
📝Controller의 리턴타입
- String: jsp를 이용하는 경우에는 jsp파일의 경로와 파일이름을 나타내기 위해서 사용- 분기
- 상황에 따라 다른 화면을 보여줄 필요가 있을 경우에 유용하게 사용
- String타입에는 다음과 같은 특별한 키워드를 붙여서 사용할 수 있음
- redirect:리다이렉트 방식으로 처리하는 경우
- forward: 포워드 방식으로 처리하는 경우
Redirect 방식의 예를 들어보겠다.
철수가 영희에게 re1호떡집에 가보라고 했는데 호떡집이 있어야할 위치에 없고 이전을 하여 re2 건물에 있다고한다.
그 주인이 그대로 re2에 호떡집을 이사한 것이다.
위의 ex02List 처럼 return 값을 하지 않아도 ex02Bean으로 자동으로 값 리턴
어노테이션 안에 { } <=를 사용하여 여러 페이지 연결 가능
- VO,DTO타입: 주로 JSON타입의 데이터를 만들어서 반환하는 용도로 사용(추가적인 라이브러리 필요)
- ResponseEntity 타입: response할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용(추가적인 라이브러리 필요)
- Model, ModelAndView: Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용 (최근에 많이 사용X)
- HttpHeaders: 응답에 내용 없이 Http헤더 메시지만 전달하는 용도로 사용
📝파일 업로드 처리
- Servlet 3.0이후(Tomcat 7.0)에는 기본적으로 업로드 되는 파일을 처리할 수 있는 기능이 추가
- 별도로 commons-fileupload라이브러리 등을 사용
https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
위의 링크를 통해 1.4버전의 dependency를 추가한다.
그리고 root-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>
<!-- 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="10485756"></beans:property>
</beans:bean>
파일 업로드를 위한 폴더 경로를 만들어준다.
그 후 해당 경로에 SampleController하나 생성한 후 아래와 같이 코드 입력후 테스트 해보면
결과는??
아직 jsp파일이 없으니 당연한 결과다. ㅎㅎ
놀라지 마시길...
하지만 콘솔 창을 확인하면 로그는 찍혔다! 이러면 연결을 되었다고 생각하면된다. 그러면 jsp파일을 만들어서 확인하자.
exUpload.jsp파일을 만들어주시고
<form action="/sample/exUploadPost" method="post" enctype="multipart/form-data">
<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="file" name="files">
</div>
<div>
<input type="submit">
</div>
</form>
코드를 body안에 붙여준다
붙여주고 창을 새로고침하면
원하는 view가 나왔다!
이제 업로드가 되는 지만 간단히 확인해보자
@PostMapping("/exUploadPost")
public void exUploadPost(ArrayList<MultipartFile> files) {
files.forEach(file->{
log.info(file.getOriginalFilename());
log.info(file.getSize());
log.info(file.getContentType());
});
}
이렇게 postmapping으로 생성해주고
로그로 확인하는데 배열로 되어있으니 for문으로 log를찍었다.
파일의 이름 사이즈 컨텐트타입을 확인할 것이다.
3개의 파일을 올려보았다.
그리고 제출을 클릭하면?
URI도 잘이동하고
원하는 정보가 콘솔창에 찍혔다.!
일단은 여기까지만 파일 업로드부분을 다루고 나중에 다루겠다.
📝Controller의 예외처리
📌@ControllerAdvice : 스프링의 bean으로 등록할때 쓰는 어노테이션
- 예외처리와 원래의 컨트롤러가 혼합된 형태의 클래스가 작성되는 방식
- @ExceptionHandler는 해당 메서드가 ()들어가는 예외타입을 처리한다는 것을 의미
advice가 들어가있는 것은 AOP와 관련되있는 아이라고 생각하면된다.
에러페이지를 만들어보자.
우선 컨트롤러에
@ExceptionHandler(Exception.class)
public String except(Exception ex, Model model) {
log.error("Exception ......." + ex.getMessage());
model.addAttribute("exception", ex);
log.error(model);
return "error_page";
}
추가를 해주시고 view도 만들어준다.
이제 예외가 발생시 exception page가 뜰 것이다 ㅎㅎ
다음 글부터는 지금까지 배운것을 바탕으로 웹페이지 구현을 들어간다. 기대반 설렘반 ㅋㅎ
'Spring' 카테고리의 다른 글
[Part 2] BoardVO클래스와 매퍼테스트 #2 (0) | 2023.01.17 |
---|---|
[Part 2] 스프링 프로젝트 구성 #1 (0) | 2023.01.15 |
[Part 1] 스프링 MVC #9 (0) | 2023.01.14 |
[Part 1] MyBatis 연동 #8 (0) | 2023.01.13 |
[Part 1] HikariCP 설정 #7 (0) | 2023.01.12 |