티스토리 뷰

728x90

0. Form에서 전송한 데이터를 Date로 변환이 필요한 경우가 많다. 워낙 다양하기 때문에 생각 날 때마다 추가할 예정

 

form에서 Parmater로 받아 Controller에서 Date로 변환하는 방법 (LocalDate에도 사용가능하다)

1. Form에서 입력한 값을 Controller에서 Date객체로 변환하려면 @DateTimeFormat을 사용할 수 있다.

  1-0 아래는 항공편을 예약할 때 사용하는 Flight 검색정보를 받아서 항공편을 검색하는 예제이다.

  1-1 @RequestParam으로 전달 받은 값을 @DataTimeFormat은 Date객체로 변환한다.

  1-2 @DateTimeFormat pattern 속성에서 어떤 형식으로 값이 입력되는지를 정의할 수 있다.

 

@Controller
public class FlightController {

  @Autowired
  FlightRepository flightRepository;
  
  private static final Logger LOGGER = LoggerFactory.getLogger(FlightController.class);
  
  
  @PostMapping("/findFlights")
  public String findFlights(
      @RequestParam String from, 
      @RequestParam String to, 
      @RequestParam("departureDate") @DateTimeFormat(pattern = "MM-dd-yyyy") Date departureDate,
      Model model) {
    
    LOGGER.info("from:: " + from + ", to:: " + to + ", departureDate:: " + departureDate.toString());
    
    List<Flight> flights = this.flightRepository.findFlights(from, to, departureDate);
    model.addAttribute("flights", flights);
    
    
    return "displayFlights";
  }
}

 

2. MySql의 Date는 년월일 까지만 저장한다. 시간까지 저장하려면 DateTime을 사용해야 한다.

 

3. 자바의 Date는 시간 정보까지 저장할 수 있는 클래스임을 유의한다.

 

 

form에서 @ModelAttribute 로 받아 Date로 변환하는 방법 (LocalDate에도 사용가능하다)

 

1. 위의 방법과 동일하게 @DateTimeFormat을 사용한다.

  1-1 @DateTimeFormat을 DTO나 Entity클래스의 속성에 정의할 수 있다.

  1-2 위와 동일한 예제이다. pattern은 상황마다 달라질 수 있다.

    1-2-1 일반적으로 한국어로 html에 input type="date"로 정의되면 아래처럼 yyyy-MM-dd 포멧이 된다.

 

 

Entity에서 Annotation을 통해 Format을 지정하는 방법

1. Entity 클래스를 열어 지정을 원하는 곳에 @DateTimeFormat을 사용한다.

 

package pe.pilseong.flightreservation.dto;

import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;

import lombok.Data;

@Data
public class FlightSearchDTO {

  private String from;

  private String to;

  @DateTimeFormat(pattern = "yyyy-MM-dd")
  private Date departureDate;
}

 

@InitBinder와 PropertyEditorSupport를 사용하여 변환하기 (LocalDate, Date 모두 가능하다.)

1. setAsText는 String값을 받아서 특정 속성을 변환하는 기능을 지원한다.

 

2. 아래의 경우는 String을 LocalDate으로 변경하는 것을 지원한다.

 

  @InitBinder
  public void dateBinder(WebDataBinder dataBinder) {
    dataBinder.setDisallowedFields("id");

    dataBinder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {
      @Override
      public void setAsText(String text) throws IllegalArgumentException {
        setValue(LocalDate.parse(text));
      }
    });
  }

 

 

@InitBinder와 CustomDateEditor을 사용하여 변환하기 (Date만 가능)

1. SimpleDateFormat 객체를 생성하여 원하는 포멧을 지정하고

2. CustomDateEditor를 생성하여 formatter를 지정한 후 등록한다.

 

  @InitBinder
  public void initBinder(WebDataBinder binder) {
    log.info("initBinder in TodoController \n");
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
  }

 

String과 Date를 변환을 위한 클래스 사용하기

 

1. Database에 Date 타입의 column을 만든다. 아래는 date_of_birth라는 column으로 date 타입으로 되어 있다.

  1-1 물론 datetime으로 사용할 수도 있는데 MySql의 Datetime은 시간정보도 포함한다.

 

MySql의 student table은 아래의 구조로 되어 있다고 가정

'id', 'int', 'NO', 'PRI', NULL, 'auto_increment'
'first_name', 'varchar(45)', 'YES', '', NULL, ''
'last_name', 'varchar(45)', 'YES', '', NULL, ''
'date_of_birth', 'date', 'YES', '', NULL, ''
'email', 'varchar(45)', 'YES', '', NULL, ''

 

2. DateUtil 클래스를 생성한다.

  2-1 기능은 단순한데 parseDate 메소드는 String을 Date 객체로 변환하는 것이고

  2-2 formatDate 메소드는 Date객체를 String으로 변환하는 기능을 가진다.

 

public class DateUtil {
  private static SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

  public static Date parseDate(String dateStr) throws ParseException {
    Date date = formatter.parse(dateStr);

    return date;
  }
  
  public static String formatDate(Date date) {
    String dateStr = null;
    
    if (date != null) {
      dateStr = formatter.format(date);
    }
    
    return dateStr;
  }
}

 

728x90
댓글