스프링 코딩 공작소 - 7장 스프링 폼 태그: 도서 등록 페이지 만들기

­하형·2023년 4월 11일
0

7장 스프링 폼 태그: 도서 등록 페이지 만들기

7.1 스프링 폼 태그 개요

7.1.1 스프링 폼 태그

스프링 폼 태그란?

  • 스프링 MVC와 연동되는 태그 라이브러리
  • 폼에서 전달되는 파라미터 이름으로 Setter( ) 메서드를 작성한 클래스의 프로퍼티(필드 이름)에 접근할 수 있고 컨트롤러가 다루는 데이터를 참조할 수 있음
  • 동적 웹 애플리케이션을 더 쉽고 편리하게 개발하고 유지 관리할 수 있다!
  • 스프링 폼 태그 라이브러리의 선언
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    • prefix="form": 태그 이름이 form인 라이브러리의 태그를 뷰 페이지의 어느곳이든 이용한다는 의미로, <form:태그 이름>형식으로 사용할 수 있도록 함

7.1.2 스프링 폼 태그 사용법

  • <form> 태그

    • 사용자에게 데이터를 입력받아 상호 작용하는 다양한 입력 양식과 관련된 내용을 포함하는 최상위 태그로 사용하며 형식은 다음과 같음
    <form:form 속성1="값1" [속성2="값2" ...]>
      // 다양한 입력 양식 태그(<input>, <select>, <textarea>) 
    </form:form>
    • <form> 태그는 HTML의 <form> 태그와 다르게 modelAttribute 속성을 지원하여 <input>이나 <hidden> 같은 태그들이 커맨드 객체의 프로퍼티(필드 이름)에 접근할 수 있게 함
    • 다음은 <form> 태그를 사용한 예로, HTML 코드를 열어 보면 다음과 같이 html의 <form> 태그로 출력됨
    <form:form modelAttribute="member">
      ... 
    </form:form>
    • 위처럼 <form:form> 태그의 method와 action 속성을 지정하지 않으면 다음과 같이 HTML로 출력되는 <form> 태그의 method 속성 값은 post로 설정되고, action 속성 값은 현재 요청 URL이 됨
    • 출력된 HTML <form> 코드
    <form id="member" action="/chap07/member" method="post">
      ... 
    </form>
  • <form> 안에 사용하는 태그

    • 스프링 폼 태그들은 <form:form> 태그 내 중첩되어 사용
    • 반드시 종료(/>) 태그로 닫아야 함
    • 형식은 다음과 같고, 사용법은 HTML 태그와 동일
    <form:form modelAttribute="커맨드 객체">
      <form:태그 이름 path="커맨드 객체의 프로퍼티(필드)"/> 
    </form:form>
    • 커맨드 객체의 필드에 접근하기 위해 <form:form> 태그 내 modelAttribute 속성을 설정하면 중첩되는 <form:form> 태그에 반드시 path 속성을 설정해야 함

7.1.3 실습 스프링 폼 태그로 도서 등록 페이지 만들기


7.2 @ModelAttribute를 이용한 데이터 바인딩

(참고) 데이터 바인딩이란?

  • 웹 페이지에서 전달되는 요청 파라미터 값을 동적으로 도메인 객체의 프로퍼티에 설정해 주는 것
  • 웹 애플리케이션에서 사용자가 입력하여 웹 페이지로 문자열을 전달하는 경우, 해당 문자열로 전달된 파라미터는 도메인 객체의 프로퍼티 타입(int, boolean, char 등)에 맞게 변환해야 함
  • 이렇게 사용자가 입력한 문자열 값을 프로퍼티 타입에 맞추어 자동으로 변환하여 할당하는 것을 데이터 바인딩이라고 한다!

7.2.1 요청 처리 메서드의 매개변수에 @ModelAttribte 적용

  • 폼 페이지에서 입력된 데이터가 전달되면 @ModelAttribute는 커맨드 객체에 매핑되어 프로퍼티에 데이터를 채우는 역할을 수행함
  • @ModelAttribute를 컨트롤러 안의 @RequestMapping이 적용된 요청 처리 메서드의 매개변수로 설정하여 사용하며, 형식은 다음과 같음
public String 메서드 이름(@ModelAttribute 매개변수, Model model) {
    // model.addAttribute(...);
    return "뷰"; 
}
  • 요청 처리 메서드의 매개변수에 @ModelAttribute를 사용하면 폼 페이지에서 입력된 데이터를 자동으로 할당해 주기 때문에 폼 입력 양식의 구문을 개별적으로 분석하지 않아도 됨
  • 요청 처리 메서드의 매개변수인 커맨드 객체 이름도 자유롭게 변경하여 사용 가능

7.2.2 메서드에 @ModelAttribute 적용

  • 메서드 수준의 @ModelAttribute란?
    컨트롤러 안에 @RequestMapping이 적용되지 않은 별도의 일반 메서드를 만들어 해당 메서드에 @ModelAttribute를 적용하는 것

    @ModelAttribute("모델 속성 이름")
    public String 메서드 이름() {
    	...
    }
    
    @ModelAttribute
    public void 메서드 이름(Model model) {
    	//model.addAttribute(...);
    }
  • 뷰 페이지에서 공통으로 사용할 수 있는 커맨드 객체의 프로퍼티(멤버 변수, 필드)를 설정하여 뷰 페이지에 출력하는 역할 수행

  • 웹 요청 URL을 처리할 수는 없으나 먼저 호출되며 컨트롤러 안에 여러 개 생성 가능

7.2.3 실습 @ModelAttribute를 이용하여 새로운 도서 등록하기


7.3 @InitBinder를 이용한 커스텀 데이터 바인딩

7.3.1 메서드에 @InitBinder 적용

  • @InitBinder는 사용자가 입력한 데이터가 커맨드 객체의 프로퍼티에 매핑되기 전에 데이터 바인딩을 사용자 정의(customizing)할 수 있음
  • WebDataBinder 객체를 초기화하는 메서드와 함께 사용되며 형식은 다음과 같음
@InitBinder
public void 메서드 이름(WebDataBinder binder, ...) {
    // 구현 생략
} 

@InitBinder("커맨드 객체 이름")
public void 메서드 이름(WebDataBinder binder, ...) {
    // 구현 생략 
}
  • @InitBinder가 선언된 메서드의 매개변수로 WebDataBinder를 사용하여 폼 페이지에서 입력된 데이터들을 커맨드 객체의 프로퍼티로 전체 또는 일부만 전달할지 구성할 수 있음

7.3.2 폼 파라미터의 커스텀 데이터 바인딩

  • setAllowedFields( )
    • 폼 페이지에서 원하지 않는 파라미터가 할당되는 것을 방지하고자 할 때 데이터 바인딩을 허용하는 폼 파라미터를 설정함으로서 커스텀 데이터 바인딩을 할 수 있음
    • 매개변수의 기본값은 폼 페이지의 모든 파라미터, 즉 모든 파라미터를 바인딩하는 상태
    public void setAllowedFields("폼 파라미터 이름1", ...) 
  • setDisallowedFields( )
    • setAllowedFields( )의 반대 메서드
    • 폼 페이지에서 원하지 않는 파라미터가 바인딩되는 것을 방지하기 위해 데이터 바인딩을 허용하지 않는 폼 파라미터를 설정
    • 매개변수의 기본값은 none
    public void setDisallowedFields("폼 파라미터 이름1", ...) 

7.3.3 실습 @InitBinder를 이용하여 커스텀 데이터 바인딩하기

0개의 댓글