
유효하지 않을 시 결과 화면

1. @ModelAttribute
적용 대상을 Model의 속성으로 자동 추가해주는 어노테이션 (Model에 자동 저장 -> 호출/저장 필요없음)
반환 타입 또는 컨트롤러 메서드의 매개변수에 적용 가능
Model에
Key와 value가 있다면,
"myDate"와 'data주소'가 저장된다.

컨트롤러 메소드 앞에 붙이기

호출 결과를 Model에 저장한다.
key와 value가 있다면
"yoil"과 '수'로 저장된다.
코드가 간결해졌다!
<java />
package com.fastcampus.ch2;
import java.util.Calendar;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class YoilTellerMVC5 {
@ExceptionHandler(Exception.class)
public String catcher(Exception e) {
return "yoilError";
}
@RequestMapping("/getYoilMVC5") // http://localhost/ch2/getYoilMVC5
// public String main(@ModelAttribute("MyDate") MyDate date, Model model) { 아래와 동일
public String main(@ModelAttribute MyDate date, Model model) {
// 1. 유효성 검사
if(!isValid(date))
return "yoilError"; // 유효하지 않으면, /WEB-INF/views/yoilError.jsp로 이동
// 2. 처리
// char yoil = getYoil(date);
// 3. Model에 작업 결과 저장
// model.addAttribute("myDate", date); //작업한 결과를 모델에 줄 때 key를 myDate로, value는 date로
// model.addAttribute("yoil", yoil);
// 4. 작업 결과를 보여줄 View의 이름을 반환
return "yoil"; // /WEB-INF/views/yoil.jsp
}
private boolean isValid(MyDate date) {
return isValid(date.getYear(),date.getMonth(),date.getDay());
}
private @ModelAttribute("yoil") char getYoil(MyDate date) {
return getYoil(date.getYear(),date.getMonth(),date.getDay());
}
private char getYoil(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, day);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
return " 일월화수목금토".charAt(dayOfWeek);
}
private boolean isValid(int year, int month, int day) {
if(year==-1 || month==-1 || day==-1)
return false;
return (1<=month && month<=12) && (1<=day && day<=31); // 간단히 체크
}
}
사실 @ModelAttribute가 생략 가능!
컨트롤러 매개변수의
- 타입이 기본형, String일 때는 RequestParam이 생략된 것으로 보면 된다.
- 타입이 참조형일 때는 ModelAttribute이 생략된 것으로 보면 된다.
2. WebDataBinder

브라우저를 통해 요청 받은 값이 (year,month,day)
MyData 객체에 바인딩 될 때 중간 역할을 해준다.
WebDataBinder가 하는 일 :
1. 타입 변환 -> 결과/에러를 BindingResult에 저장
2. 데이터 검증 -> 결과/에러를 BindingResult에 저장
3. 컨트롤러에 넘겨줌 (컨트롤러가 결과 확인 가능)
<java />
@Controller
public class YoilTellerMVC6 {
@ExceptionHandler(Exception.class)
public String catcher(Exception ex, BindingResult result) { //컨트롤러까지 에러가 닿지도 못해서 여기서 에러 출력해보기
System.out.println("result="+result);
System.out.println("error="+result.getFieldError());
FieldError error = result.getFieldError();
System.out.println("code="+error.getCode());
System.out.println("field="+error.getField());
System.out.println("msg="+error.getDefaultMessage());
return "yoilError";
}
@RequestMapping("/getYoilMVC6") // http://localhost/ch2/getYoilMVC6
// public String main(@ModelAttribute("myDate") MyDate date, Model model) {
public String main(MyDate date, BindingResult result) {
System.out.println("result="+result);
// 1. 유효성 검사
if(!isValid(date))
return "yoilError"; // 유효하지 않으면, /WEB-INF/views/yoilError.jsp로 이동
// 2. 처리
// char yoil = getYoil(date);
// 3. Model에 작업 결과 저장
// model.addAttribute("myDate", date);
// model.addAttribute("yoil", yoil);
// 4. 작업 결과를 보여줄 View의 이름을 반환
return "yoil"; // /WEB-INF/views/yoil.jsp
}
private @ModelAttribute("yoil") char getYoil(MyDate date) {
return getYoil(date.getYear(), date.getMonth(), date.getDay());
}
private char getYoil(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, day);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
return " 일월화수목금토".charAt(dayOfWeek);
}
private boolean isValid(MyDate date) {
if(date.getYear()==-1 || date.getMonth()==-1 || date.getDay()==-1)
return false;
return (1<=date.getMonth() && date.getMonth()<=12) && (1<=date.getDay() && date.getDay()<=31); // 간단히 체크
}
}
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패캠 챌린지' 카테고리의 다른 글
패스트캠퍼스 챌린지 - 15일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.06 |
---|---|
패스트캠퍼스 챌린지 - 14일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.05 |
패스트캠퍼스 챌린지 - 12일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.03 |
패스트캠퍼스 챌린지 - 11일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.02 |
패스트캠퍼스 챌린지 - 10일차 [스프링의 정석:남궁성과 끝까지 간다] (0) | 2023.03.01 |