Oracle + Mybatis ํ๊ฒฝ์์์ Date ๋ค๋ฃจ๊ธฐ
์ํฉ
- Oracle, Java 8, mybatis3 ํ๊ฒฝ
- Date์ปฌ๋ผ์ ๋ฐ์ดํฐ๊ฐ ์๋๋ฐ ์ด๋ฅผ select query๋ก ์กฐํํ์ฌ Model์ ๋ฐ์ธ๋ฉ ์ํค๊ณ ์ ํจ.
- ์ฟผ๋ฆฌ์ ์๋ฌด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์๊ณ Date ํํ๋ก Model์ ๋ฐ์ธ๋ฉ์ ํ๋ฉด ์๋ถ์ด๊ฐ ์์ด์ง
2017-01-01 00:00:00
ํํ๋ก ๋จ๊ฒ๋จ - ๊ทธ๋์ ์๋์ฒ๋ผ ์ฟผ๋ฆฌ ์์ฑํ ๋๋ง๋ค TO_CHAR๋ฅผ ์ฌ์ฉํด์ ํฌ๋งท์ ๋ง์ถ์ด ํ๋ณํ์ ์ํค๊ณ Date ๋๋ String์ผ๋ก Model์ ๋ฐ์ธ๋ฉ ํ๊ณค ํ์.
SELECT
TO_CHAR(reg_ymdt, 'YYYY-MM-DD HH24:MI:SS') AS registDate
FROM
...
- ์ด๋ ๊ฒ ํ๋ค๋ณด๋ query ๋ง๋ค๋๋ง๋ค ํ๋ณํํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ค์ผํ๊ณ , ์์นซ ํฌ๋งทํ์์ ๋ค๋ฅด๊ฒ ์ ์ผ๋ฉด ์๋ฑํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๊ฑฐ๋, Dateํ์ ๊ทธ๋๋ก ๋ฐ์ ์ฌ์ฉํด์ผํ๋ ์ํฉ์์๋ ๋ค์ ํ๋ณํํ๋ ๊ณผ์ (
String to Date
)์ ํด์ค์ผ๋ง ํจ. ..๊ท์ฐจ๋์ฆ์ ์์ : ์ฝ์ง
1. ์ฝ์ง์ ์์
1-1. ์ค๋ผํด์ DATEํ
โ java.sql.Date
์ ๊ฒฝ์ฐ
- mybatis์์๋ ์๋์ ์ผ๋ก
org.apache.ibatis.type.SqlDateTypeHandler
๋ฅผ ํธ์ถํ๊ฒ๋จ mybatis 3 ๋ฌธ์ ์ฐธ๊ณ - ํด๋น ํธ๋ค๋ฌ์ ๋ด๋ถ ๋ฐ์ดํฐ ๋ณํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์
@Override
public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getDate(columnName);
}
java.sql.ResultSet.getDate()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ค์ ‘yyyy-mm-dd’ ๋ง ๊ฐ์ ธ์ ๋ฆฌํดํ๊ฒ๋จ (์ฌ๊ธฐ์ ๋๋ฒ๊น ํด๋ณด๋ฉด rs.getTimestamp(columnName)๊ฐ์ ์๋ถ์ด๊น์ง ๋ค ๋ค์ด๊ฐ ์์)- ๋ฐ๋ผ์ ์๊ฐ๊ฐ์ด ์๋
yyyy-mm-dd
ํํ๋ก ๋ฆฌํด์ด ๋จ
1-2. ์ค๋ผํด์ DATEํ
โ java.util.Date
์ ๊ฒฝ์ฐ
- mybatis์์๋ ์๋์ ์ผ๋ก
org.apache.ibatis.type.DateOnlyTypeHandler
๋ฅผ ํธ์ถํ๊ฒ๋จ mybatis 3 ๋ฌธ์ ์ฐธ๊ณ - ํด๋น ํธ๋ค๋ฌ์ ๋ด๋ถ ๋ฐ์ดํฐ ๋ณํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์
@Override
public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
java.sql.Date sqlDate = rs.getDate(columnName);
if (sqlDate != null) {
return new java.util.Date(sqlDate.getTime());
}
return null;
}
- ์์
org.apache.ibatis.type.SqlDateTypeHandler
๋ณํ์ฝ๋์์ ๋ฐ์ํ ๋ฌธ์ ์ ๊ณผ ๊ฐ์ดyyyy-mm-dd
๋ง ๊ฐ์ ธ์์ java.sql.Date ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ์ด ์ ๋ณด๋ฅผ ํ ๋๋ก java.util.Date ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฒ ๋๋๋ฐ ์์ ์๊ฐ๊ฐ์ ๋บ ์ ๋ณด๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ๋์ผํ๊ฒyyyy-mm-dd
ํํ๋ก ๋ฆฌํด์ด ๋จ
2. ์ฝ์ง์๋ฃ, ํด๊ฒฐ์ ์์
- ์ค๋ผํด + mybatis ํ๊ฒฝ์์ Dateํ์ ์ ๋ค๋ฃจ๊ธฐ ์ํด์๋ ํ์ ํธ๋ค๋ฌ๋ฅผ ๋ช ์์ ์ผ๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค๋๊ฑธ ์๊ฒ๋จ.
2-1. ์ค๋ผํด์ DATEํ
โ java.sql.Date
์ ๊ฒฝ์ฐ
- ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ปค์คํ ํธ๋ค๋ฌ๋ฅผ ๋ง๋ค์ด ๋ฑ๋ก์ ์์ผ์ค๋ค.
- mybatis-config.xml
<typeHandlers>
<typeHandler handler="com.naver.dbill.admin.common.handler.CustomDateHandler"/>
</typeHandlers>
- CustomDateHandler.java
...
import java.sql.Date;
...
public class CustomDateHandler extends BaseTypeHandler<Date> {
...
@Override
public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
Timestamp sqlTimestamp = rs.getTimestamp(columnName);
if (sqlTimestamp != null) {
return new Date(sqlTimestamp.getTime());
}
return null;
}
...
}
- ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์คํํด๋ณด๋ฉด ์ ์์ ์ผ๋ก ์๋ถ์ด ๊ฐ์ด ์๋ ์์ ํ Date ํํ๋ฅผ ๋ณผ์ ์๋ค.
2-2. ์ค๋ผํด์ DATEํ
โ java.util.Date
์ ๊ฒฝ์ฐ
- ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ปค์คํ ํธ๋ค๋ฌ๋ฅผ ๋ง๋ค์ด ๋ฑ๋ก์ ์์ผ์ค๋ค.
- ๋จ, mybatis 3 ๋ฌธ์๋ฅผ ๋ณด๋ฉด
java.sql.Date
์๋ ๋ค๋ฅด๊ฒ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋ typeHandler๊ฐ JDBC์ ๋ฐ๋ผ 3๊ฐ์ง๊ฐ ์๋ค. - ๋ฐ๋ผ์ ์์ฑํ ์ปค์คํ
ํธ๋ค๋ฌ๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ช
์์ ์ผ๋ก
์๋ฐํ์
๊ณผJDBCํ์
์ ์ ์ด์ค์ผ ์ ์์ ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์ด ํด๋น ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. - mybatis-config.xml
<typeHandlers>
<typeHandler handler="com.naver.dbill.admin.common.handler.CustomDateHandler" javaType="java.util.Date" jdbcType="DATE"/>
</typeHandlers>
- CustomDateHandler.java ๋ ์์ ๋์ผํ๋ค. ( import java.util.Date; ์ฌ์ฉ์ผ๋ก ๋ณ๊ฒฝ )
์ฝ์งํ๋ฉฐ ์๊ฒ๋ ๋ณด๋์ค ์ง์
java.sql.Date
๋java.util.Date
์ ์์๋ฐ์๋ค.
public class Date extends java.util.Date {
}
- ๊ฒ์์ ํ๋ค๋ณด๋ฉด ์์์๊ฒ ์ง๋ง
java.sql.Date
๋ JDBC๋ฑ์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ ํฉํ๊ณ ,java.util.Date
์ ๋ณด๋ค ๋ฒ์ฉ์ ์ธ ๋ ์ง๋ ์๊ฐ์ ๋ณด๋ฅผ ๋ค๋ฃฐ๋ ์ ํฉํ๋ค๊ณ ํ๋ค. - toString ๋ฉ์๋์ ๋ฆฌํด Format ํํ
java.sql.Date
: yyyy-mm-ddjava.util.Date
: EEE MMM dd HH:mm:ss zzz yyyy
- mybatis ์์ ํ๋ณํ์ mybatis 3 ๋ฌธ์์ ๋์์๋ ์๋ฐํ์ ๊ณผ JDBCํ์ ์ด ์ผ์นํ ๊ฒฝ์ฐ์ ํด๋น ํ์ ํธ๋ค๋ฌ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค.
์ ์ํ ๋ ์กฐ์ธ ( http://d2.naver.com/helloworld/645609 ์์ฑํ์ ๋ถ )
- Oracle์ JDBC ๋๋ผ์ด๋ฒ๊ฐ ์์ ๋ฐ์ผ๋ก ๋์ํ๋ค์. Oracle์ DATE ํ์ ๋ ๋ฌธ์๋ฅผ ๋ณด๋ ์๋ถ์ด๊น์ง ์ ์ฅํ๊ฒ ๋์ด ์๋๋ฐ, Oracle JDBC ๊ตฌํ์ฒด๊ฐ DATE ํ์ ์ ์ฒ ํ์ ์คํดํ๊ฒ ์๋๊ฐํ๋ ์๊ฐ๋ ๋ญ๋๋ค.
- ์ฐธ๊ณ ๋ก java.sql.Date, java.sql.TimeStamp๋ ์๋ชป๋ ์ค๊ณ๋ผ๋ ๋นํ์ด ๋ง์ต๋๋ค.
- ์ ๋ Java์ ๋ ์ง์ ์๊ฐ API ๋ผ๋ ๊ธ์์ ์๋์ ๊ฐ์ด ์ ์ ์ ์ด ์์ต๋๋ค.
java.sql.Date ํด๋์ค๋ ์์ ํด๋์ค์ธ java.util.Date ํด๋์ค์ ์ด๋ฆ์ด ๊ฐ๋ค. ์ด ํด๋์ค๋ฅผ ๋๊ณ Java ํ๋ซํผ ์ค๊ณ์๋ ํด๋์ค ์ด๋ฆ์ ์ง์ผ๋ฉด์ ๊น๋นก ์กด ๋ฏํ๋ค๋ ์กฐ๋กฑ๊น์ง ๋์๋ค.[24]