본문 바로가기

Programming!

JPA Converter 를 Generics로 처리하기...

를 하려고 했으나.. 가령.


@Entity

@Table(catalog = XXX.CCC, name = "hotel")

public class Hotel {

...

    @Column(name = "spec")

    @Convert(converter = HotelSpecJsonConverter.class)

    private HotelSpec spec;


위 spec 컬럼은 json 으로 저장되어 있다. 해서 HotelSpecJsonConverter 를 지정해서 사용했으나.. 

다른 테이블에도 json으로 저장되어 있는 컬럼들이 여기저기 많아서 그때마다 AttributeConverter 를 구현하는 건 좀 무리라는 생각.



제너릭하게 이런 형태를 원했으나 @Convert를 지정할때 타입을 보낼 수 없으니.

Fail Source~

public class HotelSpecJsonConverter<T> implements AttributeConverter<T, String>{



Success Source~

해서 AttributeConverter 를 확장한 인터페이스 하나 더 만들고.

public interface ColumnJsonConverter<T> extends AttributeConverter<T, String> {


    @Override

    default String convertToDatabaseColumn(T t) {

        ...

    }


    @Override

    default T convertToEntityAttribute(String v) {

        ...

    }

}



default로 구현 소스 만들어 놓고 이놈을 다시 Converter로...콜록.

@Converter(autoApply=true)

public class HotelSpecJsonConverter implements ColumnJsonConverter<HotelSpec>{

....

}


다시 적용.

    @Column(name = "spec")

    @Convert(converter = HotelSpecJsonConverter.class)

    private HotelSpec spec;


이렇게 하니 뭐.. 클래스는 늘어나도 구현 소스는 그나마.. 뭐 더 명시적이니 좋다라고 자기위안을 삼아본다.


그나저나... 뭔 테이블에 json 저장이 이렇게 많은지 거기에!!! key가 동적이야...그럼 Map으로 해야 되는데...

거기에!!! 특정 column에 json문구를 like 검색을 하는 곳도 있다.. like '%Text%' ...

엌...

작업 끝난 후에 마이그레이션도 해야되것네.. 허허.