@InitBinder:
주로 컨트롤러 클래스 내에서 사용되며, 컨트롤러 메서드의 파라미터 레벨에서 사용될 수 있다.
여러 컨트롤러 메서드 또는 여러 컨트롤러 클래스에서 공통적인 바인딩 및 변환 설정을 정의하고 공유할 때 사용된다.
- 문자열에서 날짜로 변환: 사용자가 날짜를 문자열로 입력하고 이를 Java의 java.util.Date 또는 java.time.LocalDate와 같은 날짜 형식으로 변환 (@DateTimeFormat을 사용해도 된다.)
@Controller
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
}
- 문자열에서 열거형(enum)으로 변환
- 사용자 정의 데이터 타입으로 변환
- 파라미터 값 검증 및 처리- 파라미터 이름 매핑
http://localhost:8080/sample/ex03?title=test&dueDate=2018-01-01
'2018-01-01'과 같이 문자열로 전달된 데이터를 java.util.Date 타입으로 @InitBinder 변환한다.
스프링Controller에서 파라미터를 바인딩 할때 자동으로 호출되는 @InitBinder를 이용해 변환을 처리할 수있다.
SimpleDateFormat 클래스
CustomDateEditor 클래스
/**
* CustomDateEditor 클래스의 생성자(객체를 초기화하고 설정함).
*
* @param dateFormat DateFormat 객체: 파싱과 렌더링에 사용할 날짜 형식을 정의합니다.
* @param allowEmpty 빈 문자열 허용 여부: true로 설정하면 빈 문자열은 null로 해석됩니다.
public CustomDateEditor(DateFormat dateFormat, boolean allowEmpty) {
// dateFormat 필드에 주어진 DateFormat 객체를 할당하여 사용합니다.
this.dateFormat = dateFormat;
// allowEmpty 필드에 주어진 허용 여부를 할당합니다.
this.allowEmpty = allowEmpty;
this.exactDateLength = -1;
}
@DateTimeFormat:
주로 필드 레벨에서 사용되며, 모델 클래스의 특정 필드에 대한 날짜 및 시간 형식을 지정할 때 사용된다.
public class MyModel {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date myDate;
}
필드에 날짜 및 시간 형식을 지정하는 방법
방법1(java8이전버전에는 java.util.Date 클래스는 특정 시점의 날짜와 시간 정보를 표현하는 데 사용)
* SimpleDateFormat은 날짜를 원하는 형식으로 포맷하거나 파싱하기 위한 클래스이고,
* Date는 날짜와 시간을 표현하는 클래스
// BoardVO
private Date updatedDate;
public void setUpdatedDate(Date currentDate) {
this.updatedDate = currentDate;
}
// BoardServiceImpl
@Override
public boolean modifyPost(BoardVO boardVO) {
Date currentDate = new Date(); // 현재 날짜와 시간 생성
boardVO.setUpdatedDate(currentDate); // 수정일 설정
log.info("modifyPost.....");
return mapper.modify(boardVO) == 1;
}
방법2(Java8 이후 java.time.LocalDateTime )
- LocalDate: 날짜 정보만 포함하는 클래스
- LocalTime: 시간 정보만 포함하는 클래스
- LocalDateTime: 날짜와 시간 정보를 포함하는 클래스
- ZonedDateTime: 특정 타임존을 고려한 날짜와 시간 정보를 포함하는 클래스
- DateTimeFormatter: 날짜와 시간을 특정 형식으로 변환
// BoardVO
private LocalDateTime updatedDate;
// 생성자를 이용하여 날짜를 설정
public BoardVO() {
this.createdDate = LocalDateTime.now();
this.updatedDate = LocalDateTime.now();
}
// BoardServiceImpl
@Override
public boolean modifyPost(BoardVO boardVO) {
LocalDateTime currentDateTime = LocalDateTime.now(); // 현재 날짜와 시간 생성
boardVO.setUpdatedDate(currentDateTime); // 수정일 설정
log.info("modifyPost.....");
return mapper.modify(boardVO) == 1;
}