21.08.16
1. 문제1 발생
1. DB에서 regdate는 datetime으로 선언한 칼럼이었습니다.
2. spring에서 객체로 값을 받아와 view단에 el태그를 사용해 뿌려줬습니다. ( ${list.regdate} ), 그러나 값이 제대로 넘어오지 않았는지 계속해서 공백이 떴습니다.
3. 오류 메세지가 뜨지 않고 공백만 뜨는 것을 보아 뭔가 datatype의 문제가 아닐까 생각하고 해결하는 시간을 가졌습니다.
2. 문제1 해결
1. DB에서 datetime으로 선언한 것은 옳았습니다. 게시글의 날짜와 시분초까지 알기 위해선 datetime, 또는 timestamp를 써야하기 때문입니다. 여기선 문제가 없었습니다.
2. 문제는 java코드에서 발생했습니다. ListVO 라는 class에 값을 받아와 controller에서 사용하는 구조인데 ListVO를 다시 들여다보니 ListVO의 변수인 regdate의 선언이 timestamp로 되어 있었습니다. 변수 선언시 타입을 date로 다시 바꾸고 서버를 다시 돌리니 값이 넘어오는 것을 확인했습니다.
3. 문제2 발생
1. date로 타입을 변경해야한다는 해결 방안을 찾고 이제 ctrl+shift+o를 눌러 import 시켰습니다. 하지만 두 개의 import 예시가 뜨는 것을 보고 고민에 빠졌습니다. 둘의 차이점은 뭐고 뭘 써야 오류가 나지 않고 내가 원하는 값을 가져올지 궁금했습니다.
2. 일단 java.sql.date를 import하고 사용해봤습니다.
3. 이런 시분초가 넘어오지 않았습니다.
4. 문제2 해결
1. googling을 통해서 둘 사이의 차이점을 찾았고 해결책은...
2. java.util.date 였습니다. sql.date는 시분초를 가져올수 없었습니다.. 나중에 비슷한 문제가 발생하지 않도록 신경써야 겠습니다.
5. 문제3 발생
1. view 단으로 날짜 + 시분초 까지 값이 잘 넘어오는 것을 확인했습니다. 그런데 mysql table에서는 저녁에 작성한 글인데 view, jsp단에서는 15시간 전으로 표시되고 있었습니다. 전에 작성했던 다른 게시글도 모두 정확히 15시간 차이가 나는 것을 보고 이건 어떤 설정값에서 문제가 생겼겠구나 예상을 했습니다.
6. 문제3 해결
1. 정답은 mysql 8 이상부터 생긴 servertimezone의 설정 문제였습니다.
2. select @@global.time_zone, @@session.time_zone,@@system_time_zone;
를 사용해 제가 쓰는 mysql의 systtemtimezone을 확인해봤습니다. 결과는
???ѹα? ǥ?ؽ |
이상한 글자가 떴습니다. db에서 select 문을 돌렸을땐 올바른 값이 나오니까 아마 spring에서 설정을 잘못하지 않았을까 라는 생각이 들었습니다. 그때 spring의 root-context가 생각났습니다.
3. root-context 의 property에서
<property name="url"value="jdbc:mysql://localhost:3306/spring?characterEncoding=UTF-8&serverTimezone=Asia/Seoul" /> 그전엔 =utc 였지만 asia/seoul로 값을 변경했습니다.
값을 변경하고 서버를 재가동했습니다.
4. 15시간 전이 아닌 실제 작성시간에 맞는 값이 넘어와 list.regdate에 담겼습니다.
오늘은 이 오류를 해결하는데 약 2시간 정도를 썼습니다.
'Spring' 카테고리의 다른 글
spring ApplicationContext, @primary, @qualifier (0) | 2021.08.27 |
---|---|
Spring EL, 내장객체, 표현법 (0) | 2021.08.13 |
Spring Model, Model 객체 (0) | 2021.08.11 |
session, Session의 동작 순서, Session 사용 코드 (0) | 2021.08.07 |
Tiles, dependency (0) | 2021.08.07 |