[Spring] project 실습 ② - 입력 폼 처리, enum

형이·2023년 9월 27일

Spring

목록 보기
12/21
post-thumbnail

📝 Spring

🖥️ 1. 입력 폼 처리

  • 타임리프가 제공하는 입력 폼 기능을 적용해서 기존 프로젝트의 폼 코드를 타임리프가 지원하는 기능을 사용해서 효율적으로 개선하자.
  • th:object="${item}" : form에 객체가 연결되는 것을 커맨드 객체라고 한다.
  • th:field="${item.itemName}" : id="itemName" name="itemName" 1차 생략 가능
  • th:field="*{itemName}" : th:object 소속이라는 뜻의 *을 넣어주면 item도 생략 가능하다. (id, name, value 삭제 가능)

🖥️ 2. enum 타입

** java에서 제공

2-1. enum 타입이란?

  • Enumeration
  • 연관된 상수들을 하나의 타입으로 지정할 수 있도록 하는 클래스
  • 데이터 중에서 요일 (일 / 월 / 화 / 수 / 목 / 금 / 토) 혹은 계절 (봄 / 여름 / 가을 / 겨울) 등과 같이 몇 가지 한정된 값을 갖는 경우가 흔히 있다. 이러한 데이터를 열거 타입에 들어갈 수 있는 열거 상수라고 한다.

2-2. enum의 장점

  • 코드가 단순해지며 가독성이 좋아짐
  • 인스턴스 생성과 상속을 방지하여 상수값의 안정성이 보장됨
  • 상수 자료형을 정의함으로써 해당 자료형 이외의 상수값은 저장되지 못하게 함
  • enum 예약어를 사용하므로 열거 의도를 분명히 함

2-3. enum과 메모리 구조

  • java에서 열거 상수는 상수 각각을 내부적으로 public static final 필드이면서 객체로 제공되도록 한다.
  • static이 붙어있기 때문에 각각의 상수는 클래스 변수로 클래스로더가 로드 시점에 JVM Method 영역에 해당 클래스 변수들을 항상 상주시켜 프로그램이 종료되기 전에는 언제든지 가져다 쓸 수 있는 주소 공간을 확보한다.

2-4. 열거 상수를 다른 값과 연결하기

  • 열거 상수 각각이 열거 객체이므로 열거 객체에 생성자를 사용해서 다음과 같이 열거 상수에 다른 값을 할당할 수 있다.
  • 상수("연결문자"), 상수(값)과 같은 형태로 작성
  • 상수들을 열거한 끝에 ; 작성
  • 해당 자료형에 맞는 private 생성자 필요
  • 연결한 값을 반환해줄 getter 메소드 필요
<input type="hidden" name="_open" value="on" /> <!-- 히든 필드 -->
  • 스프링 MVC에서는 약간의 트릭을 사용하는데, 히든 필드를 하나만들어서, open처럼 기존 체크 박스 이름 앞에 언더스코어()를 붙여서 전송하면 체크를 해제했다고 인식할 수 있다. 히든 필드는 항상 전송된다. 따라서 체크를 해제한 경우 여기에서 open은 전송되지 않고, _open만 전송되는데 이 경우 스프링 MVC는 체크를 해제했다고 판단한다.

2-5. 예제

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);
		}

🖥️ 3. radio

  • th:value="${type.name()}" : enum의 name return
  • th:text="${type.description}" : enum의 getDescription을 return

🖥️ 4. bindingResult

  • 스프링이 제공하는 검증 오류를 보관하는 객체이다. 검증 오류가 발생하면 여기에 보관하면 된다.
  • BindingResult가 있으면 @ModelAttribute에 데이터 바인딩 시 오류가 발생하도록 컨트롤러가 호출된다.
  • 주의사항 : 검증할 대상 바로 다음에 와야 한다. 순서가 중요!
  • @ModelAttribute Item item, 바로 다음에 BindingResult가 와야 한다.
  • BindingResult는 Model에 자동으로 포함된다.
  • th:errors : 해당 필드에 오류가 있는 경우에 태그를 출력한다. th:if의 편의 버전이다.
  • th:errorclass="field-error" : th:field에서 지정한 필드에 오류가 있으면 class 정보를 추가한다.

🖥️ 5. FieldError

  • 파라미터 목록
	objectname		: 오류가 발생한 객체 이름
	field		: 오류 필드
	rejectedValue  	: 사용자가 입력한 값 (거절된 값)
	bindingFailure 	: 타입 오류 같은 바인딩 실패인지, 검증 실패인지 구분
	codes			: 메시지 코드
	arguments		: 메시지에서 사용하는 인자
	defaultMessage	: 기본 오류 메시지

0개의 댓글