우리 프로젝트에 사용할 데이터!
게시물을 등록할 때 여러 재료(ingredientsList)와 여러 태그(tagList)를 설정할 수 있다. 그래서 게시물을 관리하는 테이블(post)에 재료 리스트가 담긴 컬럼과 태그 리스트가 담긴 컬럼이 있어야 한다!
근데 리스트를 필드로 어떻게 저장하지..?
AttributeConverter 인터페이스를 상속받아 StringListConverter 클래스를 구현한다.
⇒ tagList와 ingredientsList가 DB에 저장될 때는 통째로 String으로 변환하고, 다시 객체로 만들 때는 String을 파싱하여 List에 담는다.
package com.inno.coogle.converter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.persistence.AttributeConverter;
import java.io.IOException;
import java.util.List;
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);
// DB 테이블에 들어갈 때 적용됨
@Override
public String convertToDatabaseColumn(List<String> attribute) {
try{
// Object to JSON in String
return mapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
throw new IllegalArgumentException();
}
}
// DB 테이블의 데이터를 Object 에 매핑시킬 때 적용됨
@Override
public List<String> convertToEntityAttribute(String dbData) {
try {
// JSON from String to Object
return mapper.readValue(dbData, List.class);
} catch (IOException e) {
throw new IllegalArgumentException();
}
}
@Convert(converter = StringListConverter.class)
private List<String> ingredientsList;
@Convert(converter = StringListConverter.class)
private List<String> tagList;
이제 원하는 대로 저장이 된다!
아이고 뭐가 성능적으로 우수한 건지 모르겠다. 어쨌든 다시 다 고쳐야 할 수도..🤔