프로젝트를 진행하면서 List 형식을 컬럼 하나에 저장하고 싶은데 마땅한 방법이 없어서 찾다가 @Convert 라는 방식을 알게 되었다.
이 방식은 List 로 저장 시켜준다기 보단 내가 원하는 형식으로 변환하여 저장 해준다는 표현이 적절하다.
먼저, 나는 List 타입을 저장 시키고 싶어서 List 타입 변수에 @Convert를 써주었다. 이후에 내가 원하는 타입을 구현하여 convert = 구현클래스.class 로 지정해주면 된다.
@Convert(converter = StringListConverter.class)
private List<String> styles = new ArrayList<>();
이후에 StringListConvert 클래스 파일을 만들고 내가 원하는 작업을 오버 라이드해서 구현하면 된다.
@Slf4j
public class StringListConverter implements AttributeConverter<List<String>, String> {
private static final ObjectMapper mapper = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
@Override
public String convertToDatabaseColumn(List<String> attribute) {
try {
return mapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
throw new IllegalArgumentException();
}
}
@Override
public List<String> convertToEntityAttribute(String dbData) {
TypeReference<List<String>> typeReference = new TypeReference<List<String>>() {};
try {
return mapper.readValue(dbData, typeReference);
} catch (IOException e) {
throw new IllegalArgumentException();
}
}
}
convertToDatabaseColumn 메서드는 프론트에서 넘어오는 List 타입의 데이터를 DB에 저장할 때 문자열로 직렬화 해준다.
그리고 convertToEntityAttribute 메서드는 문자열로 저장 된 데이터를 역직렬화 해줘서 다시 List 타입으로 변환 해준다.
이렇게 하면 일일이 콤마로 나눠주고 꺼내와서 다시 파싱하고 List에 담아주는 작업을 하지 않아도 된다.
즉, DB에 List 를 저장 시키는 것이 아닌 List를 내가 구현 한 메서드에서 문자열로 변환하는 과정을 거친 후 DB에 저장되고 이후에 내가 조회를 해서 사용 할 때 DB에 있는 문자열을 List 타입으로 변형시켜서 반환해준다.