본문 바로가기

카테고리 없음

📅 TIL - JPA에서 List<String>을 DB에 저장하는 방법

✅ 문제 상황

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 리스트 등 다른 타입에도 응용 가능