7.1 ์์ ๋ง์ ์ ํ ๋ณํ๊ธฐ ๋ง๋ค๊ธฐ
๋๋๋ก ํ ์ด๋ธ์ ํ ์ด์ ์๋นํ ๋ณต์กํ ๋ฐ์ดํฐ ์ ํ์ ์ ์ฅํ๋ ค๋ ๊ฒฝ์ฐ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค. Hibernate๊ฐ ๋ฌธ์์ด๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์๋ค๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์์ ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์์ฒด ๋ฐ์ดํฐ ๋ณํ๊ธฐ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ์ฌ์ฉ์์ ์๋
์์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ก ์ ์ฅํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค YY.MM.DD
. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค 98.12.15
. ๋ํ ์ผ๋ฐ ๋ ์ง๋ก ๋ณํํด์ผ ํฉ๋๋ค 15/12/1998
. ๊ทธ๋ฐ ๋ค์ ์์ ๋ง์ ๋ณํ๊ธฐ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค AttributeConverter<EntityType, DbType>
.
@Converter(autoApply = true)
public class DateConverter implements AttributeConverter<java.time.LocalDate, String> {
public String convertToDatabaseColumn(java.time.LocalDate date) {
return date.format("YY.MM.DD");
}
public java.time.LocalDate convertToEntityAttribute(String dbData) {
String[] data = dbData.split(".");
return LocalDate.of(data[2], data[1], "19"+data[0]);
}
}
๋ฌผ๋ก ์ด ๋ณํ๊ธฐ๋ ๋ชจ๋ ํ๋์ ์ถ๊ฐํ ์ ์์ต๋๋ค(์ ํ์ด ์ผ์นํ๋ ๊ฒฝ์ฐ).
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@Column(name="join_date")
@Convert(converter = DateConverter.class)
public java.time.LocalDate date;
}
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค๊ณํ์ง ์์ ๊ฒฝ์ฐ ๋ณํ๊ธฐ๋ฅผ ์์ฃผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ฑฐ๊ธฐ์ ์๋ ๋ฐ์ดํฐ๋ "์ด์ํ ํ์"์ผ ์ ์์ต๋๋ค. ๋ ์ง๋ ๋ฌธ์์ด๋ก, ๋ถ์ธ์ Y ๋ฐ N ๊ฐ์ด ์๋ CHAR ๋ฑ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
7.2 ์์ฒด ๋ฐ์ดํฐ ์ ํ ๋ง๋ค๊ธฐ
Hibernate์ ์๋ ค์ง ์ ํ ๋ชฉ๋ก์ด ์๋ ํ๋ฅผ ๊ธฐ์ตํ์ญ๋๊น? ์ฃผ์๊ณผ ํจ๊ป ์ง์ ๋ ์ ํ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค @Type
. Hibernate์ ๋ค๋ฅธ ๋ด์ฅ ์ ํ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ณ ์ ํ ๋ฐ์ดํฐ ์ ํ์ ์์ฑํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ TIME์ด ์๋๋ผ VARCHAR๋ก ์ ์ฅ๋๋ LocalTime ์ ํ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๋ ๊ทธ๋ฌํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ํด๋น ์ด์ ๋ฐ์ดํฐ ์ ํ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ์์ ์ Hibernate ์ ํ์ ์์ฑํ ์ ์์ต๋๋ค. LocalTimeString์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
๋จผ์ ์ ์ ํ์ ์ค๋ช ํ๋ ์์ ํด๋์ค๊ฐ ํ์ํฉ๋๋ค.
public class LocalTimeStringType extends AbstractSingleColumnStandardBasicType<<LocalTime> {
public static final LocalTimeStringType INSTANCE = new LocalTimeStringType ();
public LocalTimeStringType () {
super(VarcharTypeDescriptor.INSTANCE, LocalTimeStringJavaDescriptor.INSTANCE);
}
@Override
public String getName() {
return "LocalTimeString";
}
}
ํ๋์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ Enum ์ ํ์ ๋๋ค. ์ด๋ฌํ ๋จ์ผ enam ์ธํธ๋ Hibernate์ ์๋ ค์ง ๋ชจ๋ ์ ํ์ ๋๋ค.
๋ํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํฌํจํ๋ ๋ณํ๊ธฐ์ ์๋ ๋ก๊ทธ ํด๋์ค wrap()
์ unwrap()
LocalTime ์ ํ์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ณํํ๋ ํด๋์ค๊ฐ ํ์ํฉ๋๋ค.
๋ค์์ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์๊ณ ํ์๋๋ ๋ฐฉ์์ ๋๋ค.
public class LocalTimeStringJavaDescriptor extends AbstractTypeDescriptor<LocalTime> {
public static final LocalTimeStringJavaDescriptor INSTANCE = new LocalTimeStringJavaDescriptor();
public LocalTimeStringJavaDescriptor() {
super(LocalTime.class, ImmutableMutabilityPlan.INSTANCE);
}
public <X> X unwrap(LocalTime value, Class<X> type, WrapperOptions options) {
}
public <X> LocalTime wrap(X value, WrapperOptions options) {
}
}
์ด์ ๋ฉ์๋ ๊ตฌํ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
public <X> X unwrap(LocalTime value, Class<X> type, WrapperOptions options) {
if (value == null)
return null;
if (String.class.isAssignableFrom(type))
return (X) LocalTimeType.FORMATTER.format(value);
throw unknownUnwrap(type);
}
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ:
@Override
public <X> LocalTime wrap(X value, WrapperOptions options) {
if (value == null)
return null;
if(String.class.isInstance(value))
return LocalTime.from(LocalTimeType.FORMATTER.parse((CharSequence) value));
throw unknownWrap(value.getClass());
}
์ค๋น๊ฐ ๋. ์ด ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ์ ๋ฌธ์์ด๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
@Entity
@Table(name="user")
class User
{
@Id
@Column(name="id")
public Integer id;
@Column(name="join_time")
@Type(type = "com.codegym.hibernate.customtypes.LocalTimeStringType")
public java.time.LocalTime time;
}
7.3 ์ ํ ๋ฑ๋ก
Hibernate ๊ตฌ์ฑ ์ค์ ๋ฐ์ดํฐ ์ ํ์ ๋ฑ๋กํ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ํ ์ผ์ด ์๋๋๋ค.
ServiceRegistry serviceRegistry = StandardServiceRegistryBuilder()
.applySettings(getProperties()).build();
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
Metadata metadata = metadataSources
.addAnnotatedClass(User.class)
.getMetadataBuilder()
.applyBasicType(LocalTimeStringType.INSTANCE)
.build();
SessionFactory factory = metadata.buildSessionFactory();
๋จผ์ MetadataSources๋ฅผ ๊ฐ์ ธ์ MetadataBuilder๋ฅผ ๊ฐ์ ธ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ฅผ ํตํด ๊ฐ๋ฅ hibernate.cfg.xml
ํ์ง๋ง ์กฐ๊ธ ๋ฒ๊ฑฐ๋กญ๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ฑ๋ก ํ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
@Entity
@Table(name="user")
class User
{
@Id
@Column(name="id")
public Integer id;
@Column(name="join_time")
@Type(type = "LocalTimeString")
public java.time.LocalTime time;
}
GO TO FULL VERSION