- 타임리프가 제공하는 입력 폼 기능을 적용해서 기존 프로젝트의 폼 코드를 타임리프가 지원하는 기능을 사용해서 효율적으로 개선하자.
th:object="${item}": form에 객체가 연결되는 것을 커맨드 객체라고 한다.
th:field="${item.itemName}": id="itemName" name="itemName" 1차 생략 가능
th:field="*{itemName}": th:object 소속이라는 뜻의 *을 넣어주면 item도 생략 가능하다. (id, name, value 삭제 가능)
** java에서 제공
- Enumeration
- 연관된 상수들을 하나의 타입으로 지정할 수 있도록 하는 클래스
- 데이터 중에서 요일 (일 / 월 / 화 / 수 / 목 / 금 / 토) 혹은 계절 (봄 / 여름 / 가을 / 겨울) 등과 같이 몇 가지 한정된 값을 갖는 경우가 흔히 있다. 이러한 데이터를 열거 타입에 들어갈 수 있는 열거 상수라고 한다.
- 코드가 단순해지며 가독성이 좋아짐
- 인스턴스 생성과 상속을 방지하여 상수값의 안정성이 보장됨
- 상수 자료형을 정의함으로써 해당 자료형 이외의 상수값은 저장되지 못하게 함
- enum 예약어를 사용하므로 열거 의도를 분명히 함
- java에서 열거 상수는 상수 각각을 내부적으로 public static final 필드이면서 객체로 제공되도록 한다.
- static이 붙어있기 때문에 각각의 상수는 클래스 변수로 클래스로더가 로드 시점에 JVM Method 영역에 해당 클래스 변수들을 항상 상주시켜 프로그램이 종료되기 전에는 언제든지 가져다 쓸 수 있는 주소 공간을 확보한다.
- 열거 상수 각각이 열거 객체이므로 열거 객체에 생성자를 사용해서 다음과 같이 열거 상수에 다른 값을 할당할 수 있다.
- 상수("연결문자"), 상수(값)과 같은 형태로 작성
- 상수들을 열거한 끝에 ; 작성
- 해당 자료형에 맞는 private 생성자 필요
- 연결한 값을 반환해줄 getter 메소드 필요
<input type="hidden" name="_open" value="on" /> <!-- 히든 필드 -->
- 스프링 MVC에서는 약간의 트릭을 사용하는데, 히든 필드를 하나만들어서, open처럼 기존 체크 박스 이름 앞에 언더스코어()를 붙여서 전송하면 체크를 해제했다고 인식할 수 있다. 히든 필드는 항상 전송된다. 따라서 체크를 해제한 경우 여기에서 open은 전송되지 않고, _open만 전송되는데 이 경우 스프링 MVC는 체크를 해제했다고 판단한다.
public enum Season {
SPRING, SUMMER, FALL, WINTER;
}
public static void main(String[] args) {
Season season = Season.SPRING;
// name() : 열거 객체의 문자열 리턴 → SPIRNG
String name = season.name();
System.out.println(name);
System.out.println("--------------------------");
// ordinal() : 열거 객체가 몇 번째인지를 리턴 → 0
int ordinal = season.ordinal();
System.out.println(ordinal);
System.out.println("--------------------------");
// values() : 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴 → SPRING SUMMER FALL WINTER
Season[] season1 = Season.values();
for( Season s : season1 ) {
System.out.println(s);
}
th:value="${type.name()}": enum의 name return
th:text="${type.description}": enum의 getDescription을 return
- 스프링이 제공하는 검증 오류를 보관하는 객체이다. 검증 오류가 발생하면 여기에 보관하면 된다.
- BindingResult가 있으면 @ModelAttribute에 데이터 바인딩 시 오류가 발생하도록 컨트롤러가 호출된다.
- 주의사항 : 검증할 대상 바로 다음에 와야 한다. 순서가 중요!
- @ModelAttribute Item item, 바로 다음에 BindingResult가 와야 한다.
- BindingResult는 Model에 자동으로 포함된다.
th:errors: 해당 필드에 오류가 있는 경우에 태그를 출력한다. th:if의 편의 버전이다.
th:errorclass="field-error": th:field에서 지정한 필드에 오류가 있으면 class 정보를 추가한다.
- 파라미터 목록
objectname : 오류가 발생한 객체 이름 field : 오류 필드 rejectedValue : 사용자가 입력한 값 (거절된 값) bindingFailure : 타입 오류 같은 바인딩 실패인지, 검증 실패인지 구분 codes : 메시지 코드 arguments : 메시지에서 사용하는 인자 defaultMessage : 기본 오류 메시지