일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- application.yml
- 테스트
- 네이티브쿼리
- 커밋메세지수정
- querydsl
- 컨테이너실행
- EC2
- 메세지수정
- 추후정리
- WeNews
- 서브쿼리
- MySQL
- 예약
- 포트
- subquery
- ubuntu
- 참조키
- appspec
- ㅔㄴ션
- 적용우선순위
- appspec.yml
- 메소드명
- 외부키
- 테스트메소드
- Query
- foreignkey
- 2 > /dev/null
- AuthenticationEntryPoint
- docker명령어
- 검색
- Today
- Total
제뉴어리의 모든것
mysql LocalDateTime 그리고 HTML DateTime-local 간의 변환.. 본문
Spring boot 프로젝트에서 Entity에 날짜시간 관련 변수의 데이터형을 LocalDateTime을 사용하였다..
그럼 Mysql에는 자동으로 datetime(6)으로 설정이 된다..
그리고 HTML에서는 날짜를 입력받기 위해 datetime-local 타입의 Input 필드를 사용하였다..
즉 현재 날짜를 나타는 한 항목(데이터)을
Mysql - datetime(6)
Java(Entity) - LocalDateTime
HTML - datetime-local
이렇게 3가지 형식으로 가지고 있는것이다...
문제는 datetime-local 때문에 발생하였다...
datetime-local은 날짜와 시간을 입력받기 위해 사용한 input 타입이다...
날짜와 시간을 입력 받을 필요가 없고 그냥 출력만 하고싶다면 type="text" 형의 input 타입에
value를 넣을때 th:value="${#temporals.format(dto.modDate, 'yyyy/MM/dd HH:mm:ss')}"
이런식으로 LocalDateTime의 데이터를 포맷만 해주면 됬었다...
그런데 datetime-local을 사용한 이유는 입력을 받기 위해서고..문제는..datetime-local 타입의 input 데이터를 submit으로 인해 서버에서 받는것도 되지가 않고datetime-local 타입의 input 에 데이터를 넣어서 세팅을 해놓는것도 되지가 않았다..
서버에서 받을때는 똑같이 LocalDateTime으로 설정을 하니까 매칭이 되지 않았다..그리고 HTML에 세팅을 하려고 해도 기본값으로만 보여졌다..
해결을 하기위해
일단 바꿀수 없다고 가정한 원칙은
1. Entity는 기존처럼 LocalDateTime을 사용하고 DB도 자동으로 DateTime을 사용한다.
2. HTML에서는 날짜시간 입력을 위해 datetime-local을 사용한다.
그리고 각 파트별로 데이터의 타입은
DB 필드 타입 - datetime(6)
엔티티 변수 타입 - LocalDateTime
HTML 전달위한 DTO 변수 타입 - String
HTML input 타입 - datetime-local
해결방법 :
HTML datetime-local타입 input 데이터를 DTO에서 String으로 받고 (String은 날짜관련 데이터형이 달라도 다 받아줄것 같아서..)
String 형태의 데이터를 Entity에 저장하기 위해 LocalDateTime으로 형변환 하고 이때 HTML datetime-local 형식이 받을 수 있는 포맷으로 파싱을 하여 LocalDateTime 형태로 저장한다.
LocalDateTime newDate = LocalDateTime
.parse(dto.getLimitDate(), DateTimeFormatter.ISO_DATE_TIME);
DB에는 datetime(6) 형태 변수에 2021-03-30 15:30:00.000000 형태로 저장이 된다.
그 데이터를 읽어서 다시 datetime-local에 뿌리려고 어떠한 포맷으로 파싱 해보려고 해도 에러가 나거나 제대로 출력이 되지 않았다.. 그러므로 애초에 datetime-local이 받을 수있는 LocalDateTime 형태로 DB에 저장을 하였다.포맷형태로 파싱을 하지 않고 저장하면 LocalDateTime으로 형변환 하여 DB에 저장은 되지만 (DB상에 0.xxx 초 단위까지 저장됨..)
그리고
DTO에 String 형태로 저장하여 HTML에 전송하고
HTML에서는 아래와 같이 그냥 value엣 대입하여 사용하면 된다.
<div class="form-group">
<label>Limit Date</label>
<input id="limitDate" class="form-control"type="datetime-local" th:value="${dto.limitDate}"/><br>
</div>
요약하자면
- HTML -> DB
datetime-local 값을 dto에서 String으로 받아서
LocalDateTime newDate = LocalDateTime.parse(dto.getLimitDate(), DateTimeFormatter.ISO_DATE_TIME);
을 사용하여 형변환 해서 DB 저장
- DB -> HTML
DB에서 읽은 LocalDateTime을 String으로 DTO 저장하고
HTML에는
<div class="form-group">
<label>Limit Date</label>
<input id="limitDate" class="form-control"type="datetime-local" th:value="${dto.limitDate}"/><br>
</div>
으로 그냥 출력
'HTML' 카테고리의 다른 글
HTML4와 HTML5 (0) | 2021.03.28 |
---|---|
동적으로 HTML 소스 추가할때 th이용하여 자바 함수 사용예 (0) | 2021.03.18 |
HTML에서 파일 업로드 시 특정 타입의 데이터만 올리기 (0) | 2021.03.12 |
[HTML] 폼태크 <input>에서 id와 name의 서로 다른 기능 (0) | 2021.03.10 |
HTML 날짜 입력 받기 (0) | 2021.03.10 |