์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ํ์ฌ ์ํฉ
JDBC๊ฐ ๋ฐ๋ช ๋๊ณ ์ธํฐํ์ด์ค๊ฐ ํ์คํ๋ ์ดํ 20๋ ์ด๋ผ๋ ์๊ฐ์ด ํ๋ ๊ณ ๊ทธ ์ฌ์ด ๋ง์ ๊ฒ์ด ๋ณํ๋ค.
์ฒซ์งธ, ์ธ๊ณ๋ ๊ธ๋ก๋ฒํ๋์์ผ๋ฉฐ ์ด์ ํ๋์ ์๋ฒ๊ฐ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ธํฐ๋ท ์๋๊ฐ ๋นจ๋ผ์ก์ต๋๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ ํ์ด ์๊ฐ๊ณผ ํจ๊ป ์๋ํ๋๋ก SQL์ ์ถ๊ฐ๋์์ต๋๋ค . ์ด์ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- DATE - ๋ ์ง๋ฅผ ์ ์ฅํฉ๋๋ค: ๋ , ์, ์ผ.
- TIME - ์๊ฐ ์ ์ฅ: ์, ๋ถ, ์ด.
- TIMESTAMP - ํน์ ์์ (๋ ์ง, ์๊ฐ ๋ฐ ๋ฐ๋ฆฌ์ด)์ ์ ์ฅํฉ๋๋ค.
- TIMESTAMP WITH TIME ZONE - TIMESTAMP ๋ฐ ์๊ฐ๋(๊ตฌ์ญ ์ด๋ฆ ๋๋ ์คํ์ ).
๋์งธ, Java๋ ์ ์ญ ์๊ฐ ๊ด๋ฆฌ๋ฅผ ์ํด DateTime API๋ฅผ ๋์ ํ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํด๋์ค๊ฐ ์์ต๋๋ค.
- ๋ ์ง ๋ฐ ์๊ฐ :
- ํ์ง ๋ ์ง
- ํ์ง ์๊ฐ
- ์ ํํ ์๊ฐ :
- java.time.Instant
- java.time.LocalDateTime
- java.time.OffsetDateTime
- java.time.ZonedDateTime
- ์๊ฐ๋๊ฐ ํฌํจ๋ ์๊ฐ :
- java.time.OffsetDateTime
- java.time.ZonedDateTime
์ธ ๋ฒ์งธ ํฅ๋ฏธ๋ก์ด ์ ์ ๋ง์ SQL ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋ก์ปฌ ์์ญ์ ์๋ ์๋ฒ์์ ์๊ฐ์ ๋ฐ๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์ ๋๋ค . ๋ฌผ๋ก ์ฆ์์์ ์๊ฐ์ ๋ณํํ ์ ์์ง๋ง ํธ๋ฆฌํ์ง ์๊ณ ์ค์๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ค๋์ ๋ชจ๋ ์์ ์ ๊ฐ์ ธ์ค๊ณ ์ถ์ต๋๋ค. SQL Server์๋ ์ด๋ฅผ ์ํ CURDATE() ํจ์๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์์๋ง ์๋ฒ๊ฐ ๋ฏธ๊ตญ์ ์๊ณ ์ ๋ ์ผ๋ณธ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฐ "๊ทธ์ ์ค๋"์ด ์๋๋ผ "๋์ ์ค๋"์ ๋ํ ๋ชจ๋ ๊ธฐ๋ก์ ๋ฐํํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ผ๋ฐ์ ์ผ๋ก SQL ์๋ฒ๋ ๋ค๋ฅธ ์๊ฐ๋์ ์๋ ํด๋ผ์ด์ธํธ์๋ ์ค๋งํธํ๊ฒ ์์ ํ ์ ์์ด์ผ ํฉ๋๋ค.
ํ๋ ๋ฌธ์ ์๋ ํ๋์ ์ธ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค
์์น์ ์ผ๋ก Java DateTime API์ ์ ์ ํ๊ณผ SQL์ ์ ํ์ ํธ๋ฆฌํ๊ฒ ๋งคํํ ์ ์์ต๋๋ค. Java์์ DATE ์ ํ์ ๋ํ๋ด๋ ค๋ฉด JDK 8 DateTime API์ java.time.LocalDate ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค .
๋ฐ์ดํฐ๋ฒ ์ด์ค์ TIME ์ ํ์ Java์ ๋ ๊ฐ์ง ์ ํ์ธ java.time.LocalTime ๋ฐ java.time.OffsetTime ์ผ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค . ๋ณต์กํ ๊ฒ๋ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ TIMESTAMP ์ ํ ์ผ๋ก ํ์๋๋ ํน์ ์์ ์ Java์์ 4๊ฐ์ง ์ ํ์ผ๋ก ํ์๋ ์ ์์ต๋๋ค.
- java.time.Instant
- java.time.LocalDateTime
- java.time.OffsetDateTime
- java.time.ZonedDateTime
๋ง์ง๋ง์ผ๋ก TIMESTAMP WITH TIME ZONE์ ๋ ๊ฐ์ง ์ ํ์ผ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
- java.time.OffsetDateTime
- java.time.ZonedDateTime
์ด๋ฏธ DateTime API์ ์ต์ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ ๊ฒ์ ๋๋ค :)
ํ ํ์์ผ๋ก ์์ฑํ๋ฏ๋ก ๋ ์ฌ์ธ ๊ฒ์ ๋๋ค.
SQL ์ ํ | ์๋ฐ ์ ํ |
---|---|
๋ ์ง | java.time.LocalDate |
์๊ฐ | java.time.LocalTime java.time.OffsetTime |
ํ์์คํฌํ | java.time.Instant java.time.LocalDateTime java.time.OffsetDateTime java.time.ZonedDateTime |
์๊ฐ๋๊ฐ ์๋ ํ์์คํฌํ | java.time.OffsetDateTime _ |
๋ ์ง ๋ฐ๊ธฐ
์ข์ ์์์ด ์์ต๋๋ค. ์ค๋๋ง์. java.sql ๋ ์ง ์ ํ์ ๋ฐํํ๋ getDate() ๋ฉ์๋ ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ ์ ์์ต๋๋ค .
์์ ์ ๊ฐ์ฒด๊ฒฐ๊ณผ ์งํฉ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๋ฐฉ๋ฒ์ด ์์ต๋๋ค - getObject() . ์ด ๋ฉ์๋๋ ์ด๊ณผ ์ ํ์ ๋ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์ง์ ๋ ์ ํ์ผ๋ก ๋ณํ๋ ์ด์ ๊ฐ์ ๋ฐํํฉ๋๋ค. ๋ฐฉ๋ฒ์ ์ผ๋ฐ์ ์ธ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ClassName Name = getObject(column, ClassName);
๊ทธ๋ฆฌ๊ณ DATE ์ ํ์ java.time.LocalDate ์ ํ ์ผ๋ก ๋ณํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ผ ํฉ๋๋ค.
LocalDate localDate = results.getObject(4, LocalDate.class);
๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ TIMESTAMP๋ ์ฌ๋ฌ ์ ํ์ผ๋ก ๋ณํ๋ ์ ์์ต๋๋ค.
java.time.Instant instant = results.getObject(9, java.time.Instant.class);
java.time.LocalDateTime local = results.getObject(9, java.time. LocalDateTime.class);
java.time.OffsetDateTime offset = results.getObject(9, java.time. OffsetDateTime.class);
java.time.ZonedDateTime zoned = results.getObject(9, java.time. ZonedDateTime.class);
์ค์ํ! ์ด ์ฝ๋๋ ์ค๋๋ MySQL JDBC ๋๋ผ์ด๋ฒ๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ํ์ง ์์ต๋๋ค . pom.xml์ ์์ฑ๋์๊ฑฐ๋ ํ๋ก์ ํธ ์ค์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐ๋ "mysql-connector-java" ๋ฒ์ ์ ์ฃผ์ํ์ญ์์ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ณธ ์ ํ์ ๋ํด null์ ์ ์ฅํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ํ ์ด๋ธ ์ด์ด INT ์ ํ์ธ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก null์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์๋ ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
Integer id1 = results.getObject(8, Integer.class); // this will work
Integer id2 = results.getObject(8, int.class); //this will also work
int id3 = results.getObject(8, Integer.class); //method will return null, JVM will throw NPE
int id4 = results.getObject(8, int.class); //method will return null, JVM will throw NPE
MySQL์ ์๊ฐ๋ ์ค์
MySQL์์๋ ๋ง์ ํฅ๋ฏธ๋ก์ด ์ผ๋ค์ด ์ผ์ด๋ฌ์ต๋๋ค. ์์๋ค์ํผ MySQL ์ฐ๊ฒฐ์ ์์ฑํ ๋ ๋ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค .mysql://localhost:3306/db_scheme?Name=meaning&Name=meaning
๋ฐ๋ผ์ MySQL์์ ์๊ฐ๋ ์์ ์ ์ํด ์ธ ๊ฐ์ ๋งค๊ฐ๋ณ์๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์๋ฒ์ ๋ํ ์ฐ๊ฒฐ์ ์ค์ ํ ๋ ์ด๋ฌํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
์๋์์ ๋๋ ๊ทธ๋ค๊ณผ ํจ๊ป ํ๋ฅผ ์ค ๊ฒ์ ๋๋ค :
๋ชจ์ | ๊ฐ์น | ๊ธฐ๋ณธ๊ฐ |
---|---|---|
์ฐ๊ฒฐ ์๊ฐ๋ | ์ง์ญ | ์๋ฒ | ์ฌ์ฉ์ ์์ญ | ์ฌ๊ธฐ๋ ์ฌ๋ |
forceConnectionTimeZoneToSession | ์ฌ์ค | ๊ฑฐ์ง | ์ง์ค |
๋ณด์กด ์ธ์คํด์ค | ์ฌ์ค | ๊ฑฐ์ง | ๊ฑฐ์ง |
connectionTimeZone ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์์ฒญ์ด ์คํ๋ ์๊ฐ๋(์๊ฐ๋)๋ฅผ ์ ํํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ๊ด์ ์์ ์๋ฒ๋ ์ง์ ๋ ์๊ฐ๋๋ก ์คํ๋ฉ๋๋ค.
forceConnectionTimeZoneToSession ๋งค๊ฐ๋ณ์ ๋ก ์ธํด ์ธ์ time_zone ๋ณ์๊ฐ ๋ฌด์๋๊ณ connectionTimeZone์ผ๋ก ๋์ฒด๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, preserveInstants ๋งค๊ฐ๋ณ์๋ JVM์ timeZone๊ณผ connectionTimeZone ์ฌ์ด์ ์ ํํ ์๊ฐ ๋ณํ์ ์ ์ดํฉ๋๋ค.
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
connectionTimeZone=LOCAL & forceConnectionTimeZoneToSession=false - useLegacyDatetimeCode=true์ธ ์ด์ MySQL JDBC ๋๋ผ์ด๋ฒ ๋ฒ์ 5.1์ ํด๋นํฉ๋๋ค.
-
connectionTimeZone=LOCAL & forceConnectionTimeZoneToSession=true๋ ๋ ์ง ๋ฐ ์๊ฐ ๊ฐ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์์ฐ์ค๋ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ์๋ก์ด ๋ชจ๋์ ๋๋ค.
-
connectionTimeZone=SERVER & preserveInstants=true - useLegacyDatetimeCode=false์ธ ์ด์ MySQL JDBC ๋๋ผ์ด๋ฒ ๋ฒ์ 5.1์ ํด๋นํฉ๋๋ค.
-
connectionTimeZone=user_defined & preserveInstants=true - ์๋ฒ์ ํ์ค ์๊ฐ๋๊ฐ CET/CEST์ ๊ฐ์ ์ผ๋ฐ ์ฝ์ด๋ก ์ค์ ๋์ด ์ปค๋ฅํฐ์์ ์ธ์ํ ์ ์๋ ์ํฉ์ ๊ทน๋ณตํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์, ๋ ์ง๋ ํฅ๋ฏธ๋ก์ด ์ฃผ์ ์ด๋ฉฐ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋ด์ฒ๋ผ : ๋ฌผ๋ก ๋ฌด์ญ์ง ๋ง ํ๋ ์๋์! :)
GO TO FULL VERSION