✅ 문제 상황
JPA는 기본적으로 List<String> 같은 컬렉션 타입을 RDB에 직접 매핑하지 못한다.
하지만 DB에 JSON 문자열로 저장하고, 엔티티에서는 List<String>으로 다루고 싶을 때가 있다.
✅ 해결 방법: @Converter + Jackson
@Converter를 사용해 List<String> ↔ String(JSON) 변환기를 만들어 해결할 수 있다.
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import java.util.List;
@Converter
public class StringListConverter implements AttributeConverter<List<String>, String> {
private final ObjectMapper mapper = new ObjectMapper();
@Override
public String convertToDatabaseColumn(List<String> dataList) {
try {
return mapper.writeValueAsString(dataList); // List → JSON 문자열
} catch (JsonProcessingException e) {
throw new RuntimeException("Could not convert list to JSON", e);
}
}
@Override
public List<String> convertToEntityAttribute(String data) {
try {
return mapper.readValue(data, new TypeReference<List<String>>() {}); // JSON 문자열 → List
} catch (JsonProcessingException e) {
throw new RuntimeException("Could not convert JSON to list", e);
}
}
}
✅ 사용 예시
@Convert(converter = StringListConverter.class)
private List<String> tags;
✅ 참고 사항
- ObjectMapper는 Jackson 라이브러리의 직렬화/역직렬화 도구
- TypeReference를 사용하면 타입 안전하게 List<String>으로 변환 가능
- 컬렉션, Map, Enum 리스트 등 다른 타입에도 응용 가능